From unknown Wed Jun 18 23:14:16 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#38408 <38408@debbugs.gnu.org> To: bug#38408 <38408@debbugs.gnu.org> Subject: Status: [PATCH 0/3] (WIP) Semantic version aware recusive importer for crates Reply-To: bug#38408 <38408@debbugs.gnu.org> Date: Thu, 19 Jun 2025 06:14:16 +0000 retitle 38408 [PATCH 0/3] (WIP) Semantic version aware recusive importer fo= r crates reassign 38408 guix-patches submitter 38408 Martin Becze severity 38408 normal tag 38408 patch thanks From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 27 19:13:54 2019 Received: (at submit) by debbugs.gnu.org; 28 Nov 2019 00:13:54 +0000 Received: from localhost ([127.0.0.1]:56403 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ia7RS-0005Cs-2F for submit@debbugs.gnu.org; Wed, 27 Nov 2019 19:13:54 -0500 Received: from lists.gnu.org ([209.51.188.17]:39084) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ia7RQ-0005Ck-Rj for submit@debbugs.gnu.org; Wed, 27 Nov 2019 19:13:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:59103) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ia7RP-0005KX-LU for guix-patches@gnu.org; Wed, 27 Nov 2019 19:13:52 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=BAYES_50,RCVD_IN_DNSWL_LOW, URIBL_BLOCKED autolearn=disabled version=3.3.2 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ia7RO-0006nY-AF for guix-patches@gnu.org; Wed, 27 Nov 2019 19:13:51 -0500 Received: from mx1.riseup.net ([198.252.153.129]:45718) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ia7RK-0006hm-6h for guix-patches@gnu.org; Wed, 27 Nov 2019 19:13:48 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47NdQw1pZfzFc8p; Wed, 27 Nov 2019 16:13:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1574900024; bh=XuOcfW9l2u3JO6izUIsKgWNJJa5uk+XIPgdZQ1XmV4Y=; h=From:To:Cc:Subject:Date:From; b=Swf/vrxLf8aYCN9Ris64tEu+GmiAWA65JYjPEhYvb5Y5KZpTKtcxpyRPnT7+nt1Jj rut3OMzWQEqRRLyqtGTt9Xe7cQBMXvl+66IOVpF4MYRj6OmT0nnP8zJrmwvkdzEb9w Bul8Hrdarm4upJ/UN/0W5VAa01Lpiq4MVJTC0q9c= X-Riseup-User-ID: 72796163DC9A36A43D076D262C7C74AE50807E2924CDA0EA125994C32C1FB1F0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47NdQv2rZdz8sx2; Wed, 27 Nov 2019 16:13:43 -0800 (PST) From: Martin Becze To: guix-patches@gnu.org Subject: [PATCH 0/3] (WIP) Semantic version aware recusive importer for crates Date: Wed, 27 Nov 2019 19:13:11 -0500 Message-Id: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 198.252.153.129 X-Spam-Score: -1.4 (-) X-Debbugs-Envelope-To: submit Cc: efraim@flashner.co.il, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.4 (--) This patch add a new recusive importer (recusive-import-semver) which use= s semantic versioning to find the correct version of dependencies. This p= rocedure is then used by the crate importer. Since quite a few langague p= ms use semantic versioning I hope that other importers can also use it. This patch has one problem that I'm aware of. recusive-import-semver reli= es on guile-semver. But how do I make it so that it is installed by defau= lt? Or altenativly how can I check a guile module exists or not, so that = I can promt the user to install it? Thanks, Martin Becze Martin Becze (3): gnu: added new function, find-packages-by-name*/direct gnu: added new procedure, recusive-import-semver Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. gnu/packages.scm | 41 ++++++++ guix/import/crate.scm | 165 +++++++++++++++++-------------- guix/import/utils.scm | 181 ++++++++++++++++++++++++++++++++-- guix/scripts/import/crate.scm | 9 +- tests/crate.scm | 2 +- tests/import-utils.scm | 162 ++++++++++++++++++++++++++++++ tests/packages.scm | 13 +++ 7 files changed, 481 insertions(+), 92 deletions(-) --=20 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 27 19:17:05 2019 Received: (at 38408) by debbugs.gnu.org; 28 Nov 2019 00:17:05 +0000 Received: from localhost ([127.0.0.1]:56419 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ia7UW-0005JY-QC for submit@debbugs.gnu.org; Wed, 27 Nov 2019 19:17:05 -0500 Received: from mx1.riseup.net ([198.252.153.129]:60806) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ia7UU-0005JH-LB for 38408@debbugs.gnu.org; Wed, 27 Nov 2019 19:17:03 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47NdVk1w9QzFc8p; Wed, 27 Nov 2019 16:17:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1574900222; bh=chL81QND2PvQrUFrNgy/ahQ3nrmiGlgQD4PnAhtyUtw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PqhDxkrY3u3kuHFUgkX39ZKYtYFiNgvKCL5S7MmfX5ns+i4+4bojCOYeT+cewS/g5 v855dAKU/n4STOlXCYsc48XWec62P7T6G9BCK6w79U+Y2laWYnxQcFDnNwXtz61UOE Rdu35lC9DhRnJfkBONz4JN5FRVbuQ0T1OnonFmDA= X-Riseup-User-ID: 9C21D360A06A3FAEB4F20C58D4B4B6FF7FCEA12DBFA00B16D9ADA81B32F22821 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47NdVj4JWDz8tTD; Wed, 27 Nov 2019 16:17:01 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH 1/3] gnu: added new function, find-packages-by-name*/direct Date: Wed, 27 Nov 2019 19:16:50 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: efraim@flashner.co.il, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * gnu/packages.scm (find-packages-by-naem*/direct) --- gnu/packages.scm | 41 +++++++++++++++++++++++++++++++++++++++++ tests/packages.scm | 13 +++++++++++++ 2 files changed, 54 insertions(+) diff --git a/gnu/packages.scm b/gnu/packages.scm index 959777ff8f..cca2a393e5 100644 --- a/gnu/packages.scm +++ b/gnu/packages.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2016, 2017 Alex Kost ;;; Copyright © 2016 Mathieu Lirzin +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -52,7 +53,9 @@ %default-package-module-path fold-packages + fold-packages* fold-available-packages + find-packages-by-name*/direct find-newest-available-packages find-packages-by-name @@ -250,6 +253,23 @@ is guaranteed to never traverse the same package twice." init modules)) +(define* (fold-packages* proc init + #:optional + (modules (all-modules (%package-module-path) + #:warn + warn-about-load-error)) + #:key (select? (negate hidden-package?))) + "Call (PROC PACKAGE RESULT) for each available package defined in one of +MODULES that matches SELECT?, using INIT as the initial value of RESULT. It +is guaranteed to never traverse the same package twice." + (fold-module-public-variables* (lambda (module symbol var result) + (let ((object (variable-ref var))) + (if (and (package? object) (select? object)) + (proc module symbol object result) + result))) + init + modules)) + (define %package-cache-file ;; Location of the package cache. "/lib/guix/package.cache") @@ -297,6 +317,27 @@ decreasing version order." matching) matching))))) +(define find-packages-by-name*/direct ;bypass the cache + (let ((packages (delay + (fold-packages* (lambda (mod sym p r) + (vhash-cons (package-name p) (list mod sym p) r)) + vlist-null))) + (version>? (match-lambda* + (((_ _ versions) ..1) + (apply version>? (map package-version versions)))))) + (lambda* (name #:optional version) + "Return the list of ( ) with the given NAME. If + VERSION is not #f, then only return packages whose version is prefixed by + VERSION, sorted in decreasing version order." + (let ((matching (sort (vhash-fold* cons '() name (force packages)) + version>?))) + (if version + (filter (match-lambda + ((_ _ package) + (version-prefix? version (package-version package)))) + matching) + matching))))) + (define (cache-lookup cache name) "Lookup package NAME in CACHE. Return a list sorted in increasing version order." diff --git a/tests/packages.scm b/tests/packages.scm index 423c5061aa..9f02b0d5d2 100644 --- a/tests/packages.scm +++ b/tests/packages.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès ;;; Copyright © Jan (janneke) Nieuwenhuizen +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -1135,11 +1136,23 @@ (((? (cut eq? hello <>))) #t) (wrong (pk 'find-packages-by-name wrong #f)))) +(test-assert "find-packages-by-name*/direct" + (match (find-packages-by-name*/direct "hello") + ((((? (cut eq? (resolve-interface '(gnu packages base)) <>)) + (? (cut eq? 'hello <>)) + (? (cut eq? hello <>)))) #t))) + (test-assert "find-packages-by-name with version" (match (find-packages-by-name "hello" (package-version hello)) (((? (cut eq? hello <>))) #t) (wrong (pk 'find-packages-by-name wrong #f)))) +(test-assert "find-packages-by-name*/direct with version" + (match (find-packages-by-name*/direct "hello" (package-version hello)) + ((((? (cut eq? (resolve-interface '(gnu packages base)) <>)) + (? (cut eq? 'hello <>)) + (? (cut eq? hello <>)))) #t))) + (test-equal "find-packages-by-name with cache" (find-packages-by-name "guile") (call-with-temporary-directory -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 27 19:17:08 2019 Received: (at 38408) by debbugs.gnu.org; 28 Nov 2019 00:17:08 +0000 Received: from localhost ([127.0.0.1]:56421 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ia7UZ-0005Ju-Tf for submit@debbugs.gnu.org; Wed, 27 Nov 2019 19:17:08 -0500 Received: from mx1.riseup.net ([198.252.153.129]:60816) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ia7UV-0005JV-QO for 38408@debbugs.gnu.org; Wed, 27 Nov 2019 19:17:05 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47NdVl2n4BzFc94; Wed, 27 Nov 2019 16:17:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1574900223; bh=eXiKp6xJqqFQPNzckywNUZngJI+P5LxkAMwTMvBbN2M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XmiHU+etp0m5QcgRoHivAt80bfxpmTI0QEPx6hFmQOB07xVzQQLQhFhElVe7lu2sL le/uAloe2SpqbWKXuxxC/iltWsnpEc1v8/i6QTxxmWtxLLgcXW4M4wnZLzZArX/exC VVm2g9UzuBgB2ki55+QTPn/giioJd4yRNzZUiNME= X-Riseup-User-ID: 8F8E5B678EAABD5605281BEF0AFA968233AA1A59E71FF649A481435C557C6C22 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47NdVk31f8z8tTD; Wed, 27 Nov 2019 16:17:02 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH 2/3] gnu: added new procedure, recusive-import-semver Date: Wed, 27 Nov 2019 19:16:51 -0500 Message-Id: <0b124a8a41c3488d3cda265d363eab49de7aca62.1574897905.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: efraim@flashner.co.il, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * gnu/packages.scm (recusive-import-semver): New Procedure * gnu/packages.scm (package->definition)[arguments]: New argument, "latest" * tests/import-utils.scm: tests for recusive-import-semver --- guix/import/utils.scm | 181 +++++++++++++++++++++++++++++++++++++++-- tests/import-utils.scm | 162 ++++++++++++++++++++++++++++++++++++ 2 files changed, 336 insertions(+), 7 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 4694b6e7ef..6932614f8e 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,6 +33,7 @@ #:use-module (guix discovery) #:use-module (guix build-system) #:use-module (guix gexp) + #:use-module (guix memoization) #:use-module (guix store) #:use-module (guix download) #:use-module (gnu packages) @@ -43,6 +45,8 @@ #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) #:use-module (srfi srfi-41) + #:use-module (semver) + #:use-module (semver ranges) #:export (factorize-uri flatten @@ -69,7 +73,8 @@ guix-name - recursive-import)) + recursive-import + recursive-import-semver)) (define (factorize-uri uri version) "Factorize URI, a package tarball URI as a string, such that any occurrences @@ -257,13 +262,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional (latest #t)) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if latest + name + (string-append name "-" version))) ,guix-package)))) (define (build-system-modules) @@ -414,3 +421,163 @@ dependencies." step ;; initial state (step initial-state))) + +(define* (recursive-import-semver #:key name + (version #f) + name->metadata + metadata->package + metadata-versions + package-dependencies + dependency-name + dependency-range + guix-name + make-sexp) + "Generates a stream of package expressions for the dependencies of the given +NAME and VERSION. The dependencies will be resolved using semantic versioning. +This procedure makes the assumption that most package repositories will, for a +given package provide some on that package that includes what +versions of the package that are available and a list of dependencies for each +version. Dependencies are assumed to be composed of a NAME, a semantic RANGE and +other data. + +This procedure takes the following keys: + NAME - The name of the package to import + VERSION - The version of the package to import + NAME->METADATA - A procedure that takes a NAME of a package and returns that +package's + METADATA->PACKAGE A procedure that takes a package's and VERSION +and returns the for the given VERSION + METADATA-VERSIONS A procedure that that takes a packages and +returns a list of version as strings that are available for the given package + PACKAGE-DEPENDENCIES a procedure that returns a list of given a + + DEPENDENCY-NAME A procedure that takes a and returns the its name + DEPENDENCY-RANGE A procedure that takes a and returns that +decency's range as a string + GUIX-NAME A procedure that take a NAME and returns the Guix version of it + MAKE-SEXP A procedure that takes , and a list of pairs +containing (EXPORT-NAME ), returning the package expression as an +s-expression" + (define mem-name->metadata (memoize name->metadata)) + + (define (latest? versions version) + (equal? (car versions) version)) + + (define (sorted-versions metadata) + (sort (metadata-versions metadata) version>?)) + + (define (name->versions name) + (sorted-versions (mem-name->metadata name))) + + (define (semver-range-contains-string? range version) + (semver-range-contains? range + (string->semver version))) + + (define (guix-export-name name version) + (let ((versions (name->versions name)) + (name (guix-name name))) + (if (latest? versions version) + name + (string-append name "-" version)))) + + ;; checks to see if we already defined or want to define a dep + (define (find-known name range known) + (match + (find + (match-lambda ((dep-name version) + (and + (string=? dep-name name) + (semver-range-contains-string? range version)))) + known) + + (#f #f) + ((name version) (list (guix-export-name name version) version #f))) + ) + + ;; searches searches for a package in guix + (define (find-locally name range) + (match + (find + (match-lambda ((_ _ package) + (semver-range-contains-string? + range + (package-version package)))) + (find-packages-by-name*/direct (guix-name name))) + (#f #f) + ((_ export-symbol package) (list + (symbol->string export-symbol) + (package-version package) #f)))) + + ;; searches for a package in some external repo + (define (find-remote name range) + (let* ((versions (name->versions name)) + (version (find + (lambda (ver) + (semver-range-contains-string? range ver)) + versions)) + (export-name (guix-export-name name version))) + `(,export-name ,version #t))) + + + (define (find-dep-version dep known-deps) + (let* ((name (dependency-name dep)) + (range (string->semver-range (dependency-range dep))) + (export-name-version-needed + (or (find-known name range known-deps) + (find-locally name range) + (find-remote name range)))) + `(,name ,@export-name-version-needed ,dep) + )) + + (define (make-package-definition name version known-deps) + (let* ((metadata (mem-name->metadata name)) + (versions (sorted-versions metadata)) + (package (metadata->package metadata version)) + (deps (map (lambda (dep) + (find-dep-version dep known-deps)) + (package-dependencies package))) + (sexp + (make-sexp metadata package + (map + (match-lambda ((_ export-symbol _ _ dep) + (list export-symbol dep))) + deps)))) + (values + (package->definition sexp (latest? versions version)) + (filter-map + (match-lambda ((name _ version need? dep) + (if need? + (list name version) + #f))) + deps)))) + + (define initial-state + (list #f + (list + ;; packages to find + (list name (if version + version + (car (name->versions name))))) + ;; packages that have been found + (list))) + + (define (step state) + (match state + ((prev ((next-name next-version) . rest) done) + (receive (package dependencies) + (make-package-definition next-name next-version + (append done rest `((,next-name ,next-version)))) + (list + package + (append rest dependencies) + (cons (list next-name next-version) done)))) + ((prev '() done) + (list #f '() done)))) + + (stream-unfold + ;; map: produce a stream element + (match-lambda ((latest queue done) latest)) + ;; predicate + (match-lambda ((latest queue done) latest)) + step + (step initial-state))) diff --git a/tests/import-utils.scm b/tests/import-utils.scm index c3ab25d788..4ed3a5e1da 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2016 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,6 +25,10 @@ #:use-module (guix packages) #:use-module (guix build-system) #:use-module (gnu packages) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-41) #:use-module (srfi srfi-64)) (test-begin "import-utils") @@ -120,4 +125,161 @@ ("license" . #f)))) (package-native-inputs (alist->package meta)))) +(define-record-type + (make-metadata name versions) + metadata? + (name metadata-name) + (versions metadata-versions)) + +(define-record-type + (make-package version dependencies) + package? + (version package-version) + (dependencies package-dependencies)) + +(define-record-type + (make-dependency name range) + dependency? + (name dependency-name) + (range dependency-range)) + +(define (metadata-semver-versions metadata) + (map (lambda (p) + (package-version p)) + (metadata-versions metadata))) + +(define (metadata->package metadata version) + (find + (lambda (package) + (equal? (package-version package) version)) + (metadata-versions metadata))) + +(define (make-sexp metadata package dependencies) + `(package + (name ,(guix-name (metadata-name metadata))) + (version ,(package-version package)) + (dependcies ,(map + (match-lambda ((public-name dep) + (list (guix-name (dependency-name dep)) public-name))) + dependencies)))) + +(define (guix-name name) + (string-append "test-" name)) + +(define packages + `(("no-deps" . (("1.0.0" . ()) ("0.1.0" . ()))) + ("one-dep" . (("1.0.0" . (("no-deps" "^1.0"))) + ("0.1.0" . (("no-deps" "^0.1.0"))))) + ("shared-dep" . (("1.0.0" . (("one-dep" "^0.1.0") + ("no-deps" "*"))))) + ("recursive" . (("1.0.0" . (("recursive" "=1.0.0"))))) + ("already-packaged" . (("1.0.0" . (("rust" "~1.28"))))))) + +(define (name->metadata name) + (let ((versions (assoc-ref packages name))) + (make-metadata name + (map + (match-lambda + ((version . deps) + (make-package version + (map + (lambda (name-range) + (apply make-dependency name-range)) + deps)))) + versions)))) + +(define* (test-recursive-importer name version #:optional (guix-name guix-name)) + (recursive-import-semver #:name name + #:version version + #:name->metadata name->metadata + #:metadata->package metadata->package + #:metadata-versions metadata-semver-versions + #:package-dependencies package-dependencies + #:dependency-name dependency-name + #:dependency-range dependency-range + #:guix-name guix-name + #:make-sexp make-sexp)) + +(test-equal "recursive import test with no dependencies" + `((define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "no-deps" "1.0.0"))) + +(test-equal "recursive import test with one dependencies" + `((define-public test-one-dep + (package + (name "test-one-dep") + (version "1.0.0") + (dependcies (("test-no-deps" "test-no-deps"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "1.0.0"))) + +(test-equal "recursive import test with recursuve dependencies" + `((define-public test-recursive + (package + (name "test-recursive") + (version "1.0.0") + (dependcies (("test-recursive" "test-recursive")))))) + (stream->list (test-recursive-importer "recursive" "1.0.0"))) + +(test-equal "recursive import test with no dependencies using an old version" + `((define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies ())))) + (stream->list (test-recursive-importer "no-deps" "0.1.0"))) + +(test-equal "recursive import test with one dependencies unsing an old version" + `((define-public test-one-dep-0.1.0 + (package + (name "test-one-dep") + (version "0.1.0") + (dependcies (("test-no-deps" "test-no-deps-0.1.0"))))) + (define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "0.1.0"))) + +(test-equal "recursive import test with with dependency that is already in the repo" + `((define-public test-already-packaged + (package (name "test-already-packaged") + (version "1.0.0") + (dependcies + (("test-rust" "rust-1.28")))))) + (stream->list (test-recursive-importer "already-packaged" "1.0.0" identity))) + +(test-equal "shared dependencies" + `((define-public test-shared-dep + (package + (name "test-shared-dep") + (version "1.0.0") + (dependcies (("test-one-dep" "test-one-dep-0.1.0") + ("test-no-deps" "test-no-deps"))))) + (define-public test-one-dep-0.1.0 + (package + (name "test-one-dep") + (version "0.1.0") + (dependcies (("test-no-deps" "test-no-deps-0.1.0"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ()))) + (define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies())))) + (stream->list (test-recursive-importer "shared-dep" "1.0.0"))) + (test-end "import-utils") -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 27 19:17:09 2019 Received: (at 38408) by debbugs.gnu.org; 28 Nov 2019 00:17:09 +0000 Received: from localhost ([127.0.0.1]:56423 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ia7Ua-0005Jw-JM for submit@debbugs.gnu.org; Wed, 27 Nov 2019 19:17:09 -0500 Received: from mx1.riseup.net ([198.252.153.129]:60826) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ia7UW-0005JX-L2 for 38408@debbugs.gnu.org; Wed, 27 Nov 2019 19:17:05 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47NdVm1XhYzFc8t; Wed, 27 Nov 2019 16:17:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1574900224; bh=/mXFFri2VLK/k5oza9VQ6xurOa3MksoTDnW4B/KLRgU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j6HAEevctbiN43UD2dCmonh0lawsWk1SwSfa74S+tM97vggVCjv54q2FvraFhUEmT 2knHTrEcOIJr78SZC3EnYZwSbiwf52v+qMrLv5o3t88wGLz080BlETKe1Ra4nzmJ+o yptZ1RnJIAiihKKOgY/mIbWV93ngIe3CCdnASLZw= X-Riseup-User-ID: F8BB018A11D7E30E0E949BA46BDE0C66D376523D546EB4CC9673DDE5AB5CD909 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47NdVl3sxSz8tTD; Wed, 27 Nov 2019 16:17:03 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH 3/3] Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. Date: Wed, 27 Nov 2019 19:16:52 -0500 Message-Id: <052524339786cd4c0db5fda81547239c8bee6003.1574897905.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: efraim@flashner.co.il, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (make-crate-sexp): Use as args * guix/import/crate.scm (crate->crate-version): New Procedure * guix/import/crate.scm (crate->versions): New Procedure * guix/import/crate.scm (crate-recursive-import): Updated to user recursive-import-semver * guix/scripts/import/crate.scm (guix-import-crate): Remove `define-public` generation from UI * guix/tests/crate.scm: Updated tests --- guix/import/crate.scm | 165 ++++++++++++++++++---------------- guix/scripts/import/crate.scm | 9 +- tests/crate.scm | 2 +- 3 files changed, 91 insertions(+), 85 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 8dc014d232..da92c43b8c 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name crate-recursive-import @@ -85,7 +86,7 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string @@ -111,7 +112,9 @@ record or #f if it was not found." (url (string-append (%crate-base-url) path))) (match (assoc-ref (or (json-fetch url) '()) "dependencies") ((? vector? vector) - (map json->crate-dependency (vector->list vector))) + (filter (lambda (dep) + (not (eq? (crate-dependency-kind dep) 'dev))) + (map json->crate-dependency (vector->list vector)))) (_ '())))) @@ -141,62 +144,84 @@ record or #f if it was not found." ((args ...) `((arguments (,'quasiquote ,args)))))) -(define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) - "Return the `package' s-expression for a rust package with the given NAME, -VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, -and LICENSE." - (let* ((port (http-fetch (crate-uri name version))) +(define (make-crate-sexp crate version* dependencies) + "Return the `package' s-expression for a rust package given , + and a list of " + (define normal-dependency? + (match-lambda ((_ dep) (not (eq? (crate-dependency-kind dep) 'dev))))) + + (define (string->license string) + (match (regexp-exec %dual-license-rx string) + (#f (list (spdx-string->license string))) + (m (list (spdx-string->license (match:substring m 1)) + (spdx-string->license (match:substring m 2)))))) + + (let* ((dep-crates dev-dep-crates (partition normal-dependency? dependencies)) + (cargo-inputs (sort (unzip1 dep-crates) + string-ci (crate-version-license version*) + string->license)) + (port (http-fetch (crate-uri name version)) ) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) (pkg `(package - (name ,guix-name) - (version ,version) - (source (origin - (method url-fetch) - (uri (crate-uri ,name version)) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 - (base32 - ,(bytevector->nix-base32-string (port-sha256 port)))))) - (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) - (maybe-cargo-development-inputs - cargo-development-inputs))) - (home-page ,(match home-page - (() "") - (_ home-page))) - (synopsis ,synopsis) - (description ,(beautify-description description)) - (license ,(match license - (() #f) - ((license) license) - (_ `(list ,@license))))))) - (close-port port) - pkg)) + (name ,guix-name) + (version ,version) + (source (origin + (method url-fetch) + (uri (crate-uri ,name version)) + (file-name (string-append name "-" version ".crate")) + (sha256 + (base32 + ,(bytevector->nix-base32-string (port-sha256 port)))))) + (build-system cargo-build-system) + ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + (maybe-cargo-development-inputs + cargo-development-inputs))) + (home-page ,(match home-page + (() "") + (_ home-page))) + (synopsis ,synopsis) + (description ,(beautify-description description)) + (license ,(match license + (() #f) + ((license) license) + (_ `(list ,@license))))))) + + (close-port port) + pkg)) (define %dual-license-rx ;; Dual licensing is represented by a string such as "MIT OR Apache-2.0". ;; This regexp matches that. (make-regexp "^(.*) OR (.*)$")) +(define (crate->crate-version crate version-number) + "returns the for a given CRATE and VERSION-NUMBER" + (find (lambda (version) + (string=? (crate-version-number version) + version-number)) + (crate-versions crate))) + +(define (crate->versions crate) + "Returns a list of versions for a given CRATE" + (map (lambda (version) + (crate-version-number version)) + (crate-versions crate))) + (define* (crate->guix-package crate-name #:optional version) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." - (define (string->license string) - (match (regexp-exec %dual-license-rx string) - (#f (list (spdx-string->license string))) - (m (list (spdx-string->license (match:substring m 1)) - (spdx-string->license (match:substring m 2)))))) - - (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) - (define crate (lookup-crate crate-name)) @@ -205,38 +230,27 @@ latest version of CRATE-NAME." (crate-latest-version crate))) (define version* - (find (lambda (version) - (string=? (crate-version-number version) - version-number)) - (crate-versions crate))) + (crate->crate-version crate version-number)) - (and crate version* - (let* ((dependencies (crate-version-dependencies version*)) - (dep-crates (filter normal-dependency? dependencies)) - (dev-dep-crates (remove normal-dependency? dependencies)) - (cargo-inputs (sort (map crate-dependency-id dep-crates) - string-ci (crate-version-license version*) - string->license)) - (append cargo-inputs cargo-development-inputs))))) + (define dependencies (map + (lambda (dep) + (list (crate-name->package-name + (crate-dependency-id dep)) dep)) + (crate-version-dependencies version*))) + (make-crate-sexp crate version* dependencies)) -(define (crate-recursive-import crate-name) - (recursive-import crate-name #f - #:repo->guix-package (lambda (name repo) - (crate->guix-package name)) - #:guix-name crate-name->package-name)) +(define* (crate-recursive-import name #:optional version) + (recursive-import-semver + #:name name + #:version version + #:name->metadata lookup-crate + #:metadata->package crate->crate-version + #:metadata-versions crate->versions + #:package-dependencies crate-version-dependencies + #:dependency-name crate-dependency-id + #:dependency-range crate-dependency-requirement + #:guix-name crate-name->package-name + #:make-sexp make-crate-sexp)) (define (guix-package->crate-name package) "Return the crate name of PACKAGE." @@ -285,4 +299,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 4690cceb4d..85ae6fbe59 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,14 +96,7 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (reverse - (stream->list - (crate-recursive-import name)))) + (stream->list (crate-recursive-import name version)) (let ((sexp (crate->guix-package name version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") diff --git a/tests/crate.scm b/tests/crate.scm index c14862ad9f..b77cbb08c6 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -95,7 +95,7 @@ ('source ('origin ('method 'url-fetch) ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) + ('file-name ('string-append 'name "-" 'version ".crate")) ('sha256 ('base32 (? string? hash))))) -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Fri Nov 29 10:59:39 2019 Received: (at 38408) by debbugs.gnu.org; 29 Nov 2019 15:59:39 +0000 Received: from localhost ([127.0.0.1]:33456 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iaigF-0004BS-ML for submit@debbugs.gnu.org; Fri, 29 Nov 2019 10:59:39 -0500 Received: from mx1.riseup.net ([198.252.153.129]:40424) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iaigE-0004BK-BE for 38408@debbugs.gnu.org; Fri, 29 Nov 2019 10:59:38 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47PfMq74FFzFbVv; Fri, 29 Nov 2019 07:59:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575043176; bh=TokIIb6oyCmWgogNtv73u5/YNZQFko3fbGcl0cMfZUg=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=M1DGJlRCsBCaK2egVIVfQ2A9an/80oYvUDqnuTk3IToWsBLZLYGfCMn5lBL2KlsmJ PmqPeyI9gx6dixe6J8gzicUpbHMxjK0x1SxkyiYg6LsaI9c4pl6gdje5rutEPe1+Ag ldRCELOP69o6z+iXM2q2tGNCvwDDjTydCgfYPz4o= X-Riseup-User-ID: 1B0D3487749973B0BDE0A930AEB82705895992682D0832DAF91F7E9383AF04BE Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47PfMq4qBvz8tTy; Fri, 29 Nov 2019 07:59:35 -0800 (PST) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_8c7ff32fd889d85d2c755905a8cf8680" Date: Fri, 29 Nov 2019 07:59:35 -0800 From: Martin Becze To: Efraim Flashner Subject: Re: [PATCH] WIP patches for the rust importer In-Reply-To: <20191128122255.GT1124@E5400> References: <20191126120408.GL1124@E5400> <1E01C051-2EE5-4050-B826-C60E858AAC2B@flashner.co.il> <0b2db52d687fc2acf34dc1e00618dae7.squirrel@sm.riseup.net> <20191128122255.GT1124@E5400> Message-ID: <8981451ac5d914dd5f53fa928741b846@riseup.net> X-Debbugs-Envelope-To: 38408 Cc: guix-devel@gnu.org, 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --=_8c7ff32fd889d85d2c755905a8cf8680 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII On 2019-11-28 12:22, Efraim Flashner wrote: > On Wed, Nov 27, 2019 at 04:36:20PM -0800, mjbecze@riseup.net wrote: >> >> > I'd love to see what you have so far if you want to share >> >> Okie Dokie, I posted it and cc'd ya. >> >> Also I took a look at your patches. >> 0001-import-crate-Don-t-include-optional-dependencies.patch should work >> just fine with my patch. But >> 0003-import-crate-Honor-versioned-dependencies-when-impor.patch will not >> work. >> >> I took a different route here with the naming. If you are interested take >> a look take a look at my second patch. (recusive-import-semver) only will >> add the version number to the name if the crate being imported is not the >> latest version. I thought this was more inline with the canonical names, >> but if always adding version number the export symbol is desirable it will >> simplify things. >> > > I'll take a look at it in a minute. I figured with the versioned > requirements we would always want to be specific in version numbers for > crate dependents so I figured it made sense. Also, if we did want to > provide an unversioned '-latest' version we could declare an extra > variable '(define-public rust-libc rust-libc-0.2)' and now rust-libc > points to rust-libc-0.2. > >> Also I added a function (find-packages-by-name*/direct) to packages.scm >> which will return the export symbol of a package that already exists. I >> use this in case there are some non-canocal export name already added. >> I added the no-optional-dep logic to the recusive-semver patch (https://issues.guix.gnu.org/issue/38408), but it seems to break packages. I'm testing on the recursive importer on "hello-cli". Attach is the patch to add the logic and the before and after output for "guix import crate -r hello-cli". Removing all the optional deps breaks clap here for some reason which I haven't figured out. --=_8c7ff32fd889d85d2c755905a8cf8680 Content-Transfer-Encoding: base64 Content-Type: text/plain; name=after.scm Content-Disposition: attachment; filename=after.scm; size=4344 KGRlZmluZS1tb2R1bGUgKGdudSBwYWNrYWdlcyBjcmF0ZXMtaW8pCiAgIzp1c2UtbW9kdWxlIChn dWl4IGJ1aWxkLXN5c3RlbSBjYXJnbykKICAjOnVzZS1tb2R1bGUgKGd1aXggZG93bmxvYWQpCiAg Izp1c2UtbW9kdWxlICgoZ3VpeCBsaWNlbnNlcykgIzpwcmVmaXggbGljZW5zZTopCiAgIzp1c2Ut bW9kdWxlIChndWl4IHBhY2thZ2VzKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtaGVsbG8tY2xpCiAg KHBhY2thZ2UKICAgIChuYW1lICJydXN0LWhlbGxvLWNsaSIpCiAgICAodmVyc2lvbiAiMC4yLjIi KQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAg ICAgICAgKHVyaSAoY3JhdGUtdXJpICJoZWxsby1jbGkiIHZlcnNpb24pKQogICAgICAgIChmaWxl LW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIp KQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjBxaWxqOWI5 NGlnN3oxNjBrYXprNDFrMml5MWhwcmRrNXF3YXltNGZuZjV4OWZpa3NpbGQiKSkpKQogICAgKGJ1 aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpj YXJnby1pbnB1dHMgKCgicnVzdC1jbGFwIiAscnVzdC1jbGFwKSkpKQogICAgKGhvbWUtcGFnZQog ICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2Zwb2xpL3J1c3QtaGVsbG8tY2xpIikKICAgIChzeW5v cHNpcyAiUHJpbnRzIGEgbmljZSAnSGVsbG8gV29ybGQhJyBtZXNzYWdlIikKICAgIChkZXNjcmlw dGlvbgogICAgICAiUHJpbnRzIGEgbmljZSAnSGVsbG8gV29ybGQhJyBtZXNzYWdlIikKICAgIChs aWNlbnNlIGxpY2Vuc2U6ZXhwYXQpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtY2xhcAogIChwYWNr YWdlCiAgICAobmFtZSAicnVzdC1jbGFwIikKICAgICh2ZXJzaW9uICIyLjMzLjAiKQogICAgKHNv dXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVy aSAoY3JhdGUtdXJpICJjbGFwIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAg ICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hh MjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxbmY2bGQzYmltczFuNXZmemhrdmNi NTVwZHpoMDRiYmh6ZjhuaWw1dnZ3MDVueHphcnNoIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2Fy Z28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAg ICAgICAgKCgicnVzdC1iaXRmbGFncyIgLHJ1c3QtYml0ZmxhZ3MpCiAgICAgICAgICgicnVzdC10 ZXh0d3JhcCIgLHJ1c3QtdGV4dHdyYXApCiAgICAgICAgICgicnVzdC11bmljb2RlLXdpZHRoIiAs cnVzdC11bmljb2RlLXdpZHRoKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9jbGFwLnJzLyIp CiAgICAoc3lub3BzaXMKICAgICAgIkEgc2ltcGxlIHRvIHVzZSwgZWZmaWNpZW50LCBhbmQgZnVs bC1mZWF0dXJlZCBDb21tYW5kIExpbmUgQXJndW1lbnQgUGFyc2VyCiIpCiAgICAoZGVzY3JpcHRp b24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHNpbXBsZSB0byB1c2UsIGVmZmljaWVu dCwgYW5kIGZ1bGwtZmVhdHVyZWQgQ29tbWFuZCBMaW5lIEFyZ3VtZW50IFBhcnNlcgoiKQogICAg KGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1iaXRmbGFncwog IChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1iaXRmbGFncyIpCiAgICAodmVyc2lvbiAiMS4yLjEi KQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAg ICAgICAgKHVyaSAoY3JhdGUtdXJpICJiaXRmbGFncyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUt bmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikp CiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMTRxbmQ1bnE4 cDJhbG1rNzltNG04eWRxaGQ0MTN5YXhzeWpwNXhkMTlnM21pa3pmNDdmZyIpKSkpCiAgICAoYnVp bGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBz Oi8vZ2l0aHViLmNvbS9iaXRmbGFncy9iaXRmbGFncyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEg bWFjcm8gdG8gZ2VuZXJhdGUgc3RydWN0dXJlcyB3aGljaCBiZWhhdmUgbGlrZSBiaXRmbGFncy4K IikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgbWFjcm8g dG8gZ2VuZXJhdGUgc3RydWN0dXJlcyB3aGljaCBiZWhhdmUgbGlrZSBiaXRmbGFncy4KIikKICAg IChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXRleHR3cmFwCiAgKHBhY2thZ2UK ICAgIChuYW1lICJydXN0LXRleHR3cmFwIikKICAgICh2ZXJzaW9uICIwLjExLjAiKQogICAgKHNv dXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVy aSAoY3JhdGUtdXJpICJ0ZXh0d3JhcCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAg ICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAg KHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMHE1aGt5MDNpazN5NTBzOXN6 MjVyNDM4YmM0bndocWM2ZHF3eW52NHd5bGM4MDduMjluayIpKSkpCiAgICAoYnVpbGQtc3lzdGVt IGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0 cwogICAgICAgICgoInJ1c3QtdW5pY29kZS13aWR0aCIgLHJ1c3QtdW5pY29kZS13aWR0aCkpKSkK ICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9tZ2Vpc2xlci90ZXh0d3Jh cCIpCiAgICAoc3lub3BzaXMKICAgICAgIlRleHR3cmFwIGlzIGEgc21hbGwgbGlicmFyeSBmb3Ig d29yZCB3cmFwcGluZywgaW5kZW50aW5nLCBhbmQKZGVkZW50aW5nIHN0cmluZ3MuCgpZb3UgY2Fu IHVzZSBpdCB0byBmb3JtYXQgc3RyaW5ncyAoc3VjaCBhcyBoZWxwIGFuZCBlcnJvciBtZXNzYWdl cykgZm9yCmRpc3BsYXkgaW4gY29tbWFuZGxpbmUgYXBwbGljYXRpb25zLiBJdCBpcyBkZXNpZ25l ZCB0byBiZSBlZmZpY2llbnQKYW5kIGhhbmRsZSBVbmljb2RlIGNoYXJhY3RlcnMgY29ycmVjdGx5 LgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUZXh0d3JhcCBpcyBhIHNtYWxsIGxpYnJhcnkg Zm9yIHdvcmQgd3JhcHBpbmcsIGluZGVudGluZywgYW5kCmRlZGVudGluZyBzdHJpbmdzLgoKWW91 IGNhbiB1c2UgaXQgdG8gZm9ybWF0IHN0cmluZ3MgKHN1Y2ggYXMgaGVscCBhbmQgZXJyb3IgbWVz c2FnZXMpIGZvcgpkaXNwbGF5IGluIGNvbW1hbmRsaW5lIGFwcGxpY2F0aW9ucy4gIEl0IGlzIGRl c2lnbmVkIHRvIGJlIGVmZmljaWVudAphbmQgaGFuZGxlIFVuaWNvZGUgY2hhcmFjdGVycyBjb3Jy ZWN0bHkuCiIpCiAgICAobGljZW5zZSBsaWNlbnNlOmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBy dXN0LXVuaWNvZGUtd2lkdGgKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtdW5pY29kZS13aWR0 aCIpCiAgICAodmVyc2lvbiAiMC4xLjYiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAg ICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJ1bmljb2RlLXdp ZHRoIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVu ZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAo YmFzZTMyCiAgICAgICAgICAgICIwODJmOWh2MXIzZ2NkMXhsMzN3aGpocm0xOHAwdzlpNzd6aGho a2ljY2I1cjQ3YWRuMXZoIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVt KQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3VuaWNvZGUtcnMvdW5p Y29kZS13aWR0aCIpCiAgICAoc3lub3BzaXMKICAgICAgIkRldGVybWluZSBkaXNwbGF5ZWQgd2lk dGggb2YgYGNoYXJgIGFuZCBgc3RyYCB0eXBlcwphY2NvcmRpbmcgdG8gVW5pY29kZSBTdGFuZGFy ZCBBbm5leCAjMTEgcnVsZXMuCiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkRldGVybWluZSBk aXNwbGF5ZWQgd2lkdGggb2YgYGNoYXJgIGFuZCBgc3RyYCB0eXBlcwphY2NvcmRpbmcgdG8gVW5p Y29kZSBTdGFuZGFyZCBBbm5leCAjMTEgcnVsZXMuCiIpCiAgICAobGljZW5zZSAjZikpKQoKcnVz dC1oZWxsby1jbGkK --=_8c7ff32fd889d85d2c755905a8cf8680 Content-Transfer-Encoding: base64 Content-Type: text/plain; name=before.scm Content-Disposition: attachment; filename=before.scm; size=171694 KGRlZmluZS1tb2R1bGUgKGhlbGxvLWNsaSkKICAjOnVzZS1tb2R1bGUgKGd1aXggYnVpbGQtc3lz dGVtIGNhcmdvKQogICM6dXNlLW1vZHVsZSAoZ3VpeCBkb3dubG9hZCkKICAjOnVzZS1tb2R1bGUg KChndWl4IGxpY2Vuc2VzKSAjOnByZWZpeCBsaWNlbnNlOikKICAjOnVzZS1tb2R1bGUgKGd1aXgg cGFja2FnZXMpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1oZWxsby1jbGkKICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtaGVsbG8tY2xpIikKICAgICh2ZXJzaW9uICIwLjIuMiIpCiAgICAoc291cmNl CiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChj cmF0ZS11cmkgImhlbGxvLWNsaSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAg ICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNo YTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMHFpbGo5Yjk0aWc3ejE2MGthems0 MWsyaXkxaHByZGs1cXdheW00Zm5mNXg5Zmlrc2lsZCIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNh cmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cyAo KCJydXN0LWNsYXAiICxydXN0LWNsYXApKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczov L2dpdGh1Yi5jb20vZnBvbGkvcnVzdC1oZWxsby1jbGkiKQogICAgKHN5bm9wc2lzICJQcmludHMg YSBuaWNlICdIZWxsbyBXb3JsZCEnIG1lc3NhZ2UiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJQ cmludHMgYSBuaWNlICdIZWxsbyBXb3JsZCEnIG1lc3NhZ2UiKQogICAgKGxpY2Vuc2UgbGljZW5z ZTpleHBhdCkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1jbGFwCiAgKHBhY2thZ2UKICAgIChuYW1l ICJydXN0LWNsYXAiKQogICAgKHZlcnNpb24gIjIuMzMuMCIpCiAgICAoc291cmNlCiAgICAgIChv cmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkg ImNsYXAiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBw ZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAg IChiYXNlMzIKICAgICAgICAgICAgIjFuZjZsZDNiaW1zMW41dmZ6aGt2Y2I1NXBkemgwNGJiaHpm OG5pbDV2dncwNW54emFyc2giKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0 ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0 LWFuc2ktdGVybS0wLjExLjAiICxydXN0LWFuc2ktdGVybS0wLjExLjApCiAgICAgICAgICgicnVz dC1hdHR5IiAscnVzdC1hdHR5KQogICAgICAgICAoInJ1c3QtYml0ZmxhZ3MiICxydXN0LWJpdGZs YWdzKQogICAgICAgICAoInJ1c3QtY2xpcHB5IiAscnVzdC1jbGlwcHkpCiAgICAgICAgICgicnVz dC1zdHJzaW0tMC44LjAiICxydXN0LXN0cnNpbS0wLjguMCkKICAgICAgICAgKCJydXN0LXRlcm0t c2l6ZS0wLjMuMSIgLHJ1c3QtdGVybS1zaXplLTAuMy4xKQogICAgICAgICAoInJ1c3QtdGV4dHdy YXAiICxydXN0LXRleHR3cmFwKQogICAgICAgICAoInJ1c3QtdW5pY29kZS13aWR0aCIgLHJ1c3Qt dW5pY29kZS13aWR0aCkKICAgICAgICAgKCJydXN0LXZlYy1tYXAiICxydXN0LXZlYy1tYXApCiAg ICAgICAgICgicnVzdC15YW1sLXJ1c3QtMC4zLjUiICxydXN0LXlhbWwtcnVzdC0wLjMuNSkpKSkK ICAgIChob21lLXBhZ2UgImh0dHBzOi8vY2xhcC5ycy8iKQogICAgKHN5bm9wc2lzCiAgICAgICJB IHNpbXBsZSB0byB1c2UsIGVmZmljaWVudCwgYW5kIGZ1bGwtZmVhdHVyZWQgQ29tbWFuZCBMaW5l IEFyZ3VtZW50IFBhcnNlcgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2Ug cHJvdmlkZXMgYSBzaW1wbGUgdG8gdXNlLCBlZmZpY2llbnQsIGFuZCBmdWxsLWZlYXR1cmVkIENv bW1hbmQgTGluZSBBcmd1bWVudCBQYXJzZXIKIikKICAgIChsaWNlbnNlIGxpY2Vuc2U6ZXhwYXQp KSkKCihkZWZpbmUtcHVibGljIHJ1c3QtYml0ZmxhZ3MKICAocGFja2FnZQogICAgKG5hbWUgInJ1 c3QtYml0ZmxhZ3MiKQogICAgKHZlcnNpb24gIjEuMi4xIikKICAgIChzb3VyY2UKICAgICAgKG9y aWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAi Yml0ZmxhZ3MiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmct YXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAg ICAgIChiYXNlMzIKICAgICAgICAgICAgIjE0cW5kNW5xOHAyYWxtazc5bTRtOHlkcWhkNDEzeWF4 c3lqcDV4ZDE5ZzNtaWt6ZjQ3ZmciKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1z eXN0ZW0pCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vYml0ZmxhZ3Mv Yml0ZmxhZ3MiKQogICAgKHN5bm9wc2lzCiAgICAgICJBIG1hY3JvIHRvIGdlbmVyYXRlIHN0cnVj dHVyZXMgd2hpY2ggYmVoYXZlIGxpa2UgYml0ZmxhZ3MuCiIpCiAgICAoZGVzY3JpcHRpb24KICAg ICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIG1hY3JvIHRvIGdlbmVyYXRlIHN0cnVjdHVyZXMg d2hpY2ggYmVoYXZlIGxpa2UgYml0ZmxhZ3MuCiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmlu ZS1wdWJsaWMgcnVzdC10ZXh0d3JhcAogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC10ZXh0d3Jh cCIpCiAgICAodmVyc2lvbiAiMC4xMS4wIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAg ICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAidGV4dHdyYXAi IHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5h bWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNl MzIKICAgICAgICAgICAgIjBxNWhreTAzaWszeTUwczlzejI1cjQzOGJjNG53aHFjNmRxd3ludjR3 eWxjODA3bjI5bmsiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAg ICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWh5cGhl bmF0aW9uIiAscnVzdC1oeXBoZW5hdGlvbikKICAgICAgICAgKCJydXN0LXRlcm0tc2l6ZS0wLjMu MSIgLHJ1c3QtdGVybS1zaXplLTAuMy4xKQogICAgICAgICAoInJ1c3QtdW5pY29kZS13aWR0aCIg LHJ1c3QtdW5pY29kZS13aWR0aCkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0 aHViLmNvbS9tZ2Vpc2xlci90ZXh0d3JhcCIpCiAgICAoc3lub3BzaXMKICAgICAgIlRleHR3cmFw IGlzIGEgc21hbGwgbGlicmFyeSBmb3Igd29yZCB3cmFwcGluZywgaW5kZW50aW5nLCBhbmQKZGVk ZW50aW5nIHN0cmluZ3MuCgpZb3UgY2FuIHVzZSBpdCB0byBmb3JtYXQgc3RyaW5ncyAoc3VjaCBh cyBoZWxwIGFuZCBlcnJvciBtZXNzYWdlcykgZm9yCmRpc3BsYXkgaW4gY29tbWFuZGxpbmUgYXBw bGljYXRpb25zLiBJdCBpcyBkZXNpZ25lZCB0byBiZSBlZmZpY2llbnQKYW5kIGhhbmRsZSBVbmlj b2RlIGNoYXJhY3RlcnMgY29ycmVjdGx5LgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUZXh0 d3JhcCBpcyBhIHNtYWxsIGxpYnJhcnkgZm9yIHdvcmQgd3JhcHBpbmcsIGluZGVudGluZywgYW5k CmRlZGVudGluZyBzdHJpbmdzLgoKWW91IGNhbiB1c2UgaXQgdG8gZm9ybWF0IHN0cmluZ3MgKHN1 Y2ggYXMgaGVscCBhbmQgZXJyb3IgbWVzc2FnZXMpIGZvcgpkaXNwbGF5IGluIGNvbW1hbmRsaW5l IGFwcGxpY2F0aW9ucy4gIEl0IGlzIGRlc2lnbmVkIHRvIGJlIGVmZmljaWVudAphbmQgaGFuZGxl IFVuaWNvZGUgY2hhcmFjdGVycyBjb3JyZWN0bHkuCiIpCiAgICAobGljZW5zZSBsaWNlbnNlOmV4 cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXVuaWNvZGUtd2lkdGgKICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtdW5pY29kZS13aWR0aCIpCiAgICAodmVyc2lvbiAiMC4xLjYiKQogICAgKHNv dXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVy aSAoY3JhdGUtdXJpICJ1bmljb2RlLXdpZHRoIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1l CiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAg ICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwODJmOWh2MXIzZ2Nk MXhsMzN3aGpocm0xOHAwdzlpNzd6aGhoa2ljY2I1cjQ3YWRuMXZoIikpKSkKICAgIChidWlsZC1z eXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28t aW5wdXRzCiAgICAgICAgKCgicnVzdC1jb21waWxlci1idWlsdGlucyIKICAgICAgICAgICxydXN0 LWNvbXBpbGVyLWJ1aWx0aW5zKQogICAgICAgICAoInJ1c3QtcnVzdGMtc3RkLXdvcmtzcGFjZS1j b3JlIgogICAgICAgICAgLHJ1c3QtcnVzdGMtc3RkLXdvcmtzcGFjZS1jb3JlKQogICAgICAgICAo InJ1c3QtcnVzdGMtc3RkLXdvcmtzcGFjZS1zdGQiCiAgICAgICAgICAscnVzdC1ydXN0Yy1zdGQt d29ya3NwYWNlLXN0ZCkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNv bS91bmljb2RlLXJzL3VuaWNvZGUtd2lkdGgiKQogICAgKHN5bm9wc2lzCiAgICAgICJEZXRlcm1p bmUgZGlzcGxheWVkIHdpZHRoIG9mIGBjaGFyYCBhbmQgYHN0cmAgdHlwZXMKYWNjb3JkaW5nIHRv IFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzExIHJ1bGVzLgoiKQogICAgKGRlc2NyaXB0aW9uCiAg ICAgICJEZXRlcm1pbmUgZGlzcGxheWVkIHdpZHRoIG9mIGBjaGFyYCBhbmQgYHN0cmAgdHlwZXMK YWNjb3JkaW5nIHRvIFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzExIHJ1bGVzLgoiKQogICAgKGxp Y2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtYW5zaS10ZXJtLTAuMTEuMAogIChwYWNr YWdlCiAgICAobmFtZSAicnVzdC1hbnNpLXRlcm0iKQogICAgKHZlcnNpb24gIjAuMTEuMCIpCiAg ICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAg ICAodXJpIChjcmF0ZS11cmkgImFuc2lfdGVybSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFt ZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAg ICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMTZ3cHZyZ2h2ZDAz NTM1ODRpMWlkbnNnbTByM3ZjaGc4ZnlybTB4OGF5djFyZ3ZibGpnZiIpKSkpCiAgICAoYnVpbGQt c3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdv LWlucHV0cyAoKCJydXN0LXdpbmFwaSIgLHJ1c3Qtd2luYXBpKSkpKQogICAgKGhvbWUtcGFnZQog ICAgICAiaHR0cHM6Ly9naXRodWIuY29tL29naGFtL3J1c3QtYW5zaS10ZXJtIikKICAgIChzeW5v cHNpcwogICAgICAiTGlicmFyeSBmb3IgQU5TSSB0ZXJtaW5hbCBjb2xvdXJzIGFuZCBzdHlsZXMg KGJvbGQsIHVuZGVybGluZSkiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJMaWJyYXJ5IGZvciBB TlNJIHRlcm1pbmFsIGNvbG91cnMgYW5kIHN0eWxlcyAoYm9sZCwgdW5kZXJsaW5lKSIpCiAgICAo bGljZW5zZSBsaWNlbnNlOmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWF0dHkKICAocGFj a2FnZQogICAgKG5hbWUgInJ1c3QtYXR0eSIpCiAgICAodmVyc2lvbiAiMC4yLjEzIikKICAgIChz b3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1 cmkgKGNyYXRlLXVyaSAiYXR0eSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAg ICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNo YTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMTQwc3N3cDFid3F3YzR6azgwYnhr Ym5mYjNnOTM2aGdyYjc3ZzlnMGsxemNsZDN3YzBxcSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNh cmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwog ICAgICAgICgoInJ1c3QtbGliYyIgLHJ1c3QtbGliYykKICAgICAgICAgKCJydXN0LXdpbmFwaSIg LHJ1c3Qtd2luYXBpKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3NvZnRw cm9wcy9hdHR5IikKICAgIChzeW5vcHNpcyAiQSBzaW1wbGUgaW50ZXJmYWNlIGZvciBxdWVyeWlu ZyBhdHR5IikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEg c2ltcGxlIGludGVyZmFjZSBmb3IgcXVlcnlpbmcgYXR0eSIpCiAgICAobGljZW5zZSBsaWNlbnNl OmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWNsaXBweQogIChwYWNrYWdlCiAgICAobmFt ZSAicnVzdC1jbGlwcHkiKQogICAgKHZlcnNpb24gIjAuMC4zMDIiKQogICAgKHNvdXJjZQogICAg ICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUt dXJpICJjbGlwcHkiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJp bmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAg ICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjE1NjJ4M3NxOW1nbWM4ajM5Z2QzNHdxbTd5YnJk dnBtajdjYzFuNDUwZ3dzYXdheXc0ZnIiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWls ZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAo KCJydXN0LXRlcm0tMC41LjIiICxydXN0LXRlcm0tMC41LjIpKSkpCiAgICAoaG9tZS1wYWdlCiAg ICAgICJodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nLW51cnNlcnkvcnVzdC1jbGlwcHkiKQog ICAgKHN5bm9wc2lzCiAgICAgICJBIGJ1bmNoIG9mIGhlbHBmdWwgbGludHMgdG8gYXZvaWQgY29t bW9uIHBpdGZhbGxzIGluIFJ1c3QuIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNr YWdlIHByb3ZpZGVzIGEgYnVuY2ggb2YgaGVscGZ1bCBsaW50cyB0byBhdm9pZCBjb21tb24gcGl0 ZmFsbHMgaW4gUnVzdC4iKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qt c3Ryc2ltLTAuOC4wCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXN0cnNpbSIpCiAgICAodmVy c2lvbiAiMC44LjAiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1 cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzdHJzaW0iIHZlcnNpb24pKQogICAg ICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24g Ii5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAg IjBzanNtN2hydmpkaWZ6NjYxcGp4cTV3NGhmMTkwaHg1M2ZyYThkZnZhbWFjdmZmMTM5Y2YiKSkp KQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlICJo dHRwczovL2dpdGh1Yi5jb20vZGd1by9zdHJzaW0tcnMiKQogICAgKHN5bm9wc2lzCiAgICAgICJJ bXBsZW1lbnRhdGlvbnMgb2Ygc3RyaW5nIHNpbWlsYXJpdHkgbWV0cmljcy4KSW5jbHVkZXMgSGFt bWluZywgTGV2ZW5zaHRlaW4sIE9TQSwgRGFtZXJhdS1MZXZlbnNodGVpbiwgSmFybywgYW5kIEph cm8tV2lua2xlci4KIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiSW1wbGVtZW50YXRpb25zIG9m IHN0cmluZyBzaW1pbGFyaXR5IG1ldHJpY3MuCkluY2x1ZGVzIEhhbW1pbmcsIExldmVuc2h0ZWlu LCBPU0EsIERhbWVyYXUtTGV2ZW5zaHRlaW4sIEphcm8sIGFuZCBKYXJvLVdpbmtsZXIuCiIpCiAg ICAobGljZW5zZSBsaWNlbnNlOmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXRlcm0tc2l6 ZS0wLjMuMQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC10ZXJtLXNpemUiKQogICAgKHZlcnNp b24gIjAuMy4xIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJs LWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAidGVybV9zaXplIiB2ZXJzaW9uKSkKICAg ICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9u ICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAg ICIwOXdrMzE3M25nbWI3MTBxczlyd2dpYnE0dzI1MHE4bGdud2p2YjljeXBjMXZkazlsbnd5Iikp KSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwog ICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1jbGlwcHkiICxydXN0LWNsaXBw eSkKICAgICAgICAgKCJydXN0LWtlcm5lbDMyLXN5cyIgLHJ1c3Qta2VybmVsMzItc3lzKQogICAg ICAgICAoInJ1c3QtbGliYyIgLHJ1c3QtbGliYykKICAgICAgICAgKCJydXN0LXdpbmFwaS0wLjIu OCIgLHJ1c3Qtd2luYXBpLTAuMi44KSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9n aXRodWIuY29tL2tia25hcHAvdGVybV9zaXplLXJzLmdpdCIpCiAgICAoc3lub3BzaXMKICAgICAg ImZ1bmN0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgdGVybWluYWwgc2l6ZXMgYW5kIGRpbWVuc2lvbnMi KQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJmdW5jdGlvbnMgZm9yIGRldGVybWluaW5nIHRlcm1p bmFsIHNpemVzIGFuZCBkaW1lbnNpb25zIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1 YmxpYyBydXN0LXZlYy1tYXAKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtdmVjLW1hcCIpCiAg ICAodmVyc2lvbiAiMC44LjEiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1l dGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJ2ZWNfbWFwIiB2ZXJzaW9u KSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2 ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAg ICAgICAgICIwNm44aHc0aGxiY3ozMjhhM2dicHZteTBtYTQ2dmcxbGMwcjV3ZjU1OTAwc3pmM3Fk aXE1IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3Vt ZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzICgoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKSkp KQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2NvbnRhaW4tcnMvdmVj LW1hcCIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgc2ltcGxlIG1hcCBiYXNlZCBvbiBhIHZlY3Rv ciBmb3Igc21hbGwgaW50ZWdlciBrZXlzIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBw YWNrYWdlIHByb3ZpZGVzIGEgc2ltcGxlIG1hcCBiYXNlZCBvbiBhIHZlY3RvciBmb3Igc21hbGwg aW50ZWdlciBrZXlzIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXlh bWwtcnVzdC0wLjMuNQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC15YW1sLXJ1c3QiKQogICAg KHZlcnNpb24gIjAuMy41IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRo b2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAieWFtbC1ydXN0IiB2ZXJzaW9u KSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2 ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAg ICAgICAgICIxNG05ZHp3YjhmYjA1ZjRqamI0bnFwNDlyeGQ5YzV2Y213cHYzYTA0ZDJ5NWlwaG5j cXo2IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3Vt ZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1jbGlwcHkiICxydXN0 LWNsaXBweSkKICAgICAgICAgKCJydXN0LWxpbmtlZC1oYXNoLW1hcC0wLjMuMCIKICAgICAgICAg ICxydXN0LWxpbmtlZC1oYXNoLW1hcC0wLjMuMCkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0 dHA6Ly9jaHloMTk5MC5naXRodWIuaW8veWFtbC1ydXN0LyIpCiAgICAoc3lub3BzaXMgIlRoZSBt aXNzaW5nIFlBTUwgMS4yIHBhcnNlciBmb3IgcnVzdCIpCiAgICAoZGVzY3JpcHRpb24KICAgICAg IlRoZSBtaXNzaW5nIFlBTUwgMS4yIHBhcnNlciBmb3IgcnVzdCIpCiAgICAobGljZW5zZSAjZikp KQoKKGRlZmluZS1wdWJsaWMgcnVzdC1oeXBoZW5hdGlvbgogIChwYWNrYWdlCiAgICAobmFtZSAi cnVzdC1oeXBoZW5hdGlvbiIpCiAgICAodmVyc2lvbiAiMC43LjEiKQogICAgKHNvdXJjZQogICAg ICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUt dXJpICJoeXBoZW5hdGlvbiIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAg KHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1 NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMGs1bXN2OGNhbG1uZmQ1a3cxcm1xNGJn NWhuMXZjZDM5a2JzeGw1N3NkbGQ2M3h3ZDRxNCIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdv LWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAg ICAgICgoInJ1c3QtYXRsYXRsIiAscnVzdC1hdGxhdGwpCiAgICAgICAgICgicnVzdC1hdGxhdGwi ICxydXN0LWF0bGF0bCkKICAgICAgICAgKCJydXN0LWJpbmNvZGUiICxydXN0LWJpbmNvZGUpCiAg ICAgICAgICgicnVzdC1iaW5jb2RlIiAscnVzdC1iaW5jb2RlKQogICAgICAgICAoInJ1c3QtaHlw aGVuYXRpb24tY29tbW9ucyIKICAgICAgICAgICxydXN0LWh5cGhlbmF0aW9uLWNvbW1vbnMpCiAg ICAgICAgICgicnVzdC1oeXBoZW5hdGlvbi1jb21tb25zIgogICAgICAgICAgLHJ1c3QtaHlwaGVu YXRpb24tY29tbW9ucykKICAgICAgICAgKCJydXN0LXBvY2tldC1yZXNvdXJjZXMiICxydXN0LXBv Y2tldC1yZXNvdXJjZXMpCiAgICAgICAgICgicnVzdC1zZXJkZSIgLHJ1c3Qtc2VyZGUpCiAgICAg ICAgICgicnVzdC1zZXJkZSIgLHJ1c3Qtc2VyZGUpCiAgICAgICAgICgicnVzdC11bmljb2RlLW5v cm1hbGl6YXRpb24iCiAgICAgICAgICAscnVzdC11bmljb2RlLW5vcm1hbGl6YXRpb24pKSkpCiAg ICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vdGFwZWlub3N5bmUvaHlwaGVu YXRpb24iKQogICAgKHN5bm9wc2lzCiAgICAgICJLbnV0aC1MaWFuZyBoeXBoZW5hdGlvbiBmb3Ig YSB2YXJpZXR5IG9mIGxhbmd1YWdlcyIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIktudXRoLUxp YW5nIGh5cGhlbmF0aW9uIGZvciBhIHZhcmlldHkgb2YgbGFuZ3VhZ2VzIikKICAgIChsaWNlbnNl ICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWNvbXBpbGVyLWJ1aWx0aW5zCiAgKHBhY2thZ2UK ICAgIChuYW1lICJydXN0LWNvbXBpbGVyLWJ1aWx0aW5zIikKICAgICh2ZXJzaW9uICIwLjEuMjEi KQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAg ICAgICAgKHVyaSAoY3JhdGUtdXJpICJjb21waWxlcl9idWlsdGlucyIgdmVyc2lvbikpCiAgICAg ICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAi LmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAi MDh6MTR5NXljNGN4eTJkNTdhYWE4M2NwNDZ4Zjd5eDgzeTU3amc3ODVkZDVmdjlqMWlmayIpKSkp CiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAg ICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtY2MiICxydXN0LWNjKQogICAgICAg ICAoInJ1c3QtcnVzdGMtc3RkLXdvcmtzcGFjZS1jb3JlIgogICAgICAgICAgLHJ1c3QtcnVzdGMt c3RkLXdvcmtzcGFjZS1jb3JlKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRo dWIuY29tL3J1c3QtbGFuZy9jb21waWxlci1idWlsdGlucyIpCiAgICAoc3lub3BzaXMKICAgICAg IkNvbXBpbGVyIGludHJpbnNpY3MgdXNlZCBieSB0aGUgUnVzdCBjb21waWxlci4gQWxzbyBhdmFp bGFibGUgZm9yIG90aGVyIHRhcmdldHMKaWYgbmVjZXNzYXJ5IQoiKQogICAgKGRlc2NyaXB0aW9u CiAgICAgICJDb21waWxlciBpbnRyaW5zaWNzIHVzZWQgYnkgdGhlIFJ1c3QgY29tcGlsZXIuICBB bHNvIGF2YWlsYWJsZSBmb3Igb3RoZXIgdGFyZ2V0cwppZiBuZWNlc3NhcnkhCiIpCiAgICAobGlj ZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1ydXN0Yy1zdGQtd29ya3NwYWNlLWNvcmUK ICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcnVzdGMtc3RkLXdvcmtzcGFjZS1jb3JlIikKICAg ICh2ZXJzaW9uICIxLjAuMCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0 aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInJ1c3RjLXN0ZC13b3Jrc3Bh Y2UtY29yZSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1h cHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAg ICAgKGJhc2UzMgogICAgICAgICAgICAiMTMwOXhod3lhaTl4cHoxMjh4cmZqcWttbmt2Z2p3ZGR6 bm1qN2JyYmQ4aThmNTh6YW1ociIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5 c3RlbSkKICAgIChob21lLXBhZ2UgIiIpCiAgICAoc3lub3BzaXMKICAgICAgIkV4cGxpY2l0bHkg ZW1wdHkgY3JhdGUgZm9yIHJ1c3QtbGFuZy9ydXN0IGludGVncmF0aW9uCiIpCiAgICAoZGVzY3Jp cHRpb24KICAgICAgIkV4cGxpY2l0bHkgZW1wdHkgY3JhdGUgZm9yIHJ1c3QtbGFuZy9ydXN0IGlu dGVncmF0aW9uCiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1ydXN0 Yy1zdGQtd29ya3NwYWNlLXN0ZAogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1ydXN0Yy1zdGQt d29ya3NwYWNlLXN0ZCIpCiAgICAodmVyc2lvbiAiMS4wLjEiKQogICAgKHNvdXJjZQogICAgICAo b3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJp ICJydXN0Yy1zdGQtd29ya3NwYWNlLXN0ZCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQog ICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAg ICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXZxNHZhY2xhbXdoazBh bGY0Zjd3cTNpOXd4YTk5M3N4cG1oeTZxZmFpbXkxYWk3ZDltYiIpKSkpCiAgICAoYnVpbGQtc3lz dGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UgIiIpCiAgICAoc3lub3BzaXMg Ildvcmthcm91bmQgZm9yIHJ1c3RidWlsZCIpCiAgICAoZGVzY3JpcHRpb24gIldvcmthcm91bmQg Zm9yIHJ1c3RidWlsZCIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC13 aW5hcGkKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qtd2luYXBpIikKICAgICh2ZXJzaW9uICIw LjMuOCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRj aCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIndpbmFwaSIgdmVyc2lvbikpCiAgICAgICAgKGZp bGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRl IikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWlpOWo5 bHpyaHdyaTA5MDI2NTJhd2lmeng5ZnBheWltYnA2aGZoaGMyOTZ4Y2cwazR3MCIpKSkpCiAgICAo YnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgj OmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3Qtd2luYXBpLWk2ODYtcGMtd2luZG93cy1nbnUi CiAgICAgICAgICAscnVzdC13aW5hcGktaTY4Ni1wYy13aW5kb3dzLWdudSkKICAgICAgICAgKCJy dXN0LXdpbmFwaS14ODYtNjQtcGMtd2luZG93cy1nbnUiCiAgICAgICAgICAscnVzdC13aW5hcGkt eDg2LTY0LXBjLXdpbmRvd3MtZ251KSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9n aXRodWIuY29tL3JldGVwOTk4L3dpbmFwaS1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIlJhdyBG RkkgYmluZGluZ3MgZm9yIGFsbCBvZiBXaW5kb3dzIEFQSS4iKQogICAgKGRlc2NyaXB0aW9uCiAg ICAgICJSYXcgRkZJIGJpbmRpbmdzIGZvciBhbGwgb2YgV2luZG93cyBBUEkuIikKICAgIChsaWNl bnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWxpYmMKICAocGFja2FnZQogICAgKG5hbWUg InJ1c3QtbGliYyIpCiAgICAodmVyc2lvbiAiMC4yLjY2IikKICAgIChzb3VyY2UKICAgICAgKG9y aWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAi bGliYyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBl bmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAg KGJhc2UzMgogICAgICAgICAgICAiMG4wbXdyeTIxZnhmd2MwNjNrMzNtdnhrOHhqN2lhNWFyOG00 MmM5eW1iYW0ya3NiMjVmbSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3Rl bSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3Qt cnVzdGMtc3RkLXdvcmtzcGFjZS1jb3JlIgogICAgICAgICAgLHJ1c3QtcnVzdGMtc3RkLXdvcmtz cGFjZS1jb3JlKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFu Zy9saWJjIikKICAgIChzeW5vcHNpcwogICAgICAiUmF3IEZGSSBiaW5kaW5ncyB0byBwbGF0Zm9y bSBsaWJyYXJpZXMgbGlrZSBsaWJjLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJSYXcgRkZJ IGJpbmRpbmdzIHRvIHBsYXRmb3JtIGxpYnJhcmllcyBsaWtlIGxpYmMuCiIpCiAgICAobGljZW5z ZSAobGlzdCBsaWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMg cnVzdC10ZXJtLTAuNS4yCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXRlcm0iKQogICAgKHZl cnNpb24gIjAuNS4yIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2Qg dXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAidGVybSIgdmVyc2lvbikpCiAgICAg ICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAi LmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAi MGhrZ2pyZmlzajZ6and6NTI1NjM5cG1zdnpobGM0OGEwaDY1bnc4N3FyZHA2amloZGxnZCIpKSkp CiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAg ICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtYnl0ZW9yZGVyIiAscnVzdC1ieXRl b3JkZXIpCiAgICAgICAgICgicnVzdC1kaXJzLTEuMC41IiAscnVzdC1kaXJzLTEuMC41KQogICAg ICAgICAoInJ1c3Qtd2luYXBpIiAscnVzdC13aW5hcGkpKSkpCiAgICAoaG9tZS1wYWdlICJodHRw czovL2dpdGh1Yi5jb20vU3RlYmFsaWVuL3Rlcm0iKQogICAgKHN5bm9wc2lzICJBIHRlcm1pbmFs IGZvcm1hdHRpbmcgbGlicmFyeQoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2th Z2UgcHJvdmlkZXMgYSB0ZXJtaW5hbCBmb3JtYXR0aW5nIGxpYnJhcnkKIikKICAgIChsaWNlbnNl ICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWtlcm5lbDMyLXN5cwogIChwYWNrYWdlCiAgICAo bmFtZSAicnVzdC1rZXJuZWwzMi1zeXMiKQogICAgKHZlcnNpb24gIjAuMi4yIikKICAgIChzb3Vy Y2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkg KGNyYXRlLXVyaSAia2VybmVsMzItc3lzIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAg ICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAg ICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxMzg5YXYwNjAxYTl5ejhk dng1emhhOXZta2Q2aWs3YXgwaWRwYjAzMmQyODU1NW40MXZtIikpKSkKICAgIChidWlsZC1zeXN0 ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5w dXRzCiAgICAgICAgKCgicnVzdC13aW5hcGktMC4yLjgiICxydXN0LXdpbmFwaS0wLjIuOCkKICAg ICAgICAgKCJydXN0LXdpbmFwaS1idWlsZCIgLHJ1c3Qtd2luYXBpLWJ1aWxkKSkpKQogICAgKGhv bWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3JldGVwOTk4L3dpbmFwaS1ycyIpCiAg ICAoc3lub3BzaXMKICAgICAgIkNvbnRhaW5zIGZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciB0aGUg V2luZG93cyBBUEkgbGlicmFyeSBrZXJuZWwzMi4gU2VlIHdpbmFwaSBmb3IgdHlwZXMgYW5kIGNv bnN0YW50cy4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJDb250YWlucyBmdW5jdGlvbiBkZWZp bml0aW9ucyBmb3IgdGhlIFdpbmRvd3MgQVBJIGxpYnJhcnkga2VybmVsMzIuICBTZWUgd2luYXBp IGZvciB0eXBlcyBhbmQgY29uc3RhbnRzLiIpCiAgICAobGljZW5zZSBsaWNlbnNlOmV4cGF0KSkp CgooZGVmaW5lLXB1YmxpYyBydXN0LXdpbmFwaS0wLjIuOAogIChwYWNrYWdlCiAgICAobmFtZSAi cnVzdC13aW5hcGkiKQogICAgKHZlcnNpb24gIjAuMi44IikKICAgIChzb3VyY2UKICAgICAgKG9y aWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAi d2luYXBpIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFw cGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAg ICAoYmFzZTMyCiAgICAgICAgICAgICIweWg4MTZsaDZsZjU2ZHBzZ3h5MTg5YzJhaTF6M2o4bXc5 c2k2aXpxYjZ3c2prYmNqejhuIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lz dGVtKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3JldGVwOTk4L3dp bmFwaS1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIlJhdyBGRkkgYmluZGluZ3MgZm9yIGFsbCBv ZiBXaW5kb3dzIEFQSS4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJSYXcgRkZJIGJpbmRpbmdz IGZvciBhbGwgb2YgV2luZG93cyBBUEkuIikKICAgIChsaWNlbnNlIGxpY2Vuc2U6ZXhwYXQpKSkK CihkZWZpbmUtcHVibGljIHJ1c3Qtc2VyZGUKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qtc2Vy ZGUiKQogICAgKHZlcnNpb24gIjEuMC4xMDMiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAg ICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzZXJkZSIg dmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFt ZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2Uz MgogICAgICAgICAgICAiMDBpcDN4eTA5bms2YzJiNDdreTFtNTM3OXlqbXdrNm4zc3Iydm1ibHA0 NzhwMXhnajVxaiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAg IChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3Qtc2VyZGUt ZGVyaXZlIiAscnVzdC1zZXJkZS1kZXJpdmUpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL3Nl cmRlLnJzIikKICAgIChzeW5vcHNpcwogICAgICAiQSBnZW5lcmljIHNlcmlhbGl6YXRpb24vZGVz ZXJpYWxpemF0aW9uIGZyYW1ld29yayIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFj a2FnZSBwcm92aWRlcyBhIGdlbmVyaWMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gZnJh bWV3b3JrIikKICAgIChsaWNlbnNlIChsaXN0IGxpY2Vuc2U6ZXhwYXQgbGljZW5zZTphc2wyLjAp KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWxpbmtlZC1oYXNoLW1hcC0wLjMuMAogIChwYWNrYWdl CiAgICAobmFtZSAicnVzdC1saW5rZWQtaGFzaC1tYXAiKQogICAgKHZlcnNpb24gIjAuMy4wIikK ICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAg ICAgICh1cmkgKGNyYXRlLXVyaSAibGlua2VkLWhhc2gtbWFwIiB2ZXJzaW9uKSkKICAgICAgICAo ZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3Jh dGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxa2Fm OTVncnZmcWNoeG44cGwwODU0ZzhhYjBmemw1NjIxN2huZGhoaHo1cXFtMmowOWtkIikpKSkKICAg IChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBg KCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1jbGlwcHkiICxydXN0LWNsaXBweSkKICAg ICAgICAgKCJydXN0LXNlcmRlLTAuOC4yMyIgLHJ1c3Qtc2VyZGUtMC44LjIzKQogICAgICAgICAo InJ1c3Qtc2VyZGUtdGVzdC0wLjguMjMiCiAgICAgICAgICAscnVzdC1zZXJkZS10ZXN0LTAuOC4y MykpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9jb250YWluLXJz L2xpbmtlZC1oYXNoLW1hcCIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgSGFzaE1hcCB3cmFwcGVy IHRoYXQgaG9sZHMga2V5LXZhbHVlIHBhaXJzIGluIGluc2VydGlvbiBvcmRlciIpCiAgICAoZGVz Y3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIEhhc2hNYXAgd3JhcHBlciB0 aGF0IGhvbGRzIGtleS12YWx1ZSBwYWlycyBpbiBpbnNlcnRpb24gb3JkZXIiKQogICAgKGxpY2Vu c2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtYXRsYXRsCiAgKHBhY2thZ2UKICAgIChuYW1l ICJydXN0LWF0bGF0bCIpCiAgICAodmVyc2lvbiAiMC4xLjIiKQogICAgKHNvdXJjZQogICAgICAo b3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJp ICJhdGxhdGwiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmct YXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAg ICAgIChiYXNlMzIKICAgICAgICAgICAgIjE4a3l2ZG01NmZkYjUyYjFzcnlpODB4Z3MzbmtqZHls eW5zdjMyNGFpcW5qODVsMWJmcmoiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1z eXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJy dXN0LWZudiIgLHJ1c3QtZm52KQogICAgICAgICAoInJ1c3QtbnVtLXRyYWl0cyIgLHJ1c3QtbnVt LXRyYWl0cykKICAgICAgICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkpKSkKICAgIChob21l LXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS90YXBlaW5vc3luZS9hdGxhdGwiKQogICAg KHN5bm9wc2lzICJEb3VibGUtYXJyYXkgdHJpZXMuIikKICAgIChkZXNjcmlwdGlvbiAiRG91Ymxl LWFycmF5IHRyaWVzLiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1h dGxhdGwKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtYXRsYXRsIikKICAgICh2ZXJzaW9uICIw LjEuMiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRj aCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImF0bGF0bCIgdmVyc2lvbikpCiAgICAgICAgKGZp bGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRl IikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMThreXZk bTU2ZmRiNTJiMXNyeWk4MHhnczNua2pkeWx5bnN2MzI0YWlxbmo4NWwxYmZyaiIpKSkpCiAgICAo YnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgj OmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtZm52IiAscnVzdC1mbnYpCiAgICAgICAgICgi cnVzdC1udW0tdHJhaXRzIiAscnVzdC1udW0tdHJhaXRzKQogICAgICAgICAoInJ1c3Qtc2VyZGUi ICxydXN0LXNlcmRlKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29t L3RhcGVpbm9zeW5lL2F0bGF0bCIpCiAgICAoc3lub3BzaXMgIkRvdWJsZS1hcnJheSB0cmllcy4i KQogICAgKGRlc2NyaXB0aW9uICJEb3VibGUtYXJyYXkgdHJpZXMuIikKICAgIChsaWNlbnNlICNm KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWJpbmNvZGUKICAocGFja2FnZQogICAgKG5hbWUgInJ1 c3QtYmluY29kZSIpCiAgICAodmVyc2lvbiAiMS4yLjAiKQogICAgKHNvdXJjZQogICAgICAob3Jp Z2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJi aW5jb2RlIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFw cGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAg ICAoYmFzZTMyCiAgICAgICAgICAgICIxNGp6ajYxYzE0NXM5andyMWkyMTNiN21kY212MW55NHox bG5zOXM4Z3ZwMzRqOW43YXhxIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lz dGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVz dC1hdXRvY2ZnIiAscnVzdC1hdXRvY2ZnKQogICAgICAgICAoInJ1c3QtYnl0ZW9yZGVyIiAscnVz dC1ieXRlb3JkZXIpCiAgICAgICAgICgicnVzdC1zZXJkZSIgLHJ1c3Qtc2VyZGUpKSkpCiAgICAo aG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vc2Vydm8vYmluY29kZSIpCiAgICAoc3lub3Bz aXMKICAgICAgIkEgYmluYXJ5IHNlcmlhbGl6YXRpb24gLyBkZXNlcmlhbGl6YXRpb24gc3RyYXRl Z3kgdGhhdCB1c2VzIFNlcmRlIGZvciB0cmFuc2Zvcm1pbmcgc3RydWN0cyBpbnRvIGJ5dGVzIGFu ZCB2aWNlIHZlcnNhISIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92 aWRlcyBhIGJpbmFyeSBzZXJpYWxpemF0aW9uIC8gZGVzZXJpYWxpemF0aW9uIHN0cmF0ZWd5IHRo YXQgdXNlcyBTZXJkZSBmb3IgdHJhbnNmb3JtaW5nIHN0cnVjdHMgaW50byBieXRlcyBhbmQgdmlj ZSB2ZXJzYSEiKQogICAgKGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoKKGRlZmluZS1wdWJsaWMg cnVzdC1iaW5jb2RlCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWJpbmNvZGUiKQogICAgKHZl cnNpb24gIjEuMi4wIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2Qg dXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiYmluY29kZSIgdmVyc2lvbikpCiAg ICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lv biAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAg ICAiMTRqemo2MWMxNDVzOWp3cjFpMjEzYjdtZGNtdjFueTR6MWxuczlzOGd2cDM0ajluN2F4cSIp KSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMK ICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtYXV0b2NmZyIgLHJ1c3QtYXV0 b2NmZykKICAgICAgICAgKCJydXN0LWJ5dGVvcmRlciIgLHJ1c3QtYnl0ZW9yZGVyKQogICAgICAg ICAoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9n aXRodWIuY29tL3NlcnZvL2JpbmNvZGUiKQogICAgKHN5bm9wc2lzCiAgICAgICJBIGJpbmFyeSBz ZXJpYWxpemF0aW9uIC8gZGVzZXJpYWxpemF0aW9uIHN0cmF0ZWd5IHRoYXQgdXNlcyBTZXJkZSBm b3IgdHJhbnNmb3JtaW5nIHN0cnVjdHMgaW50byBieXRlcyBhbmQgdmljZSB2ZXJzYSEiKQogICAg KGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBiaW5hcnkgc2VyaWFs aXphdGlvbiAvIGRlc2VyaWFsaXphdGlvbiBzdHJhdGVneSB0aGF0IHVzZXMgU2VyZGUgZm9yIHRy YW5zZm9ybWluZyBzdHJ1Y3RzIGludG8gYnl0ZXMgYW5kIHZpY2UgdmVyc2EhIikKICAgIChsaWNl bnNlIGxpY2Vuc2U6ZXhwYXQpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtaHlwaGVuYXRpb24tY29t bW9ucwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1oeXBoZW5hdGlvbi1jb21tb25zIikKICAg ICh2ZXJzaW9uICIwLjcuMSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0 aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImh5cGhlbmF0aW9uX2NvbW1v bnMiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5k IG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChi YXNlMzIKICAgICAgICAgICAgIjFwYXNuYmszcmJkZ2YzMGpqamgxaDI0YTlweHBkcm5uMGloY2l2 bXBuenFoYTZtbjJkNHkiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0p CiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWF0 bGF0bCIgLHJ1c3QtYXRsYXRsKQogICAgICAgICAoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKSkp KQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3RhcGVpbm9zeW5lL2h5 cGhlbmF0aW9uIikKICAgIChzeW5vcHNpcwogICAgICAiUHJvZW1pYWwgY29kZSBmb3IgdGhlIGBo eXBoZW5hdGlvbmAgbGlicmFyeSIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlByb2VtaWFsIGNv ZGUgZm9yIHRoZSBgaHlwaGVuYXRpb25gIGxpYnJhcnkiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihk ZWZpbmUtcHVibGljIHJ1c3QtaHlwaGVuYXRpb24tY29tbW9ucwogIChwYWNrYWdlCiAgICAobmFt ZSAicnVzdC1oeXBoZW5hdGlvbi1jb21tb25zIikKICAgICh2ZXJzaW9uICIwLjcuMSIpCiAgICAo c291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAo dXJpIChjcmF0ZS11cmkgImh5cGhlbmF0aW9uX2NvbW1vbnMiIHZlcnNpb24pKQogICAgICAgIChm aWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0 ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFwYXNu YmszcmJkZ2YzMGpqamgxaDI0YTlweHBkcm5uMGloY2l2bXBuenFoYTZtbjJkNHkiKSkpKQogICAg KGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAo IzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWF0bGF0bCIgLHJ1c3QtYXRsYXRsKQogICAg ICAgICAoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAi aHR0cHM6Ly9naXRodWIuY29tL3RhcGVpbm9zeW5lL2h5cGhlbmF0aW9uIikKICAgIChzeW5vcHNp cwogICAgICAiUHJvZW1pYWwgY29kZSBmb3IgdGhlIGBoeXBoZW5hdGlvbmAgbGlicmFyeSIpCiAg ICAoZGVzY3JpcHRpb24KICAgICAgIlByb2VtaWFsIGNvZGUgZm9yIHRoZSBgaHlwaGVuYXRpb25g IGxpYnJhcnkiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtcG9ja2V0 LXJlc291cmNlcwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1wb2NrZXQtcmVzb3VyY2VzIikK ICAgICh2ZXJzaW9uICIwLjMuMiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAo bWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInBvY2tldC1yZXNvdXJj ZXMiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5k IG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChi YXNlMzIKICAgICAgICAgICAgIjFuMmk1dm1pOGZkYnc4OXdtNW56MXdzMXo5ZjFxYXg5MTFwNmtz ZzRzY21kZzIzejZkZjEiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0p CiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vdG9tYWthL3BvY2tldC1y ZXNvdXJjZXMiKQogICAgKHN5bm9wc2lzCiAgICAgICJJbmNsdWRlIHJlc291cmNlcyBpbiB5b3Vy IGFwcGxpY2F0aW9ucy4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJJbmNsdWRlIHJlc291cmNl cyBpbiB5b3VyIGFwcGxpY2F0aW9ucy4iKQogICAgKGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoK KGRlZmluZS1wdWJsaWMgcnVzdC11bmljb2RlLW5vcm1hbGl6YXRpb24KICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtdW5pY29kZS1ub3JtYWxpemF0aW9uIikKICAgICh2ZXJzaW9uICIwLjEuMTEi KQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAg ICAgICAgKHVyaSAoY3JhdGUtdXJpICJ1bmljb2RlLW5vcm1hbGl6YXRpb24iIHZlcnNpb24pKQog ICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNp b24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAg ICAgIjFreHhiNW5kYjVkenlwMWZsYWpqZHhuYnd5anc2bWw5eHZ5MHB6N2I4c3JqbjlreTRxZG0i KSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRz CiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LXNtYWxsdmVjIiAscnVzdC1z bWFsbHZlYykpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS91bmlj b2RlLXJzL3VuaWNvZGUtbm9ybWFsaXphdGlvbiIpCiAgICAoc3lub3BzaXMKICAgICAgIlRoaXMg Y3JhdGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBub3JtYWxpemF0aW9uIG9mClVuaWNvZGUgc3Ry aW5ncywgaW5jbHVkaW5nIENhbm9uaWNhbCBhbmQgQ29tcGF0aWJsZQpEZWNvbXBvc2l0aW9uIGFu ZCBSZWNvbXBvc2l0aW9uLCBhcyBkZXNjcmliZWQgaW4KVW5pY29kZSBTdGFuZGFyZCBBbm5leCAj MTUuCiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgY3JhdGUgcHJvdmlkZXMgZnVuY3Rp b25zIGZvciBub3JtYWxpemF0aW9uIG9mClVuaWNvZGUgc3RyaW5ncywgaW5jbHVkaW5nIENhbm9u aWNhbCBhbmQgQ29tcGF0aWJsZQpEZWNvbXBvc2l0aW9uIGFuZCBSZWNvbXBvc2l0aW9uLCBhcyBk ZXNjcmliZWQgaW4KVW5pY29kZSBTdGFuZGFyZCBBbm5leCAjMTUuCiIpCiAgICAobGljZW5zZSAj ZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1jYwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1j YyIpCiAgICAodmVyc2lvbiAiMS4wLjQ3IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAg ICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiY2MiIHZlcnNp b24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0i IHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAg ICAgICAgICAgIjFmMDg1NjBjd2JhbG5pMWZjMmpjbWgxZHN6bDNyYzMxYXp2cjQ1Ymd6OHZocnM2 aGIxeGEiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJn dW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWpvYnNlcnZlciIg LHJ1c3Qtam9ic2VydmVyKQogICAgICAgICAoInJ1c3QtbnVtLWNwdXMiICxydXN0LW51bS1jcHVz KSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2FsZXhjcmljaHRv bi9jYy1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgYnVpbGQtdGltZSBkZXBlbmRlbmN5IGZv ciBDYXJnbyBidWlsZCBzY3JpcHRzIHRvIGFzc2lzdCBpbiBpbnZva2luZyB0aGUgbmF0aXZlCkMg Y29tcGlsZXIgdG8gY29tcGlsZSBuYXRpdmUgQyBjb2RlIGludG8gYSBzdGF0aWMgYXJjaGl2ZSB0 byBiZSBsaW5rZWQgaW50byBSdXN0CmNvZGUuCiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRo aXMgcGFja2FnZSBwcm92aWRlcyBhIGJ1aWxkLXRpbWUgZGVwZW5kZW5jeSBmb3IgQ2FyZ28gYnVp bGQgc2NyaXB0cyB0byBhc3Npc3QgaW4gaW52b2tpbmcgdGhlIG5hdGl2ZQpDIGNvbXBpbGVyIHRv IGNvbXBpbGUgbmF0aXZlIEMgY29kZSBpbnRvIGEgc3RhdGljIGFyY2hpdmUgdG8gYmUgbGlua2Vk IGludG8gUnVzdApjb2RlLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1 c3Qtd2luYXBpLWk2ODYtcGMtd2luZG93cy1nbnUKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qt d2luYXBpLWk2ODYtcGMtd2luZG93cy1nbnUiKQogICAgKHZlcnNpb24gIjAuNC4wIikKICAgIChz b3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1 cmkgKGNyYXRlLXVyaSAid2luYXBpLWk2ODYtcGMtd2luZG93cy1nbnUiIHZlcnNpb24pKQogICAg ICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24g Ii5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAg IjFkbXBhNm12Y3Z6ejE2emc2ZDV2cmZ5NGJ4Z2c1NDF3eHJjaXA3Y25zaGkwNnYzOGZmeGMiKSkp KQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlCiAg ICAgICJodHRwczovL2dpdGh1Yi5jb20vcmV0ZXA5OTgvd2luYXBpLXJzIikKICAgIChzeW5vcHNp cwogICAgICAiSW1wb3J0IGxpYnJhcmllcyBmb3IgdGhlIGk2ODYtcGMtd2luZG93cy1nbnUgdGFy Z2V0LiBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgY3JhdGUgZGlyZWN0bHksIGRlcGVuZCBvbiB3aW5h cGkgaW5zdGVhZC4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJJbXBvcnQgbGlicmFyaWVzIGZv ciB0aGUgaTY4Ni1wYy13aW5kb3dzLWdudSB0YXJnZXQuICBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMg Y3JhdGUgZGlyZWN0bHksIGRlcGVuZCBvbiB3aW5hcGkgaW5zdGVhZC4iKQogICAgKGxpY2Vuc2Ug I2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtd2luYXBpLXg4Ni02NC1wYy13aW5kb3dzLWdudQog IChwYWNrYWdlCiAgICAobmFtZSAicnVzdC13aW5hcGkteDg2LTY0LXBjLXdpbmRvd3MtZ251IikK ICAgICh2ZXJzaW9uICIwLjQuMCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAo bWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkKICAgICAgICAgICAgICAg IndpbmFwaS14ODZfNjQtcGMtd2luZG93cy1nbnUiCiAgICAgICAgICAgICAgIHZlcnNpb24pKQog ICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNp b24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAg ICAgIjBncXE2NGN6cWI2NGtza2pyeWo4aXNwNjJtMnNndngyNXl5ajNrcGMybXloODV3MjRia2ki KSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdl CiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vcmV0ZXA5OTgvd2luYXBpLXJzIikKICAgIChzeW5v cHNpcwogICAgICAiSW1wb3J0IGxpYnJhcmllcyBmb3IgdGhlIHg4Nl82NC1wYy13aW5kb3dzLWdu dSB0YXJnZXQuIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBjcmF0ZSBkaXJlY3RseSwgZGVwZW5kIG9u IHdpbmFwaSBpbnN0ZWFkLiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkltcG9ydCBsaWJyYXJp ZXMgZm9yIHRoZSB4ODZfNjQtcGMtd2luZG93cy1nbnUgdGFyZ2V0LiAgUGxlYXNlIGRvbid0IHVz ZSB0aGlzIGNyYXRlIGRpcmVjdGx5LCBkZXBlbmQgb24gd2luYXBpIGluc3RlYWQuIikKICAgIChs aWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWJ5dGVvcmRlcgogIChwYWNrYWdlCiAg ICAobmFtZSAicnVzdC1ieXRlb3JkZXIiKQogICAgKHZlcnNpb24gIjEuMy4yIikKICAgIChzb3Vy Y2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkg KGNyYXRlLXVyaSAiYnl0ZW9yZGVyIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAg ICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAo c2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxeGJ3amxtcTJ6aXFqbWp2a3F4 ZHgxeWgxMzZ4eGhpbHhkNDBia3kxdzRkN2huNHh2aHg3IikpKSkKICAgIChidWlsZC1zeXN0ZW0g Y2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIu Y29tL0J1cm50U3VzaGkvYnl0ZW9yZGVyIikKICAgIChzeW5vcHNpcwogICAgICAiTGlicmFyeSBm b3IgcmVhZGluZy93cml0aW5nIG51bWJlcnMgaW4gYmlnLWVuZGlhbiBhbmQgbGl0dGxlLWVuZGlh bi4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJMaWJyYXJ5IGZvciByZWFkaW5nL3dyaXRpbmcg bnVtYmVycyBpbiBiaWctZW5kaWFuIGFuZCBsaXR0bGUtZW5kaWFuLiIpCiAgICAobGljZW5zZSAo bGlzdCBsaWNlbnNlOnVubGljZW5zZSBsaWNlbnNlOmV4cGF0KSkpKQoKKGRlZmluZS1wdWJsaWMg cnVzdC1kaXJzLTEuMC41CiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWRpcnMiKQogICAgKHZl cnNpb24gIjEuMC41IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2Qg dXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiZGlycyIgdmVyc2lvbikpCiAgICAg ICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAi LmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAi MDA5cnJoemo5cHh5bmNtbTJ2aGxqNzBucGcwY2dnZ3YyaGpiYmtpd2RsOXZjY3E4a21yeiIpKSkp CiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAg ICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtbGliYyIgLHJ1c3QtbGliYykKICAg ICAgICAgKCJydXN0LXJlZG94LXVzZXJzIiAscnVzdC1yZWRveC11c2VycykKICAgICAgICAgKCJy dXN0LXdpbmFwaSIgLHJ1c3Qtd2luYXBpKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRo dWIuY29tL3NvYy9kaXJzLXJzIikKICAgIChzeW5vcHNpcwogICAgICAiQSB0aW55IGxvdy1sZXZl bCBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgcGxhdGZvcm0tc3BlY2lmaWMgc3RhbmRhcmQgbG9jYXRp b25zIG9mIGRpcmVjdG9yaWVzIGZvciBjb25maWcsIGNhY2hlIGFuZCBvdGhlciBkYXRhIG9uIExp bnV4LCBXaW5kb3dzLCBtYWNPUyBhbmQgUmVkb3ggYnkgbGV2ZXJhZ2luZyB0aGUgbWVjaGFuaXNt cyBkZWZpbmVkIGJ5IHRoZSBYREcgYmFzZS91c2VyIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9ucyBv biBMaW51eCwgdGhlIEtub3duIEZvbGRlciBBUEkgb24gV2luZG93cywgYW5kIHRoZSBTdGFuZGFy ZCBEaXJlY3RvcnkgZ3VpZGVsaW5lcyBvbiBtYWNPUy4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAg ICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSB0aW55IGxvdy1sZXZlbCBsaWJyYXJ5IHRoYXQgcHJv dmlkZXMgcGxhdGZvcm0tc3BlY2lmaWMgc3RhbmRhcmQgbG9jYXRpb25zIG9mIGRpcmVjdG9yaWVz IGZvciBjb25maWcsIGNhY2hlIGFuZCBvdGhlciBkYXRhIG9uIExpbnV4LCBXaW5kb3dzLCBtYWNP UyBhbmQgUmVkb3ggYnkgbGV2ZXJhZ2luZyB0aGUgbWVjaGFuaXNtcyBkZWZpbmVkIGJ5IHRoZSBY REcgYmFzZS91c2VyIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9ucyBvbiBMaW51eCwgdGhlIEtub3du IEZvbGRlciBBUEkgb24gV2luZG93cywgYW5kIHRoZSBTdGFuZGFyZCBEaXJlY3RvcnkgZ3VpZGVs aW5lcyBvbiBtYWNPUy4iKQogICAgKGxpY2Vuc2UgKGxpc3QgbGljZW5zZTpleHBhdCBsaWNlbnNl OmFzbDIuMCkpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtd2luYXBpLWJ1aWxkCiAgKHBhY2thZ2UK ICAgIChuYW1lICJydXN0LXdpbmFwaS1idWlsZCIpCiAgICAodmVyc2lvbiAiMC4xLjEiKQogICAg KHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAg KHVyaSAoY3JhdGUtdXJpICJ3aW5hcGktYnVpbGQiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5h bWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQog ICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFnNHJxc2dqa3kw YTc1MzBxYWpuMmJiZmNybDJ2MHpiMzlpZGdkd3M5YjFsN2dwNXdjOWQiKSkpKQogICAgKGJ1aWxk LXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczov L2dpdGh1Yi5jb20vcmV0ZXA5OTgvd2luYXBpLXJzIikKICAgIChzeW5vcHNpcwogICAgICAiQ29t bW9uIGNvZGUgZm9yIGJ1aWxkLnJzIGluIFdpbkFQSSAtc3lzIGNyYXRlcy4iKQogICAgKGRlc2Ny aXB0aW9uCiAgICAgICJDb21tb24gY29kZSBmb3IgYnVpbGQucnMgaW4gV2luQVBJIC1zeXMgY3Jh dGVzLiIpCiAgICAobGljZW5zZSBsaWNlbnNlOmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0 LXNlcmRlLWRlcml2ZQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zZXJkZS1kZXJpdmUiKQog ICAgKHZlcnNpb24gIjEuMC4xMDMiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAg KG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzZXJkZV9kZXJpdmUi IHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5h bWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNl MzIKICAgICAgICAgICAgIjFsMmljcXE1NDhkbXE1Ym4yNzh6YjJ2ajcyNXpuajRoNG1zODl3M2Iw cjFma2Jwem1pbTgiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAg ICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LXByb2Mt bWFjcm8yIiAscnVzdC1wcm9jLW1hY3JvMikKICAgICAgICAgKCJydXN0LXF1b3RlIiAscnVzdC1x dW90ZSkKICAgICAgICAgKCJydXN0LXN5biIgLHJ1c3Qtc3luKSkpKQogICAgKGhvbWUtcGFnZSAi aHR0cHM6Ly9zZXJkZS5ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIk1hY3JvcyAxLjEgaW1wbGVt ZW50YXRpb24gb2YgI1tkZXJpdmUoU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldIikKICAgIChkZXNj cmlwdGlvbgogICAgICAiTWFjcm9zIDEuMSBpbXBsZW1lbnRhdGlvbiBvZiAjW2Rlcml2ZShTZXJp YWxpemUsIERlc2VyaWFsaXplKV0iKQogICAgKGxpY2Vuc2UgKGxpc3QgbGljZW5zZTpleHBhdCBs aWNlbnNlOmFzbDIuMCkpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtc2VyZGUtMC44LjIzCiAgKHBh Y2thZ2UKICAgIChuYW1lICJydXN0LXNlcmRlIikKICAgICh2ZXJzaW9uICIwLjguMjMiKQogICAg KHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAg KHVyaSAoY3JhdGUtdXJpICJzZXJkZSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAg ICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAg KHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWo0YWppcG4wc2Y0eWEwY3Jn Y2I5NHM4NDhxcDdtZmMzNW42ZDBxMnJmOHJrNXNremJjeCIpKSkpCiAgICAoYnVpbGQtc3lzdGVt IGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0 cyAoKCJydXN0LWNsaXBweSIgLHJ1c3QtY2xpcHB5KSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6 Ly9zZXJkZS5ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgZ2VuZXJpYyBzZXJpYWxpemF0aW9u L2Rlc2VyaWFsaXphdGlvbiBmcmFtZXdvcmsiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlz IHBhY2thZ2UgcHJvdmlkZXMgYSBnZW5lcmljIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9u IGZyYW1ld29yayIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1zZXJk ZS10ZXN0LTAuOC4yMwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zZXJkZS10ZXN0IikKICAg ICh2ZXJzaW9uICIwLjguMjMiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1l dGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzZXJkZV90ZXN0IiB2ZXJz aW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICIt IiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAg ICAgICAgICAgICIxbTkzOWo3Y2dzN2k1OHI2dnhmMGZmcDNuYnI4YWR2cjhwOWRxYTl3OHprMHoy eWtzMnFpIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFy Z3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1zZXJkZS0wLjgu MjMiICxydXN0LXNlcmRlLTAuOC4yMykpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vc2VyZGUu cnMiKQogICAgKHN5bm9wc2lzCiAgICAgICJUb2tlbiBEZS9TZXJpYWxpemVyIGZvciB0ZXN0aW5n IERlL1NlcmlhbGl6ZSBpbXBsZW1lbnRhdGlvbnMiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJU b2tlbiBEZS9TZXJpYWxpemVyIGZvciB0ZXN0aW5nIERlL1NlcmlhbGl6ZSBpbXBsZW1lbnRhdGlv bnMiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtZm52CiAgKHBhY2th Z2UKICAgIChuYW1lICJydXN0LWZudiIpCiAgICAodmVyc2lvbiAiMS4wLjYiKQogICAgKHNvdXJj ZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAo Y3JhdGUtdXJpICJmbnYiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChz dHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYK ICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjF3dzU2YmkxcjViOGlkM25zOWozcXhiaTd3 NWgwMDVyemhpcnl5MHppOWg5N3JhcWJiOWciKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1i dWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vc2Vydm8vcnVz dC1mbnYiKQogICAgKHN5bm9wc2lzCiAgICAgICJGb3dsZXLDolx4ODBceDkzTm9sbMOiXHg4MFx4 OTNWbyBoYXNoIGZ1bmN0aW9uIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiRm93bGVyw6JceDgw XHg5M05vbGzDolx4ODBceDkzVm8gaGFzaCBmdW5jdGlvbiIpCiAgICAobGljZW5zZSAjZikpKQoK KGRlZmluZS1wdWJsaWMgcnVzdC1udW0tdHJhaXRzCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0 LW51bS10cmFpdHMiKQogICAgKHZlcnNpb24gIjAuMi4xMCIpCiAgICAoc291cmNlCiAgICAgIChv cmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkg Im51bS10cmFpdHMiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJp bmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAg ICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFyMDc5amJtcm5yYnZzejdkYzVtY2doaWp4N2Jo cGZpa2pzcGZxcmdsNG4yMjd5MXpqNmwiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWls ZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAo KCJydXN0LWF1dG9jZmciICxydXN0LWF1dG9jZmcpCiAgICAgICAgICgicnVzdC1saWJtIiAscnVz dC1saWJtKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3Qt bnVtL251bS10cmFpdHMiKQogICAgKHN5bm9wc2lzCiAgICAgICJOdW1lcmljIHRyYWl0cyBmb3Ig Z2VuZXJpYyBtYXRoZW1hdGljcyIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIk51bWVyaWMgdHJh aXRzIGZvciBnZW5lcmljIG1hdGhlbWF0aWNzIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5l LXB1YmxpYyBydXN0LWF1dG9jZmcKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtYXV0b2NmZyIp CiAgICAodmVyc2lvbiAiMC4xLjciKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAg KG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJhdXRvY2ZnIiB2ZXJz aW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICIt IiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAg ICAgICAgICAgICIxY2h3Z2ltcHg1ejd4YmFnN2tycjlkOGFzeGZxYmg2ODNxaGdsOWtuM2h4azJs MGRqajh4IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGhv bWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2N1dmlwZXIvYXV0b2NmZyIpCiAgICAoc3lub3Bz aXMKICAgICAgIkF1dG9tYXRpYyBjZmcgZm9yIFJ1c3QgY29tcGlsZXIgZmVhdHVyZXMiKQogICAg KGRlc2NyaXB0aW9uCiAgICAgICJBdXRvbWF0aWMgY2ZnIGZvciBSdXN0IGNvbXBpbGVyIGZlYXR1 cmVzIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXNtYWxsdmVjCiAg KHBhY2thZ2UKICAgIChuYW1lICJydXN0LXNtYWxsdmVjIikKICAgICh2ZXJzaW9uICIxLjAuMCIp CiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAg ICAgICAodXJpIChjcmF0ZS11cmkgInNtYWxsdmVjIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1u YW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkK ICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxMXB3empia2l3 MWpzeTFxNHc4YndzM3I2MXNrMjdkc3A5YXNhbmt2bTJsZnlzMmtwa3NmIikpKSkKICAgIChidWls ZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2Fy Z28taW5wdXRzICgoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKSkpKQogICAgKGhvbWUtcGFnZQog ICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3NlcnZvL3J1c3Qtc21hbGx2ZWMiKQogICAgKHN5bm9w c2lzCiAgICAgICInU21hbGwgdmVjdG9yJyBvcHRpbWl6YXRpb246IHN0b3JlIHVwIHRvIGEgc21h bGwgbnVtYmVyIG9mIGl0ZW1zIG9uIHRoZSBzdGFjayIpCiAgICAoZGVzY3JpcHRpb24KICAgICAg IidTbWFsbCB2ZWN0b3InIG9wdGltaXphdGlvbjogc3RvcmUgdXAgdG8gYSBzbWFsbCBudW1iZXIg b2YgaXRlbXMgb24gdGhlIHN0YWNrIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1Ymxp YyBydXN0LWpvYnNlcnZlcgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1qb2JzZXJ2ZXIiKQog ICAgKHZlcnNpb24gIjAuMS4xNyIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAo bWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImpvYnNlcnZlciIgdmVy c2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAi LSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgog ICAgICAgICAgICAiMHE2MXAzOW53MGJkeDZ3MHdranYxa2NoYTVtYmhjZmRsNHoxaHhyaHBjc2t5 aHBkOWNnaiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChh cmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtZ2V0cmFuZG9t IiAscnVzdC1nZXRyYW5kb20pCiAgICAgICAgICgicnVzdC1saWJjIiAscnVzdC1saWJjKQogICAg ICAgICAoInJ1c3QtbG9nIiAscnVzdC1sb2cpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRw czovL2dpdGh1Yi5jb20vYWxleGNyaWNodG9uL2pvYnNlcnZlci1ycyIpCiAgICAoc3lub3BzaXMK ICAgICAgIkFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBHTlUgbWFrZSBqb2JzZXJ2ZXIgZm9yIFJ1 c3QKIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEdO VSBtYWtlIGpvYnNlcnZlciBmb3IgUnVzdAoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUt cHVibGljIHJ1c3QtbnVtLWNwdXMKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtbnVtLWNwdXMi KQogICAgKHZlcnNpb24gIjEuMTEuMSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAg ICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIm51bV9jcHVzIiB2 ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1l ICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMy CiAgICAgICAgICAgICIwd2x4czAwY3BnMTZ6MDlmd2NoajFnZHoxanhuZjVkZ2cxY2JpZHZxMHNj NzVibndibmtuIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAg KGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1oZXJtaXQt YWJpIiAscnVzdC1oZXJtaXQtYWJpKQogICAgICAgICAoInJ1c3QtbGliYyIgLHJ1c3QtbGliYykp KSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9zZWFubW9uc3Rhci9u dW1fY3B1cyIpCiAgICAoc3lub3BzaXMgIkdldCB0aGUgbnVtYmVyIG9mIENQVXMgb24gYSBtYWNo aW5lLiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkdldCB0aGUgbnVtYmVyIG9mIENQVXMgb24g YSBtYWNoaW5lLiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yZWRv eC11c2VycwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1yZWRveC11c2VycyIpCiAgICAodmVy c2lvbiAiMC4zLjEiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1 cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJyZWRveF91c2VycyIgdmVyc2lvbikp CiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVy c2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAg ICAgICAiMHZkbjY4OHE5d2c5OTdiMXg1YWJ4MmdmNzQwNnJuMWx2ZDYyeXBjZ2gxZ2o3ZzVkcGtq ZiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVu dHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtZmFpbHVyZSIgLHJ1c3Qt ZmFpbHVyZSkKICAgICAgICAgKCJydXN0LXJhbmQtb3MtMC4xLjMiICxydXN0LXJhbmQtb3MtMC4x LjMpCiAgICAgICAgICgicnVzdC1yZWRveC1zeXNjYWxsIiAscnVzdC1yZWRveC1zeXNjYWxsKQog ICAgICAgICAoInJ1c3QtcnVzdC1hcmdvbjItMC41LjEiCiAgICAgICAgICAscnVzdC1ydXN0LWFy Z29uMi0wLjUuMSkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0bGFiLnJlZG94 LW9zLm9yZy9yZWRveC1vcy91c2VycyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgUnVzdCBsaWJy YXJ5IHRvIGFjY2VzcyBSZWRveCB1c2VycyBhbmQgZ3JvdXBzIGZ1bmN0aW9uYWxpdHkiKQogICAg KGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBSdXN0IGxpYnJhcnkg dG8gYWNjZXNzIFJlZG94IHVzZXJzIGFuZCBncm91cHMgZnVuY3Rpb25hbGl0eSIpCiAgICAobGlj ZW5zZSBsaWNlbnNlOmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXByb2MtbWFjcm8yCiAg KHBhY2thZ2UKICAgIChuYW1lICJydXN0LXByb2MtbWFjcm8yIikKICAgICh2ZXJzaW9uICIxLjAu NiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkK ICAgICAgICAodXJpIChjcmF0ZS11cmkgInByb2MtbWFjcm8yIiB2ZXJzaW9uKSkKICAgICAgICAo ZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3Jh dGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwOXJn YjVhYjBqZ3czOWt5YWQwbGdxczRuYjl5YWY3bXdjcmd4cW5zeGJuNGlsNTRnN2x3IikpKSkKICAg IChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBg KCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC11bmljb2RlLXhpZCIgLHJ1c3QtdW5pY29k ZS14aWQpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vYWxleGNy aWNodG9uL3Byb2MtbWFjcm8yIikKICAgIChzeW5vcHNpcwogICAgICAiQSBzdGFibGUgaW1wbGVt ZW50YXRpb24gb2YgdGhlIHVwY29taW5nIG5ldyBgcHJvY19tYWNyb2AgQVBJLiBDb21lcyB3aXRo IGFuCm9wdGlvbiwgb2ZmIGJ5IGRlZmF1bHQsIHRvIGFsc28gcmVpbXBsZW1lbnQgaXRzZWxmIGlu IHRlcm1zIG9mIHRoZSB1cHN0cmVhbQp1bnN0YWJsZSBBUEkuCiIpCiAgICAoZGVzY3JpcHRpb24K ICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHN0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0 aGUgdXBjb21pbmcgbmV3IGBwcm9jX21hY3JvYCBBUEkuICBDb21lcyB3aXRoIGFuCm9wdGlvbiwg b2ZmIGJ5IGRlZmF1bHQsIHRvIGFsc28gcmVpbXBsZW1lbnQgaXRzZWxmIGluIHRlcm1zIG9mIHRo ZSB1cHN0cmVhbQp1bnN0YWJsZSBBUEkuCiIpCiAgICAobGljZW5zZSAobGlzdCBsaWNlbnNlOmV4 cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1xdW90ZQogIChwYWNr YWdlCiAgICAobmFtZSAicnVzdC1xdW90ZSIpCiAgICAodmVyc2lvbiAiMS4wLjIiKQogICAgKHNv dXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVy aSAoY3JhdGUtdXJpICJxdW90ZSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAg ICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNo YTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXprYzQ2cnlhY2YyamRrYzZrcnN5 Mno2MTV4YmsxeDhrcDE4MzByY3h6M2lyajVxcWZoNSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNh cmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwog ICAgICAgICgoInJ1c3QtcHJvYy1tYWNybzIiICxydXN0LXByb2MtbWFjcm8yKSkpKQogICAgKGhv bWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2R0b2xuYXkvcXVvdGUiKQogICAgKHN5bm9wc2lz ICJRdWFzaS1xdW90aW5nIG1hY3JvIHF1b3RlISguLi4pIikKICAgIChkZXNjcmlwdGlvbiAiUXVh c2ktcXVvdGluZyBtYWNybyBxdW90ZSEoLi4uKSIpCiAgICAobGljZW5zZSAobGlzdCBsaWNlbnNl OmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1zeW4KICAocGFj a2FnZQogICAgKG5hbWUgInJ1c3Qtc3luIikKICAgICh2ZXJzaW9uICIxLjAuOSIpCiAgICAoc291 cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJp IChjcmF0ZS11cmkgInN5biIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAg KHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1 NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWg2N3EyYmhwNDR6cGthaGRxM3d6NzF2 enkzNXMzaWJ2NXB4amdnZ2gwYWowNnA5NzVwcSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdv LWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAg ICAgICgoInJ1c3QtcHJvYy1tYWNybzIiICxydXN0LXByb2MtbWFjcm8yKQogICAgICAgICAoInJ1 c3QtcXVvdGUiICxydXN0LXF1b3RlKQogICAgICAgICAoInJ1c3QtdW5pY29kZS14aWQiICxydXN0 LXVuaWNvZGUteGlkKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2R0b2xu YXkvc3luIikKICAgIChzeW5vcHNpcyAiUGFyc2VyIGZvciBSdXN0IHNvdXJjZSBjb2RlIikKICAg IChkZXNjcmlwdGlvbiAiUGFyc2VyIGZvciBSdXN0IHNvdXJjZSBjb2RlIikKICAgIChsaWNlbnNl IChsaXN0IGxpY2Vuc2U6ZXhwYXQgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBy dXN0LWxpYm0KICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtbGlibSIpCiAgICAodmVyc2lvbiAi MC4yLjEiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0 Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJsaWJtIiB2ZXJzaW9uKSkKICAgICAgICAoZmls ZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUi KSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwYWtoNTZz aDUxYWRoYWdtazlsODRkeXJsejYwZ3Y4cmkwNXhocjEzaTFiMThjemtwbXk3IikpKSkKICAgIChi dWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6 Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1yYW5kLTAuNi41IiAscnVzdC1yYW5kLTAuNi41 KSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9saWJtIikK ICAgIChzeW5vcHNpcyAibGlibSBpbiBwdXJlIFJ1c3QiKQogICAgKGRlc2NyaXB0aW9uICJsaWJt IGluIHB1cmUgUnVzdCIpCiAgICAobGljZW5zZSAobGlzdCBsaWNlbnNlOmV4cGF0IGxpY2Vuc2U6 YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1nZXRyYW5kb20KICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtZ2V0cmFuZG9tIikKICAgICh2ZXJzaW9uICIwLjEuMTMiKQogICAgKHNvdXJj ZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAo Y3JhdGUtdXJpICJnZXRyYW5kb20iIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAg ICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChz aGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjAxemx6aGRiZzh5NmQxenJsaWh2 bTkzczQyMWcwbmxkaXE3ZjFoY2gza2ZsOXNscHJuejciKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBj YXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMK ICAgICAgICAoKCJydXN0LWNmZy1pZiIgLHJ1c3QtY2ZnLWlmKQogICAgICAgICAoInJ1c3QtY29t cGlsZXItYnVpbHRpbnMiCiAgICAgICAgICAscnVzdC1jb21waWxlci1idWlsdGlucykKICAgICAg ICAgKCJydXN0LWxpYmMiICxydXN0LWxpYmMpCiAgICAgICAgICgicnVzdC1sb2ciICxydXN0LWxv ZykKICAgICAgICAgKCJydXN0LXJ1c3RjLXN0ZC13b3Jrc3BhY2UtY29yZSIKICAgICAgICAgICxy dXN0LXJ1c3RjLXN0ZC13b3Jrc3BhY2UtY29yZSkKICAgICAgICAgKCJydXN0LXN0ZHdlYiIgLHJ1 c3Qtc3Rkd2ViKQogICAgICAgICAoInJ1c3Qtd2FzaSIgLHJ1c3Qtd2FzaSkKICAgICAgICAgKCJy dXN0LXdhc20tYmluZGdlbiIgLHJ1c3Qtd2FzbS1iaW5kZ2VuKSkpKQogICAgKGhvbWUtcGFnZQog ICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtcmFuZG9tL2dldHJhbmRvbSIpCiAgICAoc3lu b3BzaXMKICAgICAgIkEgc21hbGwgY3Jvc3MtcGxhdGZvcm0gbGlicmFyeSBmb3IgcmV0cmlldmlu ZyByYW5kb20gZGF0YSBmcm9tIHN5c3RlbSBzb3VyY2UiKQogICAgKGRlc2NyaXB0aW9uCiAgICAg ICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBzbWFsbCBjcm9zcy1wbGF0Zm9ybSBsaWJyYXJ5IGZv ciByZXRyaWV2aW5nIHJhbmRvbSBkYXRhIGZyb20gc3lzdGVtIHNvdXJjZSIpCiAgICAobGljZW5z ZSAobGlzdCBsaWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMg cnVzdC1sb2cKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtbG9nIikKICAgICh2ZXJzaW9uICIw LjQuOCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRj aCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImxvZyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUt bmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikp CiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXh6MThpeGNj bDVjNm5wNGxpbnYzeXBjN2hwbW1ncGM1enpkMnltcDJzc2Z4MG1oYmRobCIpKSkpCiAgICAoYnVp bGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNh cmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtY2ZnLWlmIiAscnVzdC1jZmctaWYpCiAgICAgICAg ICgicnVzdC1zZXJkZSIgLHJ1c3Qtc2VyZGUpCiAgICAgICAgICgicnVzdC1zdmFsIiAscnVzdC1z dmFsKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9sb2ci KQogICAgKHN5bm9wc2lzCiAgICAgICJBIGxpZ2h0d2VpZ2h0IGxvZ2dpbmcgZmFjYWRlIGZvciBS dXN0CiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIGxp Z2h0d2VpZ2h0IGxvZ2dpbmcgZmFjYWRlIGZvciBSdXN0CiIpCiAgICAobGljZW5zZSAobGlzdCBs aWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1oZXJt aXQtYWJpCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWhlcm1pdC1hYmkiKQogICAgKHZlcnNp b24gIjAuMS4zIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJs LWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiaGVybWl0LWFiaSIgdmVyc2lvbikpCiAg ICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lv biAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAg ICAiMDg3aWJiN3Y0ZHhoeDFoNjZqamZmazR6cmpsaHkzbjRmcjB4OWQ5eTZmM3pqZmdrcXoxaCIp KSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMK ICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtY29tcGlsZXItYnVpbHRpbnMi CiAgICAgICAgICAscnVzdC1jb21waWxlci1idWlsdGlucykKICAgICAgICAgKCJydXN0LWxpYmMi ICxydXN0LWxpYmMpCiAgICAgICAgICgicnVzdC1ydXN0Yy1zdGQtd29ya3NwYWNlLWNvcmUiCiAg ICAgICAgICAscnVzdC1ydXN0Yy1zdGQtd29ya3NwYWNlLWNvcmUpKSkpCiAgICAoaG9tZS1wYWdl CiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vaGVybWl0Y29yZS9oZXJtaXQtYWJpIikKICAgIChz eW5vcHNpcwogICAgICAiaGVybWl0LWFiaSBpcyBzbWFsbCBpbnRlcmZhY2UgdG8gY2FsbCBmdW5j dGlvbnMgZnJvbSB0aGUgdW5pa2VybmVsIFJ1c3R5SGVybWl0LgpJdCBpcyB1c2VkIHRvIGJ1aWxk IHRoZSB0YXJnZXQgYHg4Nl82NC11bmtub3duLWhlcm1pdGAuCiIpCiAgICAoZGVzY3JpcHRpb24K ICAgICAgImhlcm1pdC1hYmkgaXMgc21hbGwgaW50ZXJmYWNlIHRvIGNhbGwgZnVuY3Rpb25zIGZy b20gdGhlIHVuaWtlcm5lbCBSdXN0eUhlcm1pdC4KSXQgaXMgdXNlZCB0byBidWlsZCB0aGUgdGFy Z2V0IGB4ODZfNjQtdW5rbm93bi1oZXJtaXRgLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZp bmUtcHVibGljIHJ1c3QtZmFpbHVyZQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1mYWlsdXJl IikKICAgICh2ZXJzaW9uICIwLjEuNiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAg ICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImZhaWx1cmUiIHZl cnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUg Ii0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIK ICAgICAgICAgICAgIjFuYXk1YzJjZ2k0MGtwODRyYmlpcjFkZ3dsaDlhYXA5amF6Ym54Zm1xcmtw cjQ5a3k5enEiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAo YXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWJhY2t0cmFj ZSIgLHJ1c3QtYmFja3RyYWNlKQogICAgICAgICAoInJ1c3QtZmFpbHVyZS1kZXJpdmUiICxydXN0 LWZhaWx1cmUtZGVyaXZlKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9ydXN0LWxh bmctbnVyc2VyeS5naXRodWIuaW8vZmFpbHVyZS8iKQogICAgKHN5bm9wc2lzCiAgICAgICJFeHBl cmltZW50YWwgZXJyb3IgaGFuZGxpbmcgYWJzdHJhY3Rpb24uIikKICAgIChkZXNjcmlwdGlvbgog ICAgICAiRXhwZXJpbWVudGFsIGVycm9yIGhhbmRsaW5nIGFic3RyYWN0aW9uLiIpCiAgICAobGlj ZW5zZSAobGlzdCBsaWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJs aWMgcnVzdC1yYW5kLW9zLTAuMS4zCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXJhbmQtb3Mi KQogICAgKHZlcnNpb24gIjAuMS4zIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAg IChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAicmFuZF9vcyIgdmVy c2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAi LSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgog ICAgICAgICAgICAiMHdhaHBwbTBzNjRna3Iydm1oY2d3YzBsaWozN2luMWxnZnhnNXJiZ3FsejBs NXZnY3hidiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChh cmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtY2xvdWRhYmki ICxydXN0LWNsb3VkYWJpKQogICAgICAgICAoInJ1c3QtZnVjaHNpYS1jcHJuZyIgLHJ1c3QtZnVj aHNpYS1jcHJuZykKICAgICAgICAgKCJydXN0LWxpYmMiICxydXN0LWxpYmMpCiAgICAgICAgICgi cnVzdC1sb2ciICxydXN0LWxvZykKICAgICAgICAgKCJydXN0LXJhbmQtY29yZS0wLjQuMiIgLHJ1 c3QtcmFuZC1jb3JlLTAuNC4yKQogICAgICAgICAoInJ1c3QtcmRyYW5kLTAuNC4wIiAscnVzdC1y ZHJhbmQtMC40LjApCiAgICAgICAgICgicnVzdC1zdGR3ZWIiICxydXN0LXN0ZHdlYikKICAgICAg ICAgKCJydXN0LXdhc20tYmluZGdlbiIgLHJ1c3Qtd2FzbS1iaW5kZ2VuKQogICAgICAgICAoInJ1 c3Qtd2luYXBpIiAscnVzdC13aW5hcGkpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL2NyYXRl cy5pby9jcmF0ZXMvcmFuZF9vcyIpCiAgICAoc3lub3BzaXMgIk9TIGJhY2tlZCBSYW5kb20gTnVt YmVyIEdlbmVyYXRvciIpCiAgICAoZGVzY3JpcHRpb24gIk9TIGJhY2tlZCBSYW5kb20gTnVtYmVy IEdlbmVyYXRvciIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yZWRv eC1zeXNjYWxsCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXJlZG94LXN5c2NhbGwiKQogICAg KHZlcnNpb24gIjAuMS41NiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0 aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInJlZG94X3N5c2NhbGwiIHZl cnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUg Ii0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIK ICAgICAgICAgICAgIjExMHk3ZHlmbTJ2Y2k0eDV2azdncjBxNTUxZHZwMzFucGw5OWZuc3gyZmIx N3d6d2NmOTQiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAo aG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGxhYi5yZWRveC1vcy5vcmcvcmVkb3gtb3Mvc3lz Y2FsbCIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgUnVzdCBsaWJyYXJ5IHRvIGFjY2VzcyByYXcg UmVkb3ggc3lzdGVtIGNhbGxzIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdl IHByb3ZpZGVzIGEgUnVzdCBsaWJyYXJ5IHRvIGFjY2VzcyByYXcgUmVkb3ggc3lzdGVtIGNhbGxz IikKICAgIChsaWNlbnNlIGxpY2Vuc2U6ZXhwYXQpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtcnVz dC1hcmdvbjItMC41LjEKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcnVzdC1hcmdvbjIiKQog ICAgKHZlcnNpb24gIjAuNS4xIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgICht ZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAicnVzdC1hcmdvbjIiIHZl cnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUg Ii0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIK ICAgICAgICAgICAgIjFrcmprbXlmbjM3aHk3c2ZzNmxxaWEwZnN2dzEzMG5uMXoyODUwZ2xzamN2 YTdweW05MmMiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAo YXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWJhc2U2NC0w LjEwLjEiICxydXN0LWJhc2U2NC0wLjEwLjEpCiAgICAgICAgICgicnVzdC1ibGFrZTJiLXNpbWQi ICxydXN0LWJsYWtlMmItc2ltZCkKICAgICAgICAgKCJydXN0LWNyb3NzYmVhbS11dGlscy0wLjYu NiIKICAgICAgICAgICxydXN0LWNyb3NzYmVhbS11dGlscy0wLjYuNikpKSkKICAgIChob21lLXBh Z2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9zcnUtc3lzdGVtcy9ydXN0LWFyZ29uMiIpCiAg ICAoc3lub3BzaXMKICAgICAgIlJ1c3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFyZ29uMiBwYXNz d29yZCBoYXNoaW5nIGZ1bmN0aW9uLiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlJ1c3QgaW1w bGVtZW50YXRpb24gb2YgdGhlIEFyZ29uMiBwYXNzd29yZCBoYXNoaW5nIGZ1bmN0aW9uLiIpCiAg ICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC11bmljb2RlLXhpZAogIChwYWNr YWdlCiAgICAobmFtZSAicnVzdC11bmljb2RlLXhpZCIpCiAgICAodmVyc2lvbiAiMC4yLjAiKQog ICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAg ICAgKHVyaSAoY3JhdGUtdXJpICJ1bmljb2RlLXhpZCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUt bmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikp CiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMHowOWZuNTE1 eG03enlyMG1tZHl4YTlteDJmN2F6Y3B2NzRwcW1nNjExaXJhbHdwY3ZsMiIpKSkpCiAgICAoYnVp bGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBz Oi8vZ2l0aHViLmNvbS91bmljb2RlLXJzL3VuaWNvZGUteGlkIikKICAgIChzeW5vcHNpcwogICAg ICAiRGV0ZXJtaW5lIHdoZXRoZXIgY2hhcmFjdGVycyBoYXZlIHRoZSBYSURfU3RhcnQKb3IgWElE X0NvbnRpbnVlIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvClVuaWNvZGUgU3RhbmRhcmQgQW5uZXgg IzMxLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJEZXRlcm1pbmUgd2hldGhlciBjaGFyYWN0 ZXJzIGhhdmUgdGhlIFhJRF9TdGFydApvciBYSURfQ29udGludWUgcHJvcGVydGllcyBhY2NvcmRp bmcgdG8KVW5pY29kZSBTdGFuZGFyZCBBbm5leCAjMzEuCiIpCiAgICAobGljZW5zZSAobGlzdCBs aWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yYW5k LTAuNi41CiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXJhbmQiKQogICAgKHZlcnNpb24gIjAu Ni41IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNo KQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAicmFuZCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUt bmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikp CiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWpsNDQ0OWpj bDR3Z216bGQ2ZmZ3cWo1Z3d4cnA4enZ4OHc1NzNnMXozNjhxZzZ4bHdiZCIpKSkpCiAgICAoYnVp bGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNh cmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtYXV0b2NmZyIgLHJ1c3QtYXV0b2NmZykKICAgICAg ICAgKCJydXN0LWxpYmMiICxydXN0LWxpYmMpCiAgICAgICAgICgicnVzdC1sb2ciICxydXN0LWxv ZykKICAgICAgICAgKCJydXN0LXBhY2tlZC1zaW1kIiAscnVzdC1wYWNrZWQtc2ltZCkKICAgICAg ICAgKCJydXN0LXJhbmQtY2hhY2hhLTAuMS4xIgogICAgICAgICAgLHJ1c3QtcmFuZC1jaGFjaGEt MC4xLjEpCiAgICAgICAgICgicnVzdC1yYW5kLWNvcmUtMC40LjIiICxydXN0LXJhbmQtY29yZS0w LjQuMikKICAgICAgICAgKCJydXN0LXJhbmQtaGMtMC4xLjEiICxydXN0LXJhbmQtaGMtMC4xLjEp CiAgICAgICAgICgicnVzdC1yYW5kLWlzYWFjLTAuMS4yIiAscnVzdC1yYW5kLWlzYWFjLTAuMS4y KQogICAgICAgICAoInJ1c3QtcmFuZC1qaXR0ZXItMC4xLjQiCiAgICAgICAgICAscnVzdC1yYW5k LWppdHRlci0wLjEuNCkKICAgICAgICAgKCJydXN0LXJhbmQtb3MtMC4xLjMiICxydXN0LXJhbmQt b3MtMC4xLjMpCiAgICAgICAgICgicnVzdC1yYW5kLXBjZy0wLjEuMiIgLHJ1c3QtcmFuZC1wY2ct MC4xLjIpCiAgICAgICAgICgicnVzdC1yYW5kLXhvcnNoaWZ0LTAuMS4yIgogICAgICAgICAgLHJ1 c3QtcmFuZC14b3JzaGlmdC0wLjEuMikKICAgICAgICAgKCJydXN0LXdpbmFwaSIgLHJ1c3Qtd2lu YXBpKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9jcmF0ZXMuaW8vY3JhdGVzL3JhbmQiKQog ICAgKHN5bm9wc2lzCiAgICAgICJSYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgYW5kIG90aGVyIHJh bmRvbW5lc3MgZnVuY3Rpb25hbGl0eS4KIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiUmFuZG9t IG51bWJlciBnZW5lcmF0b3JzIGFuZCBvdGhlciByYW5kb21uZXNzIGZ1bmN0aW9uYWxpdHkuCiIp CiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1jZmctaWYKICAocGFja2Fn ZQogICAgKG5hbWUgInJ1c3QtY2ZnLWlmIikKICAgICh2ZXJzaW9uICIwLjEuMTAiKQogICAgKHNv dXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVy aSAoY3JhdGUtdXJpICJjZmctaWYiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAg ICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChz aGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjA4aDgwaWhzNzRqY3lwMjRjZDc1 d3dhYnlnYmJkZ2wwNWs2cDVkbXE4YWticjc4dnYxYTciKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBj YXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMK ICAgICAgICAoKCJydXN0LWNvbXBpbGVyLWJ1aWx0aW5zIgogICAgICAgICAgLHJ1c3QtY29tcGls ZXItYnVpbHRpbnMpCiAgICAgICAgICgicnVzdC1ydXN0Yy1zdGQtd29ya3NwYWNlLWNvcmUiCiAg ICAgICAgICAscnVzdC1ydXN0Yy1zdGQtd29ya3NwYWNlLWNvcmUpKSkpCiAgICAoaG9tZS1wYWdl CiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vYWxleGNyaWNodG9uL2NmZy1pZiIpCiAgICAoc3lu b3BzaXMKICAgICAgIkEgbWFjcm8gdG8gZXJnb25vbWljYWxseSBkZWZpbmUgYW4gaXRlbSBkZXBl bmRpbmcgb24gYSBsYXJnZSBudW1iZXIgb2YgI1tjZmddCnBhcmFtZXRlcnMuIFN0cnVjdHVyZWQg bGlrZSBhbiBpZi1lbHNlIGNoYWluLCB0aGUgZmlyc3QgbWF0Y2hpbmcgYnJhbmNoIGlzIHRoZQpp dGVtIHRoYXQgZ2V0cyBlbWl0dGVkLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBh Y2thZ2UgcHJvdmlkZXMgYSBtYWNybyB0byBlcmdvbm9taWNhbGx5IGRlZmluZSBhbiBpdGVtIGRl cGVuZGluZyBvbiBhIGxhcmdlIG51bWJlciBvZiAjW2NmZ10KcGFyYW1ldGVycy4gIFN0cnVjdHVy ZWQgbGlrZSBhbiBpZi1lbHNlIGNoYWluLCB0aGUgZmlyc3QgbWF0Y2hpbmcgYnJhbmNoIGlzIHRo ZQppdGVtIHRoYXQgZ2V0cyBlbWl0dGVkLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUt cHVibGljIHJ1c3Qtd2FzaQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC13YXNpIikKICAgICh2 ZXJzaW9uICIwLjcuMCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9k IHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIndhc2kiIHZlcnNpb24pKQogICAg ICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24g Ii5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAg IjAzYXBnM3NhNGhqbjZ4d2E0cGt5dnpqaXNjeWE1MXd5cnlnYWRneHdkZzhscnZqM3I3NXEiKSkp KQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAg ICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWNvbXBpbGVyLWJ1aWx0aW5zIgog ICAgICAgICAgLHJ1c3QtY29tcGlsZXItYnVpbHRpbnMpCiAgICAgICAgICgicnVzdC1ydXN0Yy1z dGQtd29ya3NwYWNlLWFsbG9jIgogICAgICAgICAgLHJ1c3QtcnVzdGMtc3RkLXdvcmtzcGFjZS1h bGxvYykKICAgICAgICAgKCJydXN0LXJ1c3RjLXN0ZC13b3Jrc3BhY2UtY29yZSIKICAgICAgICAg ICxydXN0LXJ1c3RjLXN0ZC13b3Jrc3BhY2UtY29yZSkpKSkKICAgIChob21lLXBhZ2UKICAgICAg Imh0dHBzOi8vZ2l0aHViLmNvbS9DcmFuZVN0YXRpb24vcnVzdC13YXNpIikKICAgIChzeW5vcHNp cwogICAgICAiRXhwZXJpbWVudGFsIFdBU0kgQVBJIGJpbmRpbmdzIGZvciBSdXN0IikKICAgIChk ZXNjcmlwdGlvbgogICAgICAiRXhwZXJpbWVudGFsIFdBU0kgQVBJIGJpbmRpbmdzIGZvciBSdXN0 IikKICAgIChsaWNlbnNlIChsaXN0ICNmIGxpY2Vuc2U6ZXhwYXQpKSkpCgooZGVmaW5lLXB1Ymxp YyBydXN0LXN0ZHdlYgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zdGR3ZWIiKQogICAgKHZl cnNpb24gIjAuNC4yMCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9k IHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInN0ZHdlYiIgdmVyc2lvbikpCiAg ICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lv biAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAg ICAiMW1kMTRuOXJ6eHpkc2t6M2hwZ2xuOHZ4Zndxc3cyY3N3YzBmNW5zbGg0cjgycm1sajhuaCIp KSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMK ICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtZGlzY2FyZCIgLHJ1c3QtZGlz Y2FyZCkKICAgICAgICAgKCJydXN0LWZ1dHVyZXMtY2hhbm5lbC1wcmV2aWV3IgogICAgICAgICAg LHJ1c3QtZnV0dXJlcy1jaGFubmVsLXByZXZpZXcpCiAgICAgICAgICgicnVzdC1mdXR1cmVzLWNv cmUtcHJldmlldyIKICAgICAgICAgICxydXN0LWZ1dHVyZXMtY29yZS1wcmV2aWV3KQogICAgICAg ICAoInJ1c3QtZnV0dXJlcy1leGVjdXRvci1wcmV2aWV3IgogICAgICAgICAgLHJ1c3QtZnV0dXJl cy1leGVjdXRvci1wcmV2aWV3KQogICAgICAgICAoInJ1c3QtZnV0dXJlcy11dGlsLXByZXZpZXci CiAgICAgICAgICAscnVzdC1mdXR1cmVzLXV0aWwtcHJldmlldykKICAgICAgICAgKCJydXN0LXJ1 c3RjLXZlcnNpb24iICxydXN0LXJ1c3RjLXZlcnNpb24pCiAgICAgICAgICgicnVzdC1zZXJkZSIg LHJ1c3Qtc2VyZGUpCiAgICAgICAgICgicnVzdC1zZXJkZS1qc29uIiAscnVzdC1zZXJkZS1qc29u KQogICAgICAgICAoInJ1c3Qtc3Rkd2ViLWRlcml2ZSIgLHJ1c3Qtc3Rkd2ViLWRlcml2ZSkKICAg ICAgICAgKCJydXN0LXN0ZHdlYi1pbnRlcm5hbC1tYWNyb3MiCiAgICAgICAgICAscnVzdC1zdGR3 ZWItaW50ZXJuYWwtbWFjcm9zKQogICAgICAgICAoInJ1c3Qtc3Rkd2ViLWludGVybmFsLXJ1bnRp bWUiCiAgICAgICAgICAscnVzdC1zdGR3ZWItaW50ZXJuYWwtcnVudGltZSkKICAgICAgICAgKCJy dXN0LXdhc20tYmluZGdlbiIgLHJ1c3Qtd2FzbS1iaW5kZ2VuKSkpKQogICAgKGhvbWUtcGFnZSAi aHR0cHM6Ly9naXRodWIuY29tL2tvdXRlL3N0ZHdlYiIpCiAgICAoc3lub3BzaXMKICAgICAgIkEg c3RhbmRhcmQgbGlicmFyeSBmb3IgdGhlIGNsaWVudC1zaWRlIFdlYiIpCiAgICAoZGVzY3JpcHRp b24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHN0YW5kYXJkIGxpYnJhcnkgZm9yIHRo ZSBjbGllbnQtc2lkZSBXZWIiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1 c3Qtd2FzbS1iaW5kZ2VuCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXdhc20tYmluZGdlbiIp CiAgICAodmVyc2lvbiAiMC4yLjU1IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAg IChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAid2FzbS1iaW5kZ2Vu IiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBu YW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFz ZTMyCiAgICAgICAgICAgICIxd241aG1pcXB3ODRrYzl3ZDFkMXdyamJ4d2gxcnl6MWw5MThrOHg2 ZGtkczZmcGs1Ymk5IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQog ICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1jZmct aWYiICxydXN0LWNmZy1pZikKICAgICAgICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkKICAg ICAgICAgKCJydXN0LXNlcmRlLWpzb24iICxydXN0LXNlcmRlLWpzb24pCiAgICAgICAgICgicnVz dC13YXNtLWJpbmRnZW4tbWFjcm8iCiAgICAgICAgICAscnVzdC13YXNtLWJpbmRnZW4tbWFjcm8p KSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL3J1c3R3YXNtLmdpdGh1Yi5pby8iKQogICAgKHN5 bm9wc2lzCiAgICAgICJFYXN5IHN1cHBvcnQgZm9yIGludGVyYWN0aW5nIGJldHdlZW4gSlMgYW5k IFJ1c3QuCiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkVhc3kgc3VwcG9ydCBmb3IgaW50ZXJh Y3RpbmcgYmV0d2VlbiBKUyBhbmQgUnVzdC4KIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5l LXB1YmxpYyBydXN0LXN2YWwKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qtc3ZhbCIpCiAgICAo dmVyc2lvbiAiMC40LjciKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhv ZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzdmFsIiB2ZXJzaW9uKSkKICAg ICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9u ICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAg ICIxYWxqZ2d4NjQ0ODFxNHdwM3d4OWh4c2ZoMmJzN2Q2NG5xc3J3YmIyenhjcG1kbmJuNnlrIikp KSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwog ICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1zZXJkZSIgLHJ1c3Qtc2VyZGUp CiAgICAgICAgICgicnVzdC1zbWFsbHZlYy0wLjYuMTMiICxydXN0LXNtYWxsdmVjLTAuNi4xMykK ICAgICAgICAgKCJydXN0LXN2YWwtZGVyaXZlIiAscnVzdC1zdmFsLWRlcml2ZSkpKSkKICAgICho b21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9zdmFsLXJzL3N2YWwiKQogICAgKHN5bm9wc2lz CiAgICAgICJBIG5vLXN0ZCwgb2JqZWN0LXNhZmUgc2VyaWFsaXphdGlvbiBmcmFtZXdvcmsiKQog ICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBuby1zdGQsIG9i amVjdC1zYWZlIHNlcmlhbGl6YXRpb24gZnJhbWV3b3JrIikKICAgIChsaWNlbnNlIChsaXN0IGxp Y2Vuc2U6YXNsMi4wIGxpY2Vuc2U6ZXhwYXQpKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWJhY2t0 cmFjZQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1iYWNrdHJhY2UiKQogICAgKHZlcnNpb24g IjAuMy40MCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1m ZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImJhY2t0cmFjZSIgdmVyc2lvbikpCiAgICAg ICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAi LmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAi MXNrcHNoejBnc3pocG1qNTFwMzVjaTluZjRubWQ3OXM4OTljZnJmczU3MGRneGNwY2s0aiIpKSkp CiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAg ICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtYWRkcjJsaW5lIiAscnVzdC1hZGRy MmxpbmUpCiAgICAgICAgICgicnVzdC1iYWNrdHJhY2Utc3lzIiAscnVzdC1iYWNrdHJhY2Utc3lz KQogICAgICAgICAoInJ1c3QtY2ZnLWlmIiAscnVzdC1jZmctaWYpCiAgICAgICAgICgicnVzdC1j b21waWxlci1idWlsdGlucyIKICAgICAgICAgICxydXN0LWNvbXBpbGVyLWJ1aWx0aW5zKQogICAg ICAgICAoInJ1c3QtY3BwLWRlbWFuZ2xlIiAscnVzdC1jcHAtZGVtYW5nbGUpCiAgICAgICAgICgi cnVzdC1maW5kc2hsaWJzIiAscnVzdC1maW5kc2hsaWJzKQogICAgICAgICAoInJ1c3QtZ29ibGlu LTAuMC4yNCIgLHJ1c3QtZ29ibGluLTAuMC4yNCkKICAgICAgICAgKCJydXN0LWxpYmMiICxydXN0 LWxpYmMpCiAgICAgICAgICgicnVzdC1tZW1tYXAiICxydXN0LW1lbW1hcCkKICAgICAgICAgKCJy dXN0LXJ1c3RjLWRlbWFuZ2xlIiAscnVzdC1ydXN0Yy1kZW1hbmdsZSkKICAgICAgICAgKCJydXN0 LXJ1c3RjLXNlcmlhbGl6ZSIgLHJ1c3QtcnVzdGMtc2VyaWFsaXplKQogICAgICAgICAoInJ1c3Qt cnVzdGMtc3RkLXdvcmtzcGFjZS1jb3JlIgogICAgICAgICAgLHJ1c3QtcnVzdGMtc3RkLXdvcmtz cGFjZS1jb3JlKQogICAgICAgICAoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKQogICAgICAgICAo InJ1c3Qtd2luYXBpIiAscnVzdC13aW5hcGkpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRw czovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2JhY2t0cmFjZS1ycyIpCiAgICAoc3lub3BzaXMKICAg ICAgIkEgbGlicmFyeSB0byBhY3F1aXJlIGEgc3RhY2sgdHJhY2UgKGJhY2t0cmFjZSkgYXQgcnVu dGltZSBpbiBhIFJ1c3QgcHJvZ3JhbS4KIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBw YWNrYWdlIHByb3ZpZGVzIGEgbGlicmFyeSB0byBhY3F1aXJlIGEgc3RhY2sgdHJhY2UgKGJhY2t0 cmFjZSkgYXQgcnVudGltZSBpbiBhIFJ1c3QgcHJvZ3JhbS4KIikKICAgIChsaWNlbnNlICNmKSkp CgooZGVmaW5lLXB1YmxpYyBydXN0LWZhaWx1cmUtZGVyaXZlCiAgKHBhY2thZ2UKICAgIChuYW1l ICJydXN0LWZhaWx1cmUtZGVyaXZlIikKICAgICh2ZXJzaW9uICIwLjEuNiIpCiAgICAoc291cmNl CiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChj cmF0ZS11cmkgImZhaWx1cmVfZGVyaXZlIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAg ICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAg ICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwMjJ4ZmI5d2NzMWJkc3Nm bTJhaXJzcmZ4cG4yY2NwYnloMWxkMndmOTQ4M2lzdmpiaGhiIikpKSkKICAgIChidWlsZC1zeXN0 ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5w dXRzCiAgICAgICAgKCgicnVzdC1wcm9jLW1hY3JvMiIgLHJ1c3QtcHJvYy1tYWNybzIpCiAgICAg ICAgICgicnVzdC1xdW90ZSIgLHJ1c3QtcXVvdGUpCiAgICAgICAgICgicnVzdC1zeW4iICxydXN0 LXN5bikKICAgICAgICAgKCJydXN0LXN5bnN0cnVjdHVyZSIgLHJ1c3Qtc3luc3RydWN0dXJlKSkp KQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9ydXN0LWxhbmctbnVyc2VyeS5naXRodWIu aW8vZmFpbHVyZS8iKQogICAgKHN5bm9wc2lzICJkZXJpdmVzIGZvciB0aGUgZmFpbHVyZSBjcmF0 ZSIpCiAgICAoZGVzY3JpcHRpb24gImRlcml2ZXMgZm9yIHRoZSBmYWlsdXJlIGNyYXRlIikKICAg IChsaWNlbnNlIChsaXN0IGxpY2Vuc2U6ZXhwYXQgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5l LXB1YmxpYyBydXN0LWNsb3VkYWJpCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWNsb3VkYWJp IikKICAgICh2ZXJzaW9uICIwLjAuMyIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAg ICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImNsb3VkYWJpIiB2 ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1l ICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMy CiAgICAgICAgICAgICIwa3hjZzgzamxpaHkwcGhuZDJnOGMyYzMwM3B4M2wycDNwa2p6MzU3bGw2 bGxuZDVwejZ4IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAg KGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1iaXRmbGFn cyIgLHJ1c3QtYml0ZmxhZ3MpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL251eGkubmwvY2xv dWRhYmkvIikKICAgIChzeW5vcHNpcwogICAgICAiTG93IGxldmVsIGludGVyZmFjZSB0byBDbG91 ZEFCSS4gQ29udGFpbnMgYWxsIHN5c2NhbGxzIGFuZCByZWxhdGVkIHR5cGVzLiIpCiAgICAoZGVz Y3JpcHRpb24KICAgICAgIkxvdyBsZXZlbCBpbnRlcmZhY2UgdG8gQ2xvdWRBQkkuICBDb250YWlu cyBhbGwgc3lzY2FsbHMgYW5kIHJlbGF0ZWQgdHlwZXMuIikKICAgIChsaWNlbnNlICNmKSkpCgoo ZGVmaW5lLXB1YmxpYyBydXN0LWZ1Y2hzaWEtY3BybmcKICAocGFja2FnZQogICAgKG5hbWUgInJ1 c3QtZnVjaHNpYS1jcHJuZyIpCiAgICAodmVyc2lvbiAiMC4xLjEiKQogICAgKHNvdXJjZQogICAg ICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUt dXJpICJmdWNoc2lhLWNwcm5nIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAg ICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hh MjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxZm5rcXJiejdpeHh6c2IwNGJzejlw MHp6YXphbm1hOHpuZmRxanZoMzluMTR2YXBmdngwIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2Fy Z28tYnVpbGQtc3lzdGVtKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9mdWNoc2lhLmdv b2dsZXNvdXJjZS5jb20vZnVjaHNpYS8rL21hc3Rlci9nYXJuZXQvcHVibGljL3J1c3QvZnVjaHNp YS1jcHJuZyIpCiAgICAoc3lub3BzaXMKICAgICAgIlJ1c3QgY3JhdGUgZm9yIHRoZSBGdWNoc2lh IGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvciIp CiAgICAoZGVzY3JpcHRpb24KICAgICAgIlJ1c3QgY3JhdGUgZm9yIHRoZSBGdWNoc2lhIGNyeXB0 b2dyYXBoaWNhbGx5IHNlY3VyZSBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvciIpCiAgICAo bGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yYW5kLWNvcmUtMC40LjIKICAocGFj a2FnZQogICAgKG5hbWUgInJ1c3QtcmFuZC1jb3JlIikKICAgICh2ZXJzaW9uICIwLjQuMiIpCiAg ICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAg ICAodXJpIChjcmF0ZS11cmkgInJhbmRfY29yZSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFt ZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAg ICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXAwOXlueXNycTF2 Y2RsbWNxbmFwcTRxYWtsMnlkMW5nM2t4aDNxc2NweDA5azJhNmN3dyIpKSkpCiAgICAoYnVpbGQt c3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdv LWlucHV0cwogICAgICAgICgoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKQogICAgICAgICAoInJ1 c3Qtc2VyZGUtZGVyaXZlIiAscnVzdC1zZXJkZS1kZXJpdmUpKSkpCiAgICAoaG9tZS1wYWdlICJo dHRwczovL2NyYXRlcy5pby9jcmF0ZXMvcmFuZF9jb3JlIikKICAgIChzeW5vcHNpcwogICAgICAi Q29yZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0cmFpdHMgYW5kIHRvb2xzIGZvciBpbXBsZW1l bnRhdGlvbi4KIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiQ29yZSByYW5kb20gbnVtYmVyIGdl bmVyYXRvciB0cmFpdHMgYW5kIHRvb2xzIGZvciBpbXBsZW1lbnRhdGlvbi4KIikKICAgIChsaWNl bnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXJkcmFuZC0wLjQuMAogIChwYWNrYWdlCiAg ICAobmFtZSAicnVzdC1yZHJhbmQiKQogICAgKHZlcnNpb24gIjAuNC4wIikKICAgIChzb3VyY2UK ICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNy YXRlLXVyaSAicmRyYW5kIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAo c3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2 CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxY2pxMGt3eDFiazdqeDNrenljaWlpc2g1 Z3Fzajc2MjBkbTQzZGM1MnNyOGZ6bW05MDM3IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28t YnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAg ICAgKCgicnVzdC1yYW5kLWNvcmUtMC4zLjEiICxydXN0LXJhbmQtY29yZS0wLjMuMSkpKSkKICAg IChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9uYWdpc2EvcnVzdF9yZHJhbmQv IikKICAgIChzeW5vcHNpcwogICAgICAiQW4gaW1wbGVtZW50YXRpb24gb2YgcmFuZG9tIG51bWJl ciBnZW5lcmF0b3IgYmFzZWQgb24gcmRyYW5kIGFuZCByZHNlZWQgaW5zdHJ1Y3Rpb25zIikKICAg IChkZXNjcmlwdGlvbgogICAgICAiQW4gaW1wbGVtZW50YXRpb24gb2YgcmFuZG9tIG51bWJlciBn ZW5lcmF0b3IgYmFzZWQgb24gcmRyYW5kIGFuZCByZHNlZWQgaW5zdHJ1Y3Rpb25zIikKICAgIChs aWNlbnNlIGxpY2Vuc2U6aXNjKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWJhc2U2NC0wLjEwLjEK ICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtYmFzZTY0IikKICAgICh2ZXJzaW9uICIwLjEwLjEi KQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAg ICAgICAgKHVyaSAoY3JhdGUtdXJpICJiYXNlNjQiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5h bWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQog ICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjEzazZidmQzbjZk bTdqcW45eDkxOHc2NWRkOXhoeDQ1NGJxcGhibnYwYmtkNm45ZGo5OGIiKSkpKQogICAgKGJ1aWxk LXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJn by1pbnB1dHMKICAgICAgICAoKCJydXN0LWJ5dGVvcmRlciIgLHJ1c3QtYnl0ZW9yZGVyKSkpKQog ICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL21hcnNoYWxscGllcmNlL3J1 c3QtYmFzZTY0IikKICAgIChzeW5vcHNpcwogICAgICAiZW5jb2RlcyBhbmQgZGVjb2RlcyBiYXNl NjQgYXMgYnl0ZXMgb3IgdXRmOCIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgImVuY29kZXMgYW5k IGRlY29kZXMgYmFzZTY0IGFzIGJ5dGVzIG9yIHV0ZjgiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihk ZWZpbmUtcHVibGljIHJ1c3QtYmxha2UyYi1zaW1kCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0 LWJsYWtlMmItc2ltZCIpCiAgICAodmVyc2lvbiAiMC41LjkiKQogICAgKHNvdXJjZQogICAgICAo b3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJp ICJibGFrZTJiX3NpbWQiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChz dHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYK ICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFoNmhoemd2dm1wOWpiNHB2YjQ4aDVqMHc1 dmIxbjAyYWhpMGcyNnAyd2c2bjZtN25meHEiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1i dWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAg ICAoKCJydXN0LWFycmF5cmVmIiAscnVzdC1hcnJheXJlZikKICAgICAgICAgKCJydXN0LWFycmF5 dmVjIiAscnVzdC1hcnJheXZlYykKICAgICAgICAgKCJydXN0LWNvbnN0YW50LXRpbWUtZXEiICxy dXN0LWNvbnN0YW50LXRpbWUtZXEpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dp dGh1Yi5jb20vb2Nvbm5vcjY2My9ibGFrZTJfc2ltZCIpCiAgICAoc3lub3BzaXMKICAgICAgImEg cHVyZSBSdXN0IEJMQUtFMmIgaW1wbGVtZW50YXRpb24gd2l0aCBkeW5hbWljIFNJTUQiKQogICAg KGRlc2NyaXB0aW9uCiAgICAgICJhIHB1cmUgUnVzdCBCTEFLRTJiIGltcGxlbWVudGF0aW9uIHdp dGggZHluYW1pYyBTSU1EIikKICAgIChsaWNlbnNlIGxpY2Vuc2U6ZXhwYXQpKSkKCihkZWZpbmUt cHVibGljIHJ1c3QtY3Jvc3NiZWFtLXV0aWxzLTAuNi42CiAgKHBhY2thZ2UKICAgIChuYW1lICJy dXN0LWNyb3NzYmVhbS11dGlscyIpCiAgICAodmVyc2lvbiAiMC42LjYiKQogICAgKHNvdXJjZQog ICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3Jh dGUtdXJpICJjcm9zc2JlYW0tdXRpbHMiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAg ICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAg IChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFyazByOW4wNGJtcTRhM2cy cTVxaHZ2bG1ybXg3ODBnYzZoOWxtYzk0bXduZHNsa3o1cTQiKSkpKQogICAgKGJ1aWxkLXN5c3Rl bSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1 dHMKICAgICAgICAoKCJydXN0LWNmZy1pZiIgLHJ1c3QtY2ZnLWlmKQogICAgICAgICAoInJ1c3Qt bGF6eS1zdGF0aWMiICxydXN0LWxhenktc3RhdGljKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAi aHR0cHM6Ly9naXRodWIuY29tL2Nyb3NzYmVhbS1ycy9jcm9zc2JlYW0vdHJlZS9tYXN0ZXIvY3Jv c3NiZWFtLXV0aWxzIikKICAgIChzeW5vcHNpcyAiVXRpbGl0aWVzIGZvciBjb25jdXJyZW50IHBy b2dyYW1taW5nIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVXRpbGl0aWVzIGZvciBjb25jdXJy ZW50IHByb2dyYW1taW5nIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0 LXJhbmQtY2hhY2hhLTAuMS4xCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXJhbmQtY2hhY2hh IikKICAgICh2ZXJzaW9uICIwLjEuMSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAg ICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInJhbmRfY2hhY2hh IiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBu YW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFz ZTMyCiAgICAgICAgICAgICIxdnh3eXpzNGZ5MWZmamM4bDAwZnN5eWdwaXNzMTM1aXJqZjdueXhn cTJ2MGxxZjNsdmFtIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQog ICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1hdXRv Y2ZnIiAscnVzdC1hdXRvY2ZnKQogICAgICAgICAoInJ1c3QtcmFuZC1jb3JlLTAuMy4xIiAscnVz dC1yYW5kLWNvcmUtMC4zLjEpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2NyYXRl cy5pby9jcmF0ZXMvcmFuZF9jaGFjaGEiKQogICAgKHN5bm9wc2lzICJDaGFDaGEgcmFuZG9tIG51 bWJlciBnZW5lcmF0b3IKIikKICAgIChkZXNjcmlwdGlvbiAiQ2hhQ2hhIHJhbmRvbSBudW1iZXIg Z2VuZXJhdG9yCiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yYW5k LWhjLTAuMS4xCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXJhbmQtaGMiKQogICAgKHZlcnNp b24gIjAuMS4xIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJs LWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAicmFuZF9oYyIgdmVyc2lvbikpCiAgICAg ICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAi LmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAi MGczM2wzODFod2Z2eGRjdjUwMmQ1Yzg4Zmg3Z3c3OGZrZm1scDI3anA4aGhsZnh6eGFtNSIpKSkp CiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAg ICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtcmFuZC1jb3JlIiAscnVzdC1yYW5k LWNvcmUpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL2NyYXRlcy5pby9jcmF0ZXMvcmFuZF9o YyIpCiAgICAoc3lub3BzaXMgIkhDMTI4IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCiIpCiAgICAo ZGVzY3JpcHRpb24gIkhDMTI4IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCiIpCiAgICAobGljZW5z ZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yYW5kLWlzYWFjLTAuMS4yCiAgKHBhY2thZ2UK ICAgIChuYW1lICJydXN0LXJhbmQtaXNhYWMiKQogICAgKHZlcnNpb24gIjAuMS4yIikKICAgIChz b3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1 cmkgKGNyYXRlLXVyaSAicmFuZF9pc2FhYyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQog ICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAg ICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMHppbnNxeXB2bTB2d2Rp d2RhYnZxNzRkMG5ucnpzaGIwa3l6c3J3aTRsNW1scDRwa2t4OSIpKSkpCiAgICAoYnVpbGQtc3lz dGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlu cHV0cwogICAgICAgICgoInJ1c3QtcmFuZC1jb3JlIiAscnVzdC1yYW5kLWNvcmUpCiAgICAgICAg ICgicnVzdC1zZXJkZSIgLHJ1c3Qtc2VyZGUpCiAgICAgICAgICgicnVzdC1zZXJkZS1kZXJpdmUi ICxydXN0LXNlcmRlLWRlcml2ZSkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vY3JhdGVzLmlv L2NyYXRlcy9yYW5kX2lzYWFjIikKICAgIChzeW5vcHNpcyAiSVNBQUMgcmFuZG9tIG51bWJlciBn ZW5lcmF0b3IKIikKICAgIChkZXNjcmlwdGlvbiAiSVNBQUMgcmFuZG9tIG51bWJlciBnZW5lcmF0 b3IKIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXJhbmQtaml0dGVy LTAuMS40CiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXJhbmQtaml0dGVyIikKICAgICh2ZXJz aW9uICIwLjEuNCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVy bC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInJhbmRfaml0dGVyIiB2ZXJzaW9uKSkK ICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJz aW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAg ICAgICIxNnozODd5NDZiZnozY3NjNDJ6eGJqcTg5dmNyMWF4cWFjbmN2djhxaHl5OTNwNHhhcmhp IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50 cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1saWJjIiAscnVzdC1saWJj KQogICAgICAgICAoInJ1c3QtbG9nIiAscnVzdC1sb2cpCiAgICAgICAgICgicnVzdC1yYW5kLWNv cmUtMC40LjIiICxydXN0LXJhbmQtY29yZS0wLjQuMikKICAgICAgICAgKCJydXN0LXdpbmFwaSIg LHJ1c3Qtd2luYXBpKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3Qt cmFuZG9tL3JhbmQiKQogICAgKHN5bm9wc2lzCiAgICAgICJSYW5kb20gbnVtYmVyIGdlbmVyYXRv ciBiYXNlZCBvbiB0aW1pbmcgaml0dGVyIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiUmFuZG9t IG51bWJlciBnZW5lcmF0b3IgYmFzZWQgb24gdGltaW5nIGppdHRlciIpCiAgICAobGljZW5zZSAo bGlzdCBsaWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVz dC1yYW5kLXBjZy0wLjEuMgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1yYW5kLXBjZyIpCiAg ICAodmVyc2lvbiAiMC4xLjIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1l dGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJyYW5kX3BjZyIgdmVyc2lv bikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIg dmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAg ICAgICAgICAiMGkwYmRsYTE4YTh4NGpuMXcwZnhzYnMzamc3YWpsbHo2YXptY2gxenczM3IwNmR2 MXlkYiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1 bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtYXV0b2NmZyIgLHJ1 c3QtYXV0b2NmZykKICAgICAgICAgKCJydXN0LXJhbmQtY29yZS0wLjQuMiIgLHJ1c3QtcmFuZC1j b3JlLTAuNC4yKQogICAgICAgICAoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKQogICAgICAgICAo InJ1c3Qtc2VyZGUtZGVyaXZlIiAscnVzdC1zZXJkZS1kZXJpdmUpKSkpCiAgICAoaG9tZS1wYWdl ICJodHRwczovL2NyYXRlcy5pby9jcmF0ZXMvcmFuZF9wY2ciKQogICAgKHN5bm9wc2lzCiAgICAg ICJTZWxlY3RlZCBQQ0cgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzCiIpCiAgICAoZGVzY3JpcHRp b24KICAgICAgIlNlbGVjdGVkIFBDRyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMKIikKICAgIChs aWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXJhbmQteG9yc2hpZnQtMC4xLjIKICAo cGFja2FnZQogICAgKG5hbWUgInJ1c3QtcmFuZC14b3JzaGlmdCIpCiAgICAodmVyc2lvbiAiMC4x LjIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gp CiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJyYW5kX3hvcnNoaWZ0IiB2ZXJzaW9uKSkKICAgICAg ICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIu Y3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIx dnd5dmx5MmJnbmkyNDZqOHhsczgzYXh2Y2p6OXA1NjN2eW54NXJxcWxsOGhpenN6YTk3IikpKSkK ICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAg ICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1yYW5kLWNvcmUiICxydXN0LXJhbmQt Y29yZSkKICAgICAgICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkKICAgICAgICAgKCJydXN0 LXNlcmRlLWRlcml2ZSIgLHJ1c3Qtc2VyZGUtZGVyaXZlKSkpKQogICAgKGhvbWUtcGFnZQogICAg ICAiaHR0cHM6Ly9jcmF0ZXMuaW8vY3JhdGVzL3JhbmRfeG9yc2hpZnQiKQogICAgKHN5bm9wc2lz ICJYb3JzaGlmdCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgoiKQogICAgKGRlc2NyaXB0aW9uCiAg ICAgICJYb3JzaGlmdCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgoiKQogICAgKGxpY2Vuc2UgI2Yp KSkKCihkZWZpbmUtcHVibGljIHJ1c3QtcGFja2VkLXNpbWQKICAocGFja2FnZQogICAgKG5hbWUg InJ1c3QtcGFja2VkLXNpbWQiKQogICAgKHZlcnNpb24gIjAuMy4zIikKICAgIChzb3VyY2UKICAg ICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRl LXVyaSAicGFja2VkX3NpbWQiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAg IChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEy NTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjA4MjJ3cWY2a3p3NGlnOXlrbmRnMzQ4 dzJieGtoczN4NjRicnpzdmR4aDJhMXB5YWpwbTgiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJn by1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAg ICAgICAoKCJydXN0LWNmZy1pZiIgLHJ1c3QtY2ZnLWlmKQogICAgICAgICAoInJ1c3QtY29yZS1h cmNoIiAscnVzdC1jb3JlLWFyY2gpCiAgICAgICAgICgicnVzdC1zbGVlZi1zeXMiICxydXN0LXNs ZWVmLXN5cykpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9ydXN0 LWxhbmctbnVyc2VyeS9wYWNrZWRfc2ltZCIpCiAgICAoc3lub3BzaXMgIlBvcnRhYmxlIFBhY2tl ZCBTSU1EIHZlY3RvcnMiKQogICAgKGRlc2NyaXB0aW9uICJQb3J0YWJsZSBQYWNrZWQgU0lNRCB2 ZWN0b3JzIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXJ1c3RjLXN0 ZC13b3Jrc3BhY2UtYWxsb2MKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcnVzdGMtc3RkLXdv cmtzcGFjZS1hbGxvYyIpCiAgICAodmVyc2lvbiAiMS4wLjAiKQogICAgKHNvdXJjZQogICAgICAo b3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJp ICJydXN0Yy1zdGQtd29ya3NwYWNlLWFsbG9jIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1l CiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAg ICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxMXBzbXFrNmdsZ2x4 bDN6d2g4c2x6Nml5bmZ4YWlmaDRzcGQyd2Nud3M1NTJkcWRhcnB6IikpKSkKICAgIChidWlsZC1z eXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGhvbWUtcGFnZSAiIikKICAgIChzeW5vcHNp cyAid29ya3NwYWNlIGhhY2siKQogICAgKGRlc2NyaXB0aW9uICJ3b3Jrc3BhY2UgaGFjayIpCiAg ICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1kaXNjYXJkCiAgKHBhY2thZ2UK ICAgIChuYW1lICJydXN0LWRpc2NhcmQiKQogICAgKHZlcnNpb24gIjEuMC40IikKICAgIChzb3Vy Y2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkg KGNyYXRlLXVyaSAiZGlzY2FyZCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAg ICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNo YTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWg2N25pNWJ4dmc5NXM5MXdnaWNp bHk0aXg3bGN3N2NxMGE1Z3k5bmpyeWJhaWJoeWI5MSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNh cmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNv bS9QYXVhbi9ydXN0LWRpc2NhcmQiKQogICAgKHN5bm9wc2lzCiAgICAgICJEaXNjYXJkIHRyYWl0 IHdoaWNoIGFsbG93cyBmb3IgaW50ZW50aW9uYWxseSBsZWFraW5nIG1lbW9yeSIpCiAgICAoZGVz Y3JpcHRpb24KICAgICAgIkRpc2NhcmQgdHJhaXQgd2hpY2ggYWxsb3dzIGZvciBpbnRlbnRpb25h bGx5IGxlYWtpbmcgbWVtb3J5IikKICAgIChsaWNlbnNlIGxpY2Vuc2U6ZXhwYXQpKSkKCihkZWZp bmUtcHVibGljIHJ1c3QtcnVzdGMtdmVyc2lvbgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1y dXN0Yy12ZXJzaW9uIikKICAgICh2ZXJzaW9uICIwLjIuMyIpCiAgICAoc291cmNlCiAgICAgIChv cmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkg InJ1c3RjX3ZlcnNpb24iIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChz dHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYK ICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjAyaDN4NTdsY3I4bDJwbTBhNjQ1czl3aGRo MzNwbjVjbnJ3dm41Y2I1N3ZjcmM1M3gzaGsiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1i dWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMgKCgicnVz dC1zZW12ZXIiICxydXN0LXNlbXZlcikpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8v Z2l0aHViLmNvbS9LaW11bmRpL3J1c3RjLXZlcnNpb24tcnMiKQogICAgKHN5bm9wc2lzCiAgICAg ICJBIGxpYnJhcnkgZm9yIHF1ZXJ5aW5nIHRoZSB2ZXJzaW9uIG9mIGEgaW5zdGFsbGVkIHJ1c3Rj IGNvbXBpbGVyIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVz IGEgbGlicmFyeSBmb3IgcXVlcnlpbmcgdGhlIHZlcnNpb24gb2YgYSBpbnN0YWxsZWQgcnVzdGMg Y29tcGlsZXIiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtc3Rkd2Vi LWRlcml2ZQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zdGR3ZWItZGVyaXZlIikKICAgICh2 ZXJzaW9uICIwLjUuMyIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9k IHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInN0ZHdlYi1kZXJpdmUiIHZlcnNp b24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0i IHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAg ICAgICAgICAgIjF2c2g3ZzBnYXhuNGt4cXEza25oeW1kbjAycDJwZnhtbmQyajB2cGxwajZjMXlq NjB5bjgiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJn dW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LXByb2MtbWFjcm8y IiAscnVzdC1wcm9jLW1hY3JvMikKICAgICAgICAgKCJydXN0LXF1b3RlIiAscnVzdC1xdW90ZSkK ICAgICAgICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkKICAgICAgICAgKCJydXN0LXNlcmRl LWRlcml2ZSIgLHJ1c3Qtc2VyZGUtZGVyaXZlKQogICAgICAgICAoInJ1c3Qtc3luIiAscnVzdC1z eW4pKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20va291dGUvc3Rkd2ViIikK ICAgIChzeW5vcHNpcyAiRGVyaXZlIG1hY3JvcyBmb3IgdGhlIGBzdGR3ZWJgIGNyYXRlIikKICAg IChkZXNjcmlwdGlvbgogICAgICAiRGVyaXZlIG1hY3JvcyBmb3IgdGhlIGBzdGR3ZWJgIGNyYXRl IikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXN0ZHdlYi1pbnRlcm5h bC1tYWNyb3MKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qtc3Rkd2ViLWludGVybmFsLW1hY3Jv cyIpCiAgICAodmVyc2lvbiAiMC4yLjkiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAg ICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzdGR3ZWItaW50 ZXJuYWwtbWFjcm9zIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3Ry aW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAg ICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwNDlmcThmbDVueTlsNWlmMnF2N2t4d25nN2c2 bnM5NWg0ZmJtM3p4MzYwZG1wdjV6eWpxIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVp bGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAg KCgicnVzdC1iYXNlLXgiICxydXN0LWJhc2UteCkKICAgICAgICAgKCJydXN0LXByb2MtbWFjcm8y IiAscnVzdC1wcm9jLW1hY3JvMikKICAgICAgICAgKCJydXN0LXF1b3RlIiAscnVzdC1xdW90ZSkK ICAgICAgICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkKICAgICAgICAgKCJydXN0LXNlcmRl LWRlcml2ZSIgLHJ1c3Qtc2VyZGUtZGVyaXZlKQogICAgICAgICAoInJ1c3Qtc2VyZGUtanNvbiIg LHJ1c3Qtc2VyZGUtanNvbikKICAgICAgICAgKCJydXN0LXNoYTEiICxydXN0LXNoYTEpCiAgICAg ICAgICgicnVzdC1zeW4iICxydXN0LXN5bikpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0 aHViLmNvbS9rb3V0ZS9zdGR3ZWIiKQogICAgKHN5bm9wc2lzCiAgICAgICJJbnRlcm5hbCBwcm9j ZWR1cmFsIG1hY3JvcyBmb3IgdGhlIGBzdGR3ZWJgIGNyYXRlIikKICAgIChkZXNjcmlwdGlvbgog ICAgICAiSW50ZXJuYWwgcHJvY2VkdXJhbCBtYWNyb3MgZm9yIHRoZSBgc3Rkd2ViYCBjcmF0ZSIp CiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1zdGR3ZWItaW50ZXJuYWwt cnVudGltZQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zdGR3ZWItaW50ZXJuYWwtcnVudGlt ZSIpCiAgICAodmVyc2lvbiAiMC4xLjUiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAg ICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzdGR3ZWItaW50 ZXJuYWwtcnVudGltZSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0 cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1Ngog ICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWgwbmtwcGI0cjhkYnJibXMyaHc5bjV4ZGNz MzkybTByNWhqM2I2bHN4M2g2ZngwMmRyMSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1 aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9rb3V0ZS9zdGR3 ZWIiKQogICAgKHN5bm9wc2lzCiAgICAgICJJbnRlcm5hbCBydW50aW1lIGZvciB0aGUgYHN0ZHdl YmAgY3JhdGUiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJJbnRlcm5hbCBydW50aW1lIGZvciB0 aGUgYHN0ZHdlYmAgY3JhdGUiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1 c3QtZnV0dXJlcy1jaGFubmVsLXByZXZpZXcKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtZnV0 dXJlcy1jaGFubmVsLXByZXZpZXciKQogICAgKHZlcnNpb24gIjAuMy4wLWFscGhhLjE5IikKICAg IChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAg ICh1cmkgKGNyYXRlLXVyaSAiZnV0dXJlcy1jaGFubmVsLXByZXZpZXciIHZlcnNpb24pKQogICAg ICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24g Ii5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAg IjBmaTZiaTRscHl4amlneTExeTVzamc2d2xjOG5jNzF2YnBteHozMWMzYWFnanZnejlyZm0iKSkp KQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAg ICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWZ1dHVyZXMtY29yZS1wcmV2aWV3 IgogICAgICAgICAgLHJ1c3QtZnV0dXJlcy1jb3JlLXByZXZpZXcpCiAgICAgICAgICgicnVzdC1m dXR1cmVzLXNpbmstcHJldmlldyIKICAgICAgICAgICxydXN0LWZ1dHVyZXMtc2luay1wcmV2aWV3 KSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9ydXN0LWxhbmctbnVyc2VyeS5naXRo dWIuaW8vZnV0dXJlcy1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIkNoYW5uZWxzIGZvciBhc3lu Y2hyb25vdXMgY29tbXVuaWNhdGlvbiB1c2luZyBmdXR1cmVzLXJzLgoiKQogICAgKGRlc2NyaXB0 aW9uCiAgICAgICJDaGFubmVscyBmb3IgYXN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gdXNpbmcg ZnV0dXJlcy1ycy4KIikKICAgIChsaWNlbnNlIChsaXN0IGxpY2Vuc2U6ZXhwYXQgbGljZW5zZTph c2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWZ1dHVyZXMtY29yZS1wcmV2aWV3CiAgKHBh Y2thZ2UKICAgIChuYW1lICJydXN0LWZ1dHVyZXMtY29yZS1wcmV2aWV3IikKICAgICh2ZXJzaW9u ICIwLjMuMC1hbHBoYS4xOSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0 aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImZ1dHVyZXMtY29yZS1wcmV2 aWV3IiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVu ZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAo YmFzZTMyCiAgICAgICAgICAgICIwMm42NmpramhweTIxMGR2MjRwejBqMzBsdnlpbjVremxyYjUw cDFqN3g4eXpkaW40bnhrIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVt KQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9ydXN0LWxhbmctbnVyc2VyeS5naXRodWIu aW8vZnV0dXJlcy1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIlRoZSBjb3JlIHRyYWl0cyBhbmQg dHlwZXMgaW4gZm9yIHRoZSBgZnV0dXJlc2AgbGlicmFyeS4KIikKICAgIChkZXNjcmlwdGlvbgog ICAgICAiVGhlIGNvcmUgdHJhaXRzIGFuZCB0eXBlcyBpbiBmb3IgdGhlIGBmdXR1cmVzYCBsaWJy YXJ5LgoiKQogICAgKGxpY2Vuc2UgKGxpc3QgbGljZW5zZTpleHBhdCBsaWNlbnNlOmFzbDIuMCkp KSkKCihkZWZpbmUtcHVibGljIHJ1c3QtZnV0dXJlcy1leGVjdXRvci1wcmV2aWV3CiAgKHBhY2th Z2UKICAgIChuYW1lICJydXN0LWZ1dHVyZXMtZXhlY3V0b3ItcHJldmlldyIpCiAgICAodmVyc2lv biAiMC4zLjAtYWxwaGEuMTkiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1l dGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJmdXR1cmVzLWV4ZWN1dG9y LXByZXZpZXciIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmct YXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAg ICAgIChiYXNlMzIKICAgICAgICAgICAgIjE2MXl2N3d3aGE2MG1kemoxaWQ0N2toOHlsbmhjbnY3 Ymxnd2lkZzh4czR6cG40Nnc4dm0iKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1z eXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJy dXN0LWZ1dHVyZXMtY29yZS1wcmV2aWV3IgogICAgICAgICAgLHJ1c3QtZnV0dXJlcy1jb3JlLXBy ZXZpZXcpCiAgICAgICAgICgicnVzdC1mdXR1cmVzLXV0aWwtcHJldmlldyIKICAgICAgICAgICxy dXN0LWZ1dHVyZXMtdXRpbC1wcmV2aWV3KQogICAgICAgICAoInJ1c3QtbnVtLWNwdXMiICxydXN0 LW51bS1jcHVzKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9ydXN0LWxhbmctbnVy c2VyeS5naXRodWIuaW8vZnV0dXJlcy1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIkV4ZWN1dG9y cyBmb3IgYXN5bmNocm9ub3VzIHRhc2tzIGJhc2VkIG9uIHRoZSBmdXR1cmVzLXJzIGxpYnJhcnku CiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkV4ZWN1dG9ycyBmb3IgYXN5bmNocm9ub3VzIHRh c2tzIGJhc2VkIG9uIHRoZSBmdXR1cmVzLXJzIGxpYnJhcnkuCiIpCiAgICAobGljZW5zZSAobGlz dCBsaWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1m dXR1cmVzLXV0aWwtcHJldmlldwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1mdXR1cmVzLXV0 aWwtcHJldmlldyIpCiAgICAodmVyc2lvbiAiMC4zLjAtYWxwaGEuMTkiKQogICAgKHNvdXJjZQog ICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3Jh dGUtdXJpICJmdXR1cmVzLXV0aWwtcHJldmlldyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFt ZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAg ICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMTM4Zjh3eTB2cXky Z3NnazI4a2xkYnFucmRjZ3dmdjlmOXh4NnJ3emtyOHA3aWluaXNhdyIpKSkpCiAgICAoYnVpbGQt c3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdv LWlucHV0cwogICAgICAgICgoInJ1c3QtZnV0dXJlcy0wLjEuMjkiICxydXN0LWZ1dHVyZXMtMC4x LjI5KQogICAgICAgICAoInJ1c3QtZnV0dXJlcy1jaGFubmVsLXByZXZpZXciCiAgICAgICAgICAs cnVzdC1mdXR1cmVzLWNoYW5uZWwtcHJldmlldykKICAgICAgICAgKCJydXN0LWZ1dHVyZXMtY29y ZS1wcmV2aWV3IgogICAgICAgICAgLHJ1c3QtZnV0dXJlcy1jb3JlLXByZXZpZXcpCiAgICAgICAg ICgicnVzdC1mdXR1cmVzLWlvLXByZXZpZXciCiAgICAgICAgICAscnVzdC1mdXR1cmVzLWlvLXBy ZXZpZXcpCiAgICAgICAgICgicnVzdC1mdXR1cmVzLWpvaW4tbWFjcm8tcHJldmlldyIKICAgICAg ICAgICxydXN0LWZ1dHVyZXMtam9pbi1tYWNyby1wcmV2aWV3KQogICAgICAgICAoInJ1c3QtZnV0 dXJlcy1zZWxlY3QtbWFjcm8tcHJldmlldyIKICAgICAgICAgICxydXN0LWZ1dHVyZXMtc2VsZWN0 LW1hY3JvLXByZXZpZXcpCiAgICAgICAgICgicnVzdC1mdXR1cmVzLXNpbmstcHJldmlldyIKICAg ICAgICAgICxydXN0LWZ1dHVyZXMtc2luay1wcmV2aWV3KQogICAgICAgICAoInJ1c3QtbWVtY2hy IiAscnVzdC1tZW1jaHIpCiAgICAgICAgICgicnVzdC1waW4tdXRpbHMiICxydXN0LXBpbi11dGls cykKICAgICAgICAgKCJydXN0LXByb2MtbWFjcm8taGFjayIgLHJ1c3QtcHJvYy1tYWNyby1oYWNr KQogICAgICAgICAoInJ1c3QtcHJvYy1tYWNyby1uZXN0ZWQiCiAgICAgICAgICAscnVzdC1wcm9j LW1hY3JvLW5lc3RlZCkKICAgICAgICAgKCJydXN0LXNsYWIiICxydXN0LXNsYWIpCiAgICAgICAg ICgicnVzdC10b2tpby1pby0wLjEuMTIiICxydXN0LXRva2lvLWlvLTAuMS4xMikpKSkKICAgICho b21lLXBhZ2UKICAgICAgImh0dHBzOi8vcnVzdC1sYW5nLW51cnNlcnkuZ2l0aHViLmlvL2Z1dHVy ZXMtcnMiKQogICAgKHN5bm9wc2lzCiAgICAgICJDb21tb24gdXRpbGl0aWVzIGFuZCBleHRlbnNp b24gdHJhaXRzIGZvciB0aGUgZnV0dXJlcy1ycyBsaWJyYXJ5LgoiKQogICAgKGRlc2NyaXB0aW9u CiAgICAgICJDb21tb24gdXRpbGl0aWVzIGFuZCBleHRlbnNpb24gdHJhaXRzIGZvciB0aGUgZnV0 dXJlcy1ycyBsaWJyYXJ5LgoiKQogICAgKGxpY2Vuc2UgKGxpc3QgbGljZW5zZTpleHBhdCBsaWNl bnNlOmFzbDIuMCkpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtc2VyZGUtanNvbgogIChwYWNrYWdl CiAgICAobmFtZSAicnVzdC1zZXJkZS1qc29uIikKICAgICh2ZXJzaW9uICIxLjAuNDIiKQogICAg KHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAg KHVyaSAoY3JhdGUtdXJpICJzZXJkZV9qc29uIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1l CiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAg ICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwaHEweDB4MGxiamN2 Zm5tbDJzN3prN3M5bGNhNTBna3F6NWJqOG43dzFoenBrZjUyY3FzIikpKSkKICAgIChidWlsZC1z eXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28t aW5wdXRzCiAgICAgICAgKCgicnVzdC1pbmRleG1hcCIgLHJ1c3QtaW5kZXhtYXApCiAgICAgICAg ICgicnVzdC1pdG9hIiAscnVzdC1pdG9hKQogICAgICAgICAoInJ1c3Qtcnl1IiAscnVzdC1yeXUp CiAgICAgICAgICgicnVzdC1zZXJkZSIgLHJ1c3Qtc2VyZGUpKSkpCiAgICAoaG9tZS1wYWdlICJo dHRwczovL2dpdGh1Yi5jb20vc2VyZGUtcnMvanNvbiIpCiAgICAoc3lub3BzaXMgIkEgSlNPTiBz ZXJpYWxpemF0aW9uIGZpbGUgZm9ybWF0IikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBw YWNrYWdlIHByb3ZpZGVzIGEgSlNPTiBzZXJpYWxpemF0aW9uIGZpbGUgZm9ybWF0IikKICAgIChs aWNlbnNlIChsaXN0IGxpY2Vuc2U6ZXhwYXQgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5lLXB1 YmxpYyBydXN0LXdhc20tYmluZGdlbi1tYWNybwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC13 YXNtLWJpbmRnZW4tbWFjcm8iKQogICAgKHZlcnNpb24gIjAuMi41NSIpCiAgICAoc291cmNlCiAg ICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0 ZS11cmkgIndhc20tYmluZGdlbi1tYWNybyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQog ICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAg ICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXI0enhjNTJwcDQ0aGhp bmQyeHhiYm5jeThqZGNoczY2eWxsNWs5OTZnNXB3cjN3Z3o0NyIpKSkpCiAgICAoYnVpbGQtc3lz dGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlu cHV0cwogICAgICAgICgoInJ1c3QtcXVvdGUiICxydXN0LXF1b3RlKQogICAgICAgICAoInJ1c3Qt d2FzbS1iaW5kZ2VuLW1hY3JvLXN1cHBvcnQiCiAgICAgICAgICAscnVzdC13YXNtLWJpbmRnZW4t bWFjcm8tc3VwcG9ydCkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vcnVzdHdhc20u Z2l0aHViLmlvL3dhc20tYmluZGdlbi8iKQogICAgKHN5bm9wc2lzCiAgICAgICJEZWZpbml0aW9u IG9mIHRoZSBgI1t3YXNtX2JpbmRnZW5dYCBhdHRyaWJ1dGUsIGFuIGludGVybmFsIGRlcGVuZGVu Y3kKIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiRGVmaW5pdGlvbiBvZiB0aGUgYCNbd2FzbV9i aW5kZ2VuXWAgYXR0cmlidXRlLCBhbiBpbnRlcm5hbCBkZXBlbmRlbmN5CiIpCiAgICAobGljZW5z ZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1zbWFsbHZlYy0wLjYuMTMKICAocGFja2FnZQog ICAgKG5hbWUgInJ1c3Qtc21hbGx2ZWMiKQogICAgKHZlcnNpb24gIjAuNi4xMyIpCiAgICAoc291 cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJp IChjcmF0ZS11cmkgInNtYWxsdmVjIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAg ICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAo c2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxZGwyMTl2bmZrbXNmeDI4bG0z ZjgzbHl3MjR6YXA2ZmRzbGk2cmc4bm5wMWFhNjdiYzdwIikpKSkKICAgIChidWlsZC1zeXN0ZW0g Y2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRz CiAgICAgICAgKCgicnVzdC1tYXliZS11bmluaXQiICxydXN0LW1heWJlLXVuaW5pdCkKICAgICAg ICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0 dHBzOi8vZ2l0aHViLmNvbS9zZXJ2by9ydXN0LXNtYWxsdmVjIikKICAgIChzeW5vcHNpcwogICAg ICAiJ1NtYWxsIHZlY3Rvcicgb3B0aW1pemF0aW9uOiBzdG9yZSB1cCB0byBhIHNtYWxsIG51bWJl ciBvZiBpdGVtcyBvbiB0aGUgc3RhY2siKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICInU21hbGwg dmVjdG9yJyBvcHRpbWl6YXRpb246IHN0b3JlIHVwIHRvIGEgc21hbGwgbnVtYmVyIG9mIGl0ZW1z IG9uIHRoZSBzdGFjayIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1z dmFsLWRlcml2ZQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zdmFsLWRlcml2ZSIpCiAgICAo dmVyc2lvbiAiMC40LjciKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhv ZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzdmFsX2Rlcml2ZSIgdmVyc2lv bikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIg dmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAg ICAgICAgICAiMDdzN2pxc2RjenNnMHdueWRmbnh5cnNqOHp5cmptaXdsNGlzMWRmZ244ZGZ2eWk4 bjJiaiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1 bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtcHJvYy1tYWNybzIi ICxydXN0LXByb2MtbWFjcm8yKQogICAgICAgICAoInJ1c3QtcXVvdGUiICxydXN0LXF1b3RlKQog ICAgICAgICAoInJ1c3Qtc3luIiAscnVzdC1zeW4pKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczov L2dpdGh1Yi5jb20vc3ZhbC1ycy9zdmFsIikKICAgIChzeW5vcHNpcyAiQ3VzdG9tIGRlcml2ZSBm b3Igc3ZhbCIpCiAgICAoZGVzY3JpcHRpb24gIkN1c3RvbSBkZXJpdmUgZm9yIHN2YWwiKQogICAg KGxpY2Vuc2UgKGxpc3QgbGljZW5zZTphc2wyLjAgbGljZW5zZTpleHBhdCkpKSkKCihkZWZpbmUt cHVibGljIHJ1c3QtcnVzdGMtZGVtYW5nbGUKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcnVz dGMtZGVtYW5nbGUiKQogICAgKHZlcnNpb24gIjAuMS4xNiIpCiAgICAoc291cmNlCiAgICAgIChv cmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkg InJ1c3RjLWRlbWFuZ2xlIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAo c3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2 CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxMHFwNDJzbDF3cmRiZ2JiaDhybmF5Mmdy bTk3Nno3aHFnejMyYzR5MDlsMWMwNzFxc2FjIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28t YnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAg ICAgKCgicnVzdC1jb21waWxlci1idWlsdGlucyIKICAgICAgICAgICxydXN0LWNvbXBpbGVyLWJ1 aWx0aW5zKQogICAgICAgICAoInJ1c3QtcnVzdGMtc3RkLXdvcmtzcGFjZS1jb3JlIgogICAgICAg ICAgLHJ1c3QtcnVzdGMtc3RkLXdvcmtzcGFjZS1jb3JlKSkpKQogICAgKGhvbWUtcGFnZQogICAg ICAiaHR0cHM6Ly9naXRodWIuY29tL2FsZXhjcmljaHRvbi9ydXN0Yy1kZW1hbmdsZSIpCiAgICAo c3lub3BzaXMgIlJ1c3QgY29tcGlsZXIgc3ltYm9sIGRlbWFuZ2xpbmcuCiIpCiAgICAoZGVzY3Jp cHRpb24KICAgICAgIlJ1c3QgY29tcGlsZXIgc3ltYm9sIGRlbWFuZ2xpbmcuCiIpCiAgICAobGlj ZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1hZGRyMmxpbmUKICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtYWRkcjJsaW5lIikKICAgICh2ZXJzaW9uICIwLjEwLjAiKQogICAgKHNvdXJj ZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAo Y3JhdGUtdXJpICJhZGRyMmxpbmUiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAg ICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChz aGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFkYWF4cnprNmZtZnphcWkwNnk3 MDRoY3cwcmp6MTk5bDBuOTIxNHliZm0zbTNqbm1jNG0iKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBj YXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMK ICAgICAgICAoKCJydXN0LWNwcC1kZW1hbmdsZSIgLHJ1c3QtY3BwLWRlbWFuZ2xlKQogICAgICAg ICAoInJ1c3QtZmFsbGlibGUtaXRlcmF0b3IiCiAgICAgICAgICAscnVzdC1mYWxsaWJsZS1pdGVy YXRvcikKICAgICAgICAgKCJydXN0LWdpbWxpIiAscnVzdC1naW1saSkKICAgICAgICAgKCJydXN0 LWludGVydmFsdHJlZSIgLHJ1c3QtaW50ZXJ2YWx0cmVlKQogICAgICAgICAoInJ1c3QtbGF6eWNl bGwiICxydXN0LWxhenljZWxsKQogICAgICAgICAoInJ1c3Qtb2JqZWN0LTAuMTIuMCIgLHJ1c3Qt b2JqZWN0LTAuMTIuMCkKICAgICAgICAgKCJydXN0LXJ1c3RjLWRlbWFuZ2xlIiAscnVzdC1ydXN0 Yy1kZW1hbmdsZSkKICAgICAgICAgKCJydXN0LXNtYWxsdmVjLTAuNi4xMyIgLHJ1c3Qtc21hbGx2 ZWMtMC42LjEzKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2dp bWxpLXJzL2FkZHIybGluZSIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgY3Jvc3MtcGxhdGZvcm0g c3ltYm9saWNhdGlvbiBsaWJyYXJ5IHdyaXR0ZW4gaW4gUnVzdCwgdXNpbmcgYGdpbWxpYCIpCiAg ICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIGNyb3NzLXBsYXRm b3JtIHN5bWJvbGljYXRpb24gbGlicmFyeSB3cml0dGVuIGluIFJ1c3QsIHVzaW5nIGBnaW1saWAi KQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtYmFja3RyYWNlLXN5cwog IChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1iYWNrdHJhY2Utc3lzIikKICAgICh2ZXJzaW9uICIw LjEuMzIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0 Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJiYWNrdHJhY2Utc3lzIiB2ZXJzaW9uKSkKICAg ICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9u ICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAg ICIxNGM0MDZ6OGJkbW1zOGE1bDhjdjc5amZrejFtazEwcWs1cDk3aXpmNHZhaTUzcXBhcmF4Iikp KSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwog ICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1jYyIgLHJ1c3QtY2MpCiAgICAg ICAgICgicnVzdC1jb21waWxlci1idWlsdGlucyIKICAgICAgICAgICxydXN0LWNvbXBpbGVyLWJ1 aWx0aW5zKQogICAgICAgICAoInJ1c3QtbGliYyIgLHJ1c3QtbGliYykKICAgICAgICAgKCJydXN0 LXJ1c3RjLXN0ZC13b3Jrc3BhY2UtY29yZSIKICAgICAgICAgICxydXN0LXJ1c3RjLXN0ZC13b3Jr c3BhY2UtY29yZSkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9h bGV4Y3JpY2h0b24vYmFja3RyYWNlLXJzIikKICAgIChzeW5vcHNpcwogICAgICAiQmluZGluZ3Mg dG8gdGhlIGxpYmJhY2t0cmFjZSBnY2MgbGlicmFyeQoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAg ICJCaW5kaW5ncyB0byB0aGUgbGliYmFja3RyYWNlIGdjYyBsaWJyYXJ5CiIpCiAgICAobGljZW5z ZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1jcHAtZGVtYW5nbGUKICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtY3BwLWRlbWFuZ2xlIikKICAgICh2ZXJzaW9uICIwLjIuMTQiKQogICAgKHNv dXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVy aSAoY3JhdGUtdXJpICJjcHBfZGVtYW5nbGUiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUK ICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAg ICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFtbTA2NHg4NDg2OHEw NnI0bTRiN2J5Zjk5OW5ya2JoeDdpeWM0bmNoeXNzYXhwc3k1YTEiKSkpKQogICAgKGJ1aWxkLXN5 c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1p bnB1dHMKICAgICAgICAoKCJydXN0LWFmbCIgLHJ1c3QtYWZsKQogICAgICAgICAoInJ1c3QtY2Zn LWlmIiAscnVzdC1jZmctaWYpCiAgICAgICAgICgicnVzdC1nbG9iIiAscnVzdC1nbG9iKSkpKQog ICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2dpbWxpLXJzL2NwcF9kZW1h bmdsZSIpCiAgICAoc3lub3BzaXMgIkEgY3JhdGUgZm9yIGRlbWFuZ2xpbmcgQysrIHN5bWJvbHMi KQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBjcmF0ZSBm b3IgZGVtYW5nbGluZyBDKysgc3ltYm9scyIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1w dWJsaWMgcnVzdC1maW5kc2hsaWJzCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWZpbmRzaGxp YnMiKQogICAgKHZlcnNpb24gIjAuNS4wIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAg ICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiZmluZHNobGli cyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQg bmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJh c2UzMgogICAgICAgICAgICAiMW4ydmFnbjBxNXlpbTMyaHhrd2kxY2pncDN5bjFkbTQ1cDd6OG53 NmxhcHl3aWhoczltaSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkK ICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtbGF6 eS1zdGF0aWMiICxydXN0LWxhenktc3RhdGljKQogICAgICAgICAoInJ1c3QtbGliYyIgLHJ1c3Qt bGliYykpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9naW1saS1y cy9maW5kc2hsaWJzIikKICAgIChzeW5vcHNpcwogICAgICAiRmluZCB0aGUgc2V0IG9mIHNoYXJl ZCBsaWJyYXJpZXMgbG9hZGVkIGluIHRoZSBjdXJyZW50IHByb2Nlc3Mgd2l0aCBhIGNyb3NzIHBs YXRmb3JtIEFQSSIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkZpbmQgdGhlIHNldCBvZiBzaGFy ZWQgbGlicmFyaWVzIGxvYWRlZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzIHdpdGggYSBjcm9zcyBw bGF0Zm9ybSBBUEkiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtZ29i bGluLTAuMC4yNAogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1nb2JsaW4iKQogICAgKHZlcnNp b24gIjAuMC4yNCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVy bC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImdvYmxpbiIgdmVyc2lvbikpCiAgICAg ICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAi LmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAi MWMzMW5ycmFpaXh5MG1uZGEyMjI3aWgzaDJnMWs0cGxsZzJrd2s4eWo2bHdqNGZqZHlwMyIpKSkp CiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAg ICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtbG9nIiAscnVzdC1sb2cpCiAgICAg ICAgICgicnVzdC1wbGFpbiIgLHJ1c3QtcGxhaW4pCiAgICAgICAgICgicnVzdC1zY3JvbGwtMC45 LjIiICxydXN0LXNjcm9sbC0wLjkuMikpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHVi LmNvbS9tNGIvZ29ibGluIikKICAgIChzeW5vcHNpcwogICAgICAiQW4gaW1waXNoLCBjcm9zcy1w bGF0Zm9ybSwgRUxGLCBNYWNoLW8sIGFuZCBQRSBiaW5hcnkgcGFyc2luZyBhbmQgbG9hZGluZyBj cmF0ZSIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkFuIGltcGlzaCwgY3Jvc3MtcGxhdGZvcm0s IEVMRiwgTWFjaC1vLCBhbmQgUEUgYmluYXJ5IHBhcnNpbmcgYW5kIGxvYWRpbmcgY3JhdGUiKQog ICAgKGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1tZW1tYXAK ICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtbWVtbWFwIikKICAgICh2ZXJzaW9uICIwLjcuMCIp CiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAg ICAgICAodXJpIChjcmF0ZS11cmkgIm1lbW1hcCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFt ZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAg ICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMG5zN2trZDFoNHBp amRrd2Z2dzRxbGJibXFtbG16d2xxM2cyNjc2ZGNsNXZ3eWF6djFiNSIpKSkpCiAgICAoYnVpbGQt c3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdv LWlucHV0cwogICAgICAgICgoInJ1c3QtbGliYyIgLHJ1c3QtbGliYykKICAgICAgICAgKCJydXN0 LXdpbmFwaSIgLHJ1c3Qtd2luYXBpKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9n aXRodWIuY29tL2RhbmJ1cmtlcnQvbWVtbWFwLXJzIikKICAgIChzeW5vcHNpcwogICAgICAiQ3Jv c3MtcGxhdGZvcm0gUnVzdCBBUEkgZm9yIG1lbW9yeS1tYXBwZWQgZmlsZSBJTyIpCiAgICAoZGVz Y3JpcHRpb24KICAgICAgIkNyb3NzLXBsYXRmb3JtIFJ1c3QgQVBJIGZvciBtZW1vcnktbWFwcGVk IGZpbGUgSU8iKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtcnVzdGMt c2VyaWFsaXplCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXJ1c3RjLXNlcmlhbGl6ZSIpCiAg ICAodmVyc2lvbiAiMC4zLjI0IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgICht ZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAicnVzdGMtc2VyaWFsaXpl IiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBu YW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFz ZTMyCiAgICAgICAgICAgICIxbmtnM3Zhc2c3bms4MGZma2F6aXpnaXl2M2hiMWw5ZzNkOGgxN2Nh amJreDUzOGppd2Z3IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQog ICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9ydXN0Yy1z ZXJpYWxpemUiKQogICAgKHN5bm9wc2lzCiAgICAgICJHZW5lcmljIHNlcmlhbGl6YXRpb24vZGVz ZXJpYWxpemF0aW9uIHN1cHBvcnQgY29ycmVzcG9uZGluZyB0byB0aGUKYGRlcml2ZShSdXN0Y0Vu Y29kYWJsZSwgUnVzdGNEZWNvZGFibGUpYCBtb2RlIGluIHRoZSBjb21waWxlci4gQWxzbyBpbmNs dWRlcwpzdXBwb3J0IGZvciBoZXgsIGJhc2U2NCwgYW5kIGpzb24gZW5jb2RpbmcgYW5kIGRlY29k aW5nLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJHZW5lcmljIHNlcmlhbGl6YXRpb24vZGVz ZXJpYWxpemF0aW9uIHN1cHBvcnQgY29ycmVzcG9uZGluZyB0byB0aGUKYGRlcml2ZShSdXN0Y0Vu Y29kYWJsZSwgUnVzdGNEZWNvZGFibGUpYCBtb2RlIGluIHRoZSBjb21waWxlci4gIEFsc28gaW5j bHVkZXMKc3VwcG9ydCBmb3IgaGV4LCBiYXNlNjQsIGFuZCBqc29uIGVuY29kaW5nIGFuZCBkZWNv ZGluZy4KIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXN5bnN0cnVj dHVyZQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zeW5zdHJ1Y3R1cmUiKQogICAgKHZlcnNp b24gIjAuMTIuMyIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVy bC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInN5bnN0cnVjdHVyZSIgdmVyc2lvbikp CiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVy c2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAg ICAgICAiMGlnbWM1ZnpwazZmZzdrZ2ZmOTE0ajA1bGJwYzZhaTJ3bWppMzEydjJoOHZ2amhud3Ji NyIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVu dHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtcHJvYy1tYWNybzIiICxy dXN0LXByb2MtbWFjcm8yKQogICAgICAgICAoInJ1c3QtcXVvdGUiICxydXN0LXF1b3RlKQogICAg ICAgICAoInJ1c3Qtc3luIiAscnVzdC1zeW4pCiAgICAgICAgICgicnVzdC11bmljb2RlLXhpZCIg LHJ1c3QtdW5pY29kZS14aWQpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1 Yi5jb20vbXlzdG9yL3N5bnN0cnVjdHVyZSIpCiAgICAoc3lub3BzaXMKICAgICAgIkhlbHBlciBt ZXRob2RzIGFuZCBtYWNyb3MgZm9yIGN1c3RvbSBkZXJpdmVzIikKICAgIChkZXNjcmlwdGlvbgog ICAgICAiSGVscGVyIG1ldGhvZHMgYW5kIG1hY3JvcyBmb3IgY3VzdG9tIGRlcml2ZXMiKQogICAg KGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yYW5kLWNvcmUt MC4zLjEKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcmFuZC1jb3JlIikKICAgICh2ZXJzaW9u ICIwLjMuMSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1m ZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInJhbmRfY29yZSIgdmVyc2lvbikpCiAgICAg ICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAi LmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAi MGp6ZGdzemZhNGJsaWlnaXk0aGk2Nms3ZnMzZ2Z3aTJxeG44dmlrODRwaDc3Zndkd3Z2cyIpKSkp CiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAg ICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtcmFuZC1jb3JlLTAuNC4yIiAscnVz dC1yYW5kLWNvcmUtMC40LjIpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL2NyYXRlcy5pby9j cmF0ZXMvcmFuZF9jb3JlIikKICAgIChzeW5vcHNpcwogICAgICAiQ29yZSByYW5kb20gbnVtYmVy IGdlbmVyYXRvciB0cmFpdHMgYW5kIHRvb2xzIGZvciBpbXBsZW1lbnRhdGlvbi4KIikKICAgIChk ZXNjcmlwdGlvbgogICAgICAiQ29yZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0cmFpdHMgYW5k IHRvb2xzIGZvciBpbXBsZW1lbnRhdGlvbi4KIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5l LXB1YmxpYyBydXN0LWFycmF5cmVmCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWFycmF5cmVm IikKICAgICh2ZXJzaW9uICIwLjMuNSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAg ICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImFycmF5cmVmIiB2 ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1l ICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMy CiAgICAgICAgICAgICIxdnBoeTMxNmpiZ21nY2trNHo3bThjc3ZseWM4aGloOXc5NWl5cTQ4aDgw Nzd4YzJ3ZjBkIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAg KGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2Ryb3VuZHkvYXJyYXlyZWYiKQogICAgKHN5 bm9wc2lzCiAgICAgICJNYWNyb3MgdG8gdGFrZSBhcnJheSByZWZlcmVuY2VzIG9mIHNsaWNlcyIp CiAgICAoZGVzY3JpcHRpb24KICAgICAgIk1hY3JvcyB0byB0YWtlIGFycmF5IHJlZmVyZW5jZXMg b2Ygc2xpY2VzIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWFycmF5 dmVjCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWFycmF5dmVjIikKICAgICh2ZXJzaW9uICIw LjUuMSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRj aCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImFycmF5dmVjIiB2ZXJzaW9uKSkKICAgICAgICAo ZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3Jh dGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxZjVt Y2E4a2lpd2h2aHhkMW1ibnE2OGo2djZyazEzOXNjaDU2N3p3d3psNmhzMzd2eHlnIikpKSkKICAg IChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBg KCM6Y2FyZ28taW5wdXRzICgoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKSkpKQogICAgKGhvbWUt cGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2JsdXNzL2FycmF5dmVjIikKICAgIChzeW5vcHNpcwog ICAgICAiQSB2ZWN0b3Igd2l0aCBmaXhlZCBjYXBhY2l0eSwgYmFja2VkIGJ5IGFuIGFycmF5IChp dCBjYW4gYmUgc3RvcmVkIG9uIHRoZSBzdGFjayB0b28pLiBJbXBsZW1lbnRzIGZpeGVkIGNhcGFj aXR5IEFycmF5VmVjIGFuZCBBcnJheVN0cmluZy4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJU aGlzIHBhY2thZ2UgcHJvdmlkZXMgYSB2ZWN0b3Igd2l0aCBmaXhlZCBjYXBhY2l0eSwgYmFja2Vk IGJ5IGFuIGFycmF5IChpdCBjYW4gYmUgc3RvcmVkIG9uIHRoZSBzdGFjayB0b28pLiAgSW1wbGVt ZW50cyBmaXhlZCBjYXBhY2l0eSBBcnJheVZlYyBhbmQgQXJyYXlTdHJpbmcuIikKICAgIChsaWNl bnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWNvbnN0YW50LXRpbWUtZXEKICAocGFja2Fn ZQogICAgKG5hbWUgInJ1c3QtY29uc3RhbnQtdGltZS1lcSIpCiAgICAodmVyc2lvbiAiMC4xLjQi KQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAg ICAgICAgKHVyaSAoY3JhdGUtdXJpICJjb25zdGFudF90aW1lX2VxIiB2ZXJzaW9uKSkKICAgICAg ICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIu Y3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIw ODNpY3ByOXhiNzJycmR4dzNwNDA2OGRjc3BuNmFpMjJqeTdyaGwyYThncmZ6NDQ4bmxyIikpKSkK ICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGhvbWUtcGFnZQogICAg ICAiaHR0cHM6Ly9naXRodWIuY29tL2Nlc2FyYi9jb25zdGFudF90aW1lX2VxIikKICAgIChzeW5v cHNpcwogICAgICAiQ29tcGFyZXMgdHdvIGVxdWFsLXNpemVkIGJ5dGUgc3RyaW5ncyBpbiBjb25z dGFudCB0aW1lLiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkNvbXBhcmVzIHR3byBlcXVhbC1z aXplZCBieXRlIHN0cmluZ3MgaW4gY29uc3RhbnQgdGltZS4iKQogICAgKGxpY2Vuc2UgbGljZW5z ZTpjYzApKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtbGF6eS1zdGF0aWMKICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtbGF6eS1zdGF0aWMiKQogICAgKHZlcnNpb24gIjEuNC4wIikKICAgIChzb3Vy Y2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkg KGNyYXRlLXVyaSAibGF6eV9zdGF0aWMiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAg ICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAg IChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjBpbjZpa2h3OG1nbDMzd2p2 NnE2eGZyYjViOWpyMTZxOHlnank4MDNmYXk0emNpc3ZhejIiKSkpKQogICAgKGJ1aWxkLXN5c3Rl bSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1 dHMgKCgicnVzdC1zcGluIiAscnVzdC1zcGluKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0 cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy1udXJzZXJ5L2xhenktc3RhdGljLnJzIikKICAgIChz eW5vcHNpcwogICAgICAiQSBtYWNybyBmb3IgZGVjbGFyaW5nIGxhemlseSBldmFsdWF0ZWQgc3Rh dGljcyBpbiBSdXN0LiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92 aWRlcyBhIG1hY3JvIGZvciBkZWNsYXJpbmcgbGF6aWx5IGV2YWx1YXRlZCBzdGF0aWNzIGluIFJ1 c3QuIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXJhbmQtY29yZQog IChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1yYW5kLWNvcmUiKQogICAgKHZlcnNpb24gIjAuNS4x IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQog ICAgICAgICh1cmkgKGNyYXRlLXVyaSAicmFuZF9jb3JlIiB2ZXJzaW9uKSkKICAgICAgICAoZmls ZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUi KSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwNmJkdngw OHYzcmt6NDUxY203ejU5eHd3cW4xcmtmaDZ2OWF5NzdiMTRmOGR3bHliZ2NoIikpKSkKICAgIChi dWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6 Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1nZXRyYW5kb20iICxydXN0LWdldHJhbmRvbSkK ICAgICAgICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkpKSkKICAgIChob21lLXBhZ2UgImh0 dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy9yYW5kX2NvcmUiKQogICAgKHN5bm9wc2lzCiAgICAgICJD b3JlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRyYWl0cyBhbmQgdG9vbHMgZm9yIGltcGxlbWVu dGF0aW9uLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJDb3JlIHJhbmRvbSBudW1iZXIgZ2Vu ZXJhdG9yIHRyYWl0cyBhbmQgdG9vbHMgZm9yIGltcGxlbWVudGF0aW9uLgoiKQogICAgKGxpY2Vu c2UgKGxpc3QgbGljZW5zZTpleHBhdCBsaWNlbnNlOmFzbDIuMCkpKSkKCihkZWZpbmUtcHVibGlj IHJ1c3QtY29yZS1hcmNoCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWNvcmUtYXJjaCIpCiAg ICAodmVyc2lvbiAiMC4xLjUiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1l dGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJjb3JlX2FyY2giIHZlcnNp b24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0i IHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAg ICAgICAgICAgIjA0dmR2cjl2ajBmMWN2MnA1NG5zc3ptcnJrOXcxanM0YzB6NGkwYmRsYWpsMWx5 ZHNsaW0iKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9t ZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nLW51cnNlcnkvc3Rkc2lt ZCIpCiAgICAoc3lub3BzaXMKICAgICAgImBjb3JlOjphcmNoYCAtIFJ1c3QncyBjb3JlIGxpYnJh cnkgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGludHJpbnNpY3MuIikKICAgIChkZXNjcmlwdGlvbgog ICAgICAiYGNvcmU6OmFyY2hgIC0gUnVzdCdzIGNvcmUgbGlicmFyeSBhcmNoaXRlY3R1cmUtc3Bl Y2lmaWMgaW50cmluc2ljcy4iKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1 c3Qtc2xlZWYtc3lzCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXNsZWVmLXN5cyIpCiAgICAo dmVyc2lvbiAiMC4xLjIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhv ZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzbGVlZi1zeXMiIHZlcnNpb24p KQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZl cnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAg ICAgICAgIjE4ODFxMnljMTdqMm0xeXZoMDE0NDdjOTN3czFtc3BucmozazJuYnZ3YnZjbTh6ODFr a3YiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1l bnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWJpbmRnZW4tMC40Ni4w IiAscnVzdC1iaW5kZ2VuLTAuNDYuMCkKICAgICAgICAgKCJydXN0LWNmZy1pZiIgLHJ1c3QtY2Zn LWlmKQogICAgICAgICAoInJ1c3QtY21ha2UiICxydXN0LWNtYWtlKQogICAgICAgICAoInJ1c3Qt ZW52LWxvZ2dlci0wLjYuMiIgLHJ1c3QtZW52LWxvZ2dlci0wLjYuMikKICAgICAgICAgKCJydXN0 LWxpYmMiICxydXN0LWxpYmMpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20v Z256bGJnL3NsZWVmLXN5cyIpCiAgICAoc3lub3BzaXMKICAgICAgIlJ1c3QgRkZJIGJpbmRpbmdz IHRvIHRoZSBTTEVFRiBWZWN0b3JpemVkIE1hdGggTGlicmFyeQoiKQogICAgKGRlc2NyaXB0aW9u CiAgICAgICJSdXN0IEZGSSBiaW5kaW5ncyB0byB0aGUgU0xFRUYgVmVjdG9yaXplZCBNYXRoIExp YnJhcnkKIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXNlbXZlcgog IChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zZW12ZXIiKQogICAgKHZlcnNpb24gIjAuOS4wIikK ICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAg ICAgICh1cmkgKGNyYXRlLXVyaSAic2VtdmVyIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1l CiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAg ICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwMHE0bGtjajBycmdi aHZpdjlzZDRwNnFtZHNpcGt3a2JyYTdyaDExanJocTVrcHZqemh4IikpKSkKICAgIChidWlsZC1z eXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28t aW5wdXRzCiAgICAgICAgKCgicnVzdC1zZW12ZXItcGFyc2VyLTAuNy4wIgogICAgICAgICAgLHJ1 c3Qtc2VtdmVyLXBhcnNlci0wLjcuMCkKICAgICAgICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJk ZSkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZG9jcy5ycy9jcmF0ZS9zZW12ZXIvIikKICAg IChzeW5vcHNpcwogICAgICAiU2VtYW50aWMgdmVyc2lvbiBwYXJzaW5nIGFuZCBjb21wYXJpc29u LgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJTZW1hbnRpYyB2ZXJzaW9uIHBhcnNpbmcgYW5k IGNvbXBhcmlzb24uCiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1i YXNlLXgKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtYmFzZS14IikKICAgICh2ZXJzaW9uICIw LjIuNiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRj aCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImJhc2UteCIgdmVyc2lvbikpCiAgICAgICAgKGZp bGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRl IikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWhmeTB3 djdqNXluZDczeWsxdnlyMzJwcWE3N3JwMTVsa3JjNTRmOGt5OWM2aGNiYzgwdiIpKSkpCiAgICAo YnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8v Z2l0aHViLmNvbS9PcktvTi9iYXNlLXgtcnMiKQogICAgKHN5bm9wc2lzICJFbmNvZGUvZGVjb2Rl IGFueSBiYXNlIikKICAgIChkZXNjcmlwdGlvbiAiRW5jb2RlL2RlY29kZSBhbnkgYmFzZSIpCiAg ICAobGljZW5zZSBsaWNlbnNlOmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXNoYTEKICAo cGFja2FnZQogICAgKG5hbWUgInJ1c3Qtc2hhMSIpCiAgICAodmVyc2lvbiAiMC42LjAiKQogICAg KHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAg KHVyaSAoY3JhdGUtdXJpICJzaGExIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAg ICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAo c2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwM2dzMnE0bTY3cm4ycDh4Y2Rm eGhpcDZtcGdhaGR3bTEyYm5iM3ZoOTBhaHY5Z3JoeTk1IikpKSkKICAgIChidWlsZC1zeXN0ZW0g Y2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRz ICgoInJ1c3Qtc2VyZGUiICxydXN0LXNlcmRlKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0 cHM6Ly9naXRodWIuY29tL21pdHN1aGlrby9ydXN0LXNoYTEiKQogICAgKHN5bm9wc2lzCiAgICAg ICJNaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIFNIQTEgZm9yIFJ1c3QuIikKICAgIChkZXNjcmlw dGlvbgogICAgICAiTWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBTSEExIGZvciBSdXN0LiIpCiAg ICAobGljZW5zZSBsaWNlbnNlOmJzZC0zKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWZ1dHVyZXMt c2luay1wcmV2aWV3CiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWZ1dHVyZXMtc2luay1wcmV2 aWV3IikKICAgICh2ZXJzaW9uICIwLjMuMC1hbHBoYS4xOSIpCiAgICAoc291cmNlCiAgICAgIChv cmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkg ImZ1dHVyZXMtc2luay1wcmV2aWV3IiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAg ICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAo c2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxdjd5NXF2Z3ZsMGQ2aGQ5czRr N2JkNXFyajJnZGxyczV5ZmwyMnY1cHh2OWRncGxpd2M2IikpKSkKICAgIChidWlsZC1zeXN0ZW0g Y2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9ydXN0LWxh bmctbnVyc2VyeS5naXRodWIuaW8vZnV0dXJlcy1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIlRo ZSBhc3luY2hyb25vdXMgYFNpbmtgIHRyYWl0IGZvciB0aGUgZnV0dXJlcy1ycyBsaWJyYXJ5Lgoi KQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGUgYXN5bmNocm9ub3VzIGBTaW5rYCB0cmFpdCBm b3IgdGhlIGZ1dHVyZXMtcnMgbGlicmFyeS4KIikKICAgIChsaWNlbnNlIChsaXN0IGxpY2Vuc2U6 ZXhwYXQgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXBpbi11dGlscwog IChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1waW4tdXRpbHMiKQogICAgKHZlcnNpb24gIjAuMS4w LWFscGhhLjQiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwt ZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJwaW4tdXRpbHMiIHZlcnNpb24pKQogICAg ICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24g Ii5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAg IjExeG15eDAwbjRtMzdkNTQ2YnkycnhiOHJ5eHMxMnY1NWNjMTcyaTN5YWsxcnFjY2Q1MnEiKSkp KQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlCiAg ICAgICJodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nLW51cnNlcnkvcGluLXV0aWxzIikKICAg IChzeW5vcHNpcyAiVXRpbGl0aWVzIGZvciBwaW5uaW5nCiIpCiAgICAoZGVzY3JpcHRpb24gIlV0 aWxpdGllcyBmb3IgcGlubmluZwoiKQogICAgKGxpY2Vuc2UgKGxpc3QgbGljZW5zZTpleHBhdCBs aWNlbnNlOmFzbDIuMCkpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtZnV0dXJlcy0wLjEuMjkKICAo cGFja2FnZQogICAgKG5hbWUgInJ1c3QtZnV0dXJlcyIpCiAgICAodmVyc2lvbiAiMC4xLjI5IikK ICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAg ICAgICh1cmkgKGNyYXRlLXVyaSAiZnV0dXJlcyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFt ZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAg ICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXZxM2N3Mzdrbm5k MGFmdzNyY2p6aDcxaTJsMDF2NW00eXNpbnJycWR2bm4ycWwwejYwdiIpKSkpCiAgICAoYnVpbGQt c3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8v cnVzdC1sYW5nLW51cnNlcnkuZ2l0aHViLmlvL2Z1dHVyZXMtcnMiKQogICAgKHN5bm9wc2lzCiAg ICAgICJBbiBpbXBsZW1lbnRhdGlvbiBvZiBmdXR1cmVzIGFuZCBzdHJlYW1zIGZlYXR1cmluZyB6 ZXJvIGFsbG9jYXRpb25zLApjb21wb3NhYmlsaXR5LCBhbmQgaXRlcmF0b3ItbGlrZSBpbnRlcmZh Y2VzLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJBbiBpbXBsZW1lbnRhdGlvbiBvZiBmdXR1 cmVzIGFuZCBzdHJlYW1zIGZlYXR1cmluZyB6ZXJvIGFsbG9jYXRpb25zLApjb21wb3NhYmlsaXR5 LCBhbmQgaXRlcmF0b3ItbGlrZSBpbnRlcmZhY2VzLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihk ZWZpbmUtcHVibGljIHJ1c3QtZnV0dXJlcy1pby1wcmV2aWV3CiAgKHBhY2thZ2UKICAgIChuYW1l ICJydXN0LWZ1dHVyZXMtaW8tcHJldmlldyIpCiAgICAodmVyc2lvbiAiMC4zLjAtYWxwaGEuMTki KQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAg ICAgICAgKHVyaSAoY3JhdGUtdXJpICJmdXR1cmVzLWlvLXByZXZpZXciIHZlcnNpb24pKQogICAg ICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24g Ii5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAg IjFucGIwNHhibjJndzVyamxsejg4Y2I4OGZxbDQ0eHhma2djaWRqamoyNmZ2YTNqNG00Z2wiKSkp KQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlCiAg ICAgICJodHRwczovL3J1c3QtbGFuZy1udXJzZXJ5LmdpdGh1Yi5pby9mdXR1cmVzLXJzIikKICAg IChzeW5vcHNpcwogICAgICAiVGhlIGBBc3luY1JlYWRgIGFuZCBgQXN5bmNXcml0ZWAgdHJhaXRz IGZvciB0aGUgZnV0dXJlcy1ycyBsaWJyYXJ5LgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJU aGUgYEFzeW5jUmVhZGAgYW5kIGBBc3luY1dyaXRlYCB0cmFpdHMgZm9yIHRoZSBmdXR1cmVzLXJz IGxpYnJhcnkuCiIpCiAgICAobGljZW5zZSAobGlzdCBsaWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNs Mi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1mdXR1cmVzLWpvaW4tbWFjcm8tcHJldmlldwog IChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1mdXR1cmVzLWpvaW4tbWFjcm8tcHJldmlldyIpCiAg ICAodmVyc2lvbiAiMC4zLjAtYWxwaGEuMTkiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAg ICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJmdXR1cmVz LWpvaW4tbWFjcm8tcHJldmlldyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAg ICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNo YTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXNtd2FqYTQ2NnlqaDVhZGxoZ2dn Zms5azk0MnN5NDcwMm40NnNjeGtyd2Nua2s2MXFqciIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNh cmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwog ICAgICAgICgoInJ1c3QtcHJvYy1tYWNyby1oYWNrIiAscnVzdC1wcm9jLW1hY3JvLWhhY2spCiAg ICAgICAgICgicnVzdC1wcm9jLW1hY3JvMiIgLHJ1c3QtcHJvYy1tYWNybzIpCiAgICAgICAgICgi cnVzdC1xdW90ZSIgLHJ1c3QtcXVvdGUpCiAgICAgICAgICgicnVzdC1zeW4iICxydXN0LXN5bikp KSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vcnVzdC1sYW5nLW51cnNlcnkuZ2l0aHVi LmlvL2Z1dHVyZXMtcnMiKQogICAgKHN5bm9wc2lzCiAgICAgICJEZWZpbml0aW9uIG9mIHRoZSBg am9pbiFgIG1hY3JvIGFuZCB0aGUgYHRyeV9qb2luIWAgbWFjcm8uCiIpCiAgICAoZGVzY3JpcHRp b24KICAgICAgIkRlZmluaXRpb24gb2YgdGhlIGBqb2luIWAgbWFjcm8gYW5kIHRoZSBgdHJ5X2pv aW4hYCBtYWNyby4KIikKICAgIChsaWNlbnNlIChsaXN0IGxpY2Vuc2U6ZXhwYXQgbGljZW5zZTph c2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWZ1dHVyZXMtc2VsZWN0LW1hY3JvLXByZXZp ZXcKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtZnV0dXJlcy1zZWxlY3QtbWFjcm8tcHJldmll dyIpCiAgICAodmVyc2lvbiAiMC4zLjAtYWxwaGEuMTkiKQogICAgKHNvdXJjZQogICAgICAob3Jp Z2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpCiAg ICAgICAgICAgICAgICJmdXR1cmVzLXNlbGVjdC1tYWNyby1wcmV2aWV3IgogICAgICAgICAgICAg ICB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBu YW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFz ZTMyCiAgICAgICAgICAgICIxeHNxNTVjZjJybmY3azZyMDRxOHd5bm14aXk5c3ZtM3BpODQwdmp2 YTQ3YmMwc3k4YW56IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQog ICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1wcm9j LW1hY3JvLWhhY2siICxydXN0LXByb2MtbWFjcm8taGFjaykKICAgICAgICAgKCJydXN0LXByb2Mt bWFjcm8yIiAscnVzdC1wcm9jLW1hY3JvMikKICAgICAgICAgKCJydXN0LXF1b3RlIiAscnVzdC1x dW90ZSkKICAgICAgICAgKCJydXN0LXN5biIgLHJ1c3Qtc3luKSkpKQogICAgKGhvbWUtcGFnZQog ICAgICAiaHR0cHM6Ly9ydXN0LWxhbmctbnVyc2VyeS5naXRodWIuaW8vZnV0dXJlcy1ycyIpCiAg ICAoc3lub3BzaXMKICAgICAgIlRoZSBgc2VsZWN0IWAgbWFjcm8gZm9yIHdhaXRpbmcgb24gbXVs dGlwbGUgZGlmZmVyZW50IGBGdXR1cmVgcyBhdCBvbmNlIGFuZCBoYW5kbGluZyB0aGUgZmlyc3Qg b25lIHRvIGNvbXBsZXRlLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGUgYHNlbGVjdCFg IG1hY3JvIGZvciB3YWl0aW5nIG9uIG11bHRpcGxlIGRpZmZlcmVudCBgRnV0dXJlYHMgYXQgb25j ZSBhbmQgaGFuZGxpbmcgdGhlIGZpcnN0IG9uZSB0byBjb21wbGV0ZS4KIikKICAgIChsaWNlbnNl IChsaXN0IGxpY2Vuc2U6ZXhwYXQgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBy dXN0LW1lbWNocgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1tZW1jaHIiKQogICAgKHZlcnNp b24gIjIuMi4xIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJs LWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAibWVtY2hyIiB2ZXJzaW9uKSkKICAgICAg ICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIu Y3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIx M2o2amk5eDl5ZHBpOWdyYnNzMTA2Z3FxcjN4bjNiY2ZwMjhheWRxZmE0NzUxcXJmbXc4IikpKSkK ICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAg ICBgKCM6Y2FyZ28taW5wdXRzICgoInJ1c3QtbGliYyIgLHJ1c3QtbGliYykpKSkKICAgIChob21l LXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9CdXJudFN1c2hpL3J1c3QtbWVtY2hyIikK ICAgIChzeW5vcHNpcyAiU2FmZSBpbnRlcmZhY2UgdG8gbWVtY2hyLiIpCiAgICAoZGVzY3JpcHRp b24gIlNhZmUgaW50ZXJmYWNlIHRvIG1lbWNoci4iKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZp bmUtcHVibGljIHJ1c3QtcHJvYy1tYWNyby1oYWNrCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0 LXByb2MtbWFjcm8taGFjayIpCiAgICAodmVyc2lvbiAiMC41LjExIikKICAgIChzb3VyY2UKICAg ICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRl LXVyaSAicHJvYy1tYWNyby1oYWNrIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAg ICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAo c2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxaWR6NXZtbmpqaHZyNTF5dnd5 amI0NW16YTE4d2E1M2ZyMDVtMXNrcXZiZHl3MTVnbTdjIikpKSkKICAgIChidWlsZC1zeXN0ZW0g Y2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRz CiAgICAgICAgKCgicnVzdC1wcm9jLW1hY3JvMiIgLHJ1c3QtcHJvYy1tYWNybzIpCiAgICAgICAg ICgicnVzdC1xdW90ZSIgLHJ1c3QtcXVvdGUpCiAgICAgICAgICgicnVzdC1zeW4iICxydXN0LXN5 bikpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9kdG9sbmF5L3By b2MtbWFjcm8taGFjayIpCiAgICAoc3lub3BzaXMKICAgICAgIlByb2NlZHVyYWwgbWFjcm9zIGlu IGV4cHJlc3Npb24gcG9zaXRpb24iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJQcm9jZWR1cmFs IG1hY3JvcyBpbiBleHByZXNzaW9uIHBvc2l0aW9uIikKICAgIChsaWNlbnNlIChsaXN0IGxpY2Vu c2U6ZXhwYXQgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXByb2MtbWFj cm8tbmVzdGVkCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXByb2MtbWFjcm8tbmVzdGVkIikK ICAgICh2ZXJzaW9uICIwLjEuMyIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAo bWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInByb2MtbWFjcm8tbmVz dGVkIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVu ZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAo YmFzZTMyCiAgICAgICAgICAgICIwYm1sa3NtOHZsNDR3a3dpaG13cjdqc2p6bmhiZzBuN2FpYmN3 MWNzMmpnamNwODZ4NmluIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVt KQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2R0b2xuYXkvcHJvYy1t YWNyby1oYWNrIikKICAgIChzeW5vcHNpcwogICAgICAiU3VwcG9ydCBmb3IgbmVzdGVkIHByb2Mt bWFjcm8taGFjayBpbnZvY2F0aW9ucyIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlN1cHBvcnQg Zm9yIG5lc3RlZCBwcm9jLW1hY3JvLWhhY2sgaW52b2NhdGlvbnMiKQogICAgKGxpY2Vuc2UgI2Yp KSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtc2xhYgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1z bGFiIikKICAgICh2ZXJzaW9uICIwLjQuMiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAg ICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInNsYWIiIHZl cnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUg Ii0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIK ICAgICAgICAgICAgIjF5NTl4c2EyN2prODRzeHpzd2prNjB4Y2pmOGI0Zm01OTYwandwem5ycmNt YXN5dmE0ZjEiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAo aG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vY2FybGxlcmNoZS9zbGFiIikKICAgIChzeW5v cHNpcwogICAgICAiUHJlLWFsbG9jYXRlZCBzdG9yYWdlIGZvciBhIHVuaWZvcm0gZGF0YSB0eXBl IikKICAgIChkZXNjcmlwdGlvbgogICAgICAiUHJlLWFsbG9jYXRlZCBzdG9yYWdlIGZvciBhIHVu aWZvcm0gZGF0YSB0eXBlIikKICAgIChsaWNlbnNlIGxpY2Vuc2U6ZXhwYXQpKSkKCihkZWZpbmUt cHVibGljIHJ1c3QtdG9raW8taW8tMC4xLjEyCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXRv a2lvLWlvIikKICAgICh2ZXJzaW9uICIwLjEuMTIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2lu CiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJ0b2tp by1pbyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBl bmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAg KGJhc2UzMgogICAgICAgICAgICAiMDlqcnoxaGg0aDF2ajQ1cXkwOXk3bTdtOGpzeTFobDZnMzJj bG5reTI1bWRpbTNkcDQyaCIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3Rl bSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3Qt Ynl0ZXMtMC40LjEyIiAscnVzdC1ieXRlcy0wLjQuMTIpCiAgICAgICAgICgicnVzdC1mdXR1cmVz LTAuMS4yOSIgLHJ1c3QtZnV0dXJlcy0wLjEuMjkpCiAgICAgICAgICgicnVzdC1sb2ciICxydXN0 LWxvZykpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vdG9raW8ucnMiKQogICAgKHN5bm9wc2lz CiAgICAgICJDb3JlIEkvTyBwcmltaXRpdmVzIGZvciBhc3luY2hyb25vdXMgSS9PIGluIFJ1c3Qu CiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkNvcmUgSS9PIHByaW1pdGl2ZXMgZm9yIGFzeW5j aHJvbm91cyBJL08gaW4gUnVzdC4KIikKICAgIChsaWNlbnNlIGxpY2Vuc2U6ZXhwYXQpKSkKCihk ZWZpbmUtcHVibGljIHJ1c3QtaXRvYQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1pdG9hIikK ICAgICh2ZXJzaW9uICIwLjQuNCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAo bWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIml0b2EiIHZlcnNpb24p KQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZl cnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAg ICAgICAgIjB6dmcyZDlxdjNhdmhmM2Q4Z2dnbGg2ZmR5dzhra3dxZzNyNDYyMmx5NXloeG52bmM0 amgiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1w YWdlICJodHRwczovL2dpdGh1Yi5jb20vZHRvbG5heS9pdG9hIikKICAgIChzeW5vcHNpcwogICAg ICAiRmFzdCBmdW5jdGlvbnMgZm9yIHByaW50aW5nIGludGVnZXIgcHJpbWl0aXZlcyB0byBhbiBp bzo6V3JpdGUiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJGYXN0IGZ1bmN0aW9ucyBmb3IgcHJp bnRpbmcgaW50ZWdlciBwcmltaXRpdmVzIHRvIGFuIGlvOjpXcml0ZSIpCiAgICAobGljZW5zZSAj ZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yeXUKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qt cnl1IikKICAgICh2ZXJzaW9uICIxLjAuMiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAg ICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInJ5dSIgdmVy c2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAi LSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgog ICAgICAgICAgICAiMWowaDc0ZjF4cWY5aGpraGFucDhpMjBtcWMxYXczNWtyMWlxOWk3OXE3NzEz bW41MWE1eiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChh cmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3Qtbm8tcGFuaWMi ICxydXN0LW5vLXBhbmljKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2R0 b2xuYXkvcnl1IikKICAgIChzeW5vcHNpcwogICAgICAiRmFzdCBmbG9hdGluZyBwb2ludCB0byBz dHJpbmcgY29udmVyc2lvbiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkZhc3QgZmxvYXRpbmcg cG9pbnQgdG8gc3RyaW5nIGNvbnZlcnNpb24iKQogICAgKGxpY2Vuc2UgKGxpc3QgbGljZW5zZTph c2wyLjAgbGljZW5zZTpib29zdDEuMCkpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtaW5kZXhtYXAK ICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtaW5kZXhtYXAiKQogICAgKHZlcnNpb24gIjEuMy4w IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQog ICAgICAgICh1cmkgKGNyYXRlLXVyaSAiaW5kZXhtYXAiIHZlcnNpb24pKQogICAgICAgIChmaWxl LW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIp KQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFja2Q5dmc2 eTcxZDlzeXo5ajc5NWJkejBkcGlsbTZ2eTU2czl5ZnduencybGx6N25iYmkiKSkpKQogICAgKGJ1 aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpj YXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWF1dG9jZmciICxydXN0LWF1dG9jZmcpCiAgICAg ICAgICgicnVzdC1yYXlvbiIgLHJ1c3QtcmF5b24pCiAgICAgICAgICgicnVzdC1zZXJkZSIgLHJ1 c3Qtc2VyZGUpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vYmx1c3MvaW5k ZXhtYXAiKQogICAgKHN5bm9wc2lzCiAgICAgICJBIGhhc2ggdGFibGUgd2l0aCBjb25zaXN0ZW50 IG9yZGVyIGFuZCBmYXN0IGl0ZXJhdGlvbi4KClRoZSBpbmRleG1hcCBpcyBhIGhhc2ggdGFibGUg d2hlcmUgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZiB0aGUga2V5LXZhbHVlCnBhaXJzIGlzIGluZGVw ZW5kZW50IG9mIHRoZSBoYXNoIHZhbHVlcyBvZiB0aGUga2V5cy4gSXQgaGFzIHRoZSB1c3VhbApo YXNoIHRhYmxlIGZ1bmN0aW9uYWxpdHksIGl0IHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIgZXhj ZXB0IGFmdGVyCnJlbW92YWxzLCBhbmQgaXQgYWxsb3dzIGxvb2t1cCBvZiBpdHMgZWxlbWVudHMg YnkgZWl0aGVyIGhhc2ggdGFibGUga2V5Cm9yIG51bWVyaWNhbCBpbmRleC4gQSBjb3JyZXNwb25k aW5nIGhhc2ggc2V0IHR5cGUgaXMgYWxzbyBwcm92aWRlZC4KClRoaXMgY3JhdGUgd2FzIGluaXRp YWxseSBwdWJsaXNoZWQgdW5kZXIgdGhlIG5hbWUgb3JkZXJtYXAsIGJ1dCBpdCB3YXMgcmVuYW1l ZCB0bwppbmRleG1hcC4KIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHBy b3ZpZGVzIGEgaGFzaCB0YWJsZSB3aXRoIGNvbnNpc3RlbnQgb3JkZXIgYW5kIGZhc3QgaXRlcmF0 aW9uLgoKVGhlIGluZGV4bWFwIGlzIGEgaGFzaCB0YWJsZSB3aGVyZSB0aGUgaXRlcmF0aW9uIG9y ZGVyIG9mIHRoZSBrZXktdmFsdWUKcGFpcnMgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGhhc2ggdmFs dWVzIG9mIHRoZSBrZXlzLiAgSXQgaGFzIHRoZSB1c3VhbApoYXNoIHRhYmxlIGZ1bmN0aW9uYWxp dHksIGl0IHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIgZXhjZXB0IGFmdGVyCnJlbW92YWxzLCBh bmQgaXQgYWxsb3dzIGxvb2t1cCBvZiBpdHMgZWxlbWVudHMgYnkgZWl0aGVyIGhhc2ggdGFibGUg a2V5Cm9yIG51bWVyaWNhbCBpbmRleC4gIEEgY29ycmVzcG9uZGluZyBoYXNoIHNldCB0eXBlIGlz IGFsc28gcHJvdmlkZWQuCgpUaGlzIGNyYXRlIHdhcyBpbml0aWFsbHkgcHVibGlzaGVkIHVuZGVy IHRoZSBuYW1lIG9yZGVybWFwLCBidXQgaXQgd2FzIHJlbmFtZWQgdG8KaW5kZXhtYXAuCiIpCiAg ICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC13YXNtLWJpbmRnZW4tbWFjcm8t c3VwcG9ydAogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC13YXNtLWJpbmRnZW4tbWFjcm8tc3Vw cG9ydCIpCiAgICAodmVyc2lvbiAiMC4yLjU1IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgog ICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAid2FzbS1i aW5kZ2VuLW1hY3JvLXN1cHBvcnQiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAg ICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChz aGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjB3N20wZ243ODN4Z2JiendjNW14 N2o4d2ExMTZ5dnk5NGZybmJ4NThyMzA3cWtyYjdpMXgiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBj YXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMK ICAgICAgICAoKCJydXN0LXByb2MtbWFjcm8yIiAscnVzdC1wcm9jLW1hY3JvMikKICAgICAgICAg KCJydXN0LXF1b3RlIiAscnVzdC1xdW90ZSkKICAgICAgICAgKCJydXN0LXN5biIgLHJ1c3Qtc3lu KQogICAgICAgICAoInJ1c3Qtd2FzbS1iaW5kZ2VuLWJhY2tlbmQiCiAgICAgICAgICAscnVzdC13 YXNtLWJpbmRnZW4tYmFja2VuZCkKICAgICAgICAgKCJydXN0LXdhc20tYmluZGdlbi1zaGFyZWQi CiAgICAgICAgICAscnVzdC13YXNtLWJpbmRnZW4tc2hhcmVkKSkpKQogICAgKGhvbWUtcGFnZQog ICAgICAiaHR0cHM6Ly9ydXN0d2FzbS5naXRodWIuaW8vd2FzbS1iaW5kZ2VuLyIpCiAgICAoc3lu b3BzaXMKICAgICAgIlRoZSBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYCNbd2Fz bV9iaW5kZ2VuXWAgYXR0cmlidXRlIHRoYXQgaXMgbm90IGluIHRoZSBzaGFyZWQgYmFja2VuZCBj cmF0ZQoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGUgcGFydCBvZiB0aGUgaW1wbGVtZW50 YXRpb24gb2YgdGhlIGAjW3dhc21fYmluZGdlbl1gIGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCBpbiB0 aGUgc2hhcmVkIGJhY2tlbmQgY3JhdGUKIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1 YmxpYyBydXN0LW1heWJlLXVuaW5pdAogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1tYXliZS11 bmluaXQiKQogICAgKHZlcnNpb24gIjIuMC4wIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgog ICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAibWF5YmUt dW5pbml0IiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFw cGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAg ICAoYmFzZTMyCiAgICAgICAgICAgICIwMDR5MG56bXBmZHJoejI1MTI3ODM0MXo2cWwzNGl2MWs2 ZHAxaDZhZjdkNm5kNmp3YzMwIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lz dGVtKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2VzdDMxL21heWJl LXVuaW5pdCIpCiAgICAoc3lub3BzaXMKICAgICAgIk1heWJlVW5pbml0IGZvciBmcmllbmRzIG9m IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IikKICAgIChkZXNjcmlwdGlvbgogICAgICAiTWF5YmVV bmluaXQgZm9yIGZyaWVuZHMgb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkiKQogICAgKGxpY2Vu c2UgKGxpc3QgbGljZW5zZTphc2wyLjAgbGljZW5zZTpleHBhdCkpKSkKCihkZWZpbmUtcHVibGlj IHJ1c3QtZmFsbGlibGUtaXRlcmF0b3IKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtZmFsbGli bGUtaXRlcmF0b3IiKQogICAgKHZlcnNpb24gIjAuMi4xIikKICAgIChzb3VyY2UKICAgICAgKG9y aWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAi ZmFsbGlibGUtaXRlcmF0b3IiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAg IChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEy NTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjF4MzFza2pzeW5uMmg3c3EzcXp5djR6 bHlrMnc4am1xY3MzcGhzZzRxeGh6NTJ5ajE2cXgiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJn by1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20v c2ZhY2tsZXIvcnVzdC1mYWxsaWJsZS1pdGVyYXRvciIpCiAgICAoc3lub3BzaXMgIkZhbGxpYmxl IGl0ZXJhdG9yIHRyYWl0cyIpCiAgICAoZGVzY3JpcHRpb24gIkZhbGxpYmxlIGl0ZXJhdG9yIHRy YWl0cyIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1naW1saQogIChw YWNrYWdlCiAgICAobmFtZSAicnVzdC1naW1saSIpCiAgICAodmVyc2lvbiAiMC4xOS4wIikKICAg IChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAg ICh1cmkgKGNyYXRlLXVyaSAiZ2ltbGkiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAg ICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAg IChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjAwNmRwYWE2M3kwMXdiNThu dnMyaGhqM3FxeDUyeXhnMjBuampmbHIwZnJmYnlwMWhiOG4iKSkpKQogICAgKGJ1aWxkLXN5c3Rl bSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1 dHMKICAgICAgICAoKCJydXN0LWFycmF5dmVjLTAuNC4xMiIgLHJ1c3QtYXJyYXl2ZWMtMC40LjEy KQogICAgICAgICAoInJ1c3QtYnl0ZW9yZGVyIiAscnVzdC1ieXRlb3JkZXIpCiAgICAgICAgICgi cnVzdC1mYWxsaWJsZS1pdGVyYXRvciIKICAgICAgICAgICxydXN0LWZhbGxpYmxlLWl0ZXJhdG9y KQogICAgICAgICAoInJ1c3QtaW5kZXhtYXAiICxydXN0LWluZGV4bWFwKQogICAgICAgICAoInJ1 c3Qtc3RhYmxlLWRlcmVmLXRyYWl0IgogICAgICAgICAgLHJ1c3Qtc3RhYmxlLWRlcmVmLXRyYWl0 KSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2dpbWxpLXJzL2dpbWxpIikK ICAgIChzeW5vcHNpcwogICAgICAiQSBsaWJyYXJ5IGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHRo ZSBEV0FSRiBkZWJ1Z2dpbmcgZm9ybWF0LiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMg cGFja2FnZSBwcm92aWRlcyBhIGxpYnJhcnkgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlIERX QVJGIGRlYnVnZ2luZyBmb3JtYXQuIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1Ymxp YyBydXN0LWludGVydmFsdHJlZQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1pbnRlcnZhbHRy ZWUiKQogICAgKHZlcnNpb24gIjAuMi40IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAg ICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiaW50ZXJ2YWx0 cmVlIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVu ZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAo YmFzZTMyCiAgICAgICAgICAgICIxMGs0MGdzdjc5a3duc3Fyendtbm1tNnBzYTVmcXdzOHlnZ2F2 bWJnZ3Z5bXYxNmhmZmRnIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVt KQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1z bWFsbHZlYy0wLjYuMTMiICxydXN0LXNtYWxsdmVjLTAuNi4xMykpKSkKICAgIChob21lLXBhZ2UK ICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9tYWluLS0vcnVzdC1pbnRlcnZhbHRyZWUiKQogICAg KHN5bm9wc2lzCiAgICAgICJBIHNpbXBsZSBhbmQgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBh biBpbW11dGFibGUgaW50ZXJ2YWwgdHJlZS4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlz IHBhY2thZ2UgcHJvdmlkZXMgYSBzaW1wbGUgYW5kIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Yg YW4gaW1tdXRhYmxlIGludGVydmFsIHRyZWUuIikKICAgIChsaWNlbnNlIGxpY2Vuc2U6ZXhwYXQp KSkKCihkZWZpbmUtcHVibGljIHJ1c3QtbGF6eWNlbGwKICAocGFja2FnZQogICAgKG5hbWUgInJ1 c3QtbGF6eWNlbGwiKQogICAgKHZlcnNpb24gIjEuMi4xIikKICAgIChzb3VyY2UKICAgICAgKG9y aWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAi bGF6eWNlbGwiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmct YXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAg ICAgIChiYXNlMzIKICAgICAgICAgICAgIjBndnF5Y21wdjdwYXJjOThpNnk2NGFpN3J2eHJuMTk0 N3oyYTZtYWEwMmc0a3Z4ZGQ1NWoiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1z eXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMgKCgicnVzdC1jbGlw cHkiICxydXN0LWNsaXBweSkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9p bmRpdjAvbGF6eWNlbGwiKQogICAgKHN5bm9wc2lzCiAgICAgICJBIGxpYnJhcnkgcHJvdmlkaW5n IGEgbGF6aWx5IGZpbGxlZCBDZWxsIHN0cnVjdCIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRo aXMgcGFja2FnZSBwcm92aWRlcyBhIGxpYnJhcnkgcHJvdmlkaW5nIGEgbGF6aWx5IGZpbGxlZCBD ZWxsIHN0cnVjdCIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1vYmpl Y3QtMC4xMi4wCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LW9iamVjdCIpCiAgICAodmVyc2lv biAiMC4xMi4wIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJs LWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAib2JqZWN0IiB2ZXJzaW9uKSkKICAgICAg ICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIu Y3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIx ZGNoMWFqanAwNWQxNmxpZzFkbnZpc2ZpczBocmxydnc5bGN3eTFod2dkY3ltM3o2am56IikpKSkK ICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAg ICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1mbGF0ZTIiICxydXN0LWZsYXRlMikK ICAgICAgICAgKCJydXN0LWdvYmxpbi0wLjAuMjIiICxydXN0LWdvYmxpbi0wLjAuMjIpCiAgICAg ICAgICgicnVzdC1wYXJpdHktd2FzbS0wLjM4LjAiCiAgICAgICAgICAscnVzdC1wYXJpdHktd2Fz bS0wLjM4LjApCiAgICAgICAgICgicnVzdC1zY3JvbGwtMC45LjIiICxydXN0LXNjcm9sbC0wLjku MikKICAgICAgICAgKCJydXN0LXV1aWQtMC43LjQiICxydXN0LXV1aWQtMC43LjQpKSkpCiAgICAo aG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vZ2ltbGktcnMvb2JqZWN0IikKICAgIChzeW5v cHNpcwogICAgICAiQSB1bmlmaWVkIGludGVyZmFjZSBmb3IgcGFyc2luZyBvYmplY3QgZmlsZSBm b3JtYXRzLiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBh IHVuaWZpZWQgaW50ZXJmYWNlIGZvciBwYXJzaW5nIG9iamVjdCBmaWxlIGZvcm1hdHMuIikKICAg IChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWdsb2IKICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtZ2xvYiIpCiAgICAodmVyc2lvbiAiMC4zLjAiKQogICAgKHNvdXJjZQogICAg ICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUt dXJpICJnbG9iIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5n LWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAg ICAgICAoYmFzZTMyCiAgICAgICAgICAgICIweDI1d2ZyN3ZnM216eGM5eDA1ZGNwaHZkM253bGNt Ym54cnZ3Y3ZycmR3cGxjcnJrNGN2IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQt c3lzdGVtKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9nbG9i IikKICAgIChzeW5vcHNpcwogICAgICAiU3VwcG9ydCBmb3IgbWF0Y2hpbmcgZmlsZSBwYXRocyBh Z2FpbnN0IFVuaXggc2hlbGwgc3R5bGUgcGF0dGVybnMuCiIpCiAgICAoZGVzY3JpcHRpb24KICAg ICAgIlN1cHBvcnQgZm9yIG1hdGNoaW5nIGZpbGUgcGF0aHMgYWdhaW5zdCBVbml4IHNoZWxsIHN0 eWxlIHBhdHRlcm5zLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qt YWZsCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWFmbCIpCiAgICAodmVyc2lvbiAiMC41LjIi KQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAg ICAgICAgKHVyaSAoY3JhdGUtdXJpICJhZmwiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUK ICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAg ICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjBhenBpOTE3bDhuaHZ4 MjVuMnY2NzBudmt4a3JoY3dtZGRmaTg1cW5yNmtjaG1pNnk5NDYiKSkpKQogICAgKGJ1aWxkLXN5 c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1p bnB1dHMKICAgICAgICAoKCJydXN0LWNjIiAscnVzdC1jYykKICAgICAgICAgKCJydXN0LWNsYXAi ICxydXN0LWNsYXApCiAgICAgICAgICgicnVzdC1ydXN0Yy12ZXJzaW9uIiAscnVzdC1ydXN0Yy12 ZXJzaW9uKQogICAgICAgICAoInJ1c3QtcnVzdGMtdmVyc2lvbiIgLHJ1c3QtcnVzdGMtdmVyc2lv bikKICAgICAgICAgKCJydXN0LXhkZyIgLHJ1c3QteGRnKQogICAgICAgICAoInJ1c3QteGRnIiAs cnVzdC14ZGcpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vcnVzdC1mdXp6 L2FmbC5ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIkZ1enppbmcgUnVzdCBjb2RlIHdpdGggYW1l cmljYW4tZnV6enktbG9wIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiRnV6emluZyBSdXN0IGNv ZGUgd2l0aCBhbWVyaWNhbi1mdXp6eS1sb3AiKQogICAgKGxpY2Vuc2UgbGljZW5zZTphc2wyLjAp KSkKCihkZWZpbmUtcHVibGljIHJ1c3QtcGxhaW4KICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qt cGxhaW4iKQogICAgKHZlcnNpb24gIjAuMi4zIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgog ICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAicGxhaW4i IHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5h bWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNl MzIKICAgICAgICAgICAgIjE5bjF4YnhiNHdhN3c4OTEyNjhiemY2Y2J3cTRxdmRiODZiaWsxejEy OXFiMHhubm5uZGwiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAg ICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vcmFuZG9taXRlcy9wbGFpbiIpCiAgICAo c3lub3BzaXMKICAgICAgIkEgc21hbGwgUnVzdCBsaWJyYXJ5IHRoYXQgYWxsb3dzIHVzZXJzIHRv IHJlaW50ZXJwcmV0IGRhdGEgb2YgY2VydGFpbiB0eXBlcyBzYWZlbHkuIikKICAgIChkZXNjcmlw dGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgc21hbGwgUnVzdCBsaWJyYXJ5IHRo YXQgYWxsb3dzIHVzZXJzIHRvIHJlaW50ZXJwcmV0IGRhdGEgb2YgY2VydGFpbiB0eXBlcyBzYWZl bHkuIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXNjcm9sbC0wLjku MgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zY3JvbGwiKQogICAgKHZlcnNpb24gIjAuOS4y IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQog ICAgICAgICh1cmkgKGNyYXRlLXVyaSAic2Nyb2xsIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1u YW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkK ICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxMHEzdzg2Ym4y MnhyamxmZzFjOTBkZmk5YzI2cWprem4yNm5hZDBpOXo4cHh3YWQzMTFnIikpKSkKICAgIChidWls ZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2Fy Z28taW5wdXRzCiAgICAgICAgKCgicnVzdC1ydXN0Yy12ZXJzaW9uIiAscnVzdC1ydXN0Yy12ZXJz aW9uKQogICAgICAgICAoInJ1c3Qtc2Nyb2xsLWRlcml2ZS0wLjkuNSIKICAgICAgICAgICxydXN0 LXNjcm9sbC1kZXJpdmUtMC45LjUpKSkpCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5j b20vbTRiL3Njcm9sbCIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgc3VpdGUgb2YgcG93ZXJmdWws IGV4dGVuc2libGUsIGdlbmVyaWMsIGVuZGlhbi1hd2FyZSBSZWFkL1dyaXRlIHRyYWl0cyBmb3Ig Ynl0ZSBidWZmZXJzIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3Zp ZGVzIGEgc3VpdGUgb2YgcG93ZXJmdWwsIGV4dGVuc2libGUsIGdlbmVyaWMsIGVuZGlhbi1hd2Fy ZSBSZWFkL1dyaXRlIHRyYWl0cyBmb3IgYnl0ZSBidWZmZXJzIikKICAgIChsaWNlbnNlIGxpY2Vu c2U6ZXhwYXQpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtc3BpbgogIChwYWNrYWdlCiAgICAobmFt ZSAicnVzdC1zcGluIikKICAgICh2ZXJzaW9uICIwLjUuMiIpCiAgICAoc291cmNlCiAgICAgIChv cmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkg InNwaW4iIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBw ZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAg IChiYXNlMzIKICAgICAgICAgICAgIjBiODRtNmRienJ3ZjJreHlsbnc4MmQzZHI4dzA2YXY3cmZr cjhzODVmYjVmNDNyd3lxdmYiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0 ZW0pCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vbXZkbmVzL3NwaW4t cnMuZ2l0IikKICAgIChzeW5vcHNpcwogICAgICAiU3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMg YmFzZWQgb24gc3Bpbm5pbmcuClRoZXkgbWF5IGNvbnRhaW4gZGF0YSwgYXJlIHVzYWJsZSB3aXRo b3V0IGBzdGRgLAphbmQgc3RhdGljIGluaXRpYWxpemVycyBhcmUgYXZhaWxhYmxlLgoiKQogICAg KGRlc2NyaXB0aW9uCiAgICAgICJTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBiYXNlZCBvbiBz cGlubmluZy4KVGhleSBtYXkgY29udGFpbiBkYXRhLCBhcmUgdXNhYmxlIHdpdGhvdXQgYHN0ZGAs CmFuZCBzdGF0aWMgaW5pdGlhbGl6ZXJzIGFyZSBhdmFpbGFibGUuCiIpCiAgICAobGljZW5zZSBs aWNlbnNlOmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWJpbmRnZW4tMC40Ni4wCiAgKHBh Y2thZ2UKICAgIChuYW1lICJydXN0LWJpbmRnZW4iKQogICAgKHZlcnNpb24gIjAuNDYuMCIpCiAg ICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAg ICAodXJpIChjcmF0ZS11cmkgImJpbmRnZW4iIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUK ICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAg ICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjFxY2x2ajVweWRuNWNh bXczOTZiMHIzbno0bm4zcDV3cHhnNGZnZzFmYXZwMDQzcHl6d2ciKSkpKQogICAgKGJ1aWxkLXN5 c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1p bnB1dHMKICAgICAgICAoKCJydXN0LWJpdGZsYWdzIiAscnVzdC1iaXRmbGFncykKICAgICAgICAg KCJydXN0LWNleHByIiAscnVzdC1jZXhwcikKICAgICAgICAgKCJydXN0LWNmZy1pZiIgLHJ1c3Qt Y2ZnLWlmKQogICAgICAgICAoInJ1c3QtY2xhbmctc3lzLTAuMjYuNCIgLHJ1c3QtY2xhbmctc3lz LTAuMjYuNCkKICAgICAgICAgKCJydXN0LWNsYXAiICxydXN0LWNsYXApCiAgICAgICAgICgicnVz dC1lbnYtbG9nZ2VyLTAuNi4yIiAscnVzdC1lbnYtbG9nZ2VyLTAuNi4yKQogICAgICAgICAoInJ1 c3QtaGFzaGJyb3duLTAuMS44IiAscnVzdC1oYXNoYnJvd24tMC4xLjgpCiAgICAgICAgICgicnVz dC1sYXp5LXN0YXRpYyIgLHJ1c3QtbGF6eS1zdGF0aWMpCiAgICAgICAgICgicnVzdC1sb2ciICxy dXN0LWxvZykKICAgICAgICAgKCJydXN0LXBlZWtpbmctdGFrZS13aGlsZSIKICAgICAgICAgICxy dXN0LXBlZWtpbmctdGFrZS13aGlsZSkKICAgICAgICAgKCJydXN0LXByb2MtbWFjcm8yLTAuNC4z MCIKICAgICAgICAgICxydXN0LXByb2MtbWFjcm8yLTAuNC4zMCkKICAgICAgICAgKCJydXN0LXF1 b3RlLTAuNi4xMyIgLHJ1c3QtcXVvdGUtMC42LjEzKQogICAgICAgICAoInJ1c3QtcmVnZXgiICxy dXN0LXJlZ2V4KQogICAgICAgICAoInJ1c3Qtd2hpY2gtMi4wLjEiICxydXN0LXdoaWNoLTIuMC4x KSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9ydXN0LWxhbmcuZ2l0aHViLmlvL3J1 c3QtYmluZGdlbi8iKQogICAgKHN5bm9wc2lzCiAgICAgICJBdXRvbWF0aWNhbGx5IGdlbmVyYXRl cyBSdXN0IEZGSSBiaW5kaW5ncyB0byBDIGFuZCBDKysgbGlicmFyaWVzLiIpCiAgICAoZGVzY3Jp cHRpb24KICAgICAgIkF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIFJ1c3QgRkZJIGJpbmRpbmdzIHRv IEMgYW5kIEMrKyBsaWJyYXJpZXMuIikKICAgIChsaWNlbnNlIGxpY2Vuc2U6YnNkLTMpKSkKCihk ZWZpbmUtcHVibGljIHJ1c3QtY21ha2UKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtY21ha2Ui KQogICAgKHZlcnNpb24gIjAuMS40MiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAg ICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImNtYWtlIiB2ZXJz aW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICIt IiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAg ICAgICAgICAgICIwcWt3aWJrdng1eGphenZ2OXY4Z3ZkbHBreTJqaGp4dmN6MDE0bnJpeGd6cWZ5 djJieXcxIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFy Z3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzICgoInJ1c3QtY2MiICxydXN0LWNjKSkpKQog ICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2FsZXhjcmljaHRvbi9jbWFr ZS1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgYnVpbGQgZGVwZW5kZW5jeSBmb3IgcnVubmlu ZyBgY21ha2VgIHRvIGJ1aWxkIGEgbmF0aXZlIGxpYnJhcnkKIikKICAgIChkZXNjcmlwdGlvbgog ICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgYnVpbGQgZGVwZW5kZW5jeSBmb3IgcnVubmlu ZyBgY21ha2VgIHRvIGJ1aWxkIGEgbmF0aXZlIGxpYnJhcnkKIikKICAgIChsaWNlbnNlICNmKSkp CgooZGVmaW5lLXB1YmxpYyBydXN0LWVudi1sb2dnZXItMC42LjIKICAocGFja2FnZQogICAgKG5h bWUgInJ1c3QtZW52LWxvZ2dlciIpCiAgICAodmVyc2lvbiAiMC42LjIiKQogICAgKHNvdXJjZQog ICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3Jh dGUtdXJpICJlbnZfbG9nZ2VyIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAg ICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hh MjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxbHgyczVuazk2eHg0aTNtNHpjNGdo cWdpOGtiMDdkc255aXY4amsyY2xoYXg0MmR4ejVhIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2Fy Z28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAg ICAgICAgKCgicnVzdC1hdHR5IiAscnVzdC1hdHR5KQogICAgICAgICAoInJ1c3QtaHVtYW50aW1l IiAscnVzdC1odW1hbnRpbWUpCiAgICAgICAgICgicnVzdC1sb2ciICxydXN0LWxvZykKICAgICAg ICAgKCJydXN0LXJlZ2V4IiAscnVzdC1yZWdleCkKICAgICAgICAgKCJydXN0LXRlcm1jb2xvciIg LHJ1c3QtdGVybWNvbG9yKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIu Y29tL3NlYmFzbWFncmkvZW52X2xvZ2dlci8iKQogICAgKHN5bm9wc2lzCiAgICAgICJBIGxvZ2dp bmcgaW1wbGVtZW50YXRpb24gZm9yIGBsb2dgIHdoaWNoIGlzIGNvbmZpZ3VyZWQgdmlhIGFuIGVu dmlyb25tZW50CnZhcmlhYmxlLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2th Z2UgcHJvdmlkZXMgYSBsb2dnaW5nIGltcGxlbWVudGF0aW9uIGZvciBgbG9nYCB3aGljaCBpcyBj b25maWd1cmVkIHZpYSBhbiBlbnZpcm9ubWVudAp2YXJpYWJsZS4KIikKICAgIChsaWNlbnNlICNm KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXNlbXZlci1wYXJzZXItMC43LjAKICAocGFja2FnZQog ICAgKG5hbWUgInJ1c3Qtc2VtdmVyLXBhcnNlciIpCiAgICAodmVyc2lvbiAiMC43LjAiKQogICAg KHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAg KHVyaSAoY3JhdGUtdXJpICJzZW12ZXItcGFyc2VyIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1u YW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkK ICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxOHZoeXB3Nnpn Y2NucmxtNXBzMXB3YTBraHo3cnk5Mjdpem5wcjg4Yjg3Y2FncjF2MmlxIikpKSkKICAgIChidWls ZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6 Ly9naXRodWIuY29tL3N0ZXZla2xhYm5pay9zZW12ZXItcGFyc2VyIikKICAgIChzeW5vcHNpcyAi UGFyc2luZyBvZiB0aGUgc2VtdmVyIHNwZWMuCiIpCiAgICAoZGVzY3JpcHRpb24gIlBhcnNpbmcg b2YgdGhlIHNlbXZlciBzcGVjLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGlj IHJ1c3QtYnl0ZXMtMC40LjEyCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWJ5dGVzIikKICAg ICh2ZXJzaW9uICIwLjQuMTIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1l dGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJieXRlcyIgdmVyc2lvbikp CiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVy c2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAg ICAgICAiMDc2OGE1NXEyZnNxZGpzdmN2OThuZGc5ZHE3dzJnNDRkdnExYXZod3B4cmR6YnlkeXZy MCIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVu dHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtYnl0ZW9yZGVyIiAscnVz dC1ieXRlb3JkZXIpCiAgICAgICAgICgicnVzdC1laXRoZXIiICxydXN0LWVpdGhlcikKICAgICAg ICAgKCJydXN0LWlvdmVjLTAuMS40IiAscnVzdC1pb3ZlYy0wLjEuNCkKICAgICAgICAgKCJydXN0 LXNlcmRlIiAscnVzdC1zZXJkZSkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNv bS90b2tpby1ycy9ieXRlcyIpCiAgICAoc3lub3BzaXMKICAgICAgIlR5cGVzIGFuZCB0cmFpdHMg Zm9yIHdvcmtpbmcgd2l0aCBieXRlcyIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlR5cGVzIGFu ZCB0cmFpdHMgZm9yIHdvcmtpbmcgd2l0aCBieXRlcyIpCiAgICAobGljZW5zZSBsaWNlbnNlOmV4 cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LW5vLXBhbmljCiAgKHBhY2thZ2UKICAgIChuYW1l ICJydXN0LW5vLXBhbmljIikKICAgICh2ZXJzaW9uICIwLjEuMTIiKQogICAgKHNvdXJjZQogICAg ICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUt dXJpICJuby1wYW5pYyIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0 cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1Ngog ICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMHhhbjV2OWFjMWFrbGluYzhhdzE2cmFxMzZw YjRpZGpybDUwMm5wOGd5MzJnZnM2czc1MSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1 aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAg ICgoInJ1c3QtcHJvYy1tYWNybzIiICxydXN0LXByb2MtbWFjcm8yKQogICAgICAgICAoInJ1c3Qt cXVvdGUiICxydXN0LXF1b3RlKQogICAgICAgICAoInJ1c3Qtc3luIiAscnVzdC1zeW4pKSkpCiAg ICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vZHRvbG5heS9uby1wYW5pYyIpCiAgICAo c3lub3BzaXMKICAgICAgIkF0dHJpYnV0ZSBtYWNybyB0byByZXF1aXJlIHRoYXQgdGhlIGNvbXBp bGVyIHByb3ZlIGEgZnVuY3Rpb24gY2FuJ3QgZXZlciBwYW5pYy4iKQogICAgKGRlc2NyaXB0aW9u CiAgICAgICJBdHRyaWJ1dGUgbWFjcm8gdG8gcmVxdWlyZSB0aGF0IHRoZSBjb21waWxlciBwcm92 ZSBhIGZ1bmN0aW9uIGNhbid0IGV2ZXIgcGFuaWMuIikKICAgIChsaWNlbnNlIChsaXN0IGxpY2Vu c2U6ZXhwYXQgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXJheW9uCiAg KHBhY2thZ2UKICAgIChuYW1lICJydXN0LXJheW9uIikKICAgICh2ZXJzaW9uICIxLjIuMSIpCiAg ICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAg ICAodXJpIChjcmF0ZS11cmkgInJheW9uIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAg ICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAg ICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxcGd4bnlwMGlxampscDJh a3c1bjk4d3hjanJkY2I5ajZ4MzNjZGlqZmZzOTY2NDl5d3MzIikpKSkKICAgIChidWlsZC1zeXN0 ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5w dXRzCiAgICAgICAgKCgicnVzdC1jcm9zc2JlYW0tZGVxdWUiICxydXN0LWNyb3NzYmVhbS1kZXF1 ZSkKICAgICAgICAgKCJydXN0LWVpdGhlciIgLHJ1c3QtZWl0aGVyKQogICAgICAgICAoInJ1c3Qt cmF5b24tY29yZSIgLHJ1c3QtcmF5b24tY29yZSkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8v Z2l0aHViLmNvbS9yYXlvbi1ycy9yYXlvbiIpCiAgICAoc3lub3BzaXMKICAgICAgIlNpbXBsZSB3 b3JrLXN0ZWFsaW5nIHBhcmFsbGVsaXNtIGZvciBSdXN0IikKICAgIChkZXNjcmlwdGlvbgogICAg ICAiU2ltcGxlIHdvcmstc3RlYWxpbmcgcGFyYWxsZWxpc20gZm9yIFJ1c3QiKQogICAgKGxpY2Vu c2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtd2FzbS1iaW5kZ2VuLWJhY2tlbmQKICAocGFj a2FnZQogICAgKG5hbWUgInJ1c3Qtd2FzbS1iaW5kZ2VuLWJhY2tlbmQiKQogICAgKHZlcnNpb24g IjAuMi41NSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1m ZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIndhc20tYmluZGdlbi1iYWNrZW5kIiB2ZXJz aW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICIt IiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAg ICAgICAgICAgICIxMWN4bjVtNXNyajRicTA2endyMmZ3MnJtOWFsOGt3ZGtycDYxcGY0NGQycnNk NW1oaThxIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFy Z3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC1idW1wYWxvIiAs cnVzdC1idW1wYWxvKQogICAgICAgICAoInJ1c3QtbGF6eS1zdGF0aWMiICxydXN0LWxhenktc3Rh dGljKQogICAgICAgICAoInJ1c3QtbG9nIiAscnVzdC1sb2cpCiAgICAgICAgICgicnVzdC1wcm9j LW1hY3JvMiIgLHJ1c3QtcHJvYy1tYWNybzIpCiAgICAgICAgICgicnVzdC1xdW90ZSIgLHJ1c3Qt cXVvdGUpCiAgICAgICAgICgicnVzdC1zeW4iICxydXN0LXN5bikKICAgICAgICAgKCJydXN0LXdh c20tYmluZGdlbi1zaGFyZWQiCiAgICAgICAgICAscnVzdC13YXNtLWJpbmRnZW4tc2hhcmVkKSkp KQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9ydXN0d2FzbS5naXRodWIuaW8vd2FzbS1i aW5kZ2VuLyIpCiAgICAoc3lub3BzaXMKICAgICAgIkJhY2tlbmQgY29kZSBnZW5lcmF0aW9uIG9m IHRoZSB3YXNtLWJpbmRnZW4gdG9vbAoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJCYWNrZW5k IGNvZGUgZ2VuZXJhdGlvbiBvZiB0aGUgd2FzbS1iaW5kZ2VuIHRvb2wKIikKICAgIChsaWNlbnNl ICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXdhc20tYmluZGdlbi1zaGFyZWQKICAocGFja2Fn ZQogICAgKG5hbWUgInJ1c3Qtd2FzbS1iaW5kZ2VuLXNoYXJlZCIpCiAgICAodmVyc2lvbiAiMC4y LjU1IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNo KQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAid2FzbS1iaW5kZ2VuLXNoYXJlZCIgdmVyc2lvbikp CiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVy c2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAg ICAgICAiMGdkbWlkODVqcjN5eTM0eGZkbno5OXJ3bGEyN2c3MGNzajh4Ym53cWsxZHlzZ2I3aDJ5 YSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBh Z2UKICAgICAgImh0dHBzOi8vcnVzdHdhc20uZ2l0aHViLmlvL3dhc20tYmluZGdlbi8iKQogICAg KHN5bm9wc2lzCiAgICAgICJTaGFyZWQgc3VwcG9ydCBiZXR3ZWVuIHdhc20tYmluZGdlbiBhbmQg d2FzbS1iaW5kZ2VuIGNsaSwgYW4gaW50ZXJuYWwKZGVwZW5kZW5jeS4KIikKICAgIChkZXNjcmlw dGlvbgogICAgICAiU2hhcmVkIHN1cHBvcnQgYmV0d2VlbiB3YXNtLWJpbmRnZW4gYW5kIHdhc20t YmluZGdlbiBjbGksIGFuIGludGVybmFsCmRlcGVuZGVuY3kuCiIpCiAgICAobGljZW5zZSAjZikp KQoKKGRlZmluZS1wdWJsaWMgcnVzdC1hcnJheXZlYy0wLjQuMTIKICAocGFja2FnZQogICAgKG5h bWUgInJ1c3QtYXJyYXl2ZWMiKQogICAgKHZlcnNpb24gIjAuNC4xMiIpCiAgICAoc291cmNlCiAg ICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0 ZS11cmkgImFycmF5dmVjIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAo c3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2 CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxZmRpdjVtNjI3Z2g2ZmxwNG1wbWkxbWg2 NDdpbW05eDQyM2xpY3NyMTFwc3o5N2Q5N3lkIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28t YnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAg ICAgKCgicnVzdC1ub2Ryb3AiICxydXN0LW5vZHJvcCkKICAgICAgICAgKCJydXN0LXNlcmRlIiAs cnVzdC1zZXJkZSkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9ibHVzcy9h cnJheXZlYyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgdmVjdG9yIHdpdGggZml4ZWQgY2FwYWNp dHksIGJhY2tlZCBieSBhbiBhcnJheSAoaXQgY2FuIGJlIHN0b3JlZCBvbiB0aGUgc3RhY2sgdG9v KS4gSW1wbGVtZW50cyBmaXhlZCBjYXBhY2l0eSBBcnJheVZlYyBhbmQgQXJyYXlTdHJpbmcuIikK ICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgdmVjdG9yIHdp dGggZml4ZWQgY2FwYWNpdHksIGJhY2tlZCBieSBhbiBhcnJheSAoaXQgY2FuIGJlIHN0b3JlZCBv biB0aGUgc3RhY2sgdG9vKS4gIEltcGxlbWVudHMgZml4ZWQgY2FwYWNpdHkgQXJyYXlWZWMgYW5k IEFycmF5U3RyaW5nLiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1z dGFibGUtZGVyZWYtdHJhaXQKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qtc3RhYmxlLWRlcmVm LXRyYWl0IikKICAgICh2ZXJzaW9uICIxLjEuMSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4K ICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInN0YWJs ZV9kZXJlZl90cmFpdCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0 cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1Ngog ICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWoybGtnYWtrc216NHZjNWhmYXdjY2gyaXBp c2tyaGpzMXNpaDBmM2JyN3M3cnlzNThmdiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1 aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9zdG9y eXllbGxlci9zdGFibGVfZGVyZWZfdHJhaXQiKQogICAgKHN5bm9wc2lzCiAgICAgICJBbiB1bnNh ZmUgbWFya2VyIHRyYWl0IGZvciB0eXBlcyBsaWtlIEJveCBhbmQgUmMgdGhhdCBkZXJlZmVyZW5j ZSB0byBhIHN0YWJsZSBhZGRyZXNzIGV2ZW4gd2hlbiBtb3ZlZCwgYW5kIGhlbmNlIGNhbiBiZSB1 c2VkIHdpdGggbGlicmFyaWVzIHN1Y2ggYXMgb3duaW5nX3JlZiBhbmQgcmVudGFsLgoiKQogICAg KGRlc2NyaXB0aW9uCiAgICAgICJBbiB1bnNhZmUgbWFya2VyIHRyYWl0IGZvciB0eXBlcyBsaWtl IEJveCBhbmQgUmMgdGhhdCBkZXJlZmVyZW5jZSB0byBhIHN0YWJsZSBhZGRyZXNzIGV2ZW4gd2hl biBtb3ZlZCwgYW5kIGhlbmNlIGNhbiBiZSB1c2VkIHdpdGggbGlicmFyaWVzIHN1Y2ggYXMgb3du aW5nX3JlZiBhbmQgcmVudGFsLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGlj IHJ1c3QtZ29ibGluLTAuMC4yMgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1nb2JsaW4iKQog ICAgKHZlcnNpb24gIjAuMC4yMiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAo bWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImdvYmxpbiIgdmVyc2lv bikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIg dmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAg ICAgICAgICAiMWE3Nmk2eno3MWhqd2QxMXB3bWM4aWlyZGRqNjM0NW1mcDAyemw1ZDZiemIwNHNk YW1ieiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1 bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtbG9nIiAscnVzdC1s b2cpCiAgICAgICAgICgicnVzdC1wbGFpbiIgLHJ1c3QtcGxhaW4pCiAgICAgICAgICgicnVzdC1z Y3JvbGwtMC45LjIiICxydXN0LXNjcm9sbC0wLjkuMikpKSkKICAgIChob21lLXBhZ2UgImh0dHBz Oi8vZ2l0aHViLmNvbS9tNGIvZ29ibGluIikKICAgIChzeW5vcHNpcwogICAgICAiQW4gaW1waXNo LCBjcm9zcy1wbGF0Zm9ybSwgRUxGLCBNYWNoLW8sIGFuZCBQRSBiaW5hcnkgcGFyc2luZyBhbmQg bG9hZGluZyBjcmF0ZSIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkFuIGltcGlzaCwgY3Jvc3Mt cGxhdGZvcm0sIEVMRiwgTWFjaC1vLCBhbmQgUEUgYmluYXJ5IHBhcnNpbmcgYW5kIGxvYWRpbmcg Y3JhdGUiKQogICAgKGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoKKGRlZmluZS1wdWJsaWMgcnVz dC11dWlkLTAuNy40CiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXV1aWQiKQogICAgKHZlcnNp b24gIjAuNy40IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJs LWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAidXVpZCIgdmVyc2lvbikpCiAgICAgICAg KGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNy YXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMGFu azR4azIweDNucno5MjZ3OGo5bXo1M2JpM3Y4YnlreG1obHEycGZmYTh4Yzh3ZG53aCIpKSkpCiAg ICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAg YCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtYnl0ZW9yZGVyIiAscnVzdC1ieXRlb3Jk ZXIpCiAgICAgICAgICgicnVzdC1tZDUtMC42LjEiICxydXN0LW1kNS0wLjYuMSkKICAgICAgICAg KCJydXN0LXJhbmQtMC42LjUiICxydXN0LXJhbmQtMC42LjUpCiAgICAgICAgICgicnVzdC1zZXJk ZSIgLHJ1c3Qtc2VyZGUpCiAgICAgICAgICgicnVzdC1zaGExIiAscnVzdC1zaGExKQogICAgICAg ICAoInJ1c3Qtc2xvZyIgLHJ1c3Qtc2xvZykKICAgICAgICAgKCJydXN0LXdpbmFwaSIgLHJ1c3Qt d2luYXBpKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3V1aWQtcnMvdXVp ZCIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgbGlicmFyeSB0byBnZW5lcmF0ZSBhbmQgcGFyc2Ug VVVJRHMuIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEg bGlicmFyeSB0byBnZW5lcmF0ZSBhbmQgcGFyc2UgVVVJRHMuIikKICAgIChsaWNlbnNlIChsaXN0 IGxpY2Vuc2U6YXNsMi4wIGxpY2Vuc2U6ZXhwYXQpKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWZs YXRlMgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1mbGF0ZTIiKQogICAgKHZlcnNpb24gIjEu MC4xMyIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRj aCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImZsYXRlMiIgdmVyc2lvbikpCiAgICAgICAgKGZp bGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRl IikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMDNyd3lo NjkxajIwaWgydmNza3dwMXNpbmhmOXBhZ2dya3YzMmZ2endsaTlmcHNkZG1rYiIpKSkpCiAgICAo YnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgj OmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtY2ZnLWlmIiAscnVzdC1jZmctaWYpCiAgICAg ICAgICgicnVzdC1jcmMzMmZhc3QiICxydXN0LWNyYzMyZmFzdCkKICAgICAgICAgKCJydXN0LWZ1 dHVyZXMtMC4xLjI5IiAscnVzdC1mdXR1cmVzLTAuMS4yOSkKICAgICAgICAgKCJydXN0LWxpYmMi ICxydXN0LWxpYmMpCiAgICAgICAgICgicnVzdC1saWJ6LXN5cyIgLHJ1c3QtbGliei1zeXMpCiAg ICAgICAgICgicnVzdC1taW5pei1veGlkZSIgLHJ1c3QtbWluaXotb3hpZGUpCiAgICAgICAgICgi cnVzdC1taW5pei1veGlkZSIgLHJ1c3QtbWluaXotb3hpZGUpCiAgICAgICAgICgicnVzdC1taW5p ei1zeXMiICxydXN0LW1pbml6LXN5cykKICAgICAgICAgKCJydXN0LXRva2lvLWlvLTAuMS4xMiIg LHJ1c3QtdG9raW8taW8tMC4xLjEyKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9n aXRodWIuY29tL2FsZXhjcmljaHRvbi9mbGF0ZTItcnMiKQogICAgKHN5bm9wc2lzCiAgICAgICJC aW5kaW5ncyB0byBtaW5pei5jIGZvciBERUZMQVRFIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNz aW9uIGV4cG9zZWQgYXMKUmVhZGVyL1dyaXRlciBzdHJlYW1zLiBDb250YWlucyBiaW5kaW5ncyBm b3IgemxpYiwgZGVmbGF0ZSwgYW5kIGd6aXAtYmFzZWQKc3RyZWFtcy4KIikKICAgIChkZXNjcmlw dGlvbgogICAgICAiQmluZGluZ3MgdG8gbWluaXouYyBmb3IgREVGTEFURSBjb21wcmVzc2lvbiBh bmQgZGVjb21wcmVzc2lvbiBleHBvc2VkIGFzClJlYWRlci9Xcml0ZXIgc3RyZWFtcy4gIENvbnRh aW5zIGJpbmRpbmdzIGZvciB6bGliLCBkZWZsYXRlLCBhbmQgZ3ppcC1iYXNlZApzdHJlYW1zLgoi KQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtcGFyaXR5LXdhc20tMC4z OC4wCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXBhcml0eS13YXNtIikKICAgICh2ZXJzaW9u ICIwLjM4LjAiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwt ZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJwYXJpdHktd2FzbSIgdmVyc2lvbikpCiAg ICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lv biAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAg ICAiMHFwZndiOWFkeWk2Zzk4cTF3MHhpcWR6a3Y0cjFwN2IydzE5d2Q1Y3I1N3Jsd2lmYm1yMCIp KSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UK ICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3Bhcml0eS13YXNtIikKICAgIChz eW5vcHNpcyAiV2ViQXNzZW1ibHkgbG93LWxldmVsIGZvcm1hdCBsaWJyYXJ5IikKICAgIChkZXNj cmlwdGlvbgogICAgICAiV2ViQXNzZW1ibHkgbG93LWxldmVsIGZvcm1hdCBsaWJyYXJ5IikKICAg IChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXhkZwogIChwYWNrYWdlCiAgICAo bmFtZSAicnVzdC14ZGciKQogICAgKHZlcnNpb24gIjIuMi4wIikKICAgIChzb3VyY2UKICAgICAg KG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVy aSAieGRnIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFw cGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAg ICAoYmFzZTMyCiAgICAgICAgICAgICIwbXdzOGEwZnIzY3FrNW5oN2FxOWxta21oemdodmFzcXk0 bWh3Nm5uemEwNmw0ZDZpMmZoIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lz dGVtKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL3doaXRlcXVhcmsv cnVzdC14ZGciKQogICAgKHN5bm9wc2lzCiAgICAgICJBIGxpYnJhcnkgZm9yIHN0b3JpbmcgYW5k IHJldHJpZXZpbmcgZmlsZXMgYWNjb3JkaW5nIHRvIFhERyBCYXNlIERpcmVjdG9yeSBzcGVjaWZp Y2F0aW9uIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEg bGlicmFyeSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBmaWxlcyBhY2NvcmRpbmcgdG8gWERH IEJhc2UgRGlyZWN0b3J5IHNwZWNpZmljYXRpb24iKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZp bmUtcHVibGljIHJ1c3QteGRnCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXhkZyIpCiAgICAo dmVyc2lvbiAiMi4yLjAiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhv ZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJ4ZGciIHZlcnNpb24pKQogICAg ICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24g Ii5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAg IjBtd3M4YTBmcjNjcWs1bmg3YXE5bG1rbWh6Z2h2YXNxeTRtaHc2bm56YTA2bDRkNmkyZmgiKSkp KQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlCiAg ICAgICJodHRwczovL2dpdGh1Yi5jb20vd2hpdGVxdWFyay9ydXN0LXhkZyIpCiAgICAoc3lub3Bz aXMKICAgICAgIkEgbGlicmFyeSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBmaWxlcyBhY2Nv cmRpbmcgdG8gWERHIEJhc2UgRGlyZWN0b3J5IHNwZWNpZmljYXRpb24iKQogICAgKGRlc2NyaXB0 aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBsaWJyYXJ5IGZvciBzdG9yaW5nIGFu ZCByZXRyaWV2aW5nIGZpbGVzIGFjY29yZGluZyB0byBYREcgQmFzZSBEaXJlY3Rvcnkgc3BlY2lm aWNhdGlvbiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1zY3JvbGwt ZGVyaXZlLTAuOS41CiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXNjcm9sbC1kZXJpdmUiKQog ICAgKHZlcnNpb24gIjAuOS41IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgICht ZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAic2Nyb2xsX2Rlcml2ZSIg dmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFt ZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2Uz MgogICAgICAgICAgICAiMWpxZzVtbThudmlpNmF2bDF6MXJjODlhZ3poMmt3a3BwZ3BzbndmYWt4 Zzc4bW5hajZsZyIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAg IChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtcHJvYy1t YWNybzItMC40LjMwIgogICAgICAgICAgLHJ1c3QtcHJvYy1tYWNybzItMC40LjMwKQogICAgICAg ICAoInJ1c3QtcXVvdGUtMC42LjEzIiAscnVzdC1xdW90ZS0wLjYuMTMpCiAgICAgICAgICgicnVz dC1zeW4tMC4xNS40NCIgLHJ1c3Qtc3luLTAuMTUuNDQpKSkpCiAgICAoaG9tZS1wYWdlICJodHRw czovL2dpdGh1Yi5jb20vbTRiL3Njcm9sbCIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgbWFjcm9z IDEuMSBkZXJpdmUgaW1wbGVtZW50YXRpb24gZm9yIFByZWFkIGFuZCBQd3JpdGUgdHJhaXRzIGZy b20gdGhlIHNjcm9sbCBjcmF0ZSIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2Fn ZSBwcm92aWRlcyBhIG1hY3JvcyAxLjEgZGVyaXZlIGltcGxlbWVudGF0aW9uIGZvciBQcmVhZCBh bmQgUHdyaXRlIHRyYWl0cyBmcm9tIHRoZSBzY3JvbGwgY3JhdGUiKQogICAgKGxpY2Vuc2UgbGlj ZW5zZTpleHBhdCkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1jZXhwcgogIChwYWNrYWdlCiAgICAo bmFtZSAicnVzdC1jZXhwciIpCiAgICAodmVyc2lvbiAiMC4zLjYiKQogICAgKHNvdXJjZQogICAg ICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUt dXJpICJjZXhwciIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmlu Zy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAg ICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMDdmZGZqNGZmMjk3NHkzM3lpeHJiNjU3cmlxOXps OWI5aDlscjBoN3JpZGhodnh2YnJndyIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxk LXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgo InJ1c3Qtbm9tLTQuMi4zIiAscnVzdC1ub20tNC4yLjMpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAg ICJodHRwczovL2dpdGh1Yi5jb20vamV0aHJvZ2IvcnVzdC1jZXhwciIpCiAgICAoc3lub3BzaXMg IkEgQyBleHByZXNzaW9uIHBhcnNlciBhbmQgZXZhbHVhdG9yIikKICAgIChkZXNjcmlwdGlvbgog ICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgQyBleHByZXNzaW9uIHBhcnNlciBhbmQgZXZh bHVhdG9yIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWNsYW5nLXN5 cy0wLjI2LjQKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtY2xhbmctc3lzIikKICAgICh2ZXJz aW9uICIwLjI2LjQiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1 cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJjbGFuZy1zeXMiIHZlcnNpb24pKQog ICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNp b24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAg ICAgIjFyNTBkd3k1aGo1Z3EwN2RuMHFmODIyMmQwN3F2MDk3MHlteDBqOG45Nzc5eWF5YzN3M2Yi KSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRz CiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWdsb2ItMC4yLjExIiAscnVz dC1nbG9iLTAuMi4xMSkKICAgICAgICAgKCJydXN0LWdsb2ItMC4yLjExIiAscnVzdC1nbG9iLTAu Mi4xMSkKICAgICAgICAgKCJydXN0LWxpYmMiICxydXN0LWxpYmMpCiAgICAgICAgICgicnVzdC1s aWJsb2FkaW5nIiAscnVzdC1saWJsb2FkaW5nKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0 cHM6Ly9naXRodWIuY29tL0t5bGVNYXllcy9jbGFuZy1zeXMiKQogICAgKHN5bm9wc2lzICJSdXN0 IGJpbmRpbmdzIGZvciBsaWJjbGFuZy4iKQogICAgKGRlc2NyaXB0aW9uICJSdXN0IGJpbmRpbmdz IGZvciBsaWJjbGFuZy4iKQogICAgKGxpY2Vuc2UgbGljZW5zZTphc2wyLjApKSkKCihkZWZpbmUt cHVibGljIHJ1c3QtaGFzaGJyb3duLTAuMS44CiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWhh c2hicm93biIpCiAgICAodmVyc2lvbiAiMC4xLjgiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2lu CiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJoYXNo YnJvd24iIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBw ZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAg IChiYXNlMzIKICAgICAgICAgICAgIjFucDM1MG5yenlzeTAyMW5kbjIxMzVxNXZwenJwNW5saTc4 eXd6MTE0ZDF2Y252MmtiaXYiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0 ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0 LWJ5dGVvcmRlciIgLHJ1c3QtYnl0ZW9yZGVyKQogICAgICAgICAoInJ1c3QtcmF5b24iICxydXN0 LXJheW9uKQogICAgICAgICAoInJ1c3Qtc2NvcGVndWFyZC0wLjMuMyIgLHJ1c3Qtc2NvcGVndWFy ZC0wLjMuMykKICAgICAgICAgKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkpKSkKICAgIChob21l LXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvaGFzaGJyb3duIikKICAg IChzeW5vcHNpcwogICAgICAiQSBSdXN0IHBvcnQgb2YgR29vZ2xlJ3MgU3dpc3NUYWJsZSBoYXNo IG1hcCIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIFJ1 c3QgcG9ydCBvZiBHb29nbGUncyBTd2lzc1RhYmxlIGhhc2ggbWFwIikKICAgIChsaWNlbnNlICNm KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXBlZWtpbmctdGFrZS13aGlsZQogIChwYWNrYWdlCiAg ICAobmFtZSAicnVzdC1wZWVraW5nLXRha2Utd2hpbGUiKQogICAgKHZlcnNpb24gIjAuMS4yIikK ICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAg ICAgICh1cmkgKGNyYXRlLXVyaSAicGVla2luZ190YWtlX3doaWxlIiB2ZXJzaW9uKSkKICAgICAg ICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIu Y3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIx NmJocXI2cmR5cnAxMnp2MzgxY3hhYXFxZDBwd3lzdm0xcThoMnlnaWh2eXB2ZnByYzhyIikpKSkK ICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGhvbWUtcGFnZQogICAg ICAiaHR0cHM6Ly9naXRodWIuY29tL2ZpdHpnZW4vcGVla2luZ190YWtlX3doaWxlIikKICAgIChz eW5vcHNpcwogICAgICAiTGlrZSBgSXRlcmF0b3I6OnRha2Vfd2hpbGVgLCBidXQgY2FsbHMgdGhl IHByZWRpY2F0ZSBvbiBhIHBlZWtlZCB2YWx1ZS4gVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBgSXRl cmF0b3I6OmJ5X3JlZmAgYW5kIGBJdGVyYXRvcjo6dGFrZV93aGlsZWAgdG9nZXRoZXIsIGFuZCBz dGlsbCBnZXQgdGhlIGZpcnN0IHZhbHVlIGZvciB3aGljaCB0aGUgYHRha2Vfd2hpbGVgIHByZWRp Y2F0ZSByZXR1cm5lZCBmYWxzZSBhZnRlciBkcm9wcGluZyB0aGUgYGJ5X3JlZmAuIikKICAgIChk ZXNjcmlwdGlvbgogICAgICAiTGlrZSBgSXRlcmF0b3I6OnRha2Vfd2hpbGVgLCBidXQgY2FsbHMg dGhlIHByZWRpY2F0ZSBvbiBhIHBlZWtlZCB2YWx1ZS4gIFRoaXMgYWxsb3dzIHlvdSB0byB1c2Ug YEl0ZXJhdG9yOjpieV9yZWZgIGFuZCBgSXRlcmF0b3I6OnRha2Vfd2hpbGVgIHRvZ2V0aGVyLCBh bmQgc3RpbGwgZ2V0IHRoZSBmaXJzdCB2YWx1ZSBmb3Igd2hpY2ggdGhlIGB0YWtlX3doaWxlYCBw cmVkaWNhdGUgcmV0dXJuZWQgZmFsc2UgYWZ0ZXIgZHJvcHBpbmcgdGhlIGBieV9yZWZgLiIpCiAg ICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1wcm9jLW1hY3JvMi0wLjQuMzAK ICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcHJvYy1tYWNybzIiKQogICAgKHZlcnNpb24gIjAu NC4zMCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRj aCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInByb2MtbWFjcm8yIiB2ZXJzaW9uKSkKICAgICAg ICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIu Y3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIw bmQ3MWZsMjRzeXMwNjZqcmhhNmo3aTM0bmZranY0NHl6dzh5d3c5NzQyd21jOGowZ2ZnIikpKSkK ICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAg ICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVzdC11bmljb2RlLXhpZC0wLjEuMCIKICAg ICAgICAgICxydXN0LXVuaWNvZGUteGlkLTAuMS4wKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAi aHR0cHM6Ly9naXRodWIuY29tL2FsZXhjcmljaHRvbi9wcm9jLW1hY3JvMiIpCiAgICAoc3lub3Bz aXMKICAgICAgIkEgc3RhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1cGNvbWluZyBuZXcgYHBy b2NfbWFjcm9gIEFQSS4gQ29tZXMgd2l0aCBhbgpvcHRpb24sIG9mZiBieSBkZWZhdWx0LCB0byBh bHNvIHJlaW1wbGVtZW50IGl0c2VsZiBpbiB0ZXJtcyBvZiB0aGUgdXBzdHJlYW0KdW5zdGFibGUg QVBJLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBz dGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVwY29taW5nIG5ldyBgcHJvY19tYWNyb2AgQVBJ LiAgQ29tZXMgd2l0aCBhbgpvcHRpb24sIG9mZiBieSBkZWZhdWx0LCB0byBhbHNvIHJlaW1wbGVt ZW50IGl0c2VsZiBpbiB0ZXJtcyBvZiB0aGUgdXBzdHJlYW0KdW5zdGFibGUgQVBJLgoiKQogICAg KGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtcXVvdGUtMC42LjEzCiAgKHBhY2th Z2UKICAgIChuYW1lICJydXN0LXF1b3RlIikKICAgICh2ZXJzaW9uICIwLjYuMTMiKQogICAgKHNv dXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVy aSAoY3JhdGUtdXJpICJxdW90ZSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAg ICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNo YTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXFncXE0OGp5bXA1aDR5MDgyYWFu ZjI1aHJ3NmJwYjY3OHhoM3p3OTkzcWZoeG1rcHFrYyIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNh cmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwog ICAgICAgICgoInJ1c3QtcHJvYy1tYWNybzItMC40LjMwIgogICAgICAgICAgLHJ1c3QtcHJvYy1t YWNybzItMC40LjMwKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2R0b2xu YXkvcXVvdGUiKQogICAgKHN5bm9wc2lzICJRdWFzaS1xdW90aW5nIG1hY3JvIHF1b3RlISguLi4p IikKICAgIChkZXNjcmlwdGlvbiAiUXVhc2ktcXVvdGluZyBtYWNybyBxdW90ZSEoLi4uKSIpCiAg ICAobGljZW5zZSAobGlzdCBsaWNlbnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmlu ZS1wdWJsaWMgcnVzdC1yZWdleAogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1yZWdleCIpCiAg ICAodmVyc2lvbiAiMS4zLjEiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1l dGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJyZWdleCIgdmVyc2lvbikp CiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVy c2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAg ICAgICAiMWc4d3AxNjB2enhncmFseWQ0aW15ZGQweHN4cTZ5aDI1emhzMjI5ejFzNnc3Zzlobjhu dyIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVu dHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtYWhvLWNvcmFzaWNrIiAs cnVzdC1haG8tY29yYXNpY2spCiAgICAgICAgICgicnVzdC1tZW1jaHIiICxydXN0LW1lbWNocikK ICAgICAgICAgKCJydXN0LXJlZ2V4LXN5bnRheCIgLHJ1c3QtcmVnZXgtc3ludGF4KQogICAgICAg ICAoInJ1c3QtdGhyZWFkLWxvY2FsLTAuMy42IgogICAgICAgICAgLHJ1c3QtdGhyZWFkLWxvY2Fs LTAuMy42KSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9y ZWdleCIpCiAgICAoc3lub3BzaXMKICAgICAgIkFuIGltcGxlbWVudGF0aW9uIG9mIHJlZ3VsYXIg ZXhwcmVzc2lvbnMgZm9yIFJ1c3QuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwpmaW5pdGUgYXV0 b21hdGEgYW5kIGd1YXJhbnRlZXMgbGluZWFyIHRpbWUgbWF0Y2hpbmcgb24gYWxsIGlucHV0cy4K IikKICAgIChkZXNjcmlwdGlvbgogICAgICAiQW4gaW1wbGVtZW50YXRpb24gb2YgcmVndWxhciBl eHByZXNzaW9ucyBmb3IgUnVzdC4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwpmaW5pdGUgYXV0 b21hdGEgYW5kIGd1YXJhbnRlZXMgbGluZWFyIHRpbWUgbWF0Y2hpbmcgb24gYWxsIGlucHV0cy4K IikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXdoaWNoLTIuMC4xCiAg KHBhY2thZ2UKICAgIChuYW1lICJydXN0LXdoaWNoIikKICAgICh2ZXJzaW9uICIyLjAuMSIpCiAg ICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAg ICAodXJpIChjcmF0ZS11cmkgIndoaWNoIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAg ICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAg ICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwcjdpNzkzc2MweHFuZDJm eG5xYmtzajdqMWt4NjVid244MWI4ejQ5NzUwdjRjOGNueW1tIikpKSkKICAgIChidWlsZC1zeXN0 ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5w dXRzCiAgICAgICAgKCgicnVzdC1mYWlsdXJlIiAscnVzdC1mYWlsdXJlKQogICAgICAgICAoInJ1 c3QtbGliYyIgLHJ1c3QtbGliYykpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0 aHViLmNvbS9oYXJyeWZlaS93aGljaC1ycy5naXQiKQogICAgKHN5bm9wc2lzCiAgICAgICJBIFJ1 c3QgZXF1aXZhbGVudCBvZiBVbml4IGNvbW1hbmQgXCJ3aGljaFwiLiBMb2NhdGUgaW5zdGFsbGVk IGV4ZWN1dGFibGUgaW4gY3Jvc3MgcGxhdGZvcm1zLiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAg IlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIFJ1c3QgZXF1aXZhbGVudCBvZiBVbml4IGNvbW1hbmQg XCJ3aGljaFwiLiAgTG9jYXRlIGluc3RhbGxlZCBleGVjdXRhYmxlIGluIGNyb3NzIHBsYXRmb3Jt cy4iKQogICAgKGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1o dW1hbnRpbWUKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtaHVtYW50aW1lIikKICAgICh2ZXJz aW9uICIxLjMuMCIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVy bC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImh1bWFudGltZSIgdmVyc2lvbikpCiAg ICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lv biAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAg ICAiMGtyd2diZjM1cGQ0Nnh2a3FnMTRqMDcwdmlyY3NuZGFiYWhhaGx2M3J3aGZscHk0cTA2eiIp KSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMK ICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtcXVpY2stZXJyb3IiICxydXN0 LXF1aWNrLWVycm9yKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29t L3RhaWxob29rL2h1bWFudGltZSIpCiAgICAoc3lub3BzaXMKICAgICAgIiAgICBBIHBhcnNlciBh bmQgZm9ybWF0dGVyIGZvciBzdGQ6OnRpbWU6OntEdXJhdGlvbiwgU3lzdGVtVGltZX0KIikKICAg IChkZXNjcmlwdGlvbgogICAgICAiICAgIEEgcGFyc2VyIGFuZCBmb3JtYXR0ZXIgZm9yIHN0ZDo6 dGltZTo6e0R1cmF0aW9uLCBTeXN0ZW1UaW1lfQoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZp bmUtcHVibGljIHJ1c3QtdGVybWNvbG9yCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXRlcm1j b2xvciIpCiAgICAodmVyc2lvbiAiMS4wLjUiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAg ICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJ0ZXJtY29s b3IiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5k IG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChi YXNlMzIKICAgICAgICAgICAgIjB2amZzbjFhOHp2cWhucmJ5Z3J6MWlkNnlja3d2MWRuY3czdzR6 ajY1cWR4MGYwMGttbG4iKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0p CiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LXdp bmNvbG9yIiAscnVzdC13aW5jb2xvcikpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8v Z2l0aHViLmNvbS9CdXJudFN1c2hpL3Rlcm1jb2xvciIpCiAgICAoc3lub3BzaXMKICAgICAgIkEg c2ltcGxlIGNyb3NzIHBsYXRmb3JtIGxpYnJhcnkgZm9yIHdyaXRpbmcgY29sb3JlZCB0ZXh0IHRv IGEgdGVybWluYWwuCiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92 aWRlcyBhIHNpbXBsZSBjcm9zcyBwbGF0Zm9ybSBsaWJyYXJ5IGZvciB3cml0aW5nIGNvbG9yZWQg dGV4dCB0byBhIHRlcm1pbmFsLgoiKQogICAgKGxpY2Vuc2UgKGxpc3QgbGljZW5zZTp1bmxpY2Vu c2UgbGljZW5zZTpleHBhdCkpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtaW92ZWMtMC4xLjQKICAo cGFja2FnZQogICAgKG5hbWUgInJ1c3QtaW92ZWMiKQogICAgKHZlcnNpb24gIjAuMS40IikKICAg IChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAg ICh1cmkgKGNyYXRlLXVyaSAiaW92ZWMiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAg ICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAg IChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjBwaDczcXlnd3g4aTBtYmxy ZjExMGNqNTlsMDBna21zZ3Jwenoxcm04NXN5ejVweW1jeGoiKSkpKQogICAgKGJ1aWxkLXN5c3Rl bSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1 dHMgKCgicnVzdC1saWJjIiAscnVzdC1saWJjKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9n aXRodWIuY29tL2NhcmxsZXJjaGUvaW92ZWMiKQogICAgKHN5bm9wc2lzCiAgICAgICJQb3J0YWJs ZSBidWZmZXIgdHlwZSBmb3Igc2NhdHRlci9nYXRoZXIgSS9PIG9wZXJhdGlvbnMKIikKICAgIChk ZXNjcmlwdGlvbgogICAgICAiUG9ydGFibGUgYnVmZmVyIHR5cGUgZm9yIHNjYXR0ZXIvZ2F0aGVy IEkvTyBvcGVyYXRpb25zCiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVz dC1laXRoZXIKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtZWl0aGVyIikKICAgICh2ZXJzaW9u ICIxLjUuMyIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1m ZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImVpdGhlciIgdmVyc2lvbikpCiAgICAgICAg KGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNy YXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXF5 ejFiMWFjYWQ2dzBrNTkyOGp3NXphcTkwMHpoc2s3cDhkbGNwNGhoNjF3NGY2bjd4diIpKSkpCiAg ICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAg YCgjOmNhcmdvLWlucHV0cyAoKCJydXN0LXNlcmRlIiAscnVzdC1zZXJkZSkpKSkKICAgIChob21l LXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9ibHVzcy9laXRoZXIiKQogICAgKHN5bm9wc2lzCiAg ICAgICJUaGUgZW51bSBgRWl0aGVyYCB3aXRoIHZhcmlhbnRzIGBMZWZ0YCBhbmQgYFJpZ2h0YCBp cyBhIGdlbmVyYWwgcHVycG9zZSBzdW0gdHlwZSB3aXRoIHR3byBjYXNlcy4KIikKICAgIChkZXNj cmlwdGlvbgogICAgICAiVGhlIGVudW0gYEVpdGhlcmAgd2l0aCB2YXJpYW50cyBgTGVmdGAgYW5k IGBSaWdodGAgaXMgYSBnZW5lcmFsIHB1cnBvc2Ugc3VtIHR5cGUgd2l0aCB0d28gY2FzZXMuCiIp CiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1jcm9zc2JlYW0tZGVxdWUK ICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtY3Jvc3NiZWFtLWRlcXVlIikKICAgICh2ZXJzaW9u ICIwLjcuMiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1m ZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgImNyb3NzYmVhbS1kZXF1ZSIgdmVyc2lvbikp CiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVy c2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAg ICAgICAiMWptM3JxYjNxZnBmeXdyYWt5eTgxZjYxeG5sNGpzaW03bGFtOWRpZ3c2dzZjZGZyOWFu MyIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVu dHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtY3Jvc3NiZWFtLWVwb2No IiAscnVzdC1jcm9zc2JlYW0tZXBvY2gpCiAgICAgICAgICgicnVzdC1jcm9zc2JlYW0tdXRpbHMi ICxydXN0LWNyb3NzYmVhbS11dGlscykpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8v Z2l0aHViLmNvbS9jcm9zc2JlYW0tcnMvY3Jvc3NiZWFtL3RyZWUvbWFzdGVyL2Nyb3NzYmVhbS1k ZXF1ZSIpCiAgICAoc3lub3BzaXMgIkNvbmN1cnJlbnQgd29yay1zdGVhbGluZyBkZXF1ZSIpCiAg ICAoZGVzY3JpcHRpb24gIkNvbmN1cnJlbnQgd29yay1zdGVhbGluZyBkZXF1ZSIpCiAgICAobGlj ZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1yYXlvbi1jb3JlCiAgKHBhY2thZ2UKICAg IChuYW1lICJydXN0LXJheW9uLWNvcmUiKQogICAgKHZlcnNpb24gIjEuNi4xIikKICAgIChzb3Vy Y2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkg KGNyYXRlLXVyaSAicmF5b24tY29yZSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAg ICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAg KHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMTRhN2dkaTVsYmY5OWl4eTI3 d255MjVncTJ3NWtqNXJic3JwcWlybTljMTNkemcxZ2d6cSIpKSkpCiAgICAoYnVpbGQtc3lzdGVt IGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0 cwogICAgICAgICgoInJ1c3QtY3Jvc3NiZWFtLWRlcXVlIiAscnVzdC1jcm9zc2JlYW0tZGVxdWUp CiAgICAgICAgICgicnVzdC1jcm9zc2JlYW0tcXVldWUiICxydXN0LWNyb3NzYmVhbS1xdWV1ZSkK ICAgICAgICAgKCJydXN0LWNyb3NzYmVhbS11dGlscyIgLHJ1c3QtY3Jvc3NiZWFtLXV0aWxzKQog ICAgICAgICAoInJ1c3QtbGF6eS1zdGF0aWMiICxydXN0LWxhenktc3RhdGljKQogICAgICAgICAo InJ1c3QtbnVtLWNwdXMiICxydXN0LW51bS1jcHVzKSkpKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6 Ly9naXRodWIuY29tL3JheW9uLXJzL3JheW9uIikKICAgIChzeW5vcHNpcyAiQ29yZSBBUElzIGZv ciBSYXlvbiIpCiAgICAoZGVzY3JpcHRpb24gIkNvcmUgQVBJcyBmb3IgUmF5b24iKQogICAgKGxp Y2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtYnVtcGFsbwogIChwYWNrYWdlCiAgICAo bmFtZSAicnVzdC1idW1wYWxvIikKICAgICh2ZXJzaW9uICIyLjYuMCIpCiAgICAoc291cmNlCiAg ICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0 ZS11cmkgImJ1bXBhbG8iIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChz dHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYK ICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjAyMHBzeHM1ZGxtMGdkYnM4M3J4MnJjYXZp YmRzaGRyMGZwemszbW13NjV6cThwcHowNWQiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1i dWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vZml0emdlbi9i dW1wYWxvIikKICAgIChzeW5vcHNpcwogICAgICAiQSBmYXN0IGJ1bXAgYWxsb2NhdGlvbiBhcmVu YSBmb3IgUnVzdC4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlk ZXMgYSBmYXN0IGJ1bXAgYWxsb2NhdGlvbiBhcmVuYSBmb3IgUnVzdC4iKQogICAgKGxpY2Vuc2Ug I2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qtbm9kcm9wCiAgKHBhY2thZ2UKICAgIChuYW1lICJy dXN0LW5vZHJvcCIpCiAgICAodmVyc2lvbiAiMC4xLjE0IikKICAgIChzb3VyY2UKICAgICAgKG9y aWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAi bm9kcm9wIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFw cGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAg ICAoYmFzZTMyCiAgICAgICAgICAgICIxZnoxdjlyOGlqYWNmMGhscTBwZHY1bDltejh2Z3FnMXNu bWh2cGptaTlhY2kxYjRtdnZqIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lz dGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAgICAgKCgicnVz dC1ub2Ryb3AtdW5pb24iICxydXN0LW5vZHJvcC11bmlvbikpKSkKICAgIChob21lLXBhZ2UgImh0 dHBzOi8vZ2l0aHViLmNvbS9ibHVzcy9hcnJheXZlYyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEg d3JhcHBlciB0eXBlIHRvIGluaGliaXQgZHJvcCAoZGVzdHJ1Y3RvcikuCgoqKipEZXByZWNhdGVk OiBVc2UgTWFudWFsbHlEcm9wIG9yIE1heWJlVW5pbml0IGluc3RlYWQhKioqCiIpCiAgICAoZGVz Y3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHdyYXBwZXIgdHlwZSB0byBp bmhpYml0IGRyb3AgKGRlc3RydWN0b3IpLgoKKioqRGVwcmVjYXRlZDogVXNlIE1hbnVhbGx5RHJv cCBvciBNYXliZVVuaW5pdCBpbnN0ZWFkISoqKgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZp bmUtcHVibGljIHJ1c3QtbWQ1LTAuNi4xCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LW1kNSIp CiAgICAodmVyc2lvbiAiMC42LjEiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAg KG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJtZDUiIHZlcnNpb24p KQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZl cnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAg ICAgICAgIjE3YjJ4bTRoNGN2eHNkanNmM2tkcnpxdjJ6YTYwa2FrOTYxeHppNWttdzZnNmRqY3Nz dnkiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1w YWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vc3RhaW5sZXNzLXN0ZWVsL21kNSIpCiAgICAo c3lub3BzaXMKICAgICAgIlRoZSBwYWNrYWdlIHByb3ZpZGVzIHRoZSBNRDUgaGFzaCBmdW5jdGlv bi4iKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGUgcGFja2FnZSBwcm92aWRlcyB0aGUgTUQ1 IGhhc2ggZnVuY3Rpb24uIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0 LXNsb2cKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qtc2xvZyIpCiAgICAodmVyc2lvbiAiMi41 LjIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gp CiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzbG9nIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1u YW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkK ICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxNmJ2NnpyZG4x c20zMTV2Ym5pYTAyZzMxeHZzbWJqeXo1Z3YzejB2cmd4ZGxpMGNkajh3IikpKSkKICAgIChidWls ZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2Fy Z28taW5wdXRzCiAgICAgICAgKCgicnVzdC1lcmFzZWQtc2VyZGUiICxydXN0LWVyYXNlZC1zZXJk ZSkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9zbG9nLXJzL3Nsb2ciKQog ICAgKHN5bm9wc2lzCiAgICAgICJTdHJ1Y3R1cmVkLCBleHRlbnNpYmxlLCBjb21wb3NhYmxlIGxv Z2dpbmcgZm9yIFJ1c3QiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJTdHJ1Y3R1cmVkLCBleHRl bnNpYmxlLCBjb21wb3NhYmxlIGxvZ2dpbmcgZm9yIFJ1c3QiKQogICAgKGxpY2Vuc2UgKGxpc3Qg I2YgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWNyYzMyZmFzdAogIChw YWNrYWdlCiAgICAobmFtZSAicnVzdC1jcmMzMmZhc3QiKQogICAgKHZlcnNpb24gIjEuMi4wIikK ICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAg ICAgICh1cmkgKGNyYXRlLXVyaSAiY3JjMzJmYXN0IiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1u YW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkK ICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxYzlkaGt2ZjNi cnJ6enBsY2lqYXl3eGkydzh3djU1NzhpMHJ5aGNtN3g4ZG16aTVzNG1zIikpKSkKICAgIChidWls ZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2Fy Z28taW5wdXRzICgoInJ1c3QtY2ZnLWlmIiAscnVzdC1jZmctaWYpKSkpCiAgICAoaG9tZS1wYWdl CiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vc3JpanMvcnVzdC1jcmMzMmZhc3QiKQogICAgKHN5 bm9wc2lzCiAgICAgICJGYXN0LCBTSU1ELWFjY2VsZXJhdGVkIENSQzMyIChJRUVFKSBjaGVja3N1 bSBjb21wdXRhdGlvbiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIkZhc3QsIFNJTUQtYWNjZWxl cmF0ZWQgQ1JDMzIgKElFRUUpIGNoZWNrc3VtIGNvbXB1dGF0aW9uIikKICAgIChsaWNlbnNlIChs aXN0IGxpY2Vuc2U6ZXhwYXQgbGljZW5zZTphc2wyLjApKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0 LW1pbml6LW94aWRlCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LW1pbml6LW94aWRlIikKICAg ICh2ZXJzaW9uICIwLjMuNSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0 aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIm1pbml6X294aWRlIiB2ZXJz aW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICIt IiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAg ICAgICAgICAgICIwOWJuZm40Ym4zaGNwOTEydjVzeXBobTRramQwZmRrd3EwMjNhNHptcjR4ZjR2 dnA4Z3ZnIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFy Z3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzICgoInJ1c3QtYWRsZXIzMiIgLHJ1c3QtYWRs ZXIzMikpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9Gcm9tbWkv bWluaXpfb3hpZGUvdHJlZS9tYXN0ZXIvbWluaXpfb3hpZGUiKQogICAgKHN5bm9wc2lzCiAgICAg ICJERUZMQVRFIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGxpYnJhcnkgcmV3cml0dGVu IGluIFJ1c3QgYmFzZWQgb24gbWluaXoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJERUZMQVRF IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGxpYnJhcnkgcmV3cml0dGVuIGluIFJ1c3Qg YmFzZWQgb24gbWluaXoiKQogICAgKGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoKKGRlZmluZS1w dWJsaWMgcnVzdC1saWJ6LXN5cwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1saWJ6LXN5cyIp CiAgICAodmVyc2lvbiAiMS4wLjI1IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAg IChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAibGliei1zeXMiIHZl cnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUg Ii0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIK ICAgICAgICAgICAgIjFnanljeWwyMjgzNTI1YWJrczk4Ymh4YTRyMjU5bTYxN3hmbTV6NTJwM3Az YzhyeTlkOWYiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAo YXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWNjIiAscnVz dC1jYykKICAgICAgICAgKCJydXN0LWxpYmMiICxydXN0LWxpYmMpCiAgICAgICAgICgicnVzdC1w a2ctY29uZmlnIiAscnVzdC1wa2ctY29uZmlnKQogICAgICAgICAoInJ1c3QtdmNwa2ciICxydXN0 LXZjcGtnKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2FsZXhj cmljaHRvbi9saWJ6LXN5cyIpCiAgICAoc3lub3BzaXMKICAgICAgIkJpbmRpbmdzIHRvIHRoZSBz eXN0ZW0gbGlieiBsaWJyYXJ5IChhbHNvIGtub3duIGFzIHpsaWIpLgoiKQogICAgKGRlc2NyaXB0 aW9uCiAgICAgICJCaW5kaW5ncyB0byB0aGUgc3lzdGVtIGxpYnogbGlicmFyeSAoYWxzbyBrbm93 biBhcyB6bGliKS4KIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LW1p bml6LW94aWRlCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LW1pbml6LW94aWRlIikKICAgICh2 ZXJzaW9uICIwLjMuNSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9k IHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIm1pbml6X294aWRlIiB2ZXJzaW9u KSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2 ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAg ICAgICAgICIwOWJuZm40Ym4zaGNwOTEydjVzeXBobTRramQwZmRrd3EwMjNhNHptcjR4ZjR2dnA4 Z3ZnIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3Vt ZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzICgoInJ1c3QtYWRsZXIzMiIgLHJ1c3QtYWRsZXIz MikpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9Gcm9tbWkvbWlu aXpfb3hpZGUvdHJlZS9tYXN0ZXIvbWluaXpfb3hpZGUiKQogICAgKHN5bm9wc2lzCiAgICAgICJE RUZMQVRFIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGxpYnJhcnkgcmV3cml0dGVuIGlu IFJ1c3QgYmFzZWQgb24gbWluaXoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJERUZMQVRFIGNv bXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGxpYnJhcnkgcmV3cml0dGVuIGluIFJ1c3QgYmFz ZWQgb24gbWluaXoiKQogICAgKGxpY2Vuc2UgbGljZW5zZTpleHBhdCkpKQoKKGRlZmluZS1wdWJs aWMgcnVzdC1taW5pei1zeXMKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtbWluaXotc3lzIikK ICAgICh2ZXJzaW9uICIwLjEuMTIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAg KG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJtaW5pei1zeXMiIHZl cnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUg Ii0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIK ICAgICAgICAgICAgIjAwbDJyNGFubThnMzV4MGpzMnpmZG53ZmJyaWg5bTQzdnBoZHBiNzdjNWdh M2tqa203aHkiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAo YXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LWNjIiAscnVz dC1jYykgKCJydXN0LWxpYmMiICxydXN0LWxpYmMpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJo dHRwczovL2dpdGh1Yi5jb20vYWxleGNyaWNodG9uL2ZsYXRlMi1ycyIpCiAgICAoc3lub3BzaXMg IkJpbmRpbmdzIHRvIHRoZSBtaW5pei5jIGxpYnJhcnkuCiIpCiAgICAoZGVzY3JpcHRpb24KICAg ICAgIkJpbmRpbmdzIHRvIHRoZSBtaW5pei5jIGxpYnJhcnkuCiIpCiAgICAobGljZW5zZSAjZikp KQoKKGRlZmluZS1wdWJsaWMgcnVzdC1zeW4tMC4xNS40NAogIChwYWNrYWdlCiAgICAobmFtZSAi cnVzdC1zeW4iKQogICAgKHZlcnNpb24gIjAuMTUuNDQiKQogICAgKHNvdXJjZQogICAgICAob3Jp Z2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJz eW4iIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5k IG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChi YXNlMzIKICAgICAgICAgICAgIjFpZDVnNng2emlodjNqN2h3cnczbTFqcDYzNmJnOGRwaTY3MXI3 enkzanZwa2F2Yjc5NHciKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0p CiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJydXN0LXBy b2MtbWFjcm8yLTAuNC4zMCIKICAgICAgICAgICxydXN0LXByb2MtbWFjcm8yLTAuNC4zMCkKICAg ICAgICAgKCJydXN0LXF1b3RlLTAuNi4xMyIgLHJ1c3QtcXVvdGUtMC42LjEzKQogICAgICAgICAo InJ1c3QtdW5pY29kZS14aWQtMC4xLjAiCiAgICAgICAgICAscnVzdC11bmljb2RlLXhpZC0wLjEu MCkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9kdG9sbmF5L3N5biIpCiAg ICAoc3lub3BzaXMgIlBhcnNlciBmb3IgUnVzdCBzb3VyY2UgY29kZSIpCiAgICAoZGVzY3JpcHRp b24gIlBhcnNlciBmb3IgUnVzdCBzb3VyY2UgY29kZSIpCiAgICAobGljZW5zZSAobGlzdCBsaWNl bnNlOmV4cGF0IGxpY2Vuc2U6YXNsMi4wKSkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1ub20tNC4y LjMKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qtbm9tIikKICAgICh2ZXJzaW9uICI0LjIuMyIp CiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAg ICAgICAodXJpIChjcmF0ZS11cmkgIm5vbSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQog ICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAg ICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMW1rdmJ5OGI0bTYxcDRn MXB4MHB3cjU4eWZrcGh5cDFqY2ZicDRxZnA3bDZpcWRha2xpYSIpKSkpCiAgICAoYnVpbGQtc3lz dGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlu cHV0cwogICAgICAgICgoInJ1c3QtbGF6eS1zdGF0aWMiICxydXN0LWxhenktc3RhdGljKQogICAg ICAgICAoInJ1c3QtbWVtY2hyIiAscnVzdC1tZW1jaHIpCiAgICAgICAgICgicnVzdC1yZWdleCIg LHJ1c3QtcmVnZXgpCiAgICAgICAgICgicnVzdC12ZXJzaW9uLWNoZWNrLTAuMS41IgogICAgICAg ICAgLHJ1c3QtdmVyc2lvbi1jaGVjay0wLjEuNSkpKSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8v Z2l0aHViLmNvbS9HZWFsL25vbSIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgYnl0ZS1vcmllbnRl ZCwgemVyby1jb3B5LCBwYXJzZXIgY29tYmluYXRvcnMgbGlicmFyeSIpCiAgICAoZGVzY3JpcHRp b24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIGJ5dGUtb3JpZW50ZWQsIHplcm8tY29w eSwgcGFyc2VyIGNvbWJpbmF0b3JzIGxpYnJhcnkiKQogICAgKGxpY2Vuc2UgbGljZW5zZTpleHBh dCkpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1nbG9iLTAuMi4xMQogIChwYWNrYWdlCiAgICAobmFt ZSAicnVzdC1nbG9iIikKICAgICh2ZXJzaW9uICIwLjIuMTEiKQogICAgKHNvdXJjZQogICAgICAo b3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJp ICJnbG9iIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFw cGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAg ICAoYmFzZTMyCiAgICAgICAgICAgICIxeXN2aTcyc2xrdzc4NGZjc3ltZ2o0MzA4YzN5MDNnd2pq enF4cDgweGRqbmtiaDh2cWNiIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lz dGVtKQogICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9nbG9iIikK ICAgIChzeW5vcHNpcwogICAgICAiU3VwcG9ydCBmb3IgbWF0Y2hpbmcgZmlsZSBwYXRocyBhZ2Fp bnN0IFVuaXggc2hlbGwgc3R5bGUgcGF0dGVybnMuCiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAg IlN1cHBvcnQgZm9yIG1hdGNoaW5nIGZpbGUgcGF0aHMgYWdhaW5zdCBVbml4IHNoZWxsIHN0eWxl IHBhdHRlcm5zLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtZ2xv Yi0wLjIuMTEKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtZ2xvYiIpCiAgICAodmVyc2lvbiAi MC4yLjExIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZl dGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiZ2xvYiIgdmVyc2lvbikpCiAgICAgICAgKGZp bGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRl IikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXlzdmk3 MnNsa3c3ODRmY3N5bWdqNDMwOGMzeTAzZ3dqanpxeHA4MHhkam5rYmg4dnFjYiIpKSkpCiAgICAo YnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UgImh0dHBzOi8v Z2l0aHViLmNvbS9ydXN0LWxhbmcvZ2xvYiIpCiAgICAoc3lub3BzaXMKICAgICAgIlN1cHBvcnQg Zm9yIG1hdGNoaW5nIGZpbGUgcGF0aHMgYWdhaW5zdCBVbml4IHNoZWxsIHN0eWxlIHBhdHRlcm5z LgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJTdXBwb3J0IGZvciBtYXRjaGluZyBmaWxlIHBh dGhzIGFnYWluc3QgVW5peCBzaGVsbCBzdHlsZSBwYXR0ZXJucy4KIikKICAgIChsaWNlbnNlICNm KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWxpYmxvYWRpbmcKICAocGFja2FnZQogICAgKG5hbWUg InJ1c3QtbGlibG9hZGluZyIpCiAgICAodmVyc2lvbiAiMC41LjIiKQogICAgKHNvdXJjZQogICAg ICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUt dXJpICJsaWJsb2FkaW5nIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAo c3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2 CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIwbHlwbHk4cmNxYzhhZ2FqenhzN2JxNml2 YmE5ZG5uMWk2OGtnYjl6MmZsbmZqaDEzY2dqIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28t YnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAgICAg ICAgKCgicnVzdC1jYyIgLHJ1c3QtY2MpCiAgICAgICAgICgicnVzdC13aW5hcGkiICxydXN0LXdp bmFwaSkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9uYWdpc2Ev cnVzdF9saWJsb2FkaW5nLyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgc2FmZXIgYmluZGluZyB0 byBwbGF0Zm9ybcOiXHg4MFx4OTlzIGR5bmFtaWMgbGlicmFyeSBsb2FkaW5nIHV0aWxpdGllcyIp CiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHNhZmVyIGJp bmRpbmcgdG8gcGxhdGZvcm3Dolx4ODBceDk5cyBkeW5hbWljIGxpYnJhcnkgbG9hZGluZyB1dGls aXRpZXMiKQogICAgKGxpY2Vuc2UgbGljZW5zZTppc2MpKSkKCihkZWZpbmUtcHVibGljIHJ1c3Qt c2NvcGVndWFyZC0wLjMuMwogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1zY29wZWd1YXJkIikK ICAgICh2ZXJzaW9uICIwLjMuMyIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAo bWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInNjb3BlZ3VhcmQiIHZl cnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUg Ii0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIK ICAgICAgICAgICAgIjA5c3k5d2JxcDQwOXBrd21xbmk0MHFtd2E5OWxkcXBsNDhwcDk1bTF4dzhz YzE5cXk5Y2wiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAo aG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vYmx1c3Mvc2NvcGVndWFyZCIpCiAgICAoc3lu b3BzaXMKICAgICAgIkEgUkFJSSBzY29wZSBndWFyZCB0aGF0IHdpbGwgcnVuIGEgZ2l2ZW4gY2xv c3VyZSB3aGVuIGl0IGdvZXMgb3V0IG9mIHNjb3BlLApldmVuIGlmIHRoZSBjb2RlIGJldHdlZW4g cGFuaWNzIChhc3N1bWluZyB1bndpbmRpbmcgcGFuaWMpLgoKRGVmaW5lcyB0aGUgbWFjcm9zIGBk ZWZlciFgLCBgZGVmZXJfb25fdW53aW5kIWAsIGBkZWZlcl9vbl9zdWNjZXNzIWAgYXMKc2hvcnRo YW5kcyBmb3IgZ3VhcmRzIHdpdGggb25lIG9mIHRoZSBpbXBsZW1lbnRlZCBzdHJhdGVnaWVzLgoi KQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBSQUlJIHNj b3BlIGd1YXJkIHRoYXQgd2lsbCBydW4gYSBnaXZlbiBjbG9zdXJlIHdoZW4gaXQgZ29lcyBvdXQg b2Ygc2NvcGUsCmV2ZW4gaWYgdGhlIGNvZGUgYmV0d2VlbiBwYW5pY3MgKGFzc3VtaW5nIHVud2lu ZGluZyBwYW5pYykuCgpEZWZpbmVzIHRoZSBtYWNyb3MgYGRlZmVyIWAsIGBkZWZlcl9vbl91bndp bmQhYCwgYGRlZmVyX29uX3N1Y2Nlc3MhYCBhcwpzaG9ydGhhbmRzIGZvciBndWFyZHMgd2l0aCBv bmUgb2YgdGhlIGltcGxlbWVudGVkIHN0cmF0ZWdpZXMuCiIpCiAgICAobGljZW5zZSAjZikpKQoK KGRlZmluZS1wdWJsaWMgcnVzdC11bmljb2RlLXhpZC0wLjEuMAogIChwYWNrYWdlCiAgICAobmFt ZSAicnVzdC11bmljb2RlLXhpZCIpCiAgICAodmVyc2lvbiAiMC4xLjAiKQogICAgKHNvdXJjZQog ICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3Jh dGUtdXJpICJ1bmljb2RlLXhpZCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAg ICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNo YTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMXo1N2xxaDRzMThycjR4MGo0Znc0 Zm1wOWhmOTM0Nmgwa21kZ3FzcXgwZmhqcjNrMHdwdyIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNh cmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNv bS91bmljb2RlLXJzL3VuaWNvZGUteGlkIikKICAgIChzeW5vcHNpcwogICAgICAiRGV0ZXJtaW5l IHdoZXRoZXIgY2hhcmFjdGVycyBoYXZlIHRoZSBYSURfU3RhcnQKb3IgWElEX0NvbnRpbnVlIHBy b3BlcnRpZXMgYWNjb3JkaW5nIHRvClVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzMxLgoiKQogICAg KGRlc2NyaXB0aW9uCiAgICAgICJEZXRlcm1pbmUgd2hldGhlciBjaGFyYWN0ZXJzIGhhdmUgdGhl IFhJRF9TdGFydApvciBYSURfQ29udGludWUgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8KVW5pY29k ZSBTdGFuZGFyZCBBbm5leCAjMzEuCiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJs aWMgcnVzdC1yZWdleC1zeW50YXgKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcmVnZXgtc3lu dGF4IikKICAgICh2ZXJzaW9uICIwLjYuMTIiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAg ICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJyZWdleC1z eW50YXgiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBw ZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAg IChiYXNlMzIKICAgICAgICAgICAgIjA1cHBsaWN2enZna2Iyd2I0aTk4cDJtcnBnYzhnd3M2dmRs OHhscHl5cjZmM2g2eTU5cWkiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0 ZW0pCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL3JlZ2V4IikK ICAgIChzeW5vcHNpcyAiQSByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2VyLiIpCiAgICAoZGVzY3Jp cHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBw YXJzZXIuIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LWFoby1jb3Jh c2ljawogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1haG8tY29yYXNpY2siKQogICAgKHZlcnNp b24gIjAuNy42IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJs LWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiYWhvLWNvcmFzaWNrIiB2ZXJzaW9uKSkK ICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJz aW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAg ICAgICIwYjhkaDIwZmhkYzU5ZGhobmZpODluMmJpODBhOHpiYWd6ZDVjMTIyaGYxdnYyYW14eXNx IikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50 cwogICAgICBgKCM6Y2FyZ28taW5wdXRzICgoInJ1c3QtbWVtY2hyIiAscnVzdC1tZW1jaHIpKSkp CiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vQnVybnRTdXNoaS9haG8t Y29yYXNpY2siKQogICAgKHN5bm9wc2lzICJGYXN0IG11bHRpcGxlIHN1YnN0cmluZyBzZWFyY2hp bmcuIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiRmFzdCBtdWx0aXBsZSBzdWJzdHJpbmcgc2Vh cmNoaW5nLiIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC10aHJlYWQt bG9jYWwtMC4zLjYKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtdGhyZWFkLWxvY2FsIikKICAg ICh2ZXJzaW9uICIwLjMuNiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0 aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInRocmVhZF9sb2NhbCIgdmVy c2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAi LSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgog ICAgICAgICAgICAiMDZyemlrOTlwOGM1anM4MjM4eWhjOHJrNm5wNTQzeWxiMWR5OW5ydzV2ODBq MHIzeGRmNiIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChh cmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtbGF6eS1zdGF0 aWMiICxydXN0LWxhenktc3RhdGljKSkpKQogICAgKGhvbWUtcGFnZQogICAgICAiaHR0cHM6Ly9n aXRodWIuY29tL0FtYW5pZXUvdGhyZWFkX2xvY2FsLXJzIikKICAgIChzeW5vcHNpcyAiUGVyLW9i amVjdCB0aHJlYWQtbG9jYWwgc3RvcmFnZSIpCiAgICAoZGVzY3JpcHRpb24gIlBlci1vYmplY3Qg dGhyZWFkLWxvY2FsIHN0b3JhZ2UiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGlj IHJ1c3QtcXVpY2stZXJyb3IKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcXVpY2stZXJyb3Ii KQogICAgKHZlcnNpb24gIjEuMi4yIikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAg IChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAicXVpY2stZXJyb3Ii IHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5h bWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNl MzIKICAgICAgICAgICAgIjF3Nmtnd3d2N3A3enIweXlnNXJiMzE1bGtrMjRiaW15d2tsd3g3ZnN2 c2J3aTEwYmp4NGoiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAg ICAoaG9tZS1wYWdlCiAgICAgICJodHRwOi8vZ2l0aHViLmNvbS90YWlsaG9vay9xdWljay1lcnJv ciIpCiAgICAoc3lub3BzaXMKICAgICAgIiAgICBBIG1hY3JvIHdoaWNoIG1ha2VzIGVycm9yIHR5 cGVzIHBsZWFzYW50IHRvIHdyaXRlLgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICIgICAgQSBt YWNybyB3aGljaCBtYWtlcyBlcnJvciB0eXBlcyBwbGVhc2FudCB0byB3cml0ZS4KIikKICAgIChs aWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LXdpbmNvbG9yCiAgKHBhY2thZ2UKICAg IChuYW1lICJydXN0LXdpbmNvbG9yIikKICAgICh2ZXJzaW9uICIxLjAuMiIpCiAgICAoc291cmNl CiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChj cmF0ZS11cmkgIndpbmNvbG9yIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAg ICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hh MjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAgICAgICAgICIxYWdhZjNoY2F2MTEzaTg2OTEyYWpu dzZqeGN5NHJ2a3JneWY4Z2RqOGtjMDMxbWgzeGNuIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2Fy Z28tYnVpbGQtc3lzdGVtKQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzCiAg ICAgICAgKCgicnVzdC13aW5hcGkiICxydXN0LXdpbmFwaSkKICAgICAgICAgKCJydXN0LXdpbmFw aS11dGlsIiAscnVzdC13aW5hcGktdXRpbCkpKSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBz Oi8vZ2l0aHViLmNvbS9CdXJudFN1c2hpL3Rlcm1jb2xvci90cmVlL21hc3Rlci93aW5jb2xvciIp CiAgICAoc3lub3BzaXMKICAgICAgIkEgc2ltcGxlIFdpbmRvd3Mgc3BlY2lmaWMgQVBJIGZvciBj b250cm9sbGluZyB0ZXh0IGNvbG9yIGluIGEgV2luZG93cyBjb25zb2xlLgoiKQogICAgKGRlc2Ny aXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBzaW1wbGUgV2luZG93cyBzcGVj aWZpYyBBUEkgZm9yIGNvbnRyb2xsaW5nIHRleHQgY29sb3IgaW4gYSBXaW5kb3dzIGNvbnNvbGUu CiIpCiAgICAobGljZW5zZSAobGlzdCBsaWNlbnNlOnVubGljZW5zZSBsaWNlbnNlOmV4cGF0KSkp KQoKKGRlZmluZS1wdWJsaWMgcnVzdC1jcm9zc2JlYW0tZXBvY2gKICAocGFja2FnZQogICAgKG5h bWUgInJ1c3QtY3Jvc3NiZWFtLWVwb2NoIikKICAgICh2ZXJzaW9uICIwLjguMCIpCiAgICAoc291 cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJp IChjcmF0ZS11cmkgImNyb3NzYmVhbS1lcG9jaCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFt ZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAg ICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWIybWdjMmd4eHZ5 enl4Z2Q1d3ZuOWs0MmdyNmY5cGhpMnN3d2phd3Bxc3d5M2R5bnIyaCIpKSkpCiAgICAoYnVpbGQt c3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdv LWlucHV0cwogICAgICAgICgoInJ1c3QtYXV0b2NmZyIgLHJ1c3QtYXV0b2NmZykKICAgICAgICAg KCJydXN0LWNmZy1pZiIgLHJ1c3QtY2ZnLWlmKQogICAgICAgICAoInJ1c3QtY3Jvc3NiZWFtLXV0 aWxzIiAscnVzdC1jcm9zc2JlYW0tdXRpbHMpCiAgICAgICAgICgicnVzdC1sYXp5LXN0YXRpYyIg LHJ1c3QtbGF6eS1zdGF0aWMpCiAgICAgICAgICgicnVzdC1tZW1vZmZzZXQiICxydXN0LW1lbW9m ZnNldCkKICAgICAgICAgKCJydXN0LXNjb3BlZ3VhcmQiICxydXN0LXNjb3BlZ3VhcmQpKSkpCiAg ICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vY3Jvc3NiZWFtLXJzL2Nyb3Nz YmVhbS90cmVlL21hc3Rlci9jcm9zc2JlYW0tZXBvY2giKQogICAgKHN5bm9wc2lzICJFcG9jaC1i YXNlZCBnYXJiYWdlIGNvbGxlY3Rpb24iKQogICAgKGRlc2NyaXB0aW9uICJFcG9jaC1iYXNlZCBn YXJiYWdlIGNvbGxlY3Rpb24iKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1 c3QtY3Jvc3NiZWFtLXV0aWxzCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWNyb3NzYmVhbS11 dGlscyIpCiAgICAodmVyc2lvbiAiMC43LjAiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAg ICAgICAgKG1ldGhvZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJjcm9zc2Jl YW0tdXRpbHMiIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmct YXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAg ICAgIChiYXNlMzIKICAgICAgICAgICAgIjF4MXJuMzVxMnYwNXFpZjE0aWpmZzc4MDBkM3JmM2pp MmNnNzlhd25hY2Z3NWpxNnNpNmYiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1z eXN0ZW0pCiAgICAoYXJndW1lbnRzCiAgICAgIGAoIzpjYXJnby1pbnB1dHMKICAgICAgICAoKCJy dXN0LWF1dG9jZmciICxydXN0LWF1dG9jZmcpCiAgICAgICAgICgicnVzdC1jZmctaWYiICxydXN0 LWNmZy1pZikKICAgICAgICAgKCJydXN0LWxhenktc3RhdGljIiAscnVzdC1sYXp5LXN0YXRpYykp KSkKICAgIChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9jcm9zc2JlYW0tcnMv Y3Jvc3NiZWFtL3RyZWUvbWFzdGVyL2Nyb3NzYmVhbS11dGlscyIpCiAgICAoc3lub3BzaXMgIlV0 aWxpdGllcyBmb3IgY29uY3VycmVudCBwcm9ncmFtbWluZyIpCiAgICAoZGVzY3JpcHRpb24KICAg ICAgIlV0aWxpdGllcyBmb3IgY29uY3VycmVudCBwcm9ncmFtbWluZyIpCiAgICAobGljZW5zZSAj ZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1jcm9zc2JlYW0tcXVldWUKICAocGFja2FnZQogICAg KG5hbWUgInJ1c3QtY3Jvc3NiZWFtLXF1ZXVlIikKICAgICh2ZXJzaW9uICIwLjIuMCIpCiAgICAo c291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAo dXJpIChjcmF0ZS11cmkgImNyb3NzYmVhbS1xdWV1ZSIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUt bmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikp CiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMDAxNzdoajFh bm1iM2Zpam02bGM5NWNuY2IxOWFkMmt2MGEyZ2YzanliZDhjaWM1M21ueiIpKSkpCiAgICAoYnVp bGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNh cmdvLWlucHV0cwogICAgICAgICgoInJ1c3QtY3Jvc3NiZWFtLXV0aWxzIiAscnVzdC1jcm9zc2Jl YW0tdXRpbHMpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vY3Jv c3NiZWFtLXJzL2Nyb3NzYmVhbS90cmVlL21hc3Rlci9jcm9zc2JlYW0tdXRpbHMiKQogICAgKHN5 bm9wc2lzICJDb25jdXJyZW50IHF1ZXVlcyIpCiAgICAoZGVzY3JpcHRpb24gIkNvbmN1cnJlbnQg cXVldWVzIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1YmxpYyBydXN0LW5vZHJvcC11 bmlvbgogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC1ub2Ryb3AtdW5pb24iKQogICAgKHZlcnNp b24gIjAuMS4xMSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAgICAgICAobWV0aG9kIHVy bC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIm5vZHJvcC11bmlvbiIgdmVyc2lvbikp CiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVy c2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAgICAg ICAgICAiMWg1OXBwaDE5cnhhbnlxY2FpZDhwZzczczd3bXpkeDN6aGp2NXNubGltNXF4NjA2enhr YyIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21lLXBh Z2UgImh0dHBzOi8vZ2l0aHViLmNvbS9ibHVzcy9hcnJheXZlYyIpCiAgICAoc3lub3BzaXMKICAg ICAgIkEgd3JhcHBlciB0eXBlIHRvIGluaGliaXQgZHJvcCAoZGVzdHJ1Y3RvcikuIEltcGxlbWVu dGF0aW9uIGNyYXRlIGZvciBub2Ryb3AsIHRoZSB1bnRhZ2dlZCB1bmlvbnMgaW1wbGVtZW50YXRp b24gKHdoaWNoIGlzIHVuc3RhYmxlIC8gcmVxdWlyZXMgbmlnaHRseSkgYXMgb2YgdGhpcyB3cml0 aW5nLgoKKioqRGVwcmVjYXRlZDogVXNlIE1hbnVhbGx5RHJvcCBvciBNYXliZVVuaW5pdCBpbnN0 ZWFkISoqKgoiKQogICAgKGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMg YSB3cmFwcGVyIHR5cGUgdG8gaW5oaWJpdCBkcm9wIChkZXN0cnVjdG9yKS4gIEltcGxlbWVudGF0 aW9uIGNyYXRlIGZvciBub2Ryb3AsIHRoZSB1bnRhZ2dlZCB1bmlvbnMgaW1wbGVtZW50YXRpb24g KHdoaWNoIGlzIHVuc3RhYmxlIC8gcmVxdWlyZXMgbmlnaHRseSkgYXMgb2YgdGhpcyB3cml0aW5n LgoKKioqRGVwcmVjYXRlZDogVXNlIE1hbnVhbGx5RHJvcCBvciBNYXliZVVuaW5pdCBpbnN0ZWFk ISoqKgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtZXJhc2VkLXNl cmRlCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWVyYXNlZC1zZXJkZSIpCiAgICAodmVyc2lv biAiMC4zLjkiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhvZCB1cmwt ZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJlcmFzZWQtc2VyZGUiIHZlcnNpb24pKQog ICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNp b24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAgICAgIChiYXNlMzIKICAgICAgICAg ICAgIjBxN2JueHM1enNrZnE1aWlsbGlnNTVnNzg5MWRsbGN4aDJwOHk4azFwMmo3MnN5Zjl2aXYi KSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAoYXJndW1lbnRz CiAgICAgIGAoIzpjYXJnby1pbnB1dHMgKCgicnVzdC1zZXJkZSIgLHJ1c3Qtc2VyZGUpKSkpCiAg ICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZHRvbG5heS9lcmFzZWQtc2Vy ZGUiKQogICAgKHN5bm9wc2lzCiAgICAgICJUeXBlLWVyYXNlZCBTZXJpYWxpemUgYW5kIFNlcmlh bGl6ZXIgdHJhaXRzIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVHlwZS1lcmFzZWQgU2VyaWFs aXplIGFuZCBTZXJpYWxpemVyIHRyYWl0cyIpCiAgICAobGljZW5zZSAjZikpKQoKKGRlZmluZS1w dWJsaWMgcnVzdC1hZGxlcjMyCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LWFkbGVyMzIiKQog ICAgKHZlcnNpb24gIjEuMC40IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAgICht ZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAiYWRsZXIzMiIgdmVyc2lv bikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIg dmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2UzMgogICAg ICAgICAgICAiMWhuYW40ZmdtbmlkZ24yazg0aGgyaTY3YzN3cDJjNWl3ZDVoczYxeWk3Z3d3eDFw NmJqeCIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAgIChob21l LXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9yZW1yYW00NC9hZGxlcjMyLXJzIikKICAg IChzeW5vcHNpcwogICAgICAiTWluaW1hbCBBZGxlcjMyIGltcGxlbWVudGF0aW9uIGZvciBSdXN0 LiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIk1pbmltYWwgQWRsZXIzMiBpbXBsZW1lbnRhdGlv biBmb3IgUnVzdC4iKQogICAgKGxpY2Vuc2UgbGljZW5zZTp6bGliKSkpCgooZGVmaW5lLXB1Ymxp YyBydXN0LXBrZy1jb25maWcKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3QtcGtnLWNvbmZpZyIp CiAgICAodmVyc2lvbiAiMC4zLjE3IikKICAgIChzb3VyY2UKICAgICAgKG9yaWdpbgogICAgICAg IChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNyYXRlLXVyaSAicGtnLWNvbmZpZyIg dmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0cmluZy1hcHBlbmQgbmFt ZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1NgogICAgICAgICAgKGJhc2Uz MgogICAgICAgICAgICAiMHh5bm5heGR2MGd6YWRsdzRoNzlqODU1azBxN3JqNHpiOXhiMXZrMDBu YzZzczU1OW5oNSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1aWxkLXN5c3RlbSkKICAg IChob21lLXBhZ2UKICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvcGtnLWNvbmZp Zy1ycyIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgbGlicmFyeSB0byBydW4gdGhlIHBrZy1jb25m aWcgc3lzdGVtIHRvb2wgYXQgYnVpbGQgdGltZSBpbiBvcmRlciB0byBiZSB1c2VkIGluCkNhcmdv IGJ1aWxkIHNjcmlwdHMuCiIpCiAgICAoZGVzY3JpcHRpb24KICAgICAgIlRoaXMgcGFja2FnZSBw cm92aWRlcyBhIGxpYnJhcnkgdG8gcnVuIHRoZSBwa2ctY29uZmlnIHN5c3RlbSB0b29sIGF0IGJ1 aWxkIHRpbWUgaW4gb3JkZXIgdG8gYmUgdXNlZCBpbgpDYXJnbyBidWlsZCBzY3JpcHRzLgoiKQog ICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1c3QtdmNwa2cKICAocGFja2FnZQog ICAgKG5hbWUgInJ1c3QtdmNwa2ciKQogICAgKHZlcnNpb24gIjAuMi43IikKICAgIChzb3VyY2UK ICAgICAgKG9yaWdpbgogICAgICAgIChtZXRob2QgdXJsLWZldGNoKQogICAgICAgICh1cmkgKGNy YXRlLXVyaSAidmNwa2ciIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChz dHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYK ICAgICAgICAgIChiYXNlMzIKICAgICAgICAgICAgIjE1ZHprMWI5NnE5NDZ2OWFpc2JkMWJiaGkz M245M3d2Z3ppd2gxc2htc2NuMXhmbGJwOWsiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1i dWlsZC1zeXN0ZW0pCiAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vbWNnb28vdmNw a2ctcnMiKQogICAgKHN5bm9wc2lzCiAgICAgICJBIGxpYnJhcnkgdG8gZmluZCBuYXRpdmUgZGVw ZW5kZW5jaWVzIGluIGEgdmNwa2cgdHJlZSBhdCBidWlsZAp0aW1lIGluIG9yZGVyIHRvIGJlIHVz ZWQgaW4gQ2FyZ28gYnVpbGQgc2NyaXB0cy4KIikKICAgIChkZXNjcmlwdGlvbgogICAgICAiVGhp cyBwYWNrYWdlIHByb3ZpZGVzIGEgbGlicmFyeSB0byBmaW5kIG5hdGl2ZSBkZXBlbmRlbmNpZXMg aW4gYSB2Y3BrZyB0cmVlIGF0IGJ1aWxkCnRpbWUgaW4gb3JkZXIgdG8gYmUgdXNlZCBpbiBDYXJn byBidWlsZCBzY3JpcHRzLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCihkZWZpbmUtcHVibGljIHJ1 c3QtdmVyc2lvbi1jaGVjay0wLjEuNQogIChwYWNrYWdlCiAgICAobmFtZSAicnVzdC12ZXJzaW9u LWNoZWNrIikKICAgICh2ZXJzaW9uICIwLjEuNSIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4K ICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgInZlcnNp b25fY2hlY2siIHZlcnNpb24pKQogICAgICAgIChmaWxlLW5hbWUKICAgICAgICAgIChzdHJpbmct YXBwZW5kIG5hbWUgIi0iIHZlcnNpb24gIi5jcmF0ZSIpKQogICAgICAgIChzaGEyNTYKICAgICAg ICAgIChiYXNlMzIKICAgICAgICAgICAgIjFwZjkxcHZqOG42YWtoN3c2ajV5cGthNmFxejA4YjNx cHpnczBhazJramY0ZnJraWxqd2kiKSkpKQogICAgKGJ1aWxkLXN5c3RlbSBjYXJnby1idWlsZC1z eXN0ZW0pCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vU2VyZ2lvQmVu aXRlei92ZXJzaW9uX2NoZWNrIikKICAgIChzeW5vcHNpcwogICAgICAiVGlueSBjcmF0ZSB0byBj aGVjayB0aGUgdmVyc2lvbiBvZiB0aGUgaW5zdGFsbGVkL3J1bm5pbmcgcnVzdGMuIikKICAgIChk ZXNjcmlwdGlvbgogICAgICAiVGlueSBjcmF0ZSB0byBjaGVjayB0aGUgdmVyc2lvbiBvZiB0aGUg aW5zdGFsbGVkL3J1bm5pbmcgcnVzdGMuIikKICAgIChsaWNlbnNlICNmKSkpCgooZGVmaW5lLXB1 YmxpYyBydXN0LXdpbmFwaS11dGlsCiAgKHBhY2thZ2UKICAgIChuYW1lICJydXN0LXdpbmFwaS11 dGlsIikKICAgICh2ZXJzaW9uICIwLjEuMiIpCiAgICAoc291cmNlCiAgICAgIChvcmlnaW4KICAg ICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11cmkgIndpbmFwaS11 dGlsIiB2ZXJzaW9uKSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVu ZCBuYW1lICItIiB2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAo YmFzZTMyCiAgICAgICAgICAgICIxajgzOWRjNnk4dnN6dnJzYjd5azBxdnMwdzZhc25haHh6Ynlh bnMzN3Zuc3c2dmJsczNpIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVt KQogICAgKGFyZ3VtZW50cwogICAgICBgKCM6Y2FyZ28taW5wdXRzICgoInJ1c3Qtd2luYXBpIiAs cnVzdC13aW5hcGkpKSkpCiAgICAoaG9tZS1wYWdlCiAgICAgICJodHRwczovL2dpdGh1Yi5jb20v QnVybnRTdXNoaS93aW5hcGktdXRpbCIpCiAgICAoc3lub3BzaXMKICAgICAgIkEgZHVtcGluZyBn cm91bmQgZm9yIGhpZ2ggbGV2ZWwgc2FmZSB3cmFwcGVycyBvdmVyIHdpbmFwaS4iKQogICAgKGRl c2NyaXB0aW9uCiAgICAgICJUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBkdW1waW5nIGdyb3VuZCBm b3IgaGlnaCBsZXZlbCBzYWZlIHdyYXBwZXJzIG92ZXIgd2luYXBpLiIpCiAgICAobGljZW5zZSAj ZikpKQoKKGRlZmluZS1wdWJsaWMgcnVzdC1tZW1vZmZzZXQKICAocGFja2FnZQogICAgKG5hbWUg InJ1c3QtbWVtb2Zmc2V0IikKICAgICh2ZXJzaW9uICIwLjUuMyIpCiAgICAoc291cmNlCiAgICAg IChvcmlnaW4KICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKICAgICAgICAodXJpIChjcmF0ZS11 cmkgIm1lbW9mZnNldCIgdmVyc2lvbikpCiAgICAgICAgKGZpbGUtbmFtZQogICAgICAgICAgKHN0 cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVyc2lvbiAiLmNyYXRlIikpCiAgICAgICAgKHNoYTI1Ngog ICAgICAgICAgKGJhc2UzMgogICAgICAgICAgICAiMWZibHF6YzI1aGZheW04bTBwajExMnM2NnBx cTg3YXZ2YXFtNWhwNXJza2liMnc5dzYzbSIpKSkpCiAgICAoYnVpbGQtc3lzdGVtIGNhcmdvLWJ1 aWxkLXN5c3RlbSkKICAgIChhcmd1bWVudHMKICAgICAgYCgjOmNhcmdvLWlucHV0cwogICAgICAg ICgoInJ1c3QtcnVzdGMtdmVyc2lvbiIgLHJ1c3QtcnVzdGMtdmVyc2lvbikpKSkKICAgIChob21l LXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9HaWxuYWEvbWVtb2Zmc2V0IikKICAgIChzeW5vcHNp cwogICAgICAib2Zmc2V0X29mIGZ1bmN0aW9uYWxpdHkgZm9yIFJ1c3Qgc3RydWN0cy4iKQogICAg KGRlc2NyaXB0aW9uCiAgICAgICJvZmZzZXRfb2YgZnVuY3Rpb25hbGl0eSBmb3IgUnVzdCBzdHJ1 Y3RzLiIpCiAgICAobGljZW5zZSBsaWNlbnNlOmV4cGF0KSkpCgooZGVmaW5lLXB1YmxpYyBydXN0 LXNjb3BlZ3VhcmQKICAocGFja2FnZQogICAgKG5hbWUgInJ1c3Qtc2NvcGVndWFyZCIpCiAgICAo dmVyc2lvbiAiMS4wLjAiKQogICAgKHNvdXJjZQogICAgICAob3JpZ2luCiAgICAgICAgKG1ldGhv ZCB1cmwtZmV0Y2gpCiAgICAgICAgKHVyaSAoY3JhdGUtdXJpICJzY29wZWd1YXJkIiB2ZXJzaW9u KSkKICAgICAgICAoZmlsZS1uYW1lCiAgICAgICAgICAoc3RyaW5nLWFwcGVuZCBuYW1lICItIiB2 ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAoc2hhMjU2CiAgICAgICAgICAoYmFzZTMyCiAgICAg ICAgICAgICIwM2FheTg0cjFmNnc4N2NrYnBqNmNjNHJuc3hreGNmczEzbjV5bnhqaWEwcWtnamlh Ym1sIikpKSkKICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQogICAgKGhvbWUt cGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2JsdXNzL3Njb3BlZ3VhcmQiKQogICAgKHN5bm9wc2lz CiAgICAgICJBIFJBSUkgc2NvcGUgZ3VhcmQgdGhhdCB3aWxsIHJ1biBhIGdpdmVuIGNsb3N1cmUg d2hlbiBpdCBnb2VzIG91dCBvZiBzY29wZSwKZXZlbiBpZiB0aGUgY29kZSBiZXR3ZWVuIHBhbmlj cyAoYXNzdW1pbmcgdW53aW5kaW5nIHBhbmljKS4KCkRlZmluZXMgdGhlIG1hY3JvcyBgZGVmZXIh YCwgYGRlZmVyX29uX3Vud2luZCFgLCBgZGVmZXJfb25fc3VjY2VzcyFgIGFzCnNob3J0aGFuZHMg Zm9yIGd1YXJkcyB3aXRoIG9uZSBvZiB0aGUgaW1wbGVtZW50ZWQgc3RyYXRlZ2llcy4KIikKICAg IChkZXNjcmlwdGlvbgogICAgICAiVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgUkFJSSBzY29wZSBn dWFyZCB0aGF0IHdpbGwgcnVuIGEgZ2l2ZW4gY2xvc3VyZSB3aGVuIGl0IGdvZXMgb3V0IG9mIHNj b3BlLApldmVuIGlmIHRoZSBjb2RlIGJldHdlZW4gcGFuaWNzIChhc3N1bWluZyB1bndpbmRpbmcg cGFuaWMpLgoKRGVmaW5lcyB0aGUgbWFjcm9zIGBkZWZlciFgLCBgZGVmZXJfb25fdW53aW5kIWAs IGBkZWZlcl9vbl9zdWNjZXNzIWAgYXMKc2hvcnRoYW5kcyBmb3IgZ3VhcmRzIHdpdGggb25lIG9m IHRoZSBpbXBsZW1lbnRlZCBzdHJhdGVnaWVzLgoiKQogICAgKGxpY2Vuc2UgI2YpKSkKCnJ1c3Qt aGVsbG8tY2xpCg== --=_8c7ff32fd889d85d2c755905a8cf8680 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=no-optional-deps.patch Content-Disposition: attachment; filename=no-optional-deps.patch; size=1618 ZGlmZiAtLWdpdCBhL2d1aXgvaW1wb3J0L2NyYXRlLnNjbSBiL2d1aXgvaW1wb3J0L2NyYXRlLnNj bQppbmRleCBkYTkyYzQzYjhjLi4zNTVhYWExNDBhIDEwMDY0NAotLS0gYS9ndWl4L2ltcG9ydC9j cmF0ZS5zY20KKysrIGIvZ3VpeC9pbXBvcnQvY3JhdGUuc2NtCkBAIC0yLDYgKzIsNyBAQAogOzs7 IENvcHlyaWdodCDCqSAyMDE2IERhdmlkIENyYXZlbiA8ZGF2aWRAY3JhdmVuLmNoPgogOzs7IENv cHlyaWdodCDCqSAyMDE5IEx1ZG92aWMgQ291cnTDqHMgPGx1ZG9AZ251Lm9yZz4KIDs7OyBDb3B5 cmlnaHQgwqkgMjAxOSBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KKzs7OyBDb3B5 cmlnaHQgwqkgMjAxOSBFZnJhaW0gRmxhc2huZXIgPGVmcmFpbUBmbGFzaG5lci5jby5pbD4KIDs7 OwogOzs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC04OCw2ICs4OSw3 IEBACiAgIChpZCAgICAgICAgICAgIGNyYXRlLWRlcGVuZGVuY3ktaWQgImNyYXRlX2lkIikgIDtz dHJpbmcKICAgKGtpbmQgICAgICAgICAgY3JhdGUtZGVwZW5kZW5jeS1raW5kICJraW5kIiAgICAg Oydub3JtYWwgfCAnZGV2IHwgJ2J1aWxkCiAgICAgICAgICAgICAgICAgIHN0cmluZy0+c3ltYm9s KQorICAob3B0aW9uYWwgICAgICBjcmF0ZS1kZXBlbmRlbmN5LW9wdGlvbmFsICJvcHRpb25hbCIp IDsgJ3RydWUgfCAnZmFsc2UKICAgKHJlcXVpcmVtZW50ICAgY3JhdGUtZGVwZW5kZW5jeS1yZXF1 aXJlbWVudCAicmVxIikpIDtzdHJpbmcKIAogKGRlZmluZSAobG9va3VwLWNyYXRlIG5hbWUpCkBA IC0xMDgsMTIgKzExMCwxNiBAQCByZWNvcmQgb3IgI2YgaWYgaXQgd2FzIG5vdCBmb3VuZC4iCiAo ZGVmaW5lIChjcmF0ZS12ZXJzaW9uLWRlcGVuZGVuY2llcyB2ZXJzaW9uKQogICAiUmV0dXJuIHRo ZSBsaXN0IG9mIDxjcmF0ZS1kZXBlbmRlbmN5PiByZWNvcmRzIG9mIFZFUlNJT04sIGEKIDxjcmF0 ZS12ZXJzaW9uPi4iCisgIChkZWZpbmUgKG9wdGlvbmFsLWRlcGVuZGVuY3k/IGRlcGVuZGVuY3kp CisgICAgKGVxPyAoY3JhdGUtZGVwZW5kZW5jeS1vcHRpb25hbCBkZXBlbmRlbmN5KSAjdCkpCisK ICAgKGxldCogKChwYXRoIChhc3NvYy1yZWYgKGNyYXRlLXZlcnNpb24tbGlua3MgdmVyc2lvbikg ImRlcGVuZGVuY2llcyIpKQogICAgICAgICAgKHVybCAgKHN0cmluZy1hcHBlbmQgKCVjcmF0ZS1i YXNlLXVybCkgcGF0aCkpKQogICAgIChtYXRjaCAoYXNzb2MtcmVmIChvciAoanNvbi1mZXRjaCB1 cmwpICcoKSkgImRlcGVuZGVuY2llcyIpCiAgICAgICAoKD8gdmVjdG9yPyB2ZWN0b3IpCiAgICAg ICAgKGZpbHRlciAobGFtYmRhIChkZXApCi0gICAgICAgICAgICAgICAgIChub3QgKGVxPyAoY3Jh dGUtZGVwZW5kZW5jeS1raW5kIGRlcCkgJ2RldikpKQorICAgICAgICAgICAgICAgICAobm90IChv ciAoZXE/IChjcmF0ZS1kZXBlbmRlbmN5LWtpbmQgZGVwKSAnZGV2KQorICAgICAgICAgICAgICAg ICAgICAgICAgICAob3B0aW9uYWwtZGVwZW5kZW5jeT8gZGVwKSkpKQogICAgICAgICAgICAgICAg KG1hcCBqc29uLT5jcmF0ZS1kZXBlbmRlbmN5ICh2ZWN0b3ItPmxpc3QgdmVjdG9yKSkpKQogICAg ICAgKF8KICAgICAgICAnKCkpKSkpCg== --=_8c7ff32fd889d85d2c755905a8cf8680-- From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 30 11:36:35 2019 Received: (at 38408) by debbugs.gnu.org; 30 Nov 2019 16:36:35 +0000 Received: from localhost ([127.0.0.1]:35115 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ib5jX-0005UW-56 for submit@debbugs.gnu.org; Sat, 30 Nov 2019 11:36:35 -0500 Received: from mx1.riseup.net ([198.252.153.129]:35160) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ib5jU-0005UN-CN for 38408@debbugs.gnu.org; Sat, 30 Nov 2019 11:36:33 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47QH7n3JGBzFcZg; Sat, 30 Nov 2019 08:36:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575131789; bh=Ng/dnjtmgmzntb9qsEYR/gj5xsbZRen9lhXzmsA/4+8=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=QU4k6p9z6nskzS7V7qKRMGNBxiz+tQcNxCZHav37KE3yTVOQ9DFoXfjMTG95FdD1W Wz9f83849DXHiM6SL6MWRUSzavB14JsNEfloODXKWgwZtrRNRDzAj8lsyn+QNouwnE ZqT63uCHFLwVww7qh57+owI0WOImKV7fkREex+4o= X-Riseup-User-ID: 3405103775FDF4E0649D3C7E4DFA91AE2E781FC7F5962D0F2978852E5653DD9E Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 47QH7n29B5zJqZw; Sat, 30 Nov 2019 08:36:21 -0800 (PST) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_ad807c347f5e3a60f456e53b0edbeabf" Date: Sat, 30 Nov 2019 08:36:20 -0800 From: Martin Becze To: 38408@debbugs.gnu.org Subject: Re: [PATCH 3/3] Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. In-Reply-To: <052524339786cd4c0db5fda81547239c8bee6003.1574897905.git.mjbecze@riseup.net> References: <052524339786cd4c0db5fda81547239c8bee6003.1574897905.git.mjbecze@riseup.net> Message-ID: <42cb010759c8355943b9e2cb71a66b93@riseup.net> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: efraim@flashner.co.il X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) --=_ad807c347f5e3a60f456e53b0edbeabf Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII On 2019-11-28 00:16, Martin Becze wrote: > * guix/import/crate.scm (make-crate-sexp): Use as args > * guix/import/crate.scm (crate->crate-version): New Procedure > * guix/import/crate.scm (crate->versions): New Procedure > * guix/import/crate.scm (crate-recursive-import): Updated to user > recursive-import-semver > * guix/scripts/import/crate.scm (guix-import-crate): Remove > `define-public` generation from UI > * guix/tests/crate.scm: Updated tests > --- > guix/import/crate.scm | 165 ++++++++++++++++++---------------- > guix/scripts/import/crate.scm | 9 +- > tests/crate.scm | 2 +- > 3 files changed, 91 insertions(+), 85 deletions(-) > > diff --git a/guix/import/crate.scm b/guix/import/crate.scm > index 8dc014d232..da92c43b8c 100644 > --- a/guix/import/crate.scm > +++ b/guix/import/crate.scm > @@ -38,6 +38,7 @@ > #:use-module (srfi srfi-1) > #:use-module (srfi srfi-2) > #:use-module (srfi srfi-26) > + #:use-module (srfi srfi-71) > #:export (crate->guix-package > guix-package->crate-name > crate-recursive-import > @@ -85,7 +86,7 @@ > crate-dependency? > json->crate-dependency > (id crate-dependency-id "crate_id") ;string > - (kind crate-dependency-kind "kind" ;'normal | 'dev > + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build > string->symbol) > (requirement crate-dependency-requirement "req")) ;string > > @@ -111,7 +112,9 @@ record or #f if it was not found." > (url (string-append (%crate-base-url) path))) > (match (assoc-ref (or (json-fetch url) '()) "dependencies") > ((? vector? vector) > - (map json->crate-dependency (vector->list vector))) > + (filter (lambda (dep) > + (not (eq? (crate-dependency-kind dep) 'dev))) > + (map json->crate-dependency (vector->list vector)))) > (_ > '())))) > > @@ -141,62 +144,84 @@ record or #f if it was not found." > ((args ...) > `((arguments (,'quasiquote ,args)))))) > > -(define* (make-crate-sexp #:key name version cargo-inputs > cargo-development-inputs > - home-page synopsis description license > - #:allow-other-keys) > - "Return the `package' s-expression for a rust package with the given NAME, > -VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, > DESCRIPTION, > -and LICENSE." > - (let* ((port (http-fetch (crate-uri name version))) > +(define (make-crate-sexp crate version* dependencies) > + "Return the `package' s-expression for a rust package given , > + and a list of " > + (define normal-dependency? > + (match-lambda ((_ dep) (not (eq? (crate-dependency-kind dep) 'dev))))) > + > + (define (string->license string) > + (match (regexp-exec %dual-license-rx string) > + (#f (list (spdx-string->license string))) > + (m (list (spdx-string->license (match:substring m 1)) > + (spdx-string->license (match:substring m 2)))))) > + > + (let* ((dep-crates dev-dep-crates (partition normal-dependency? > dependencies)) > + (cargo-inputs (sort (unzip1 dep-crates) > + string-ci + (cargo-development-inputs > + (sort (unzip1 dev-dep-crates) > + string-ci + (name (crate-name crate)) > + (version (crate-version-number version*)) > + (home-page (or (crate-home-page crate) > + (crate-repository crate))) > + (synopsis (crate-description crate)) > + (description (crate-description crate)) > + (license (and=> (crate-version-license version*) > + string->license)) > + (port (http-fetch (crate-uri name version)) ) > (guix-name (crate-name->package-name name)) > - (cargo-inputs (map crate-name->package-name cargo-inputs)) > - (cargo-development-inputs (map crate-name->package-name > - cargo-development-inputs)) > (pkg `(package > - (name ,guix-name) > - (version ,version) > - (source (origin > - (method url-fetch) > - (uri (crate-uri ,name version)) > - (file-name (string-append name "-" > version ".tar.gz")) > - (sha256 > - (base32 > - ,(bytevector->nix-base32-string > (port-sha256 port)))))) > - (build-system cargo-build-system) > - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) > - (maybe-cargo-development-inputs > - cargo-development-inputs))) > - (home-page ,(match home-page > - (() "") > - (_ home-page))) > - (synopsis ,synopsis) > - (description ,(beautify-description description)) > - (license ,(match license > - (() #f) > - ((license) license) > - (_ `(list ,@license))))))) > - (close-port port) > - pkg)) > + (name ,guix-name) > + (version ,version) > + (source (origin > + (method url-fetch) > + (uri (crate-uri ,name version)) > + (file-name (string-append name "-" version > ".crate")) > + (sha256 > + (base32 > + ,(bytevector->nix-base32-string > (port-sha256 port)))))) > + (build-system cargo-build-system) > + ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) > + (maybe-cargo-development-inputs > + cargo-development-inputs))) > + (home-page ,(match home-page > + (() "") > + (_ home-page))) > + (synopsis ,synopsis) > + (description ,(beautify-description description)) > + (license ,(match license > + (() #f) > + ((license) license) > + (_ `(list ,@license))))))) > + > + (close-port port) > + pkg)) > > (define %dual-license-rx > ;; Dual licensing is represented by a string such as "MIT OR Apache-2.0". > ;; This regexp matches that. > (make-regexp "^(.*) OR (.*)$")) > > +(define (crate->crate-version crate version-number) > + "returns the for a given CRATE and VERSION-NUMBER" > + (find (lambda (version) > + (string=? (crate-version-number version) > + version-number)) > + (crate-versions crate))) > + > +(define (crate->versions crate) > + "Returns a list of versions for a given CRATE" > + (map (lambda (version) > + (crate-version-number version)) > + (crate-versions crate))) > + > (define* (crate->guix-package crate-name #:optional version) > "Fetch the metadata for CRATE-NAME from crates.io, and return the > `package' s-expression corresponding to that package, or #f on failure. > When VERSION is specified, attempt to fetch that version; otherwise fetch the > latest version of CRATE-NAME." > - (define (string->license string) > - (match (regexp-exec %dual-license-rx string) > - (#f (list (spdx-string->license string))) > - (m (list (spdx-string->license (match:substring m 1)) > - (spdx-string->license (match:substring m 2)))))) > - > - (define (normal-dependency? dependency) > - (eq? (crate-dependency-kind dependency) 'normal)) > - > (define crate > (lookup-crate crate-name)) > > @@ -205,38 +230,27 @@ latest version of CRATE-NAME." > (crate-latest-version crate))) > > (define version* > - (find (lambda (version) > - (string=? (crate-version-number version) > - version-number)) > - (crate-versions crate))) > + (crate->crate-version crate version-number)) > > - (and crate version* > - (let* ((dependencies (crate-version-dependencies version*)) > - (dep-crates (filter normal-dependency? dependencies)) > - (dev-dep-crates (remove normal-dependency? dependencies)) > - (cargo-inputs (sort (map crate-dependency-id dep-crates) > - string-ci - (cargo-development-inputs > - (sort (map crate-dependency-id dev-dep-crates) > - string-ci - (values > - (make-crate-sexp #:name crate-name > - #:version (crate-version-number version*) > - #:cargo-inputs cargo-inputs > - #:cargo-development-inputs cargo-development-inputs > - #:home-page (or (crate-home-page crate) > - (crate-repository crate)) > - #:synopsis (crate-description crate) > - #:description (crate-description crate) > - #:license (and=> (crate-version-license version*) > - string->license)) > - (append cargo-inputs cargo-development-inputs))))) > + (define dependencies (map > + (lambda (dep) > + (list (crate-name->package-name > + (crate-dependency-id dep)) dep)) > + (crate-version-dependencies version*))) > + (make-crate-sexp crate version* dependencies)) > > -(define (crate-recursive-import crate-name) > - (recursive-import crate-name #f > - #:repo->guix-package (lambda (name repo) > - (crate->guix-package name)) > - #:guix-name crate-name->package-name)) > +(define* (crate-recursive-import name #:optional version) > + (recursive-import-semver > + #:name name > + #:version version > + #:name->metadata lookup-crate > + #:metadata->package crate->crate-version > + #:metadata-versions crate->versions > + #:package-dependencies crate-version-dependencies > + #:dependency-name crate-dependency-id > + #:dependency-range crate-dependency-requirement > + #:guix-name crate-name->package-name > + #:make-sexp make-crate-sexp)) > > (define (guix-package->crate-name package) > "Return the crate name of PACKAGE." > @@ -285,4 +299,3 @@ latest version of CRATE-NAME." > (description "Updater for crates.io packages") > (pred crate-package?) > (latest latest-release))) > - > diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm > index 4690cceb4d..85ae6fbe59 100644 > --- a/guix/scripts/import/crate.scm > +++ b/guix/scripts/import/crate.scm > @@ -96,14 +96,7 @@ Import and convert the crate.io package for > PACKAGE-NAME.\n")) > (package-name->name+version spec)) > > (if (assoc-ref opts 'recursive) > - (map (match-lambda > - ((and ('package ('name name) . rest) pkg) > - `(define-public ,(string->symbol name) > - ,pkg)) > - (_ #f)) > - (reverse > - (stream->list > - (crate-recursive-import name)))) > + (stream->list (crate-recursive-import name version)) > (let ((sexp (crate->guix-package name version))) > (unless sexp > (leave (G_ "failed to download meta-data for package '~a'~%") > diff --git a/tests/crate.scm b/tests/crate.scm > index c14862ad9f..b77cbb08c6 100644 > --- a/tests/crate.scm > +++ b/tests/crate.scm > @@ -95,7 +95,7 @@ > ('source ('origin > ('method 'url-fetch) > ('uri ('crate-uri "foo" 'version)) > - ('file-name ('string-append 'name "-" 'version ".tar.gz")) > + ('file-name ('string-append 'name "-" 'version ".crate")) > ('sha256 > ('base32 > (? string? hash))))) I'm added a patch that will skips the building of libraries which I would assume most of the packages being imported are. This could be parametrized in the future. --=_ad807c347f5e3a60f456e53b0edbeabf Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0001-added-skip-build-t-to-the-output-of-make-crate-sexp-.patch Content-Disposition: attachment; filename=0001-added-skip-build-t-to-the-output-of-make-crate-sexp-.patch; size=1876 RnJvbSAzZjJmZjNiNGRjNGNkZjhiMDI4MjMxNmI5YzI0MjYyOTFkYThhNmM3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogU2F0LCAzMCBOb3YgMjAxOSAxMToyNzowNSAtMDUwMApTdWJqZWN0OiBbUEFUQ0hdIGFkZGVk ICIjOnNraXAtYnVpbGQ/ICN0IiB0byB0aGUgb3V0cHV0IG9mIChtYWtlLWNyYXRlLXNleHApLgog TW9zdCB0aGUgdGhlIHBhY2thZ2VzIGltcG9ydGVkIHdpbGwgYmUgbGliYXJpZXMgYW5kIHdvbid0 IG5lZWQgdG8gYnVpbGQuIFRoZQogdG9wIGxldmVsIHBhY2thZ2Ugd2lsbCBidWlsZCB0aGVtIHRo b3VnaC4KCiogZ3VpeC9pbXBvcnQvY3JhdGUuc2NtIChtYWtlLWNyYXRlLXNleHApOiBhZGRlZCAi Izpza2lwLWJ1aWxkPyAjdCIgdG8gdGhlIG91dHB1dAotLS0KIGd1aXgvaW1wb3J0L2NyYXRlLnNj bSB8IDMgKystCiB0ZXN0cy9jcmF0ZS5zY20gICAgICAgfCAzICsrLQogMiBmaWxlcyBjaGFuZ2Vk LCA0IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ3VpeC9pbXBv cnQvY3JhdGUuc2NtIGIvZ3VpeC9pbXBvcnQvY3JhdGUuc2NtCmluZGV4IGRhOTJjNDNiOGMuLjU2 ODMzNjliN2EgMTAwNjQ0Ci0tLSBhL2d1aXgvaW1wb3J0L2NyYXRlLnNjbQorKysgYi9ndWl4L2lt cG9ydC9jcmF0ZS5zY20KQEAgLTE4Myw3ICsxODMsOCBAQCByZWNvcmQgb3IgI2YgaWYgaXQgd2Fz IG5vdCBmb3VuZC4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2UzMgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAsKGJ5dGV2ZWN0b3ItPm5peC1iYXNlMzItc3RyaW5nIChw b3J0LXNoYTI1NiBwb3J0KSkpKSkpCiAgICAgICAgICAgICAgICAgIChidWlsZC1zeXN0ZW0gY2Fy Z28tYnVpbGQtc3lzdGVtKQotICAgICAgICAgICAgICAgICAsQChtYXliZS1hcmd1bWVudHMgKGFw cGVuZCAobWF5YmUtY2FyZ28taW5wdXRzIGNhcmdvLWlucHV0cykKKyAgICAgICAgICAgICAgICAg LEAobWF5YmUtYXJndW1lbnRzIChhcHBlbmQgYCgjOnNraXAtYnVpbGQ/ICN0KQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF5YmUtY2FyZ28taW5wdXRzIGNh cmdvLWlucHV0cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KG1heWJlLWNhcmdvLWRldmVsb3BtZW50LWlucHV0cwogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY2FyZ28tZGV2ZWxvcG1lbnQtaW5wdXRzKSkpCiAgICAgICAg ICAgICAgICAgIChob21lLXBhZ2UgLChtYXRjaCBob21lLXBhZ2UKZGlmZiAtLWdpdCBhL3Rlc3Rz L2NyYXRlLnNjbSBiL3Rlc3RzL2NyYXRlLnNjbQppbmRleCBiNzdjYmIwOGM2Li42NGU1YjY5MzJl IDEwMDY0NAotLS0gYS90ZXN0cy9jcmF0ZS5zY20KKysrIGIvdGVzdHMvY3JhdGUuc2NtCkBAIC0x MDIsNyArMTAyLDggQEAKICAgICAgICAgICgnYnVpbGQtc3lzdGVtICdjYXJnby1idWlsZC1zeXN0 ZW0pCiAgICAgICAgICAoJ2FyZ3VtZW50cwogICAgICAgICAgICgncXVhc2lxdW90ZQotICAgICAg ICAgICAoJyM6Y2FyZ28taW5wdXRzICgoInJ1c3QtYmFyIiAoJ3VucXVvdGUgcnVzdC1iYXIpKSkp KSkKKyAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0CisgICAgICAgICAgICAjOmNhcmdvLWlu cHV0cyAoKCJydXN0LWJhciIgKCd1bnF1b3RlIHJ1c3QtYmFyKSkpKSkpCiAgICAgICAgICAoJ2hv bWUtcGFnZSAiaHR0cDovL2V4YW1wbGUuY29tIikKICAgICAgICAgICgnc3lub3BzaXMgInN1bW1h cnkiKQogICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCi0tIAoyLjI0LjAKCg== --=_ad807c347f5e3a60f456e53b0edbeabf-- From debbugs-submit-bounces@debbugs.gnu.org Sun Dec 01 04:00:20 2019 Received: (at 38408) by debbugs.gnu.org; 1 Dec 2019 09:00:20 +0000 Received: from localhost ([127.0.0.1]:35468 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibL5Y-00083a-B1 for submit@debbugs.gnu.org; Sun, 01 Dec 2019 04:00:20 -0500 Received: from flashner.co.il ([178.62.234.194]:56580) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibL5W-00083K-M2 for 38408@debbugs.gnu.org; Sun, 01 Dec 2019 04:00:19 -0500 Received: from localhost (unknown [141.226.13.108]) by flashner.co.il (Postfix) with ESMTPSA id BCA644002B; Sun, 1 Dec 2019 09:00:12 +0000 (UTC) Date: Sun, 1 Dec 2019 10:59:41 +0200 From: Efraim Flashner To: Martin Becze Subject: Re: [PATCH] WIP patches for the rust importer Message-ID: <20191201085941.GB14869@E5400> References: <20191126120408.GL1124@E5400> <1E01C051-2EE5-4050-B826-C60E858AAC2B@flashner.co.il> <0b2db52d687fc2acf34dc1e00618dae7.squirrel@sm.riseup.net> <20191128122255.GT1124@E5400> <8981451ac5d914dd5f53fa928741b846@riseup.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="IiVenqGWf+H9Y6IX" Content-Disposition: inline In-Reply-To: <8981451ac5d914dd5f53fa928741b846@riseup.net> X-PGP-Key-ID: 0x41AAE7DCCA3D8351 X-PGP-Key: https://flashner.co.il/~efraim/efraim_flashner.asc X-PGP-Fingerprint: A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 User-Agent: Mutt/1.12.2 (2019-09-21) X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: guix-devel@gnu.org, 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --IiVenqGWf+H9Y6IX Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Nov 29, 2019 at 07:59:35AM -0800, Martin Becze wrote: > On 2019-11-28 12:22, Efraim Flashner wrote: > > On Wed, Nov 27, 2019 at 04:36:20PM -0800, mjbecze@riseup.net wrote: > >> > >> > I'd love to see what you have so far if you want to share > >> > >> Okie Dokie, I posted it and cc'd ya. > >> > >> Also I took a look at your patches. > >> 0001-import-crate-Don-t-include-optional-dependencies.patch should work > >> just fine with my patch. But > >> 0003-import-crate-Honor-versioned-dependencies-when-impor.patch will n= ot > >> work. > >> > >> I took a different route here with the naming. If you are interested t= ake > >> a look take a look at my second patch. (recusive-import-semver) only w= ill > >> add the version number to the name if the crate being imported is not = the > >> latest version. I thought this was more inline with the canonical name= s, > >> but if always adding version number the export symbol is desirable it = will > >> simplify things. > >> > >=20 > > I'll take a look at it in a minute. I figured with the versioned > > requirements we would always want to be specific in version numbers for > > crate dependents so I figured it made sense. Also, if we did want to > > provide an unversioned '-latest' version we could declare an extra > > variable '(define-public rust-libc rust-libc-0.2)' and now rust-libc > > points to rust-libc-0.2. > >=20 > >> Also I added a function (find-packages-by-name*/direct) to packages.scm > >> which will return the export symbol of a package that already exists. I > >> use this in case there are some non-canocal export name already added. > >> >=20 > I added the no-optional-dep logic to the recusive-semver patch > (https://issues.guix.gnu.org/issue/38408), but it seems to break > packages. I'm testing on the recursive importer on "hello-cli". Attach > is the patch to add the logic and the before and after output for "guix > import crate -r hello-cli". Removing all the optional deps breaks clap > here for some reason which I haven't figured out. Looking at the two attached files I want to bring attention to the size of them: after.scm [text/plain, base64, utf-8, 5.7K] before.scm [text/plain, base64, utf-8, 226K] One way to fix this (in addition to your "default to the don't build" argument) is to keep rust-clap in it's broken state and define a different rust-clap for when we actually want it and to have that use enough inputs to actually build. I do now actually realize that only really works if we keep all the crates hidden, which I don't think we want. So I guess that has us sending bug reports upstream that some of the optional dependencies aren't actually optional. In any case, I think it'd be better to skip the optional dependencies and then add them back in as needed to actually build the crates we want. --=20 Efraim Flashner =D7=90=D7=A4=D7=A8=D7=99=D7=9D = =D7=A4=D7=9C=D7=A9=D7=A0=D7=A8 GPG key =3D A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted --IiVenqGWf+H9Y6IX Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAl3jgP0ACgkQQarn3Mo9 g1GTaBAAnMDGKZ8byZEL9rDyLAcVf8I+wFrZPw7D2KolaZ15EZppFeif9Vf4mxU6 bFZzfb3EurqpTND3JpLFxLXoOEw/JWe5JqSzZBR4ejRWBbzEr33R2OC+qxfm6o93 GIgf8BPFx7ZvBbJeN/wRbnZunlqcPaMfgrq6hHx5iNRrGEoMaBCSROi1t/t5ZTuF gm6+aAasFlZTwCANjV2zxpmpyOpkhskrN55i3JfTGkRMVkJ5r1BsUeLVlWTsw2n5 BrM8x68ETSnSt84Exn5V1a2ffzlAhktS2AXp0X67bvzwgOZzmfaGzMFEM83Rx1ym o5JQJAP/2wLUTIvfPVOb3awOqm6J0Z8ulZCY9F2+9GhIChzldHr4vzCD+tjkK6du 5ez/yFiXhN8TEPA+eNHDG1q5KxEqDRJm9JNQ7jWwrOhNkQC6VTKNtmrAlAQKwMkM f6Hf8y5BbiHXWNRaHzvQB0e7+oOW8tARrU4Av9M+vY0D4WjTHlJYLfhK9gkZ5rVm ncQMWqE0SGkXk6ixyFh09UHSTnyy4UcZgCXlV5XIv60OpIVYsATPwMaWn92Q1/TR CQKkWm+BxG6eOjoHOkFAS7/gJ3NFLcsNGuvYdbdiuOrP8vR5+Qvot0Q7BQcL3wLA 4hPsdTE2TtdtQH48vyyNQGz/ztQ3wbJJrZm9zZyZafklZj8c4Do= =+UEn -----END PGP SIGNATURE----- --IiVenqGWf+H9Y6IX-- From debbugs-submit-bounces@debbugs.gnu.org Sun Dec 01 04:01:38 2019 Received: (at 38408) by debbugs.gnu.org; 1 Dec 2019 09:01:38 +0000 Received: from localhost ([127.0.0.1]:35472 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibL6n-00085p-R7 for submit@debbugs.gnu.org; Sun, 01 Dec 2019 04:01:38 -0500 Received: from flashner.co.il ([178.62.234.194]:57084) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibL6l-00085b-M8 for 38408@debbugs.gnu.org; Sun, 01 Dec 2019 04:01:36 -0500 Received: from localhost (unknown [141.226.13.108]) by flashner.co.il (Postfix) with ESMTPSA id 81D05402CA; Sun, 1 Dec 2019 09:01:29 +0000 (UTC) Date: Sun, 1 Dec 2019 11:00:58 +0200 From: Efraim Flashner To: Martin Becze Subject: Re: [PATCH 3/3] Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. Message-ID: <20191201090058.GC14869@E5400> References: <052524339786cd4c0db5fda81547239c8bee6003.1574897905.git.mjbecze@riseup.net> <42cb010759c8355943b9e2cb71a66b93@riseup.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="ABTtc+pdwF7KHXCz" Content-Disposition: inline In-Reply-To: <42cb010759c8355943b9e2cb71a66b93@riseup.net> X-PGP-Key-ID: 0x41AAE7DCCA3D8351 X-PGP-Key: https://flashner.co.il/~efraim/efraim_flashner.asc X-PGP-Fingerprint: A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 User-Agent: Mutt/1.12.2 (2019-09-21) X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --ABTtc+pdwF7KHXCz Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sat, Nov 30, 2019 at 08:36:20AM -0800, Martin Becze wrote: > On 2019-11-28 00:16, Martin Becze wrote: > > * guix/import/crate.scm (make-crate-sexp): Use = as args > > * guix/import/crate.scm (crate->crate-version): New Procedure > > * guix/import/crate.scm (crate->versions): New Procedure > > * guix/import/crate.scm (crate-recursive-import): Updated to user > > recursive-import-semver > > * guix/scripts/import/crate.scm (guix-import-crate): Remove > > `define-public` generation from UI > > * guix/tests/crate.scm: Updated tests > > --- > > guix/import/crate.scm | 165 ++++++++++++++++++---------------- > > guix/scripts/import/crate.scm | 9 +- > > tests/crate.scm | 2 +- > > 3 files changed, 91 insertions(+), 85 deletions(-) > >=20 > > diff --git a/guix/import/crate.scm b/guix/import/crate.scm > > index 8dc014d232..da92c43b8c 100644 > > --- a/guix/import/crate.scm > > +++ b/guix/import/crate.scm > > @@ -38,6 +38,7 @@ > > #:use-module (srfi srfi-1) > > #:use-module (srfi srfi-2) > > #:use-module (srfi srfi-26) > > + #:use-module (srfi srfi-71) > > #:export (crate->guix-package > > guix-package->crate-name > > crate-recursive-import > > @@ -85,7 +86,7 @@ > > crate-dependency? > > json->crate-dependency > > (id crate-dependency-id "crate_id") ;string > > - (kind crate-dependency-kind "kind" ;'normal | 'dev > > + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'b= uild > > string->symbol) > > (requirement crate-dependency-requirement "req")) ;string > > =20 > > @@ -111,7 +112,9 @@ record or #f if it was not found." > > (url (string-append (%crate-base-url) path))) > > (match (assoc-ref (or (json-fetch url) '()) "dependencies") > > ((? vector? vector) > > - (map json->crate-dependency (vector->list vector))) > > + (filter (lambda (dep) > > + (not (eq? (crate-dependency-kind dep) 'dev))) > > + (map json->crate-dependency (vector->list vector)))) > > (_ > > '())))) > > =20 > > @@ -141,62 +144,84 @@ record or #f if it was not found." > > ((args ...) > > `((arguments (,'quasiquote ,args)))))) > > =20 > > -(define* (make-crate-sexp #:key name version cargo-inputs > > cargo-development-inputs > > - home-page synopsis description license > > - #:allow-other-keys) > > - "Return the `package' s-expression for a rust package with the given= NAME, > > -VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, > > DESCRIPTION, > > -and LICENSE." > > - (let* ((port (http-fetch (crate-uri name version))) > > +(define (make-crate-sexp crate version* dependencies) > > + "Return the `package' s-expression for a rust package given , > > + and a list of " > > + (define normal-dependency? > > + (match-lambda ((_ dep) (not (eq? (crate-dependency-kind dep) 'dev)= )))) > > + > > + (define (string->license string) > > + (match (regexp-exec %dual-license-rx string) > > + (#f (list (spdx-string->license string))) > > + (m (list (spdx-string->license (match:substring m 1)) > > + (spdx-string->license (match:substring m 2)))))) > > + > > + (let* ((dep-crates dev-dep-crates (partition normal-dependency? > > dependencies)) > > + (cargo-inputs (sort (unzip1 dep-crates) > > + string-ci > + (cargo-development-inputs > > + (sort (unzip1 dev-dep-crates) > > + string-ci > + (name (crate-name crate)) > > + (version (crate-version-number version*)) > > + (home-page (or (crate-home-page crate) > > + (crate-repository crate))) > > + (synopsis (crate-description crate)) > > + (description (crate-description crate)) > > + (license (and=3D> (crate-version-license version*) > > + string->license)) > > + (port (http-fetch (crate-uri name version)) ) > > (guix-name (crate-name->package-name name)) > > - (cargo-inputs (map crate-name->package-name cargo-inputs)) > > - (cargo-development-inputs (map crate-name->package-name > > - cargo-development-inputs)) > > (pkg `(package > > - (name ,guix-name) > > - (version ,version) > > - (source (origin > > - (method url-fetch) > > - (uri (crate-uri ,name version)) > > - (file-name (string-append name "-" > > version ".tar.gz")) > > - (sha256 > > - (base32 > > - ,(bytevector->nix-base32-string > > (port-sha256 port)))))) > > - (build-system cargo-build-system) > > - ,@(maybe-arguments (append (maybe-cargo-inputs carg= o-inputs) > > - (maybe-cargo-development= -inputs > > - cargo-development-inpu= ts))) > > - (home-page ,(match home-page > > - (() "") > > - (_ home-page))) > > - (synopsis ,synopsis) > > - (description ,(beautify-description description)) > > - (license ,(match license > > - (() #f) > > - ((license) license) > > - (_ `(list ,@license))))))) > > - (close-port port) > > - pkg)) > > + (name ,guix-name) > > + (version ,version) > > + (source (origin > > + (method url-fetch) > > + (uri (crate-uri ,name version)) > > + (file-name (string-append name "-" version > > ".crate")) > > + (sha256 > > + (base32 > > + ,(bytevector->nix-base32-string > > (port-sha256 port)))))) > > + (build-system cargo-build-system) > > + ,@(maybe-arguments (append (maybe-cargo-inputs cargo-= inputs) > > + (maybe-cargo-development-i= nputs > > + cargo-development-inputs)= )) > > + (home-page ,(match home-page > > + (() "") > > + (_ home-page))) > > + (synopsis ,synopsis) > > + (description ,(beautify-description description)) > > + (license ,(match license > > + (() #f) > > + ((license) license) > > + (_ `(list ,@license))))))) > > + > > + (close-port port) > > + pkg)) > > =20 > > (define %dual-license-rx > > ;; Dual licensing is represented by a string such as "MIT OR Apache-= 2.0". > > ;; This regexp matches that. > > (make-regexp "^(.*) OR (.*)$")) > > =20 > > +(define (crate->crate-version crate version-number) > > + "returns the for a given CRATE and VERSION-NUMBER" > > + (find (lambda (version) > > + (string=3D? (crate-version-number version) > > + version-number)) > > + (crate-versions crate))) > > + > > +(define (crate->versions crate) > > + "Returns a list of versions for a given CRATE" > > + (map (lambda (version) > > + (crate-version-number version)) > > + (crate-versions crate))) > > + > > (define* (crate->guix-package crate-name #:optional version) > > "Fetch the metadata for CRATE-NAME from crates.io, and return the > > `package' s-expression corresponding to that package, or #f on failure. > > When VERSION is specified, attempt to fetch that version; otherwise fe= tch the > > latest version of CRATE-NAME." > > - (define (string->license string) > > - (match (regexp-exec %dual-license-rx string) > > - (#f (list (spdx-string->license string))) > > - (m (list (spdx-string->license (match:substring m 1)) > > - (spdx-string->license (match:substring m 2)))))) > > - > > - (define (normal-dependency? dependency) > > - (eq? (crate-dependency-kind dependency) 'normal)) > > - > > (define crate > > (lookup-crate crate-name)) > > =20 > > @@ -205,38 +230,27 @@ latest version of CRATE-NAME." > > (crate-latest-version crate))) > > =20 > > (define version* > > - (find (lambda (version) > > - (string=3D? (crate-version-number version) > > - version-number)) > > - (crate-versions crate))) > > + (crate->crate-version crate version-number)) > > =20 > > - (and crate version* > > - (let* ((dependencies (crate-version-dependencies version*)) > > - (dep-crates (filter normal-dependency? dependencies)) > > - (dev-dep-crates (remove normal-dependency? dependencies)) > > - (cargo-inputs (sort (map crate-dependency-id dep-crate= s) > > - string-ci > - (cargo-development-inputs > > - (sort (map crate-dependency-id dev-dep-crates) > > - string-ci > - (values > > - (make-crate-sexp #:name crate-name > > - #:version (crate-version-number version*) > > - #:cargo-inputs cargo-inputs > > - #:cargo-development-inputs cargo-developmen= t-inputs > > - #:home-page (or (crate-home-page crate) > > - (crate-repository crate)) > > - #:synopsis (crate-description crate) > > - #:description (crate-description crate) > > - #:license (and=3D> (crate-version-license v= ersion*) > > - string->license)) > > - (append cargo-inputs cargo-development-inputs))))) > > + (define dependencies (map > > + (lambda (dep) > > + (list (crate-name->package-name > > + (crate-dependency-id dep)) dep)) > > + (crate-version-dependencies version*))) > > + (make-crate-sexp crate version* dependencies)) > > =20 > > -(define (crate-recursive-import crate-name) > > - (recursive-import crate-name #f > > - #:repo->guix-package (lambda (name repo) > > - (crate->guix-package name)) > > - #:guix-name crate-name->package-name)) > > +(define* (crate-recursive-import name #:optional version) > > + (recursive-import-semver > > + #:name name > > + #:version version > > + #:name->metadata lookup-crate > > + #:metadata->package crate->crate-version > > + #:metadata-versions crate->versions > > + #:package-dependencies crate-version-dependencies > > + #:dependency-name crate-dependency-id > > + #:dependency-range crate-dependency-requirement > > + #:guix-name crate-name->package-name > > + #:make-sexp make-crate-sexp)) > > =20 > > (define (guix-package->crate-name package) > > "Return the crate name of PACKAGE." > > @@ -285,4 +299,3 @@ latest version of CRATE-NAME." > > (description "Updater for crates.io packages") > > (pred crate-package?) > > (latest latest-release))) > > - > > diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.= scm > > index 4690cceb4d..85ae6fbe59 100644 > > --- a/guix/scripts/import/crate.scm > > +++ b/guix/scripts/import/crate.scm > > @@ -96,14 +96,7 @@ Import and convert the crate.io package for > > PACKAGE-NAME.\n")) > > (package-name->name+version spec)) > > =20 > > (if (assoc-ref opts 'recursive) > > - (map (match-lambda > > - ((and ('package ('name name) . rest) pkg) > > - `(define-public ,(string->symbol name) > > - ,pkg)) > > - (_ #f)) > > - (reverse > > - (stream->list > > - (crate-recursive-import name)))) > > + (stream->list (crate-recursive-import name version)) > > (let ((sexp (crate->guix-package name version))) > > (unless sexp > > (leave (G_ "failed to download meta-data for package '~= a'~%") > > diff --git a/tests/crate.scm b/tests/crate.scm > > index c14862ad9f..b77cbb08c6 100644 > > --- a/tests/crate.scm > > +++ b/tests/crate.scm > > @@ -95,7 +95,7 @@ > > ('source ('origin > > ('method 'url-fetch) > > ('uri ('crate-uri "foo" 'version)) > > - ('file-name ('string-append 'name "-" 'version ".t= ar.gz")) > > + ('file-name ('string-append 'name "-" 'version ".c= rate")) > > ('sha256 > > ('base32 > > (? string? hash))))) >=20 > I'm added a patch that will skips the building of libraries which I > would assume most of the packages being imported are. This could be > parametrized in the future. I like this idea. Then we can also unhide all the rust crates. It helps when people search for them and when guix searches for them to see if they can be updated or need to be imported. > From 3f2ff3b4dc4cdf8b0282316b9c2426291da8a6c7 Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Sat, 30 Nov 2019 11:27:05 -0500 > Subject: [PATCH] added "#:skip-build? #t" to the output of (make-crate-se= xp). > Most the the packages imported will be libaries and won't need to build.= The > top level package will build them though. >=20 > * guix/import/crate.scm (make-crate-sexp): added "#:skip-build? #t" to th= e output > --- > guix/import/crate.scm | 3 ++- > tests/crate.scm | 3 ++- > 2 files changed, 4 insertions(+), 2 deletions(-) >=20 > diff --git a/guix/import/crate.scm b/guix/import/crate.scm > index da92c43b8c..5683369b7a 100644 > --- a/guix/import/crate.scm > +++ b/guix/import/crate.scm > @@ -183,7 +183,8 @@ record or #f if it was not found." > (base32 > ,(bytevector->nix-base32-string (port-sha25= 6 port)))))) > (build-system cargo-build-system) > - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-in= puts) > + ,@(maybe-arguments (append `(#:skip-build? #t) > + (maybe-cargo-inputs cargo-in= puts) > (maybe-cargo-development-inp= uts > cargo-development-inputs))) > (home-page ,(match home-page > diff --git a/tests/crate.scm b/tests/crate.scm > index b77cbb08c6..64e5b6932e 100644 > --- a/tests/crate.scm > +++ b/tests/crate.scm > @@ -102,7 +102,8 @@ > ('build-system 'cargo-build-system) > ('arguments > ('quasiquote > - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) > + ('#:skip-build? #t > + #:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) > ('home-page "http://example.com") > ('synopsis "summary") > ('description "summary") > --=20 > 2.24.0 >=20 --=20 Efraim Flashner =D7=90=D7=A4=D7=A8=D7=99=D7=9D = =D7=A4=D7=9C=D7=A9=D7=A0=D7=A8 GPG key =3D A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted --ABTtc+pdwF7KHXCz Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAl3jgUoACgkQQarn3Mo9 g1GGEg/+I9QUTNDqunu8gNW9k3dKZJewqCvfye0cy4OZRjFAO6U+ucaZ1XfsyLfP r0Mqr00GsWR60dua2VRIrvRQDJUDvH8glhUilcvbogdE4OhKkUFjg3uQISkuMybd KU81NYY7RljJ7iq3+soT40z6H3RYIYGtU9hVVU6nPdC5iJExPhclk8QAnrtHX8Wh 7lHpWYHyxQPRgsj5rTbbby+b2qDsk6t/6SWsaguhmkQvEf1ijom/0MVdP+pwqTSI PBtQUsvfJv+5l3tXsV5Di31ee217su8DMmGwNelG7Fpq5z45FLEenHmk18rtochp Gk0Iupjon1gKSxT59+zliv4S/saD7oYayeTdcDfBgmx+goCxpJfmmnQd9tySVf6T 3RkpZWYw9T8F6PAx4Tu2qBl2Bv/OznOd4w7itJkBqIRgX3Qe2rJ1RdqWYtFuqb8D HZ80l9A+6Q9GpHnbSXpBOQKD3sW0415jipERl0TF5mkTCLzikkGZFcgtm+gr8Ud0 fds2KVMd/iLiX95MbgAYJoE0DgIZdpYq3WSznEBpa9pUo8UcMw5yttTa/qSU/5Iy L3PR4AF9uPzlnI9mSHAKC1I0lTAxAdHfsql4vjqP/YYfz/Jh8v604BD/f8t0kjAg hKuu7zFudz04oltJL2qiDzLjw2XQixiSKS8i0VceGLaV6CFa/Us= =ss+7 -----END PGP SIGNATURE----- --ABTtc+pdwF7KHXCz-- From debbugs-submit-bounces@debbugs.gnu.org Sun Dec 01 22:17:34 2019 Received: (at 38408) by debbugs.gnu.org; 2 Dec 2019 03:17:34 +0000 Received: from localhost ([127.0.0.1]:36928 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibcDO-0000zk-5v for submit@debbugs.gnu.org; Sun, 01 Dec 2019 22:17:34 -0500 Received: from mx1.riseup.net ([198.252.153.129]:50034) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibcDM-0000zZ-KI for 38408@debbugs.gnu.org; Sun, 01 Dec 2019 22:17:33 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47R9K74pl6zDyXn; Sun, 1 Dec 2019 19:17:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575256651; bh=TcfwRDSETiFWN95jwXesU6AEdW4YfipFAnuEWcwton4=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=QjG9ep9jD0jUz/SNnpCkw8oW+Rf9/85b21Q8PfIdEJdoeBiZq/5+qyf96aMypVnRR O9lA8oYWWe6fNSKiBPZgF/udBGNYdUSO3WK1JY3976wgjJPv3Z16NU05OuXmo5R2Ym EnSnIJWUO3hQgHY2N3512OK4FMKvcacxEZXCYkKI= X-Riseup-User-ID: E527341317AC04F4F013696A43592837619BCB6B005E03A56583E25355DD821B Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47R9K7279Gz8tVR; Sun, 1 Dec 2019 19:17:31 -0800 (PST) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Date: Sun, 01 Dec 2019 19:17:31 -0800 From: Martin Becze To: Efraim Flashner Subject: Re: [PATCH] WIP patches for the rust importer In-Reply-To: <20191201085941.GB14869@E5400> References: <20191126120408.GL1124@E5400> <1E01C051-2EE5-4050-B826-C60E858AAC2B@flashner.co.il> <0b2db52d687fc2acf34dc1e00618dae7.squirrel@sm.riseup.net> <20191128122255.GT1124@E5400> <8981451ac5d914dd5f53fa928741b846@riseup.net> <20191201085941.GB14869@E5400> Message-ID: X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: guix-devel@gnu.org, 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On 2019-12-01 08:59, Efraim Flashner wrote: > On Fri, Nov 29, 2019 at 07:59:35AM -0800, Martin Becze wrote: >> On 2019-11-28 12:22, Efraim Flashner wrote: >> > On Wed, Nov 27, 2019 at 04:36:20PM -0800, mjbecze@riseup.net wrote: >> >> >> >> > I'd love to see what you have so far if you want to share >> >> >> >> Okie Dokie, I posted it and cc'd ya. >> >> >> >> Also I took a look at your patches. >> >> 0001-import-crate-Don-t-include-optional-dependencies.patch should work >> >> just fine with my patch. But >> >> 0003-import-crate-Honor-versioned-dependencies-when-impor.patch will not >> >> work. >> >> >> >> I took a different route here with the naming. If you are interested take >> >> a look take a look at my second patch. (recusive-import-semver) only will >> >> add the version number to the name if the crate being imported is not the >> >> latest version. I thought this was more inline with the canonical names, >> >> but if always adding version number the export symbol is desirable it will >> >> simplify things. >> >> >> > >> > I'll take a look at it in a minute. I figured with the versioned >> > requirements we would always want to be specific in version numbers for >> > crate dependents so I figured it made sense. Also, if we did want to >> > provide an unversioned '-latest' version we could declare an extra >> > variable '(define-public rust-libc rust-libc-0.2)' and now rust-libc >> > points to rust-libc-0.2. >> > >> >> Also I added a function (find-packages-by-name*/direct) to packages.scm >> >> which will return the export symbol of a package that already exists. I >> >> use this in case there are some non-canocal export name already added. >> >> >> >> I added the no-optional-dep logic to the recusive-semver patch >> (https://issues.guix.gnu.org/issue/38408), but it seems to break >> packages. I'm testing on the recursive importer on "hello-cli". Attach >> is the patch to add the logic and the before and after output for "guix >> import crate -r hello-cli". Removing all the optional deps breaks clap >> here for some reason which I haven't figured out. > > Looking at the two attached files I want to bring attention to the size > of them: > after.scm [text/plain, base64, utf-8, 5.7K] > before.scm [text/plain, base64, utf-8, 226K] > > One way to fix this (in addition to your "default to the don't build" > argument) is to keep rust-clap in it's broken state and define a > different rust-clap for when we actually want it and to have that use > enough inputs to actually build. I do now actually realize that only > really works if we keep all the crates hidden, which I don't think we > want. So I guess that has us sending bug reports upstream that some of > the optional dependencies aren't actually optional. > > In any case, I think it'd be better to skip the optional dependencies > and then add them back in as needed to actually build the crates we > want. oh to be more clear. Even with "#:skip-build? #t" on all the rust libs, things fail if I omit one optional dependency from somewhere. I'm just testing on hello-cli but hello-cli inculdes clap which has alot of optional deps. In ./guix/build-systems/cargo.scm on line 186 it says "Cargo requires all transitive crate dependencies' sources to be available in its index, even if they are optional (this is so it can generate deterministic Cargo.lock files regardless of the target platform or enabled features). Thus we need all transitive crate dependencies for any cargo dev-dependencies, but this is only needed when building/testing a crate directly (i.e. we will never need transitive dev-dependencies for any dependency crates)." I haven't really dug into the cargo build-system yet but my guess is that the problem lies there. Allllsooo i totally could have missed something simple.. idk From debbugs-submit-bounces@debbugs.gnu.org Sun Dec 01 23:01:37 2019 Received: (at 38408) by debbugs.gnu.org; 2 Dec 2019 04:01:37 +0000 Received: from localhost ([127.0.0.1]:36956 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibcu0-0002Cp-Rz for submit@debbugs.gnu.org; Sun, 01 Dec 2019 23:01:37 -0500 Received: from mail-pj1-f67.google.com ([209.85.216.67]:34240) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibctz-0002CX-GL for 38408@debbugs.gnu.org; Sun, 01 Dec 2019 23:01:36 -0500 Received: by mail-pj1-f67.google.com with SMTP id t21so3477886pjq.1 for <38408@debbugs.gnu.org>; Sun, 01 Dec 2019 20:01:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:subject:from:in-reply-to:date:cc:message-id:references :to; bh=xCureC+AyOfizdcOPdaKbv2aTC03pkuXhb/bnarseFk=; b=jSIjWDxO50T6bmH8AN/PaLZ7M150jH7obblfzFpPUrpHBXnGtFfEJybR+l5LkzKTDt ee9dcJSsb3q9IBPyNVQ6HKU1KEZncVVf7+ly8ukVpwXKXgVRXogkFRr2LJwHb+Ad88cp h79fteh3bRoUDyzFG4JYSGf9zXW2yOkUyKhCxjL370CqX+X00LucL+6XYXlL9IcawtYg QRj8SAZctiZIASrWvzWumqmoy8EKxk4iLM6KQnuYuiQDJt4eqt9nnAMHbWar3qpywCK7 P/wpUpkanIzBuxjN48+u3ECIkph6KvuCWJMGXkTjjQ4Pvt0xrMKKRAawowP35Xmh4ygD FYOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :message-id:references:to; bh=xCureC+AyOfizdcOPdaKbv2aTC03pkuXhb/bnarseFk=; b=VkcRQNKuGovmcwkyfmeYVJG0nF5LrN9+PZemX52vRh/bOEp+FxM6AP6PP9ZlLlMAeg axJe+RBz6L0B7AC4Y8wRJop5F0a9QoFc5DRhhbDyoirFsInzdB0ZM6QxovWYW/rYmlBx mw2mtA7WPVeI/RAybkVzuOlqZxpz6/0IeN2T5p38YYUnyBlYhTgdkSChwBvhiVT3opXG Psp2UgPKsaY71CliPhohNifN1M2CMkoZYfsTI+6+cmBPyTFtxyocPjuS1X7bhMHcEGk8 qbRhVRcrRaZ44HSgwY/Iez+2hO9I8EX13ALjo8e7Dw2YrzBibHGGVqCIp3mpkqfKLo3N yVTQ== X-Gm-Message-State: APjAAAWP5kZdHr+/W3y39AL3W2o+mV9Kay0hItQJEUVlKaCNdamzWYSH od2/aaUuyJjXrM+nYyhAjVI= X-Google-Smtp-Source: APXvYqzY8k4vO0LDoG7SBfFAANIWh+3qRPSr8cdC3vkl78dEH9ONrVd9+hH+LX6DMuFT9cafB85llA== X-Received: by 2002:a17:902:a502:: with SMTP id s2mr25678240plq.327.1575259288797; Sun, 01 Dec 2019 20:01:28 -0800 (PST) Received: from ?IPv6:2601:602:9a00:1784:9417:8171:2224:e810? ([2601:602:9a00:1784:9417:8171:2224:e810]) by smtp.gmail.com with ESMTPSA id r3sm18088097pfg.145.2019.12.01.20.01.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 01 Dec 2019 20:01:28 -0800 (PST) Content-Type: multipart/alternative; boundary="Apple-Mail=_F3ED1432-ACEA-4F8F-A09C-12381BC7F30D" Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\)) Subject: Re: [PATCH] WIP patches for the rust importer From: Ivan Petkov In-Reply-To: Date: Sun, 1 Dec 2019 20:01:26 -0800 Message-Id: <322B85FF-6EA4-492E-B96A-1F326ADD136E@gmail.com> References: <20191126120408.GL1124@E5400> <1E01C051-2EE5-4050-B826-C60E858AAC2B@flashner.co.il> <0b2db52d687fc2acf34dc1e00618dae7.squirrel@sm.riseup.net> <20191128122255.GT1124@E5400> <8981451ac5d914dd5f53fa928741b846@riseup.net> <20191201085941.GB14869@E5400> To: Martin Becze X-Mailer: Apple Mail (2.3445.104.11) X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: guix-devel@gnu.org, 38408@debbugs.gnu.org, Efraim Flashner X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --Apple-Mail=_F3ED1432-ACEA-4F8F-A09C-12381BC7F30D Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hi Martin! > On Dec 1, 2019, at 7:17 PM, Martin Becze wrote: >=20 > oh to be more clear. Even with "#:skip-build? #t" on all the rust = libs, > things fail if I omit one optional dependency from somewhere. I'm just > testing on hello-cli but hello-cli inculdes clap which has alot of > optional deps. In ./guix/build-systems/cargo.scm on line 186 it says=20= >=20 > "Cargo requires all transitive crate dependencies' sources to be > available > in its index, even if they are optional (this is so it can generate > deterministic Cargo.lock files regardless of the target platform or > enabled > features). Thus we need all transitive crate dependencies for any = cargo > dev-dependencies, but this is only needed when building/testing a = crate > directly > (i.e. we will never need transitive dev-dependencies for any = dependency > crates)." >=20 > I haven't really dug into the cargo build-system yet but my guess is > that the problem lies there. Allllsooo i totally could have missed > something simple.. idk Yes, this is the primary limitation of packaging rust crates into guix without manually needing to edit the Cargo.toml definition. My opinion is that the easiest (to maintain) method for incorporating rust packages into guix is to bite the bullet and perform a (source) import of all transitive dependencies that a package might need. Manually keeping up with tweaking the Cargo.toml file for every single potential package, across every single published version will make you go mad :) Then the challenge would be how to automate the incremental importing from crates.io (for example, some crates require a = specific x.y.z version of a dependency, some are willing to work with x.y.*, some have ranges, = etc.) and making sure that all packaged crates point to the appropriate = dependencies as they get updated in guix. =E2=80=94Ivan= --Apple-Mail=_F3ED1432-ACEA-4F8F-A09C-12381BC7F30D Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Hi = Martin!

On Dec 1, 2019, at 7:17 PM, Martin Becze = <mjbecze@riseup.net> wrote:

oh to be more clear. Even with = "#:skip-build? #t" on all the rust libs,
things fail if I omit one optional dependency from somewhere. = I'm just
testing on = hello-cli but hello-cli inculdes clap which has alot of
optional deps. In = ./guix/build-systems/cargo.scm on line 186 it says 

"Cargo requires all transitive = crate dependencies' sources to be
available
in its index, even if they are optional (this is so it can = generate
deterministic = Cargo.lock files regardless of the target platform or
enabled
features). Thus we need all = transitive crate dependencies for any cargo
dev-dependencies, but this is = only needed when building/testing a crate
directly
(i.e. we will never need transitive dev-dependencies for any = dependency
crates)."

I haven't really dug into the cargo build-system yet but my = guess is
that the = problem lies there. Allllsooo i totally could have missed
something simple.. = idk

Yes, = this is the primary limitation of packaging rust crates into = guix
without manually needing to edit the = Cargo.toml definition.

My opinion is that the easiest (to maintain) method for = incorporating
rust packages into guix is to bite = the bullet and perform a (source)
import of all = transitive dependencies that a package might need.
Manually keeping up with tweaking the Cargo.toml file for = every single
potential package, across every single = published version will make
you go mad :)

Then the challenge would = be how to automate the incremental importing
from = crates.io (for example, = some crates require a specific x.y.z version of
a = dependency, some are willing to work with x.y.*, some have ranges, = etc.)
and making sure that all packaged crates = point to the appropriate dependencies
as they get = updated in guix.

=E2=80=94Ivan
= --Apple-Mail=_F3ED1432-ACEA-4F8F-A09C-12381BC7F30D-- From debbugs-submit-bounces@debbugs.gnu.org Mon Dec 02 18:11:15 2019 Received: (at 38408) by debbugs.gnu.org; 2 Dec 2019 23:11:15 +0000 Received: from localhost ([127.0.0.1]:39086 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibuqZ-0003s1-0a for submit@debbugs.gnu.org; Mon, 02 Dec 2019 18:11:15 -0500 Received: from mx1.riseup.net ([198.252.153.129]:33210) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ibuqW-0003rs-8S for 38408@debbugs.gnu.org; Mon, 02 Dec 2019 18:11:13 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47RgnC3FKXzFc5L; Mon, 2 Dec 2019 15:10:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575328271; bh=2QAlRxvC9/pBLCAlHIyucUdKDaspdO3rOHJVKwUgy74=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=fZm057KnFCtLynhQ+gDlUZU0zR2JTKqQ0anj1nykxgROdeibRhS1jVHplVNmr7S/l uLTMgFRFcc37OnpKr6ObrX+MCHfwyrgcqz9ANs5EUI/rKhoPwAuIoAViVh0kwTN146 Xe1HFacf3pdZsaeEzK5QsCv8Nh0MoT24GLJaXkF0= X-Riseup-User-ID: 672DD6A8D7F215E49E069433E236816B5D0D260F9A761D0576E824D363CE1E86 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 47RgnB2SHgzJpjw; Mon, 2 Dec 2019 15:10:06 -0800 (PST) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Mon, 02 Dec 2019 15:10:06 -0800 From: Martin Becze To: Ivan Petkov Subject: Re: [PATCH] WIP patches for the rust importer In-Reply-To: <322B85FF-6EA4-492E-B96A-1F326ADD136E@gmail.com> References: <20191126120408.GL1124@E5400> <1E01C051-2EE5-4050-B826-C60E858AAC2B@flashner.co.il> <0b2db52d687fc2acf34dc1e00618dae7.squirrel@sm.riseup.net> <20191128122255.GT1124@E5400> <8981451ac5d914dd5f53fa928741b846@riseup.net> <20191201085941.GB14869@E5400> <322B85FF-6EA4-492E-B96A-1F326ADD136E@gmail.com> Message-ID: <785501a89e81d30db021047529e7262e@riseup.net> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: guix-devel@gnu.org, 38408@debbugs.gnu.org, Efraim Flashner X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On 2019-12-02 04:01, Ivan Petkov wrote: > Hi Martin! > >> On Dec 1, 2019, at 7:17 PM, Martin Becze wrote: >> >> oh to be more clear. Even with "#:skip-build? #t" on all the rust >> libs, >> things fail if I omit one optional dependency from somewhere. I'm >> just >> testing on hello-cli but hello-cli inculdes clap which has alot of >> optional deps. In ./guix/build-systems/cargo.scm on line 186 it says >> >> >> "Cargo requires all transitive crate dependencies' sources to be >> available >> in its index, even if they are optional (this is so it can generate >> deterministic Cargo.lock files regardless of the target platform or >> enabled >> features). Thus we need all transitive crate dependencies for any >> cargo >> dev-dependencies, but this is only needed when building/testing a >> crate >> directly >> (i.e. we will never need transitive dev-dependencies for any >> dependency >> crates)." >> >> I haven't really dug into the cargo build-system yet but my guess is >> that the problem lies there. Allllsooo i totally could have missed >> something simple.. idk > > Yes, this is the primary limitation of packaging rust crates into guix > without manually needing to edit the Cargo.toml definition. > > My opinion is that the easiest (to maintain) method for incorporating > rust packages into guix is to bite the bullet and perform a (source) > import of all transitive dependencies that a package might need. > Manually keeping up with tweaking the Cargo.toml file for every single > potential package, across every single published version will make > you go mad :) > > Then the challenge would be how to automate the incremental importing > from crates.io [1] (for example, some crates require a specific x.y.z > version of > a dependency, some are willing to work with x.y.*, some have ranges, > etc.) > and making sure that all packaged crates point to the appropriate > dependencies > as they get updated in guix. > > —Ivan > > Links: > ------ > [1] http://crates.io Hi Ivan, > My opinion is that the easiest (to maintain) method for incorporating > rust packages into guix is to bite the bullet and perform a (source) > import of all transitive dependencies that a package might need. When you say source import of the transitive dependencies, do you mean that all the rust libs should just be source only or do you mean the top level package should have to declare all the transitive dependencies? If former I agree but if it is the latter then I would consider rust packaging to be broken. > Then the challenge would be how to automate the incremental importing > from crates.io [1] (for example, some crates require a specific x.y.z > version of > a dependency, some are willing to work with x.y.*, some have ranges, > etc.) Yes that is what this patch (https://issues.guix.gnu.org/issue/38408) does. It uses semantic versioning to select the correct package form crate.io or if available from the alread packaged rust packages. -Martin From debbugs-submit-bounces@debbugs.gnu.org Tue Dec 03 21:40:54 2019 Received: (at 38408) by debbugs.gnu.org; 4 Dec 2019 02:40:54 +0000 Received: from localhost ([127.0.0.1]:41311 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icKaz-0006Wz-Oh for submit@debbugs.gnu.org; Tue, 03 Dec 2019 21:40:54 -0500 Received: from mail-pj1-f65.google.com ([209.85.216.65]:39873) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icKav-0006Wg-RP for 38408@debbugs.gnu.org; Tue, 03 Dec 2019 21:40:50 -0500 Received: by mail-pj1-f65.google.com with SMTP id v93so2321056pjb.6 for <38408@debbugs.gnu.org>; Tue, 03 Dec 2019 18:40:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:subject:from:in-reply-to:date:cc:message-id:references :to; bh=VFZTk95/F8PZ9+SNAJXzHn5abihBsdLn49jql5moVpA=; b=ZR7tpP83AQ6QrSQxvSt0MLMrZz2Du1E3J23Fo8Q3FBuioaxcQIsIsUiHnUCBgRjo7B TClVrbtQqYBDLV/kEHdNRB5l/tgBDsDK0Q/8dYQAihuF8Zx7otvthn1FQuAW6wqDRGbl YrGV88wMTcRKsM8i8iaqENO9K823FhADZQNyKtqZTvvNFsUYZyKuzVK8ufuc3FGpizVo xZ1HLNMhyqba3HyU4sH1OK/T+Qdz+U5rlPuYJ3q8l0T1bUp97GFwlre0RMlWkCvba56b a9J4aVSNvE5eLFKJR4RthtwoQA7rDRJBqYnXCJBQuOGHBc8vl/L4OQ9t1AcnGNjxBase 7tpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :message-id:references:to; bh=VFZTk95/F8PZ9+SNAJXzHn5abihBsdLn49jql5moVpA=; b=ihh+M3/suMPLwYsnIRMH3PwtSEqmh+ILj5We2iIkWpDKDmE/780ftpgFmnbpN6w8y1 AXjzXA0nePanz2/e/pOrlwB7dferHDA7mxeKVEE8u2fqfo1iRSF5T6Ke+tz4jGPGkf1y hr/DuVyvdH7htTIdLWCTS1rmn2tfORbwlp4/EMlh9x5lTtQEauwbKbvkkmb038I9Met4 KGLZawERHewINw9Nsyu/6Nlx1lX0jM9HbHDcWbbtGCFfEx2jXhi33Tc8YOWl6IJSGgWR qAaG5ybHPOVSDjOuBnofQcJ+6EnFuQym6OUnZhgV10AKJedexGgoIsCiO/EKs5hz8fwP B1QA== X-Gm-Message-State: APjAAAVM3F0ucrb65+cBXbNKV1K4mpF3E/lI4dtlikALEQ/dwtOHYfRW bPI6+1mA9wXYinpVNFWgDNs= X-Google-Smtp-Source: APXvYqy5h0lwCYR3yr7jf6BFEUzDYeAuoY6QW3yap8ix2ooulGXzZoijQYQws/Y9Jnf6fjRJXeXwGA== X-Received: by 2002:a17:90a:1a52:: with SMTP id 18mr794949pjl.26.1575427242752; Tue, 03 Dec 2019 18:40:42 -0800 (PST) Received: from ?IPv6:2601:602:9a00:1784:39bb:7ed2:6fca:1433? ([2601:602:9a00:1784:39bb:7ed2:6fca:1433]) by smtp.gmail.com with ESMTPSA id e5sm4189761pjv.29.2019.12.03.18.40.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Dec 2019 18:40:41 -0800 (PST) Content-Type: multipart/alternative; boundary="Apple-Mail=_D518F4AF-0895-48A5-AF2A-7DA9A874CD1C" Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\)) Subject: Re: [PATCH] WIP patches for the rust importer From: Ivan Petkov In-Reply-To: <785501a89e81d30db021047529e7262e@riseup.net> Date: Tue, 3 Dec 2019 18:40:37 -0800 Message-Id: References: <20191126120408.GL1124@E5400> <1E01C051-2EE5-4050-B826-C60E858AAC2B@flashner.co.il> <0b2db52d687fc2acf34dc1e00618dae7.squirrel@sm.riseup.net> <20191128122255.GT1124@E5400> <8981451ac5d914dd5f53fa928741b846@riseup.net> <20191201085941.GB14869@E5400> <322B85FF-6EA4-492E-B96A-1F326ADD136E@gmail.com> <785501a89e81d30db021047529e7262e@riseup.net> To: Martin Becze X-Mailer: Apple Mail (2.3445.104.11) X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: guix-devel@gnu.org, 38408@debbugs.gnu.org, Efraim Flashner X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --Apple-Mail=_D518F4AF-0895-48A5-AF2A-7DA9A874CD1C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hi Martin, > On Dec 2, 2019, at 3:10 PM, Martin Becze wrote: >=20 > When you say source import of the transitive dependencies, do you mean > that all the rust libs should just be source only or do you mean the = top > level package should have to declare all the transitive dependencies? All rust libs should be source only imports, but each package definition should only declare dependencies on the crates it consumes directly and guix should figure out the rest (in other words, I=E2=80=99d expect = there to be a=20 one-to-one mapping between a Cargo.toml and a package definition). For example, if crate foo depends on crate bar which depends on crate baz, I=E2=80=99d expect the definitions to look like: (define-public rust-foo (package (name =E2=80=9Crust-foo") (source-input `((=E2=80=9Cbar=E2=80=9D ,bar))))) (define-public rust-bar (package (name =E2=80=9Crust-bar") (source-input `((=E2=80=9Cbaz=E2=80=9D ,baz))))) (define-public rust-baz (package (name =E2=80=9Crust-baz"))) But while building foo (assuming it is some kind of application), guix would ensure that bar and baz are available in the build environment. IMO this direction would be the most maintainable in the long term. =E2=80=94Ivan= --Apple-Mail=_D518F4AF-0895-48A5-AF2A-7DA9A874CD1C Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Hi = Martin,

On Dec 2, 2019, at 3:10 PM, Martin Becze = <mjbecze@riseup.net> wrote:

When you say source import of = the transitive dependencies, do you mean
that all the rust libs should just be source only or do you = mean the top
level package = should have to declare all the transitive dependencies?

All rust libs = should be source only imports, but each package = definition
should only declare dependencies on the crates it = consumes directly and
guix should figure out the rest (in = other words, I=E2=80=99d expect there to be a 
one-to-one = mapping between a Cargo.toml and a package definition).

For example, if crate foo depends on crate bar = which depends on crate
baz, I=E2=80=99d expect the definitions = to look like:

(define-public = rust-foo
  (package
    (name = =E2=80=9Crust-foo")
    (source-input `((=E2=80=9Cbar=E2= =80=9D ,bar)))))

(define-public = rust-bar
  (package
    (name = =E2=80=9Crust-bar")
    (source-input `((=E2=80=9Cbaz=E2= =80=9D ,baz)))))

(define-public = rust-baz
  (package
    (name = =E2=80=9Crust-baz")))

But while building foo (assuming it is some kind of = application), guix
would ensure that bar and baz = are available in the build environment.

IMO this direction would be the most = maintainable in the long term.

=E2=80=94Ivan
= --Apple-Mail=_D518F4AF-0895-48A5-AF2A-7DA9A874CD1C-- From debbugs-submit-bounces@debbugs.gnu.org Wed Dec 04 17:08:04 2019 Received: (at 38408) by debbugs.gnu.org; 4 Dec 2019 22:08:04 +0000 Received: from localhost ([127.0.0.1]:42763 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iccoW-0007lG-4O for submit@debbugs.gnu.org; Wed, 04 Dec 2019 17:08:04 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39250) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iccoU-0007kr-CY for 38408@debbugs.gnu.org; Wed, 04 Dec 2019 17:08:03 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47StJd51GmzFc82; Wed, 4 Dec 2019 14:08:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575497281; bh=myqupL9tXhYmuzSlr33KAezfh+oNd5VGDPXk235dnvA=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=f9z3uo2bBf2nwzZLfNURy0oQt013jpuRTuI0l9prHAftEkEq/ASvZLlRwVbR6T7fB b+FYEb8JkJrHyGofbF3JvtXQtvnFD76fvuHfj/l9hPM6ID2AsO3AmJY/onBHVsBdum iKolBYSXi8KDFMg1tftnQ5E12/DNslB3Ig8uoYYg= X-Riseup-User-ID: 42BE56310C6F0775B61A1D0C510EF5B6D5940410BBE66CE897AE043AC66D5F97 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 47StJd2YsVzJtY4; Wed, 4 Dec 2019 14:08:01 -0800 (PST) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Wed, 04 Dec 2019 14:08:01 -0800 From: Martin Becze To: Ivan Petkov Subject: Re: [PATCH] WIP patches for the rust importer In-Reply-To: References: <20191126120408.GL1124@E5400> <1E01C051-2EE5-4050-B826-C60E858AAC2B@flashner.co.il> <0b2db52d687fc2acf34dc1e00618dae7.squirrel@sm.riseup.net> <20191128122255.GT1124@E5400> <8981451ac5d914dd5f53fa928741b846@riseup.net> <20191201085941.GB14869@E5400> <322B85FF-6EA4-492E-B96A-1F326ADD136E@gmail.com> <785501a89e81d30db021047529e7262e@riseup.net> Message-ID: X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: guix-devel@gnu.org, 38408@debbugs.gnu.org, Efraim Flashner X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On 2019-12-04 02:40, Ivan Petkov wrote: > Hi Martin, > >> On Dec 2, 2019, at 3:10 PM, Martin Becze wrote: >> >> When you say source import of the transitive dependencies, do you >> mean >> that all the rust libs should just be source only or do you mean the >> top >> level package should have to declare all the transitive >> dependencies? > > All rust libs should be source only imports, but each package > definition > should only declare dependencies on the crates it consumes directly > and > guix should figure out the rest (in other words, I’d expect there to > be a > one-to-one mapping between a Cargo.toml and a package definition). > > For example, if crate foo depends on crate bar which depends on crate > baz, I’d expect the definitions to look like: > > (define-public rust-foo > (package > (name “rust-foo") > (source-input `((“bar” ,bar))))) > > (define-public rust-bar > (package > (name “rust-bar") > (source-input `((“baz” ,baz))))) > > (define-public rust-baz > (package > (name “rust-baz"))) > > But while building foo (assuming it is some kind of application), guix > would ensure that bar and baz are available in the build environment. > > IMO this direction would be the most maintainable in the long term. > > —Ivan Yes agree and that is what (recusive-import-semver) for produces rust. -Martin From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 05 15:06:23 2019 Received: (at 38408) by debbugs.gnu.org; 5 Dec 2019 20:06:23 +0000 Received: from localhost ([127.0.0.1]:45248 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOI-0002lB-Nj for submit@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:22 -0500 Received: from mx1.riseup.net ([198.252.153.129]:45842) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOF-0002kz-41 for 38408@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:19 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47TRY96q4KzFcn9 for <38408@debbugs.gnu.org>; Thu, 5 Dec 2019 12:05:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575576378; bh=0DDz489qFqrxg3fuhPxV6PBmAl3mnLNJZNfP1HUeGl4=; h=From:To:Cc:Subject:Date:From; b=N192jYrjW1hElaZEHXgIU3+5LoC/yx7as3wbCV+eirUSpKHfmCcLZxTyeIPTwLui/ 1vOKJ6jtEnb9A2pSkQc3QA70FRgJ/eUGhKFpmmhUR4XbWLj5DMrPRIEvQeMEWhE9Ik DCu88sx8C8tNgbqkd6j8jyPY7p0f8V9bDuF3bfdM= X-Riseup-User-ID: 433B8AFB6F03371F5C827A0825F9C93691D6120A3DAF9BDC0B429FF017E89216 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47TRY92FZLz8tYt; Thu, 5 Dec 2019 12:05:49 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v2 0/5] Semantic version aware recusive importer for crates Date: Thu, 5 Dec 2019 15:05:30 -0500 Message-Id: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This version just builds a bit on the prevouse version (https://issues.guix.gnu.org/issue/38408#0) I found while testing some crates have build-dependencies and nor dependencies that are the same. While in guix build and normal dependiences are treated the same way (ie source only). So the recusive importer was importing the duplicates so here we dedup the deps. Please let me know if there are any problems! -Martin Martin Becze (5): gnu: added new function, find-packages-by-name*/direct gnu: added new procedure, recusive-import-semver Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. added "#:skip-build? #t" to the output of (make-crate-sexp). Most the the packages imported will be libaries and won't need to build. The top level package will build them though. guix: crate: Depublicated build and normal dependencies gnu/packages.scm | 41 ++++++++ guix/import/crate.scm | 188 +++++++++++++++++++--------------- guix/import/utils.scm | 181 ++++++++++++++++++++++++++++++-- guix/scripts/import/crate.scm | 9 +- tests/crate.scm | 5 +- tests/import-utils.scm | 162 +++++++++++++++++++++++++++++ tests/packages.scm | 13 +++ 7 files changed, 501 insertions(+), 98 deletions(-) -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 05 15:06:24 2019 Received: (at 38408) by debbugs.gnu.org; 5 Dec 2019 20:06:24 +0000 Received: from localhost ([127.0.0.1]:45253 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOK-0002lR-0v for submit@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:24 -0500 Received: from mx1.riseup.net ([198.252.153.129]:45890) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOH-0002lA-SI for 38408@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:22 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47TRYh4fN5zFcpY for <38408@debbugs.gnu.org>; Thu, 5 Dec 2019 12:06:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575576381; bh=dCIdzcohllKhuGZdXzOmICN0KPZQt8uvs6Lpd8lm9oE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MgfpL4DjAWBAVSMuMiYmbEMTitt1DqA30d1vt9clgc4gKi99TzB2AQUdHXvTfwmQh v3oB1WbWgPdA4lRI7BQQnchcszRnJCEPVU1nciZEK57CWZYLEI36RduKjBo07NM5+t 9MUSuDUer0QcqNODAlRWGrXCTvePmR85Kqy3L8PY= X-Riseup-User-ID: 134C14AFC1AB0883C1F6CA33F2B635C0DE9ACC0500019DFBFCE498836F219393 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47TRYH3JtFz8tgT; Thu, 5 Dec 2019 12:05:55 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v2 4/5] added "#:skip-build? #t" to the output of (make-crate-sexp). Most the the packages imported will be libaries and won't need to build. The top level package will build them though. Date: Thu, 5 Dec 2019 15:05:34 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (make-crate-sexp): added "#:skip-build? #t" to the output --- guix/import/crate.scm | 3 ++- tests/crate.scm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index da92c43b8c..5683369b7a 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -183,7 +183,8 @@ record or #f if it was not found." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append `(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) (home-page ,(match home-page diff --git a/tests/crate.scm b/tests/crate.scm index b77cbb08c6..64e5b6932e 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -102,7 +102,8 @@ ('build-system 'cargo-build-system) ('arguments ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) + ('#:skip-build? #t + #:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) ('home-page "http://example.com") ('synopsis "summary") ('description "summary") -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 05 15:06:26 2019 Received: (at 38408) by debbugs.gnu.org; 5 Dec 2019 20:06:26 +0000 Received: from localhost ([127.0.0.1]:45256 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOM-0002lq-Cu for submit@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:26 -0500 Received: from mx1.riseup.net ([198.252.153.129]:45934) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOJ-0002lP-Gv for 38408@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:24 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47TRYF5s62zFcnM for <38408@debbugs.gnu.org>; Thu, 5 Dec 2019 12:05:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575576382; bh=chL81QND2PvQrUFrNgy/ahQ3nrmiGlgQD4PnAhtyUtw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HcvsT5uexe44jL3VtAD76d87SNIiGQkVGukh/cNQKPbaqR049CCAfT1K3n6mVd20L a2aayjoRE+9IZB1jAjBx9zWa5idrryWh7/86MAzvSwjeM8Vez0P3Kg6UkpCmDs6lQ4 Qf6l87yN7I5nMVoE1dt74hK7HnYmVwgKfzhfdK44= X-Riseup-User-ID: 4351C390B81D62A3F9245E9F82CF0110BD72FA28F11E4CAF48F4468A3D26B8D2 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47TRYF0d49z8tZ1; Thu, 5 Dec 2019 12:05:52 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v2 1/5] gnu: added new function, find-packages-by-name*/direct Date: Thu, 5 Dec 2019 15:05:31 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * gnu/packages.scm (find-packages-by-naem*/direct) --- gnu/packages.scm | 41 +++++++++++++++++++++++++++++++++++++++++ tests/packages.scm | 13 +++++++++++++ 2 files changed, 54 insertions(+) diff --git a/gnu/packages.scm b/gnu/packages.scm index 959777ff8f..cca2a393e5 100644 --- a/gnu/packages.scm +++ b/gnu/packages.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2016, 2017 Alex Kost ;;; Copyright © 2016 Mathieu Lirzin +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -52,7 +53,9 @@ %default-package-module-path fold-packages + fold-packages* fold-available-packages + find-packages-by-name*/direct find-newest-available-packages find-packages-by-name @@ -250,6 +253,23 @@ is guaranteed to never traverse the same package twice." init modules)) +(define* (fold-packages* proc init + #:optional + (modules (all-modules (%package-module-path) + #:warn + warn-about-load-error)) + #:key (select? (negate hidden-package?))) + "Call (PROC PACKAGE RESULT) for each available package defined in one of +MODULES that matches SELECT?, using INIT as the initial value of RESULT. It +is guaranteed to never traverse the same package twice." + (fold-module-public-variables* (lambda (module symbol var result) + (let ((object (variable-ref var))) + (if (and (package? object) (select? object)) + (proc module symbol object result) + result))) + init + modules)) + (define %package-cache-file ;; Location of the package cache. "/lib/guix/package.cache") @@ -297,6 +317,27 @@ decreasing version order." matching) matching))))) +(define find-packages-by-name*/direct ;bypass the cache + (let ((packages (delay + (fold-packages* (lambda (mod sym p r) + (vhash-cons (package-name p) (list mod sym p) r)) + vlist-null))) + (version>? (match-lambda* + (((_ _ versions) ..1) + (apply version>? (map package-version versions)))))) + (lambda* (name #:optional version) + "Return the list of ( ) with the given NAME. If + VERSION is not #f, then only return packages whose version is prefixed by + VERSION, sorted in decreasing version order." + (let ((matching (sort (vhash-fold* cons '() name (force packages)) + version>?))) + (if version + (filter (match-lambda + ((_ _ package) + (version-prefix? version (package-version package)))) + matching) + matching))))) + (define (cache-lookup cache name) "Lookup package NAME in CACHE. Return a list sorted in increasing version order." diff --git a/tests/packages.scm b/tests/packages.scm index 423c5061aa..9f02b0d5d2 100644 --- a/tests/packages.scm +++ b/tests/packages.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès ;;; Copyright © Jan (janneke) Nieuwenhuizen +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -1135,11 +1136,23 @@ (((? (cut eq? hello <>))) #t) (wrong (pk 'find-packages-by-name wrong #f)))) +(test-assert "find-packages-by-name*/direct" + (match (find-packages-by-name*/direct "hello") + ((((? (cut eq? (resolve-interface '(gnu packages base)) <>)) + (? (cut eq? 'hello <>)) + (? (cut eq? hello <>)))) #t))) + (test-assert "find-packages-by-name with version" (match (find-packages-by-name "hello" (package-version hello)) (((? (cut eq? hello <>))) #t) (wrong (pk 'find-packages-by-name wrong #f)))) +(test-assert "find-packages-by-name*/direct with version" + (match (find-packages-by-name*/direct "hello" (package-version hello)) + ((((? (cut eq? (resolve-interface '(gnu packages base)) <>)) + (? (cut eq? 'hello <>)) + (? (cut eq? hello <>)))) #t))) + (test-equal "find-packages-by-name with cache" (find-packages-by-name "guile") (call-with-temporary-directory -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 05 15:06:27 2019 Received: (at 38408) by debbugs.gnu.org; 5 Dec 2019 20:06:27 +0000 Received: from localhost ([127.0.0.1]:45258 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOM-0002ls-QO for submit@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:27 -0500 Received: from mx1.riseup.net ([198.252.153.129]:45888) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOH-0002l9-QR for 38408@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:24 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47TRYG3pxMzFcnP for <38408@debbugs.gnu.org>; Thu, 5 Dec 2019 12:05:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575576381; bh=eXiKp6xJqqFQPNzckywNUZngJI+P5LxkAMwTMvBbN2M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Sk+5Qs9xBnDPxWBysn8mcBNR4XUYjWi6vW3Doc5z14G5SuelGg/Xh0DO8D5D100VK +S3cj+zBZ6pyHhQHhYOVFJBD5LkMTzIlzGQyWD/Py+wUhzHAk+qdsBlhtSNQvc6eBm T25MOcudGJ+dbGRLbL3fpSMTHUx25t6VVal9DT3o= X-Riseup-User-ID: 490DB8298347B498F47D46431B3350D306D74F5576DB67BE0E91B6B54F803658 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47TRYF68b7z8tZ6; Thu, 5 Dec 2019 12:05:53 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v2 2/5] gnu: added new procedure, recusive-import-semver Date: Thu, 5 Dec 2019 15:05:32 -0500 Message-Id: <18d8555e374e1d7682c5f7231be25dd572dacbf0.1575575779.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * gnu/packages.scm (recusive-import-semver): New Procedure * gnu/packages.scm (package->definition)[arguments]: New argument, "latest" * tests/import-utils.scm: tests for recusive-import-semver --- guix/import/utils.scm | 181 +++++++++++++++++++++++++++++++++++++++-- tests/import-utils.scm | 162 ++++++++++++++++++++++++++++++++++++ 2 files changed, 336 insertions(+), 7 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 4694b6e7ef..6932614f8e 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,6 +33,7 @@ #:use-module (guix discovery) #:use-module (guix build-system) #:use-module (guix gexp) + #:use-module (guix memoization) #:use-module (guix store) #:use-module (guix download) #:use-module (gnu packages) @@ -43,6 +45,8 @@ #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) #:use-module (srfi srfi-41) + #:use-module (semver) + #:use-module (semver ranges) #:export (factorize-uri flatten @@ -69,7 +73,8 @@ guix-name - recursive-import)) + recursive-import + recursive-import-semver)) (define (factorize-uri uri version) "Factorize URI, a package tarball URI as a string, such that any occurrences @@ -257,13 +262,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional (latest #t)) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if latest + name + (string-append name "-" version))) ,guix-package)))) (define (build-system-modules) @@ -414,3 +421,163 @@ dependencies." step ;; initial state (step initial-state))) + +(define* (recursive-import-semver #:key name + (version #f) + name->metadata + metadata->package + metadata-versions + package-dependencies + dependency-name + dependency-range + guix-name + make-sexp) + "Generates a stream of package expressions for the dependencies of the given +NAME and VERSION. The dependencies will be resolved using semantic versioning. +This procedure makes the assumption that most package repositories will, for a +given package provide some on that package that includes what +versions of the package that are available and a list of dependencies for each +version. Dependencies are assumed to be composed of a NAME, a semantic RANGE and +other data. + +This procedure takes the following keys: + NAME - The name of the package to import + VERSION - The version of the package to import + NAME->METADATA - A procedure that takes a NAME of a package and returns that +package's + METADATA->PACKAGE A procedure that takes a package's and VERSION +and returns the for the given VERSION + METADATA-VERSIONS A procedure that that takes a packages and +returns a list of version as strings that are available for the given package + PACKAGE-DEPENDENCIES a procedure that returns a list of given a + + DEPENDENCY-NAME A procedure that takes a and returns the its name + DEPENDENCY-RANGE A procedure that takes a and returns that +decency's range as a string + GUIX-NAME A procedure that take a NAME and returns the Guix version of it + MAKE-SEXP A procedure that takes , and a list of pairs +containing (EXPORT-NAME ), returning the package expression as an +s-expression" + (define mem-name->metadata (memoize name->metadata)) + + (define (latest? versions version) + (equal? (car versions) version)) + + (define (sorted-versions metadata) + (sort (metadata-versions metadata) version>?)) + + (define (name->versions name) + (sorted-versions (mem-name->metadata name))) + + (define (semver-range-contains-string? range version) + (semver-range-contains? range + (string->semver version))) + + (define (guix-export-name name version) + (let ((versions (name->versions name)) + (name (guix-name name))) + (if (latest? versions version) + name + (string-append name "-" version)))) + + ;; checks to see if we already defined or want to define a dep + (define (find-known name range known) + (match + (find + (match-lambda ((dep-name version) + (and + (string=? dep-name name) + (semver-range-contains-string? range version)))) + known) + + (#f #f) + ((name version) (list (guix-export-name name version) version #f))) + ) + + ;; searches searches for a package in guix + (define (find-locally name range) + (match + (find + (match-lambda ((_ _ package) + (semver-range-contains-string? + range + (package-version package)))) + (find-packages-by-name*/direct (guix-name name))) + (#f #f) + ((_ export-symbol package) (list + (symbol->string export-symbol) + (package-version package) #f)))) + + ;; searches for a package in some external repo + (define (find-remote name range) + (let* ((versions (name->versions name)) + (version (find + (lambda (ver) + (semver-range-contains-string? range ver)) + versions)) + (export-name (guix-export-name name version))) + `(,export-name ,version #t))) + + + (define (find-dep-version dep known-deps) + (let* ((name (dependency-name dep)) + (range (string->semver-range (dependency-range dep))) + (export-name-version-needed + (or (find-known name range known-deps) + (find-locally name range) + (find-remote name range)))) + `(,name ,@export-name-version-needed ,dep) + )) + + (define (make-package-definition name version known-deps) + (let* ((metadata (mem-name->metadata name)) + (versions (sorted-versions metadata)) + (package (metadata->package metadata version)) + (deps (map (lambda (dep) + (find-dep-version dep known-deps)) + (package-dependencies package))) + (sexp + (make-sexp metadata package + (map + (match-lambda ((_ export-symbol _ _ dep) + (list export-symbol dep))) + deps)))) + (values + (package->definition sexp (latest? versions version)) + (filter-map + (match-lambda ((name _ version need? dep) + (if need? + (list name version) + #f))) + deps)))) + + (define initial-state + (list #f + (list + ;; packages to find + (list name (if version + version + (car (name->versions name))))) + ;; packages that have been found + (list))) + + (define (step state) + (match state + ((prev ((next-name next-version) . rest) done) + (receive (package dependencies) + (make-package-definition next-name next-version + (append done rest `((,next-name ,next-version)))) + (list + package + (append rest dependencies) + (cons (list next-name next-version) done)))) + ((prev '() done) + (list #f '() done)))) + + (stream-unfold + ;; map: produce a stream element + (match-lambda ((latest queue done) latest)) + ;; predicate + (match-lambda ((latest queue done) latest)) + step + (step initial-state))) diff --git a/tests/import-utils.scm b/tests/import-utils.scm index c3ab25d788..4ed3a5e1da 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2016 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,6 +25,10 @@ #:use-module (guix packages) #:use-module (guix build-system) #:use-module (gnu packages) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-41) #:use-module (srfi srfi-64)) (test-begin "import-utils") @@ -120,4 +125,161 @@ ("license" . #f)))) (package-native-inputs (alist->package meta)))) +(define-record-type + (make-metadata name versions) + metadata? + (name metadata-name) + (versions metadata-versions)) + +(define-record-type + (make-package version dependencies) + package? + (version package-version) + (dependencies package-dependencies)) + +(define-record-type + (make-dependency name range) + dependency? + (name dependency-name) + (range dependency-range)) + +(define (metadata-semver-versions metadata) + (map (lambda (p) + (package-version p)) + (metadata-versions metadata))) + +(define (metadata->package metadata version) + (find + (lambda (package) + (equal? (package-version package) version)) + (metadata-versions metadata))) + +(define (make-sexp metadata package dependencies) + `(package + (name ,(guix-name (metadata-name metadata))) + (version ,(package-version package)) + (dependcies ,(map + (match-lambda ((public-name dep) + (list (guix-name (dependency-name dep)) public-name))) + dependencies)))) + +(define (guix-name name) + (string-append "test-" name)) + +(define packages + `(("no-deps" . (("1.0.0" . ()) ("0.1.0" . ()))) + ("one-dep" . (("1.0.0" . (("no-deps" "^1.0"))) + ("0.1.0" . (("no-deps" "^0.1.0"))))) + ("shared-dep" . (("1.0.0" . (("one-dep" "^0.1.0") + ("no-deps" "*"))))) + ("recursive" . (("1.0.0" . (("recursive" "=1.0.0"))))) + ("already-packaged" . (("1.0.0" . (("rust" "~1.28"))))))) + +(define (name->metadata name) + (let ((versions (assoc-ref packages name))) + (make-metadata name + (map + (match-lambda + ((version . deps) + (make-package version + (map + (lambda (name-range) + (apply make-dependency name-range)) + deps)))) + versions)))) + +(define* (test-recursive-importer name version #:optional (guix-name guix-name)) + (recursive-import-semver #:name name + #:version version + #:name->metadata name->metadata + #:metadata->package metadata->package + #:metadata-versions metadata-semver-versions + #:package-dependencies package-dependencies + #:dependency-name dependency-name + #:dependency-range dependency-range + #:guix-name guix-name + #:make-sexp make-sexp)) + +(test-equal "recursive import test with no dependencies" + `((define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "no-deps" "1.0.0"))) + +(test-equal "recursive import test with one dependencies" + `((define-public test-one-dep + (package + (name "test-one-dep") + (version "1.0.0") + (dependcies (("test-no-deps" "test-no-deps"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "1.0.0"))) + +(test-equal "recursive import test with recursuve dependencies" + `((define-public test-recursive + (package + (name "test-recursive") + (version "1.0.0") + (dependcies (("test-recursive" "test-recursive")))))) + (stream->list (test-recursive-importer "recursive" "1.0.0"))) + +(test-equal "recursive import test with no dependencies using an old version" + `((define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies ())))) + (stream->list (test-recursive-importer "no-deps" "0.1.0"))) + +(test-equal "recursive import test with one dependencies unsing an old version" + `((define-public test-one-dep-0.1.0 + (package + (name "test-one-dep") + (version "0.1.0") + (dependcies (("test-no-deps" "test-no-deps-0.1.0"))))) + (define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "0.1.0"))) + +(test-equal "recursive import test with with dependency that is already in the repo" + `((define-public test-already-packaged + (package (name "test-already-packaged") + (version "1.0.0") + (dependcies + (("test-rust" "rust-1.28")))))) + (stream->list (test-recursive-importer "already-packaged" "1.0.0" identity))) + +(test-equal "shared dependencies" + `((define-public test-shared-dep + (package + (name "test-shared-dep") + (version "1.0.0") + (dependcies (("test-one-dep" "test-one-dep-0.1.0") + ("test-no-deps" "test-no-deps"))))) + (define-public test-one-dep-0.1.0 + (package + (name "test-one-dep") + (version "0.1.0") + (dependcies (("test-no-deps" "test-no-deps-0.1.0"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ()))) + (define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies())))) + (stream->list (test-recursive-importer "shared-dep" "1.0.0"))) + (test-end "import-utils") -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 05 15:06:28 2019 Received: (at 38408) by debbugs.gnu.org; 5 Dec 2019 20:06:28 +0000 Received: from localhost ([127.0.0.1]:45261 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxON-0002m1-LY for submit@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:28 -0500 Received: from mx1.riseup.net ([198.252.153.129]:45904) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOK-0002lD-1s for 38408@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:25 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47TRYH2TW9zFcnT for <38408@debbugs.gnu.org>; Thu, 5 Dec 2019 12:05:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575576381; bh=/mXFFri2VLK/k5oza9VQ6xurOa3MksoTDnW4B/KLRgU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DiP1WIzQbR1euvdVCZr0AXcffZQR3qTQw66zXJuZWpVOOOT1xdB6yLmH+AiMCaAwi 1+EYSHktDiYoMZPpPwjJQRfGy3nyj20LxeloSgQi3kCSt+C/A79P6XMTOH2MRLKKHm /Cjb2DA9M2IBjJUEJy6xTmYaHrOmVSD5gvgsiNXQ= X-Riseup-User-ID: 7E2260EAC630EC9DA0AC8DD1181CDC0CBA7C1AAD7A31375C1DF8782F1B4C3450 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47TRYG53sRz8tgK; Thu, 5 Dec 2019 12:05:54 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v2 3/5] Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. Date: Thu, 5 Dec 2019 15:05:33 -0500 Message-Id: <7cccd4231b9c1327d59ff39daf2aa7dd47a2e765.1575575779.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (make-crate-sexp): Use as args * guix/import/crate.scm (crate->crate-version): New Procedure * guix/import/crate.scm (crate->versions): New Procedure * guix/import/crate.scm (crate-recursive-import): Updated to user recursive-import-semver * guix/scripts/import/crate.scm (guix-import-crate): Remove `define-public` generation from UI * guix/tests/crate.scm: Updated tests --- guix/import/crate.scm | 165 ++++++++++++++++++---------------- guix/scripts/import/crate.scm | 9 +- tests/crate.scm | 2 +- 3 files changed, 91 insertions(+), 85 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 8dc014d232..da92c43b8c 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name crate-recursive-import @@ -85,7 +86,7 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string @@ -111,7 +112,9 @@ record or #f if it was not found." (url (string-append (%crate-base-url) path))) (match (assoc-ref (or (json-fetch url) '()) "dependencies") ((? vector? vector) - (map json->crate-dependency (vector->list vector))) + (filter (lambda (dep) + (not (eq? (crate-dependency-kind dep) 'dev))) + (map json->crate-dependency (vector->list vector)))) (_ '())))) @@ -141,62 +144,84 @@ record or #f if it was not found." ((args ...) `((arguments (,'quasiquote ,args)))))) -(define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) - "Return the `package' s-expression for a rust package with the given NAME, -VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, -and LICENSE." - (let* ((port (http-fetch (crate-uri name version))) +(define (make-crate-sexp crate version* dependencies) + "Return the `package' s-expression for a rust package given , + and a list of " + (define normal-dependency? + (match-lambda ((_ dep) (not (eq? (crate-dependency-kind dep) 'dev))))) + + (define (string->license string) + (match (regexp-exec %dual-license-rx string) + (#f (list (spdx-string->license string))) + (m (list (spdx-string->license (match:substring m 1)) + (spdx-string->license (match:substring m 2)))))) + + (let* ((dep-crates dev-dep-crates (partition normal-dependency? dependencies)) + (cargo-inputs (sort (unzip1 dep-crates) + string-ci (crate-version-license version*) + string->license)) + (port (http-fetch (crate-uri name version)) ) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) (pkg `(package - (name ,guix-name) - (version ,version) - (source (origin - (method url-fetch) - (uri (crate-uri ,name version)) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 - (base32 - ,(bytevector->nix-base32-string (port-sha256 port)))))) - (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) - (maybe-cargo-development-inputs - cargo-development-inputs))) - (home-page ,(match home-page - (() "") - (_ home-page))) - (synopsis ,synopsis) - (description ,(beautify-description description)) - (license ,(match license - (() #f) - ((license) license) - (_ `(list ,@license))))))) - (close-port port) - pkg)) + (name ,guix-name) + (version ,version) + (source (origin + (method url-fetch) + (uri (crate-uri ,name version)) + (file-name (string-append name "-" version ".crate")) + (sha256 + (base32 + ,(bytevector->nix-base32-string (port-sha256 port)))))) + (build-system cargo-build-system) + ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + (maybe-cargo-development-inputs + cargo-development-inputs))) + (home-page ,(match home-page + (() "") + (_ home-page))) + (synopsis ,synopsis) + (description ,(beautify-description description)) + (license ,(match license + (() #f) + ((license) license) + (_ `(list ,@license))))))) + + (close-port port) + pkg)) (define %dual-license-rx ;; Dual licensing is represented by a string such as "MIT OR Apache-2.0". ;; This regexp matches that. (make-regexp "^(.*) OR (.*)$")) +(define (crate->crate-version crate version-number) + "returns the for a given CRATE and VERSION-NUMBER" + (find (lambda (version) + (string=? (crate-version-number version) + version-number)) + (crate-versions crate))) + +(define (crate->versions crate) + "Returns a list of versions for a given CRATE" + (map (lambda (version) + (crate-version-number version)) + (crate-versions crate))) + (define* (crate->guix-package crate-name #:optional version) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." - (define (string->license string) - (match (regexp-exec %dual-license-rx string) - (#f (list (spdx-string->license string))) - (m (list (spdx-string->license (match:substring m 1)) - (spdx-string->license (match:substring m 2)))))) - - (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) - (define crate (lookup-crate crate-name)) @@ -205,38 +230,27 @@ latest version of CRATE-NAME." (crate-latest-version crate))) (define version* - (find (lambda (version) - (string=? (crate-version-number version) - version-number)) - (crate-versions crate))) + (crate->crate-version crate version-number)) - (and crate version* - (let* ((dependencies (crate-version-dependencies version*)) - (dep-crates (filter normal-dependency? dependencies)) - (dev-dep-crates (remove normal-dependency? dependencies)) - (cargo-inputs (sort (map crate-dependency-id dep-crates) - string-ci (crate-version-license version*) - string->license)) - (append cargo-inputs cargo-development-inputs))))) + (define dependencies (map + (lambda (dep) + (list (crate-name->package-name + (crate-dependency-id dep)) dep)) + (crate-version-dependencies version*))) + (make-crate-sexp crate version* dependencies)) -(define (crate-recursive-import crate-name) - (recursive-import crate-name #f - #:repo->guix-package (lambda (name repo) - (crate->guix-package name)) - #:guix-name crate-name->package-name)) +(define* (crate-recursive-import name #:optional version) + (recursive-import-semver + #:name name + #:version version + #:name->metadata lookup-crate + #:metadata->package crate->crate-version + #:metadata-versions crate->versions + #:package-dependencies crate-version-dependencies + #:dependency-name crate-dependency-id + #:dependency-range crate-dependency-requirement + #:guix-name crate-name->package-name + #:make-sexp make-crate-sexp)) (define (guix-package->crate-name package) "Return the crate name of PACKAGE." @@ -285,4 +299,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 4690cceb4d..85ae6fbe59 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,14 +96,7 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (reverse - (stream->list - (crate-recursive-import name)))) + (stream->list (crate-recursive-import name version)) (let ((sexp (crate->guix-package name version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") diff --git a/tests/crate.scm b/tests/crate.scm index c14862ad9f..b77cbb08c6 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -95,7 +95,7 @@ ('source ('origin ('method 'url-fetch) ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) + ('file-name ('string-append 'name "-" 'version ".crate")) ('sha256 ('base32 (? string? hash))))) -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 05 15:06:31 2019 Received: (at 38408) by debbugs.gnu.org; 5 Dec 2019 20:06:31 +0000 Received: from localhost ([127.0.0.1]:45263 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxOR-0002mL-BF for submit@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:31 -0500 Received: from mx1.riseup.net ([198.252.153.129]:46022) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1icxON-0002lz-GD for 38408@debbugs.gnu.org; Thu, 05 Dec 2019 15:06:27 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47TRYh63KyzFcpZ for <38408@debbugs.gnu.org>; Thu, 5 Dec 2019 12:06:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575576384; bh=s7kVPwUcU8b/+mRMpysYnE5JwybAezSwWf79j/xYYaU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CrTu3LGhDxqlbs/QkGSP68/azryhmSzfv+EJSoxyD1ZutU9H0+1xGSsJ8/g5aMg5I 6Ktij6GJZcvRoSFXp8VJZqZ87OJ/nLZyVzS//g/s1aV/R+hub6rhraJs3X9LE8L9U9 vjFU00s4e+d1JleOeFTeY8Y7n4u0BZZI6UwwboSk= X-Riseup-User-ID: A69F499F732212D2BBC4CA3A4C65E48982F42D1B8945E22C18F416E62F4F1C53 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47TRYJ1Xhkz8thH; Thu, 5 Dec 2019 12:05:56 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v2 5/5] guix: crate: Depublicated build and normal dependencies Date: Thu, 5 Dec 2019 15:05:35 -0500 Message-Id: <8ffe3fa2e5d612802069f2b214b03a66df05780b.1575575779.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm: (crate-version-dependencies): dedup deps --- guix/import/crate.scm | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 5683369b7a..f3c36ba516 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -109,14 +109,26 @@ record or #f if it was not found." "Return the list of records of VERSION, a ." (let* ((path (assoc-ref (crate-version-links version) "dependencies")) - (url (string-append (%crate-base-url) path))) - (match (assoc-ref (or (json-fetch url) '()) "dependencies") - ((? vector? vector) - (filter (lambda (dep) - (not (eq? (crate-dependency-kind dep) 'dev))) - (map json->crate-dependency (vector->list vector)))) - (_ - '())))) + (url (string-append (%crate-base-url) path)) + (deps-list (match (assoc-ref (or (json-fetch url) '()) "dependencies") + ((? vector? vector) (vector->list vector)) + (_ + '()))) + ;; turn the raw list into 's and remove dev depenedencies + (deps (filter-map (lambda (json) + (let ((dep (json->crate-dependency json))) + (if (eq? (crate-dependency-kind dep) 'dev) + #f + dep))) + deps-list)) + ;; split normal and build dependencies + (deps-normal deps-build (partition (lambda (dep) + (eq? (crate-dependency-kind dep) 'normal)) + deps))) + ;;remove duplicate normal and build dependencies + (lset-union (lambda (a b) + (string= (crate-dependency-id a) (crate-dependency-id a))) + deps-normal deps-build))) ;;; -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 06 13:21:49 2019 Received: (at 38408) by debbugs.gnu.org; 6 Dec 2019 18:21:49 +0000 Received: from localhost ([127.0.0.1]:47026 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEf-00053J-BP for submit@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:49 -0500 Received: from mx1.riseup.net ([198.252.153.129]:41836) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEb-00052Q-Pa for 38408@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:47 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47V1Bd1HkPzDt64 for <38408@debbugs.gnu.org>; Fri, 6 Dec 2019 10:21:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575656505; bh=QPS3bM4nS0tAl4W8u0V3hVdrklAjhLVj58YZIA1k25M=; h=From:To:Cc:Subject:Date:From; b=PfqeM9B/dzlGf6Li4T4OafbOiale8W5vSSDND6WUHG8H0urIEex/zpJT2r3t/yW0+ srimuJbrg4wifY5qKMd/EHjhJrc8qSTVbSCyTBbpZBiS/z8SXOilM5HUQLm1aSNAWX yc733yDvbDG3f/SagTPz+Sa70HQfzA0ALq57+UpE= X-Riseup-User-ID: 661A2108CF12647199D64417387C268023DC2B298670B8A84B09C8C21603B512 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47V1Bc3hMdz8syM; Fri, 6 Dec 2019 10:21:44 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v3 0/5] Semantic version aware recusive importer for crates Date: Fri, 6 Dec 2019 13:21:32 -0500 Message-Id: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This version makes one little change from the prevous version (https://issues.guix.gnu.org/issue/38408#13). I found out that crates could have duplicate dependencies in for every possible target in their Cargo.toml. So just depuplicating the build dependencies agains the normal depedencies was not enough. We need to make sure all the dependencies are unqie! -Martin Martin Becze (5): gnu: added new function, find-packages-by-name*/direct gnu: added new procedure, recusive-import-semver Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. added "#:skip-build? #t" to the output of (make-crate-sexp). Most the the packages imported will be libaries and won't need to build. The top level package will build them though. guix: crate: Depublicated dependencies gnu/packages.scm | 41 ++++++++ guix/import/crate.scm | 188 +++++++++++++++++++--------------- guix/import/utils.scm | 181 ++++++++++++++++++++++++++++++-- guix/scripts/import/crate.scm | 9 +- tests/crate.scm | 5 +- tests/import-utils.scm | 162 +++++++++++++++++++++++++++++ tests/packages.scm | 13 +++ 7 files changed, 501 insertions(+), 98 deletions(-) -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 06 13:21:50 2019 Received: (at 38408) by debbugs.gnu.org; 6 Dec 2019 18:21:50 +0000 Received: from localhost ([127.0.0.1]:47028 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEf-00053Q-Me for submit@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:50 -0500 Received: from mx1.riseup.net ([198.252.153.129]:41854) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEc-00052b-6L for 38408@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:47 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47V1Bd5my7zFc8L for <38408@debbugs.gnu.org>; Fri, 6 Dec 2019 10:21:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575656505; bh=chL81QND2PvQrUFrNgy/ahQ3nrmiGlgQD4PnAhtyUtw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aNld9npm25JM9+J4r4ihVIdHTpUcWCSIpbto9QDHfSEetI/6kh3aTVh2xlfew8HPs WhqrGQ6xn5kJqFJac8MUhOel551uF8CZHCrydsMd/vT6xbavN3Po4w7P29gMgKOKbq Mk2il0VPvj3kD0Y9b7IhbMX12fp8PRmdxY6U4aYM= X-Riseup-User-ID: 01300253ABDCBE7EEBA63884393B1C8352BA0A1AC2E89DF5E50076C8AFE96C94 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47V1Bd1lmvz8tYt; Fri, 6 Dec 2019 10:21:45 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v3 1/5] gnu: added new function, find-packages-by-name*/direct Date: Fri, 6 Dec 2019 13:21:33 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * gnu/packages.scm (find-packages-by-naem*/direct) --- gnu/packages.scm | 41 +++++++++++++++++++++++++++++++++++++++++ tests/packages.scm | 13 +++++++++++++ 2 files changed, 54 insertions(+) diff --git a/gnu/packages.scm b/gnu/packages.scm index 959777ff8f..cca2a393e5 100644 --- a/gnu/packages.scm +++ b/gnu/packages.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2016, 2017 Alex Kost ;;; Copyright © 2016 Mathieu Lirzin +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -52,7 +53,9 @@ %default-package-module-path fold-packages + fold-packages* fold-available-packages + find-packages-by-name*/direct find-newest-available-packages find-packages-by-name @@ -250,6 +253,23 @@ is guaranteed to never traverse the same package twice." init modules)) +(define* (fold-packages* proc init + #:optional + (modules (all-modules (%package-module-path) + #:warn + warn-about-load-error)) + #:key (select? (negate hidden-package?))) + "Call (PROC PACKAGE RESULT) for each available package defined in one of +MODULES that matches SELECT?, using INIT as the initial value of RESULT. It +is guaranteed to never traverse the same package twice." + (fold-module-public-variables* (lambda (module symbol var result) + (let ((object (variable-ref var))) + (if (and (package? object) (select? object)) + (proc module symbol object result) + result))) + init + modules)) + (define %package-cache-file ;; Location of the package cache. "/lib/guix/package.cache") @@ -297,6 +317,27 @@ decreasing version order." matching) matching))))) +(define find-packages-by-name*/direct ;bypass the cache + (let ((packages (delay + (fold-packages* (lambda (mod sym p r) + (vhash-cons (package-name p) (list mod sym p) r)) + vlist-null))) + (version>? (match-lambda* + (((_ _ versions) ..1) + (apply version>? (map package-version versions)))))) + (lambda* (name #:optional version) + "Return the list of ( ) with the given NAME. If + VERSION is not #f, then only return packages whose version is prefixed by + VERSION, sorted in decreasing version order." + (let ((matching (sort (vhash-fold* cons '() name (force packages)) + version>?))) + (if version + (filter (match-lambda + ((_ _ package) + (version-prefix? version (package-version package)))) + matching) + matching))))) + (define (cache-lookup cache name) "Lookup package NAME in CACHE. Return a list sorted in increasing version order." diff --git a/tests/packages.scm b/tests/packages.scm index 423c5061aa..9f02b0d5d2 100644 --- a/tests/packages.scm +++ b/tests/packages.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès ;;; Copyright © Jan (janneke) Nieuwenhuizen +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -1135,11 +1136,23 @@ (((? (cut eq? hello <>))) #t) (wrong (pk 'find-packages-by-name wrong #f)))) +(test-assert "find-packages-by-name*/direct" + (match (find-packages-by-name*/direct "hello") + ((((? (cut eq? (resolve-interface '(gnu packages base)) <>)) + (? (cut eq? 'hello <>)) + (? (cut eq? hello <>)))) #t))) + (test-assert "find-packages-by-name with version" (match (find-packages-by-name "hello" (package-version hello)) (((? (cut eq? hello <>))) #t) (wrong (pk 'find-packages-by-name wrong #f)))) +(test-assert "find-packages-by-name*/direct with version" + (match (find-packages-by-name*/direct "hello" (package-version hello)) + ((((? (cut eq? (resolve-interface '(gnu packages base)) <>)) + (? (cut eq? 'hello <>)) + (? (cut eq? hello <>)))) #t))) + (test-equal "find-packages-by-name with cache" (find-packages-by-name "guile") (call-with-temporary-directory -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 06 13:21:51 2019 Received: (at 38408) by debbugs.gnu.org; 6 Dec 2019 18:21:51 +0000 Received: from localhost ([127.0.0.1]:47030 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEg-00053Y-5A for submit@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:50 -0500 Received: from mx1.riseup.net ([198.252.153.129]:41866) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEd-00052n-45 for 38408@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:48 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47V1Bf4p0DzDrRH for <38408@debbugs.gnu.org>; Fri, 6 Dec 2019 10:21:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575656506; bh=eXiKp6xJqqFQPNzckywNUZngJI+P5LxkAMwTMvBbN2M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=i+Yf6qUdEZrgIIrRM30/Xntka+E7+Nh7QCRFLAmAdtwivotrEeBD2THTsakG+ZowN xgQyI17OmAwWIH0O7nFegXE8T2yIqj2+k9lM+tUOUM8Qi5ZlmZ/SY22+2E1Q59N4d+ cD60nlRSpqrgPmyUTkNTSKNdjD302qb2h9dDcln4= X-Riseup-User-ID: 9041C2E2D04DA28126AF8E936EA566DD23F20DF015BBBBB46601093772B2B41F Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47V1Bd6yJwz8tXp; Fri, 6 Dec 2019 10:21:45 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v3 2/5] gnu: added new procedure, recusive-import-semver Date: Fri, 6 Dec 2019 13:21:34 -0500 Message-Id: <18d8555e374e1d7682c5f7231be25dd572dacbf0.1575656092.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * gnu/packages.scm (recusive-import-semver): New Procedure * gnu/packages.scm (package->definition)[arguments]: New argument, "latest" * tests/import-utils.scm: tests for recusive-import-semver --- guix/import/utils.scm | 181 +++++++++++++++++++++++++++++++++++++++-- tests/import-utils.scm | 162 ++++++++++++++++++++++++++++++++++++ 2 files changed, 336 insertions(+), 7 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 4694b6e7ef..6932614f8e 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,6 +33,7 @@ #:use-module (guix discovery) #:use-module (guix build-system) #:use-module (guix gexp) + #:use-module (guix memoization) #:use-module (guix store) #:use-module (guix download) #:use-module (gnu packages) @@ -43,6 +45,8 @@ #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) #:use-module (srfi srfi-41) + #:use-module (semver) + #:use-module (semver ranges) #:export (factorize-uri flatten @@ -69,7 +73,8 @@ guix-name - recursive-import)) + recursive-import + recursive-import-semver)) (define (factorize-uri uri version) "Factorize URI, a package tarball URI as a string, such that any occurrences @@ -257,13 +262,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional (latest #t)) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if latest + name + (string-append name "-" version))) ,guix-package)))) (define (build-system-modules) @@ -414,3 +421,163 @@ dependencies." step ;; initial state (step initial-state))) + +(define* (recursive-import-semver #:key name + (version #f) + name->metadata + metadata->package + metadata-versions + package-dependencies + dependency-name + dependency-range + guix-name + make-sexp) + "Generates a stream of package expressions for the dependencies of the given +NAME and VERSION. The dependencies will be resolved using semantic versioning. +This procedure makes the assumption that most package repositories will, for a +given package provide some on that package that includes what +versions of the package that are available and a list of dependencies for each +version. Dependencies are assumed to be composed of a NAME, a semantic RANGE and +other data. + +This procedure takes the following keys: + NAME - The name of the package to import + VERSION - The version of the package to import + NAME->METADATA - A procedure that takes a NAME of a package and returns that +package's + METADATA->PACKAGE A procedure that takes a package's and VERSION +and returns the for the given VERSION + METADATA-VERSIONS A procedure that that takes a packages and +returns a list of version as strings that are available for the given package + PACKAGE-DEPENDENCIES a procedure that returns a list of given a + + DEPENDENCY-NAME A procedure that takes a and returns the its name + DEPENDENCY-RANGE A procedure that takes a and returns that +decency's range as a string + GUIX-NAME A procedure that take a NAME and returns the Guix version of it + MAKE-SEXP A procedure that takes , and a list of pairs +containing (EXPORT-NAME ), returning the package expression as an +s-expression" + (define mem-name->metadata (memoize name->metadata)) + + (define (latest? versions version) + (equal? (car versions) version)) + + (define (sorted-versions metadata) + (sort (metadata-versions metadata) version>?)) + + (define (name->versions name) + (sorted-versions (mem-name->metadata name))) + + (define (semver-range-contains-string? range version) + (semver-range-contains? range + (string->semver version))) + + (define (guix-export-name name version) + (let ((versions (name->versions name)) + (name (guix-name name))) + (if (latest? versions version) + name + (string-append name "-" version)))) + + ;; checks to see if we already defined or want to define a dep + (define (find-known name range known) + (match + (find + (match-lambda ((dep-name version) + (and + (string=? dep-name name) + (semver-range-contains-string? range version)))) + known) + + (#f #f) + ((name version) (list (guix-export-name name version) version #f))) + ) + + ;; searches searches for a package in guix + (define (find-locally name range) + (match + (find + (match-lambda ((_ _ package) + (semver-range-contains-string? + range + (package-version package)))) + (find-packages-by-name*/direct (guix-name name))) + (#f #f) + ((_ export-symbol package) (list + (symbol->string export-symbol) + (package-version package) #f)))) + + ;; searches for a package in some external repo + (define (find-remote name range) + (let* ((versions (name->versions name)) + (version (find + (lambda (ver) + (semver-range-contains-string? range ver)) + versions)) + (export-name (guix-export-name name version))) + `(,export-name ,version #t))) + + + (define (find-dep-version dep known-deps) + (let* ((name (dependency-name dep)) + (range (string->semver-range (dependency-range dep))) + (export-name-version-needed + (or (find-known name range known-deps) + (find-locally name range) + (find-remote name range)))) + `(,name ,@export-name-version-needed ,dep) + )) + + (define (make-package-definition name version known-deps) + (let* ((metadata (mem-name->metadata name)) + (versions (sorted-versions metadata)) + (package (metadata->package metadata version)) + (deps (map (lambda (dep) + (find-dep-version dep known-deps)) + (package-dependencies package))) + (sexp + (make-sexp metadata package + (map + (match-lambda ((_ export-symbol _ _ dep) + (list export-symbol dep))) + deps)))) + (values + (package->definition sexp (latest? versions version)) + (filter-map + (match-lambda ((name _ version need? dep) + (if need? + (list name version) + #f))) + deps)))) + + (define initial-state + (list #f + (list + ;; packages to find + (list name (if version + version + (car (name->versions name))))) + ;; packages that have been found + (list))) + + (define (step state) + (match state + ((prev ((next-name next-version) . rest) done) + (receive (package dependencies) + (make-package-definition next-name next-version + (append done rest `((,next-name ,next-version)))) + (list + package + (append rest dependencies) + (cons (list next-name next-version) done)))) + ((prev '() done) + (list #f '() done)))) + + (stream-unfold + ;; map: produce a stream element + (match-lambda ((latest queue done) latest)) + ;; predicate + (match-lambda ((latest queue done) latest)) + step + (step initial-state))) diff --git a/tests/import-utils.scm b/tests/import-utils.scm index c3ab25d788..4ed3a5e1da 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2016 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,6 +25,10 @@ #:use-module (guix packages) #:use-module (guix build-system) #:use-module (gnu packages) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-41) #:use-module (srfi srfi-64)) (test-begin "import-utils") @@ -120,4 +125,161 @@ ("license" . #f)))) (package-native-inputs (alist->package meta)))) +(define-record-type + (make-metadata name versions) + metadata? + (name metadata-name) + (versions metadata-versions)) + +(define-record-type + (make-package version dependencies) + package? + (version package-version) + (dependencies package-dependencies)) + +(define-record-type + (make-dependency name range) + dependency? + (name dependency-name) + (range dependency-range)) + +(define (metadata-semver-versions metadata) + (map (lambda (p) + (package-version p)) + (metadata-versions metadata))) + +(define (metadata->package metadata version) + (find + (lambda (package) + (equal? (package-version package) version)) + (metadata-versions metadata))) + +(define (make-sexp metadata package dependencies) + `(package + (name ,(guix-name (metadata-name metadata))) + (version ,(package-version package)) + (dependcies ,(map + (match-lambda ((public-name dep) + (list (guix-name (dependency-name dep)) public-name))) + dependencies)))) + +(define (guix-name name) + (string-append "test-" name)) + +(define packages + `(("no-deps" . (("1.0.0" . ()) ("0.1.0" . ()))) + ("one-dep" . (("1.0.0" . (("no-deps" "^1.0"))) + ("0.1.0" . (("no-deps" "^0.1.0"))))) + ("shared-dep" . (("1.0.0" . (("one-dep" "^0.1.0") + ("no-deps" "*"))))) + ("recursive" . (("1.0.0" . (("recursive" "=1.0.0"))))) + ("already-packaged" . (("1.0.0" . (("rust" "~1.28"))))))) + +(define (name->metadata name) + (let ((versions (assoc-ref packages name))) + (make-metadata name + (map + (match-lambda + ((version . deps) + (make-package version + (map + (lambda (name-range) + (apply make-dependency name-range)) + deps)))) + versions)))) + +(define* (test-recursive-importer name version #:optional (guix-name guix-name)) + (recursive-import-semver #:name name + #:version version + #:name->metadata name->metadata + #:metadata->package metadata->package + #:metadata-versions metadata-semver-versions + #:package-dependencies package-dependencies + #:dependency-name dependency-name + #:dependency-range dependency-range + #:guix-name guix-name + #:make-sexp make-sexp)) + +(test-equal "recursive import test with no dependencies" + `((define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "no-deps" "1.0.0"))) + +(test-equal "recursive import test with one dependencies" + `((define-public test-one-dep + (package + (name "test-one-dep") + (version "1.0.0") + (dependcies (("test-no-deps" "test-no-deps"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "1.0.0"))) + +(test-equal "recursive import test with recursuve dependencies" + `((define-public test-recursive + (package + (name "test-recursive") + (version "1.0.0") + (dependcies (("test-recursive" "test-recursive")))))) + (stream->list (test-recursive-importer "recursive" "1.0.0"))) + +(test-equal "recursive import test with no dependencies using an old version" + `((define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies ())))) + (stream->list (test-recursive-importer "no-deps" "0.1.0"))) + +(test-equal "recursive import test with one dependencies unsing an old version" + `((define-public test-one-dep-0.1.0 + (package + (name "test-one-dep") + (version "0.1.0") + (dependcies (("test-no-deps" "test-no-deps-0.1.0"))))) + (define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "0.1.0"))) + +(test-equal "recursive import test with with dependency that is already in the repo" + `((define-public test-already-packaged + (package (name "test-already-packaged") + (version "1.0.0") + (dependcies + (("test-rust" "rust-1.28")))))) + (stream->list (test-recursive-importer "already-packaged" "1.0.0" identity))) + +(test-equal "shared dependencies" + `((define-public test-shared-dep + (package + (name "test-shared-dep") + (version "1.0.0") + (dependcies (("test-one-dep" "test-one-dep-0.1.0") + ("test-no-deps" "test-no-deps"))))) + (define-public test-one-dep-0.1.0 + (package + (name "test-one-dep") + (version "0.1.0") + (dependcies (("test-no-deps" "test-no-deps-0.1.0"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ()))) + (define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies())))) + (stream->list (test-recursive-importer "shared-dep" "1.0.0"))) + (test-end "import-utils") -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 06 13:21:52 2019 Received: (at 38408) by debbugs.gnu.org; 6 Dec 2019 18:21:52 +0000 Received: from localhost ([127.0.0.1]:47032 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEi-00053m-1P for submit@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:52 -0500 Received: from mx1.riseup.net ([198.252.153.129]:41876) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEd-00052u-Q3 for 38408@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:48 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47V1Bg2yg8zFcpd for <38408@debbugs.gnu.org>; Fri, 6 Dec 2019 10:21:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575656507; bh=/mXFFri2VLK/k5oza9VQ6xurOa3MksoTDnW4B/KLRgU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UAKf/q95ZXqhWRgVOje3GYhgT1LCO1xxI7j1BhvD698VMsskcJf5cVrQA75wvVWNs /uWbMO86XIAMgV+uayqpxUX5dN1tgLdUFyxCbeX/LKvA6AR1X8D/KA2KKXripiOCfZ GHcx3WD95SmRMMD5uMYhAp+k2Ctm/uPaTLPJ12AI= X-Riseup-User-ID: C46F093E526AEA372FF0A0C87EDB9D310FCDA19AB3B7A5CE8AE047D4B3A0061F Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47V1Bf5xncz8tXp; Fri, 6 Dec 2019 10:21:46 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v3 3/5] Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. Date: Fri, 6 Dec 2019 13:21:35 -0500 Message-Id: <7cccd4231b9c1327d59ff39daf2aa7dd47a2e765.1575656092.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (make-crate-sexp): Use as args * guix/import/crate.scm (crate->crate-version): New Procedure * guix/import/crate.scm (crate->versions): New Procedure * guix/import/crate.scm (crate-recursive-import): Updated to user recursive-import-semver * guix/scripts/import/crate.scm (guix-import-crate): Remove `define-public` generation from UI * guix/tests/crate.scm: Updated tests --- guix/import/crate.scm | 165 ++++++++++++++++++---------------- guix/scripts/import/crate.scm | 9 +- tests/crate.scm | 2 +- 3 files changed, 91 insertions(+), 85 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 8dc014d232..da92c43b8c 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name crate-recursive-import @@ -85,7 +86,7 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string @@ -111,7 +112,9 @@ record or #f if it was not found." (url (string-append (%crate-base-url) path))) (match (assoc-ref (or (json-fetch url) '()) "dependencies") ((? vector? vector) - (map json->crate-dependency (vector->list vector))) + (filter (lambda (dep) + (not (eq? (crate-dependency-kind dep) 'dev))) + (map json->crate-dependency (vector->list vector)))) (_ '())))) @@ -141,62 +144,84 @@ record or #f if it was not found." ((args ...) `((arguments (,'quasiquote ,args)))))) -(define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) - "Return the `package' s-expression for a rust package with the given NAME, -VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, -and LICENSE." - (let* ((port (http-fetch (crate-uri name version))) +(define (make-crate-sexp crate version* dependencies) + "Return the `package' s-expression for a rust package given , + and a list of " + (define normal-dependency? + (match-lambda ((_ dep) (not (eq? (crate-dependency-kind dep) 'dev))))) + + (define (string->license string) + (match (regexp-exec %dual-license-rx string) + (#f (list (spdx-string->license string))) + (m (list (spdx-string->license (match:substring m 1)) + (spdx-string->license (match:substring m 2)))))) + + (let* ((dep-crates dev-dep-crates (partition normal-dependency? dependencies)) + (cargo-inputs (sort (unzip1 dep-crates) + string-ci (crate-version-license version*) + string->license)) + (port (http-fetch (crate-uri name version)) ) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) (pkg `(package - (name ,guix-name) - (version ,version) - (source (origin - (method url-fetch) - (uri (crate-uri ,name version)) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 - (base32 - ,(bytevector->nix-base32-string (port-sha256 port)))))) - (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) - (maybe-cargo-development-inputs - cargo-development-inputs))) - (home-page ,(match home-page - (() "") - (_ home-page))) - (synopsis ,synopsis) - (description ,(beautify-description description)) - (license ,(match license - (() #f) - ((license) license) - (_ `(list ,@license))))))) - (close-port port) - pkg)) + (name ,guix-name) + (version ,version) + (source (origin + (method url-fetch) + (uri (crate-uri ,name version)) + (file-name (string-append name "-" version ".crate")) + (sha256 + (base32 + ,(bytevector->nix-base32-string (port-sha256 port)))))) + (build-system cargo-build-system) + ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + (maybe-cargo-development-inputs + cargo-development-inputs))) + (home-page ,(match home-page + (() "") + (_ home-page))) + (synopsis ,synopsis) + (description ,(beautify-description description)) + (license ,(match license + (() #f) + ((license) license) + (_ `(list ,@license))))))) + + (close-port port) + pkg)) (define %dual-license-rx ;; Dual licensing is represented by a string such as "MIT OR Apache-2.0". ;; This regexp matches that. (make-regexp "^(.*) OR (.*)$")) +(define (crate->crate-version crate version-number) + "returns the for a given CRATE and VERSION-NUMBER" + (find (lambda (version) + (string=? (crate-version-number version) + version-number)) + (crate-versions crate))) + +(define (crate->versions crate) + "Returns a list of versions for a given CRATE" + (map (lambda (version) + (crate-version-number version)) + (crate-versions crate))) + (define* (crate->guix-package crate-name #:optional version) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." - (define (string->license string) - (match (regexp-exec %dual-license-rx string) - (#f (list (spdx-string->license string))) - (m (list (spdx-string->license (match:substring m 1)) - (spdx-string->license (match:substring m 2)))))) - - (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) - (define crate (lookup-crate crate-name)) @@ -205,38 +230,27 @@ latest version of CRATE-NAME." (crate-latest-version crate))) (define version* - (find (lambda (version) - (string=? (crate-version-number version) - version-number)) - (crate-versions crate))) + (crate->crate-version crate version-number)) - (and crate version* - (let* ((dependencies (crate-version-dependencies version*)) - (dep-crates (filter normal-dependency? dependencies)) - (dev-dep-crates (remove normal-dependency? dependencies)) - (cargo-inputs (sort (map crate-dependency-id dep-crates) - string-ci (crate-version-license version*) - string->license)) - (append cargo-inputs cargo-development-inputs))))) + (define dependencies (map + (lambda (dep) + (list (crate-name->package-name + (crate-dependency-id dep)) dep)) + (crate-version-dependencies version*))) + (make-crate-sexp crate version* dependencies)) -(define (crate-recursive-import crate-name) - (recursive-import crate-name #f - #:repo->guix-package (lambda (name repo) - (crate->guix-package name)) - #:guix-name crate-name->package-name)) +(define* (crate-recursive-import name #:optional version) + (recursive-import-semver + #:name name + #:version version + #:name->metadata lookup-crate + #:metadata->package crate->crate-version + #:metadata-versions crate->versions + #:package-dependencies crate-version-dependencies + #:dependency-name crate-dependency-id + #:dependency-range crate-dependency-requirement + #:guix-name crate-name->package-name + #:make-sexp make-crate-sexp)) (define (guix-package->crate-name package) "Return the crate name of PACKAGE." @@ -285,4 +299,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 4690cceb4d..85ae6fbe59 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,14 +96,7 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (reverse - (stream->list - (crate-recursive-import name)))) + (stream->list (crate-recursive-import name version)) (let ((sexp (crate->guix-package name version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") diff --git a/tests/crate.scm b/tests/crate.scm index c14862ad9f..b77cbb08c6 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -95,7 +95,7 @@ ('source ('origin ('method 'url-fetch) ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) + ('file-name ('string-append 'name "-" 'version ".crate")) ('sha256 ('base32 (? string? hash))))) -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 06 13:21:53 2019 Received: (at 38408) by debbugs.gnu.org; 6 Dec 2019 18:21:53 +0000 Received: from localhost ([127.0.0.1]:47034 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEi-00053q-Mp for submit@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:52 -0500 Received: from mx1.riseup.net ([198.252.153.129]:41892) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEe-000536-Gd for 38408@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:48 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47V1Bh10kwzFcqf for <38408@debbugs.gnu.org>; Fri, 6 Dec 2019 10:21:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575656508; bh=dCIdzcohllKhuGZdXzOmICN0KPZQt8uvs6Lpd8lm9oE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KT/PaKke41+1QX9KUifRcCFfrY6q8QDwB6aw3ub6uvvlgxTv6pRckaIJd1GoHm/Vx T+pUBlXZXLOdncGbLGFlyCgOU82haFQ/hrKxpYUdKaKBWQiOtHtOI/d61IczJGLuXD GxWWPKbMpNj1EGMLmSraTn4rH44v9oBopf82JPEA= X-Riseup-User-ID: BEE56343BFF31AA3425503BF1F4D995DB9C329AB77454A685D9B34C484F5A1D6 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47V1Bg4Fc3z8tXp; Fri, 6 Dec 2019 10:21:47 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v3 4/5] added "#:skip-build? #t" to the output of (make-crate-sexp). Most the the packages imported will be libaries and won't need to build. The top level package will build them though. Date: Fri, 6 Dec 2019 13:21:36 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (make-crate-sexp): added "#:skip-build? #t" to the output --- guix/import/crate.scm | 3 ++- tests/crate.scm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index da92c43b8c..5683369b7a 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -183,7 +183,8 @@ record or #f if it was not found." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append `(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) (home-page ,(match home-page diff --git a/tests/crate.scm b/tests/crate.scm index b77cbb08c6..64e5b6932e 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -102,7 +102,8 @@ ('build-system 'cargo-build-system) ('arguments ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) + ('#:skip-build? #t + #:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) ('home-page "http://example.com") ('synopsis "summary") ('description "summary") -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 06 13:21:53 2019 Received: (at 38408) by debbugs.gnu.org; 6 Dec 2019 18:21:53 +0000 Received: from localhost ([127.0.0.1]:47036 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEi-00053x-Vt for submit@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:53 -0500 Received: from mx1.riseup.net ([198.252.153.129]:41896) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1idIEf-00053I-7e for 38408@debbugs.gnu.org; Fri, 06 Dec 2019 13:21:49 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47V1Bh69HXzDt64 for <38408@debbugs.gnu.org>; Fri, 6 Dec 2019 10:21:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1575656508; bh=s7kVPwUcU8b/+mRMpysYnE5JwybAezSwWf79j/xYYaU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AJkOo2HDM7xQMLOxnW1bWgB5d7Sb0gFoAWnTNTHmJYfglxb97YahbM8n7v7jBneeV NmiU5m7B2NtAVyG4R481v5bLSYbYMyG306nD71hsADs90hf4B70F3Uk5Qd3TwTnlQx fIDcRVFA+/ulPT71aZnfRIEkrR+aCXVs1V99vb+c= X-Riseup-User-ID: 435AD2D2182CCCFD11D5C5BC508140666D027EB730C5BA66DF2CC9D4C9AFEE1F Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47V1Bh2KPlz8syM; Fri, 6 Dec 2019 10:21:48 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v3 5/5] guix: crate: Depublicated dependencies Date: Fri, 6 Dec 2019 13:21:37 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm: (crate-version-dependencies): dedup deps --- guix/import/crate.scm | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 5683369b7a..f3c36ba516 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -109,14 +109,26 @@ record or #f if it was not found." "Return the list of records of VERSION, a ." (let* ((path (assoc-ref (crate-version-links version) "dependencies")) - (url (string-append (%crate-base-url) path))) - (match (assoc-ref (or (json-fetch url) '()) "dependencies") - ((? vector? vector) - (filter (lambda (dep) - (not (eq? (crate-dependency-kind dep) 'dev))) - (map json->crate-dependency (vector->list vector)))) - (_ - '())))) + (url (string-append (%crate-base-url) path)) + (deps-list (match (assoc-ref (or (json-fetch url) '()) "dependencies") + ((? vector? vector) (vector->list vector)) + (_ + '()))) + ;; turn the raw list into 's and remove dev depenedencies + (deps (filter-map (lambda (json) + (let ((dep (json->crate-dependency json))) + (if (eq? (crate-dependency-kind dep) 'dev) + #f + dep))) + deps-list)) + ;; split normal and build dependencies + (deps-normal deps-build (partition (lambda (dep) + (eq? (crate-dependency-kind dep) 'normal)) + deps))) + ;;remove duplicate normal and build dependencies + (lset-union (lambda (a b) + (string= (crate-dependency-id a) (crate-dependency-id a))) + deps-normal deps-build))) ;;; -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Dec 10 14:23:55 2019 Received: (at 38408) by debbugs.gnu.org; 10 Dec 2019 19:23:55 +0000 Received: from localhost ([127.0.0.1]:56610 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6w-00051o-Ku for submit@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:54 -0500 Received: from mx1.riseup.net ([198.252.153.129]:33786) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6u-00051W-Oy for 38408@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:53 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47XVNS180bzDrl5 for <38408@debbugs.gnu.org>; Tue, 10 Dec 2019 11:23:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576005832; bh=ZoklI5dexPMCFIeRBZ0eJD6frbPPqbBy4rlmhMuE8ww=; h=From:To:Cc:Subject:Date:From; b=a8sXYY1BYPnaIQDGtHPcL32qciSicvdL+xfkOVOxFC01WymGulnXl6fV0HpL3AVQD cSBoIk22HIyVZIDJ5Hkoj7z4u/2axxbhpwYGV5zwyc7OoY+TpHKRjmC5P5g5bVbtsW levbowo63HPEDoldofFp0uGddtoYwRB5xYEf0uB4= X-Riseup-User-ID: 8FED6D3C44707E576349FA1B1499C448CFE153A06C10AE2E73EB0E7C4B53DBFB Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47XVNR3rkvz8tf0; Tue, 10 Dec 2019 11:23:51 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v4 0/6] Semantic version aware recusive importer for crates Date: Tue, 10 Dec 2019 14:23:37 -0500 Message-Id: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Guix, This version adds a feature. You can an import a crate using a semantive version range. ie. "guix import crate -r ripgrep@^1". Let me know if you have any suggetions or stuff to fix on this patch! Thanks. -Martin Martin Becze (6): gnu: added new function, find-packages-by-name*/direct gnu: added new procedure, recusive-import-semver Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. added "#:skip-build? #t" to the output of (make-crate-sexp). Most the the packages imported will be libaries and won't need to build. The top level package will build them though. guix: crate: Depublicated dependencies guix: import: recursive-import-semver: allow the range of a package to be specified when begining import. gnu/packages.scm | 41 ++++++++ guix/import/crate.scm | 186 +++++++++++++++++--------------- guix/import/utils.scm | 192 ++++++++++++++++++++++++++++++++-- guix/scripts/import/crate.scm | 9 +- tests/crate.scm | 5 +- tests/import-utils.scm | 175 +++++++++++++++++++++++++++++++ tests/packages.scm | 13 +++ 7 files changed, 522 insertions(+), 99 deletions(-) -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Dec 10 14:23:56 2019 Received: (at 38408) by debbugs.gnu.org; 10 Dec 2019 19:23:56 +0000 Received: from localhost ([127.0.0.1]:56613 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6x-00051q-08 for submit@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:56 -0500 Received: from mx1.riseup.net ([198.252.153.129]:33798) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6v-00051X-5Y for 38408@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:53 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47XVNS5ZqrzDskM for <38408@debbugs.gnu.org>; Tue, 10 Dec 2019 11:23:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576005832; bh=chL81QND2PvQrUFrNgy/ahQ3nrmiGlgQD4PnAhtyUtw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WijvdIvv3kwlcBTBI5F+2bGq+I6vkCOQ7r+KQn+bhaFTo4ms1w8O3EUujkhrmV8Cc VL1ffYkRn8sTnE57qz7Z0XeR2UHpOCsz2j3W7iqXfHo8873gfO6mpR2GQ1rzAAIzBb 8pj6+duQ+UAHjgCyN4t0qQHZBnXyFHnJFo6PSO3w= X-Riseup-User-ID: F430FA845320D7C81A5E8FCB26542D667EACE6DACF2FAA94B9382A6EC0798320 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47XVNS1pytz8tf0; Tue, 10 Dec 2019 11:23:52 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v4 1/6] gnu: added new function, find-packages-by-name*/direct Date: Tue, 10 Dec 2019 14:23:38 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * gnu/packages.scm (find-packages-by-naem*/direct) --- gnu/packages.scm | 41 +++++++++++++++++++++++++++++++++++++++++ tests/packages.scm | 13 +++++++++++++ 2 files changed, 54 insertions(+) diff --git a/gnu/packages.scm b/gnu/packages.scm index 959777ff8f..cca2a393e5 100644 --- a/gnu/packages.scm +++ b/gnu/packages.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2016, 2017 Alex Kost ;;; Copyright © 2016 Mathieu Lirzin +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -52,7 +53,9 @@ %default-package-module-path fold-packages + fold-packages* fold-available-packages + find-packages-by-name*/direct find-newest-available-packages find-packages-by-name @@ -250,6 +253,23 @@ is guaranteed to never traverse the same package twice." init modules)) +(define* (fold-packages* proc init + #:optional + (modules (all-modules (%package-module-path) + #:warn + warn-about-load-error)) + #:key (select? (negate hidden-package?))) + "Call (PROC PACKAGE RESULT) for each available package defined in one of +MODULES that matches SELECT?, using INIT as the initial value of RESULT. It +is guaranteed to never traverse the same package twice." + (fold-module-public-variables* (lambda (module symbol var result) + (let ((object (variable-ref var))) + (if (and (package? object) (select? object)) + (proc module symbol object result) + result))) + init + modules)) + (define %package-cache-file ;; Location of the package cache. "/lib/guix/package.cache") @@ -297,6 +317,27 @@ decreasing version order." matching) matching))))) +(define find-packages-by-name*/direct ;bypass the cache + (let ((packages (delay + (fold-packages* (lambda (mod sym p r) + (vhash-cons (package-name p) (list mod sym p) r)) + vlist-null))) + (version>? (match-lambda* + (((_ _ versions) ..1) + (apply version>? (map package-version versions)))))) + (lambda* (name #:optional version) + "Return the list of ( ) with the given NAME. If + VERSION is not #f, then only return packages whose version is prefixed by + VERSION, sorted in decreasing version order." + (let ((matching (sort (vhash-fold* cons '() name (force packages)) + version>?))) + (if version + (filter (match-lambda + ((_ _ package) + (version-prefix? version (package-version package)))) + matching) + matching))))) + (define (cache-lookup cache name) "Lookup package NAME in CACHE. Return a list sorted in increasing version order." diff --git a/tests/packages.scm b/tests/packages.scm index 423c5061aa..9f02b0d5d2 100644 --- a/tests/packages.scm +++ b/tests/packages.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès ;;; Copyright © Jan (janneke) Nieuwenhuizen +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -1135,11 +1136,23 @@ (((? (cut eq? hello <>))) #t) (wrong (pk 'find-packages-by-name wrong #f)))) +(test-assert "find-packages-by-name*/direct" + (match (find-packages-by-name*/direct "hello") + ((((? (cut eq? (resolve-interface '(gnu packages base)) <>)) + (? (cut eq? 'hello <>)) + (? (cut eq? hello <>)))) #t))) + (test-assert "find-packages-by-name with version" (match (find-packages-by-name "hello" (package-version hello)) (((? (cut eq? hello <>))) #t) (wrong (pk 'find-packages-by-name wrong #f)))) +(test-assert "find-packages-by-name*/direct with version" + (match (find-packages-by-name*/direct "hello" (package-version hello)) + ((((? (cut eq? (resolve-interface '(gnu packages base)) <>)) + (? (cut eq? 'hello <>)) + (? (cut eq? hello <>)))) #t))) + (test-equal "find-packages-by-name with cache" (find-packages-by-name "guile") (call-with-temporary-directory -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Dec 10 14:23:59 2019 Received: (at 38408) by debbugs.gnu.org; 10 Dec 2019 19:23:59 +0000 Received: from localhost ([127.0.0.1]:56618 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel70-00052Z-7y for submit@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:58 -0500 Received: from mx1.riseup.net ([198.252.153.129]:33802) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6w-00051k-18 for 38408@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:55 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47XVNT4M34zDrSN for <38408@debbugs.gnu.org>; Tue, 10 Dec 2019 11:23:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576005833; bh=eXiKp6xJqqFQPNzckywNUZngJI+P5LxkAMwTMvBbN2M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lQ6LFiEZn2mJAGZyg4g8ktipt7BXghlnRg67DZZEx4wDpQpqxPlib/Lg185YGInOx kn535CQpk+2CBUTq/oOled/pH651Lw87lU5l7dE4mQ9l+BfS+XlfiF8tGYNmN3cvi2 ef8BgFypDpGFwPygfZhSZm7me1qjAaj/spI72Wss= X-Riseup-User-ID: C3DDF74077128BA96329853B72F51A3584534BF3E5A6A39CF09E8CF50DB3919B Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47XVNS6sDCz8tf0; Tue, 10 Dec 2019 11:23:52 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v4 2/6] gnu: added new procedure, recusive-import-semver Date: Tue, 10 Dec 2019 14:23:39 -0500 Message-Id: <5b82d5ab2c9d579d279db055b8f12509587234fa.1576005195.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * gnu/packages.scm (recusive-import-semver): New Procedure * gnu/packages.scm (package->definition)[arguments]: New argument, "latest" * tests/import-utils.scm: tests for recusive-import-semver --- guix/import/utils.scm | 181 +++++++++++++++++++++++++++++++++++++++-- tests/import-utils.scm | 162 ++++++++++++++++++++++++++++++++++++ 2 files changed, 336 insertions(+), 7 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 4694b6e7ef..6932614f8e 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,6 +33,7 @@ #:use-module (guix discovery) #:use-module (guix build-system) #:use-module (guix gexp) + #:use-module (guix memoization) #:use-module (guix store) #:use-module (guix download) #:use-module (gnu packages) @@ -43,6 +45,8 @@ #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) #:use-module (srfi srfi-41) + #:use-module (semver) + #:use-module (semver ranges) #:export (factorize-uri flatten @@ -69,7 +73,8 @@ guix-name - recursive-import)) + recursive-import + recursive-import-semver)) (define (factorize-uri uri version) "Factorize URI, a package tarball URI as a string, such that any occurrences @@ -257,13 +262,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional (latest #t)) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if latest + name + (string-append name "-" version))) ,guix-package)))) (define (build-system-modules) @@ -414,3 +421,163 @@ dependencies." step ;; initial state (step initial-state))) + +(define* (recursive-import-semver #:key name + (version #f) + name->metadata + metadata->package + metadata-versions + package-dependencies + dependency-name + dependency-range + guix-name + make-sexp) + "Generates a stream of package expressions for the dependencies of the given +NAME and VERSION. The dependencies will be resolved using semantic versioning. +This procedure makes the assumption that most package repositories will, for a +given package provide some on that package that includes what +versions of the package that are available and a list of dependencies for each +version. Dependencies are assumed to be composed of a NAME, a semantic RANGE and +other data. + +This procedure takes the following keys: + NAME - The name of the package to import + VERSION - The version of the package to import + NAME->METADATA - A procedure that takes a NAME of a package and returns that +package's + METADATA->PACKAGE A procedure that takes a package's and VERSION +and returns the for the given VERSION + METADATA-VERSIONS A procedure that that takes a packages and +returns a list of version as strings that are available for the given package + PACKAGE-DEPENDENCIES a procedure that returns a list of given a + + DEPENDENCY-NAME A procedure that takes a and returns the its name + DEPENDENCY-RANGE A procedure that takes a and returns that +decency's range as a string + GUIX-NAME A procedure that take a NAME and returns the Guix version of it + MAKE-SEXP A procedure that takes , and a list of pairs +containing (EXPORT-NAME ), returning the package expression as an +s-expression" + (define mem-name->metadata (memoize name->metadata)) + + (define (latest? versions version) + (equal? (car versions) version)) + + (define (sorted-versions metadata) + (sort (metadata-versions metadata) version>?)) + + (define (name->versions name) + (sorted-versions (mem-name->metadata name))) + + (define (semver-range-contains-string? range version) + (semver-range-contains? range + (string->semver version))) + + (define (guix-export-name name version) + (let ((versions (name->versions name)) + (name (guix-name name))) + (if (latest? versions version) + name + (string-append name "-" version)))) + + ;; checks to see if we already defined or want to define a dep + (define (find-known name range known) + (match + (find + (match-lambda ((dep-name version) + (and + (string=? dep-name name) + (semver-range-contains-string? range version)))) + known) + + (#f #f) + ((name version) (list (guix-export-name name version) version #f))) + ) + + ;; searches searches for a package in guix + (define (find-locally name range) + (match + (find + (match-lambda ((_ _ package) + (semver-range-contains-string? + range + (package-version package)))) + (find-packages-by-name*/direct (guix-name name))) + (#f #f) + ((_ export-symbol package) (list + (symbol->string export-symbol) + (package-version package) #f)))) + + ;; searches for a package in some external repo + (define (find-remote name range) + (let* ((versions (name->versions name)) + (version (find + (lambda (ver) + (semver-range-contains-string? range ver)) + versions)) + (export-name (guix-export-name name version))) + `(,export-name ,version #t))) + + + (define (find-dep-version dep known-deps) + (let* ((name (dependency-name dep)) + (range (string->semver-range (dependency-range dep))) + (export-name-version-needed + (or (find-known name range known-deps) + (find-locally name range) + (find-remote name range)))) + `(,name ,@export-name-version-needed ,dep) + )) + + (define (make-package-definition name version known-deps) + (let* ((metadata (mem-name->metadata name)) + (versions (sorted-versions metadata)) + (package (metadata->package metadata version)) + (deps (map (lambda (dep) + (find-dep-version dep known-deps)) + (package-dependencies package))) + (sexp + (make-sexp metadata package + (map + (match-lambda ((_ export-symbol _ _ dep) + (list export-symbol dep))) + deps)))) + (values + (package->definition sexp (latest? versions version)) + (filter-map + (match-lambda ((name _ version need? dep) + (if need? + (list name version) + #f))) + deps)))) + + (define initial-state + (list #f + (list + ;; packages to find + (list name (if version + version + (car (name->versions name))))) + ;; packages that have been found + (list))) + + (define (step state) + (match state + ((prev ((next-name next-version) . rest) done) + (receive (package dependencies) + (make-package-definition next-name next-version + (append done rest `((,next-name ,next-version)))) + (list + package + (append rest dependencies) + (cons (list next-name next-version) done)))) + ((prev '() done) + (list #f '() done)))) + + (stream-unfold + ;; map: produce a stream element + (match-lambda ((latest queue done) latest)) + ;; predicate + (match-lambda ((latest queue done) latest)) + step + (step initial-state))) diff --git a/tests/import-utils.scm b/tests/import-utils.scm index c3ab25d788..4ed3a5e1da 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2016 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,6 +25,10 @@ #:use-module (guix packages) #:use-module (guix build-system) #:use-module (gnu packages) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-41) #:use-module (srfi srfi-64)) (test-begin "import-utils") @@ -120,4 +125,161 @@ ("license" . #f)))) (package-native-inputs (alist->package meta)))) +(define-record-type + (make-metadata name versions) + metadata? + (name metadata-name) + (versions metadata-versions)) + +(define-record-type + (make-package version dependencies) + package? + (version package-version) + (dependencies package-dependencies)) + +(define-record-type + (make-dependency name range) + dependency? + (name dependency-name) + (range dependency-range)) + +(define (metadata-semver-versions metadata) + (map (lambda (p) + (package-version p)) + (metadata-versions metadata))) + +(define (metadata->package metadata version) + (find + (lambda (package) + (equal? (package-version package) version)) + (metadata-versions metadata))) + +(define (make-sexp metadata package dependencies) + `(package + (name ,(guix-name (metadata-name metadata))) + (version ,(package-version package)) + (dependcies ,(map + (match-lambda ((public-name dep) + (list (guix-name (dependency-name dep)) public-name))) + dependencies)))) + +(define (guix-name name) + (string-append "test-" name)) + +(define packages + `(("no-deps" . (("1.0.0" . ()) ("0.1.0" . ()))) + ("one-dep" . (("1.0.0" . (("no-deps" "^1.0"))) + ("0.1.0" . (("no-deps" "^0.1.0"))))) + ("shared-dep" . (("1.0.0" . (("one-dep" "^0.1.0") + ("no-deps" "*"))))) + ("recursive" . (("1.0.0" . (("recursive" "=1.0.0"))))) + ("already-packaged" . (("1.0.0" . (("rust" "~1.28"))))))) + +(define (name->metadata name) + (let ((versions (assoc-ref packages name))) + (make-metadata name + (map + (match-lambda + ((version . deps) + (make-package version + (map + (lambda (name-range) + (apply make-dependency name-range)) + deps)))) + versions)))) + +(define* (test-recursive-importer name version #:optional (guix-name guix-name)) + (recursive-import-semver #:name name + #:version version + #:name->metadata name->metadata + #:metadata->package metadata->package + #:metadata-versions metadata-semver-versions + #:package-dependencies package-dependencies + #:dependency-name dependency-name + #:dependency-range dependency-range + #:guix-name guix-name + #:make-sexp make-sexp)) + +(test-equal "recursive import test with no dependencies" + `((define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "no-deps" "1.0.0"))) + +(test-equal "recursive import test with one dependencies" + `((define-public test-one-dep + (package + (name "test-one-dep") + (version "1.0.0") + (dependcies (("test-no-deps" "test-no-deps"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "1.0.0"))) + +(test-equal "recursive import test with recursuve dependencies" + `((define-public test-recursive + (package + (name "test-recursive") + (version "1.0.0") + (dependcies (("test-recursive" "test-recursive")))))) + (stream->list (test-recursive-importer "recursive" "1.0.0"))) + +(test-equal "recursive import test with no dependencies using an old version" + `((define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies ())))) + (stream->list (test-recursive-importer "no-deps" "0.1.0"))) + +(test-equal "recursive import test with one dependencies unsing an old version" + `((define-public test-one-dep-0.1.0 + (package + (name "test-one-dep") + (version "0.1.0") + (dependcies (("test-no-deps" "test-no-deps-0.1.0"))))) + (define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "0.1.0"))) + +(test-equal "recursive import test with with dependency that is already in the repo" + `((define-public test-already-packaged + (package (name "test-already-packaged") + (version "1.0.0") + (dependcies + (("test-rust" "rust-1.28")))))) + (stream->list (test-recursive-importer "already-packaged" "1.0.0" identity))) + +(test-equal "shared dependencies" + `((define-public test-shared-dep + (package + (name "test-shared-dep") + (version "1.0.0") + (dependcies (("test-one-dep" "test-one-dep-0.1.0") + ("test-no-deps" "test-no-deps"))))) + (define-public test-one-dep-0.1.0 + (package + (name "test-one-dep") + (version "0.1.0") + (dependcies (("test-no-deps" "test-no-deps-0.1.0"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ()))) + (define-public test-no-deps-0.1.0 + (package + (name "test-no-deps") + (version "0.1.0") + (dependcies())))) + (stream->list (test-recursive-importer "shared-dep" "1.0.0"))) + (test-end "import-utils") -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Dec 10 14:23:59 2019 Received: (at 38408) by debbugs.gnu.org; 10 Dec 2019 19:23:59 +0000 Received: from localhost ([127.0.0.1]:56620 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel70-00052c-Vr for submit@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:59 -0500 Received: from mx1.riseup.net ([198.252.153.129]:33808) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6x-00051y-Fe for 38408@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:56 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47XVNW0sxrzDvlM for <38408@debbugs.gnu.org>; Tue, 10 Dec 2019 11:23:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576005835; bh=dCIdzcohllKhuGZdXzOmICN0KPZQt8uvs6Lpd8lm9oE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aDQW36tqwtEfOPc77alQ2DsLWA3UOSrp1un30zE9RUU9aItDk/tY0mE14Mxv3Hmb9 7dyQjTb2YwxCxQy8ORWZjRK56TbywVCdoSopUX80IyYg3jnYsi8DusrLZjn+0T7MrH cMbtqnzlvKYllh7+7C/IgMl2VRuKBkuCwxGJziQY= X-Riseup-User-ID: 05231D55CF0E0F851789ED7C563B3F2A43C0135251D1DB33CAD41DB49144B579 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47XVNV3kWjz8tf0; Tue, 10 Dec 2019 11:23:54 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v4 4/6] added "#:skip-build? #t" to the output of (make-crate-sexp). Most the the packages imported will be libaries and won't need to build. The top level package will build them though. Date: Tue, 10 Dec 2019 14:23:41 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (make-crate-sexp): added "#:skip-build? #t" to the output --- guix/import/crate.scm | 3 ++- tests/crate.scm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index da92c43b8c..5683369b7a 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -183,7 +183,8 @@ record or #f if it was not found." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append `(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) (home-page ,(match home-page diff --git a/tests/crate.scm b/tests/crate.scm index b77cbb08c6..64e5b6932e 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -102,7 +102,8 @@ ('build-system 'cargo-build-system) ('arguments ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) + ('#:skip-build? #t + #:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) ('home-page "http://example.com") ('synopsis "summary") ('description "summary") -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Dec 10 14:24:00 2019 Received: (at 38408) by debbugs.gnu.org; 10 Dec 2019 19:24:00 +0000 Received: from localhost ([127.0.0.1]:56622 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel71-00052j-BT for submit@debbugs.gnu.org; Tue, 10 Dec 2019 14:24:00 -0500 Received: from mx1.riseup.net ([198.252.153.129]:33806) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6w-00051n-PL for 38408@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:56 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47XVNV2hXFzDrl5 for <38408@debbugs.gnu.org>; Tue, 10 Dec 2019 11:23:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576005834; bh=/mXFFri2VLK/k5oza9VQ6xurOa3MksoTDnW4B/KLRgU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mT3sbrhT+xwXRx09cggjuafyha8rkrOp4YgAngxnX4D6Pw8GY1MaY/rQIF3WRZ+uG E43OtK95QDGdfaPaGEvMVEMlZ+nWSWCSuXyyZv/MOh/4mCfDwLjf+vyexrEdnAgzQE tylTmhpeo6/5cp0Yttnyl0hlp9x+kIyKDO+0fkmM= X-Riseup-User-ID: 3BCCA71FB63E8403BDB2060D723A700522C59624DACE8E039B0A1A1F4BE39B59 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47XVNT5W3wz8tf0; Tue, 10 Dec 2019 11:23:53 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v4 3/6] Rewrote some of guix/import/crate.scm to use recursive-import-semver and updated script and test. Date: Tue, 10 Dec 2019 14:23:40 -0500 Message-Id: <583af30cbbd946af96c7f9cb856df9d1170287c7.1576005195.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (make-crate-sexp): Use as args * guix/import/crate.scm (crate->crate-version): New Procedure * guix/import/crate.scm (crate->versions): New Procedure * guix/import/crate.scm (crate-recursive-import): Updated to user recursive-import-semver * guix/scripts/import/crate.scm (guix-import-crate): Remove `define-public` generation from UI * guix/tests/crate.scm: Updated tests --- guix/import/crate.scm | 165 ++++++++++++++++++---------------- guix/scripts/import/crate.scm | 9 +- tests/crate.scm | 2 +- 3 files changed, 91 insertions(+), 85 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 8dc014d232..da92c43b8c 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name crate-recursive-import @@ -85,7 +86,7 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string @@ -111,7 +112,9 @@ record or #f if it was not found." (url (string-append (%crate-base-url) path))) (match (assoc-ref (or (json-fetch url) '()) "dependencies") ((? vector? vector) - (map json->crate-dependency (vector->list vector))) + (filter (lambda (dep) + (not (eq? (crate-dependency-kind dep) 'dev))) + (map json->crate-dependency (vector->list vector)))) (_ '())))) @@ -141,62 +144,84 @@ record or #f if it was not found." ((args ...) `((arguments (,'quasiquote ,args)))))) -(define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) - "Return the `package' s-expression for a rust package with the given NAME, -VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, -and LICENSE." - (let* ((port (http-fetch (crate-uri name version))) +(define (make-crate-sexp crate version* dependencies) + "Return the `package' s-expression for a rust package given , + and a list of " + (define normal-dependency? + (match-lambda ((_ dep) (not (eq? (crate-dependency-kind dep) 'dev))))) + + (define (string->license string) + (match (regexp-exec %dual-license-rx string) + (#f (list (spdx-string->license string))) + (m (list (spdx-string->license (match:substring m 1)) + (spdx-string->license (match:substring m 2)))))) + + (let* ((dep-crates dev-dep-crates (partition normal-dependency? dependencies)) + (cargo-inputs (sort (unzip1 dep-crates) + string-ci (crate-version-license version*) + string->license)) + (port (http-fetch (crate-uri name version)) ) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) (pkg `(package - (name ,guix-name) - (version ,version) - (source (origin - (method url-fetch) - (uri (crate-uri ,name version)) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 - (base32 - ,(bytevector->nix-base32-string (port-sha256 port)))))) - (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) - (maybe-cargo-development-inputs - cargo-development-inputs))) - (home-page ,(match home-page - (() "") - (_ home-page))) - (synopsis ,synopsis) - (description ,(beautify-description description)) - (license ,(match license - (() #f) - ((license) license) - (_ `(list ,@license))))))) - (close-port port) - pkg)) + (name ,guix-name) + (version ,version) + (source (origin + (method url-fetch) + (uri (crate-uri ,name version)) + (file-name (string-append name "-" version ".crate")) + (sha256 + (base32 + ,(bytevector->nix-base32-string (port-sha256 port)))))) + (build-system cargo-build-system) + ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + (maybe-cargo-development-inputs + cargo-development-inputs))) + (home-page ,(match home-page + (() "") + (_ home-page))) + (synopsis ,synopsis) + (description ,(beautify-description description)) + (license ,(match license + (() #f) + ((license) license) + (_ `(list ,@license))))))) + + (close-port port) + pkg)) (define %dual-license-rx ;; Dual licensing is represented by a string such as "MIT OR Apache-2.0". ;; This regexp matches that. (make-regexp "^(.*) OR (.*)$")) +(define (crate->crate-version crate version-number) + "returns the for a given CRATE and VERSION-NUMBER" + (find (lambda (version) + (string=? (crate-version-number version) + version-number)) + (crate-versions crate))) + +(define (crate->versions crate) + "Returns a list of versions for a given CRATE" + (map (lambda (version) + (crate-version-number version)) + (crate-versions crate))) + (define* (crate->guix-package crate-name #:optional version) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." - (define (string->license string) - (match (regexp-exec %dual-license-rx string) - (#f (list (spdx-string->license string))) - (m (list (spdx-string->license (match:substring m 1)) - (spdx-string->license (match:substring m 2)))))) - - (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) - (define crate (lookup-crate crate-name)) @@ -205,38 +230,27 @@ latest version of CRATE-NAME." (crate-latest-version crate))) (define version* - (find (lambda (version) - (string=? (crate-version-number version) - version-number)) - (crate-versions crate))) + (crate->crate-version crate version-number)) - (and crate version* - (let* ((dependencies (crate-version-dependencies version*)) - (dep-crates (filter normal-dependency? dependencies)) - (dev-dep-crates (remove normal-dependency? dependencies)) - (cargo-inputs (sort (map crate-dependency-id dep-crates) - string-ci (crate-version-license version*) - string->license)) - (append cargo-inputs cargo-development-inputs))))) + (define dependencies (map + (lambda (dep) + (list (crate-name->package-name + (crate-dependency-id dep)) dep)) + (crate-version-dependencies version*))) + (make-crate-sexp crate version* dependencies)) -(define (crate-recursive-import crate-name) - (recursive-import crate-name #f - #:repo->guix-package (lambda (name repo) - (crate->guix-package name)) - #:guix-name crate-name->package-name)) +(define* (crate-recursive-import name #:optional version) + (recursive-import-semver + #:name name + #:version version + #:name->metadata lookup-crate + #:metadata->package crate->crate-version + #:metadata-versions crate->versions + #:package-dependencies crate-version-dependencies + #:dependency-name crate-dependency-id + #:dependency-range crate-dependency-requirement + #:guix-name crate-name->package-name + #:make-sexp make-crate-sexp)) (define (guix-package->crate-name package) "Return the crate name of PACKAGE." @@ -285,4 +299,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 4690cceb4d..85ae6fbe59 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,14 +96,7 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (reverse - (stream->list - (crate-recursive-import name)))) + (stream->list (crate-recursive-import name version)) (let ((sexp (crate->guix-package name version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") diff --git a/tests/crate.scm b/tests/crate.scm index c14862ad9f..b77cbb08c6 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -95,7 +95,7 @@ ('source ('origin ('method 'url-fetch) ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) + ('file-name ('string-append 'name "-" 'version ".crate")) ('sha256 ('base32 (? string? hash))))) -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Dec 10 14:24:00 2019 Received: (at 38408) by debbugs.gnu.org; 10 Dec 2019 19:24:00 +0000 Received: from localhost ([127.0.0.1]:56624 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel72-00052r-2O for submit@debbugs.gnu.org; Tue, 10 Dec 2019 14:24:00 -0500 Received: from mx1.riseup.net ([198.252.153.129]:33826) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6y-000525-5A for 38408@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:56 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47XVNW5ddZzDrSN for <38408@debbugs.gnu.org>; Tue, 10 Dec 2019 11:23:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576005835; bh=3oGvh7DPXdBDKgvsEQLhnlyt/WuekWDAdEpVdNgb15E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GzvFqTFu6Ra569b5vwZhCBWEbhjfwjt6ZXUuDwtdnMLjIX9XkjZwhTuoNL2aF+6Hb ytfH61M+8iI2m2AGzzAWvfJsAU9JRaZRQMwYRdm8K3rohVZTDlbl+6+v6L3+m4YdGc 6qDpoD6WFXHrecVYxKRcnT6PYn4UQKVw1u7cM+tw= X-Riseup-User-ID: BA1329E747123DA85EBC3B0E5ABEF255D7F7ECD8A58270E8703BD3C66ACBBE8D Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47XVNW1l1Sz8tf0; Tue, 10 Dec 2019 11:23:55 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v4 5/6] guix: crate: Depublicated dependencies Date: Tue, 10 Dec 2019 14:23:42 -0500 Message-Id: <46a5a5ed450c386ee1a17c02f73d613369c61657.1576005195.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm: (crate-version-dependencies): dedup deps --- guix/import/crate.scm | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 5683369b7a..535ac2d8e5 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -109,15 +109,22 @@ record or #f if it was not found." "Return the list of records of VERSION, a ." (let* ((path (assoc-ref (crate-version-links version) "dependencies")) - (url (string-append (%crate-base-url) path))) - (match (assoc-ref (or (json-fetch url) '()) "dependencies") - ((? vector? vector) - (filter (lambda (dep) - (not (eq? (crate-dependency-kind dep) 'dev))) - (map json->crate-dependency (vector->list vector)))) - (_ - '())))) - + (url (string-append (%crate-base-url) path)) + (deps-list (match (assoc-ref (or (json-fetch url) '()) "dependencies") + ((? vector? vector) (vector->list vector)) + (_ + '()))) + ;; turn the raw list into 's and remove dev depenedencies + (deps (filter-map (lambda (json) + (let ((dep (json->crate-dependency json))) + (if (eq? (crate-dependency-kind dep) 'dev) + #f + dep))) + deps-list))) + ;;remove duplicate dependencies + (apply lset-adjoin `(,(lambda (a b) + (string-ci=? (crate-dependency-id a) (crate-dependency-id b))) + () ,@deps)))) ;;; ;;; Converting crates to Guix packages. -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Dec 10 14:24:01 2019 Received: (at 38408) by debbugs.gnu.org; 10 Dec 2019 19:24:01 +0000 Received: from localhost ([127.0.0.1]:56626 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel72-00052y-E4 for submit@debbugs.gnu.org; Tue, 10 Dec 2019 14:24:00 -0500 Received: from mx1.riseup.net ([198.252.153.129]:33828) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iel6y-00052N-TN for 38408@debbugs.gnu.org; Tue, 10 Dec 2019 14:23:57 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47XVNX3nJzzDrl5 for <38408@debbugs.gnu.org>; Tue, 10 Dec 2019 11:23:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576005836; bh=mokMBLgIYs0DzdKkO5eslI9luLc0OQ2nfzqR6GfZsL4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h+fCU7qLXUDcxaxoYnj54jC3oycOWDv5adtCJ0amf325BKMjRPl2K8HiqJMAnTtBj lzbzEKENQLNjjfxWXWJFS4vyH+z3+9VkS1CjnvleiewIN5R+tUbrs/AL5a/Wh7Jd33 UJ9Z1SFNRE4SqSJSrgPzUt9lajE8uV3aWg2xwoBA= X-Riseup-User-ID: DF5B6F338231F6B9850DE23BFBCC234DD7C9BD85EBFBB66A2CE13EDF36882C7B Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47XVNW702Qz8tf0; Tue, 10 Dec 2019 11:23:55 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v4 6/6] guix: import: recursive-import-semver: allow the range of a package to be specified when begining import. Date: Tue, 10 Dec 2019 14:23:43 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (crate-recursive-import) changed param version to range * guix/import/util.scm (recursive-import-semver) changed param version to range * guix/tests/import-utils.scm added range test for (recursive-import-semver) --- guix/import/crate.scm | 5 +-- guix/import/utils.scm | 69 ++++++++++++++++++++++++------------------ tests/import-utils.scm | 15 ++++++++- 3 files changed, 57 insertions(+), 32 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 535ac2d8e5..cd9ab61cca 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -247,10 +247,11 @@ latest version of CRATE-NAME." (crate-version-dependencies version*))) (make-crate-sexp crate version* dependencies)) -(define* (crate-recursive-import name #:optional version) + +(define* (crate-recursive-import name #:optional range) (recursive-import-semver #:name name - #:version version + #:range (if range range "*") #:name->metadata lookup-crate #:metadata->package crate->crate-version #:metadata-versions crate->versions diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 6932614f8e..35d5c79286 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -422,8 +422,9 @@ dependencies." ;; initial state (step initial-state))) -(define* (recursive-import-semver #:key name - (version #f) +(define* (recursive-import-semver #:key + name + (range "*") name->metadata metadata->package metadata-versions @@ -433,7 +434,7 @@ dependencies." guix-name make-sexp) "Generates a stream of package expressions for the dependencies of the given -NAME and VERSION. The dependencies will be resolved using semantic versioning. +NAME and version RANGE. The dependencies will be resolved using semantic versioning. This procedure makes the assumption that most package repositories will, for a given package provide some on that package that includes what versions of the package that are available and a list of dependencies for each @@ -442,7 +443,7 @@ other data. This procedure takes the following keys: NAME - The name of the package to import - VERSION - The version of the package to import + RANGE - The version range of the package to import NAME->METADATA - A procedure that takes a NAME of a package and returns that package's METADATA->PACKAGE A procedure that takes a package's and VERSION @@ -473,6 +474,8 @@ s-expression" (semver-range-contains? range (string->semver version))) + ;; given a name of a package and a version number this returns the export + ;; symbol that will be used (define (guix-export-name name version) (let ((versions (name->versions name)) (name (guix-name name))) @@ -518,14 +521,17 @@ s-expression" (export-name (guix-export-name name version))) `(,export-name ,version #t))) + (define (find-dep-version-by-name-range name range-string known-deps) + (let ((range (string->semver-range range-string))) + (or (find-known name range known-deps) + (find-locally name range) + (find-remote name range)))) (define (find-dep-version dep known-deps) (let* ((name (dependency-name dep)) - (range (string->semver-range (dependency-range dep))) + (range (dependency-range dep)) (export-name-version-needed - (or (find-known name range known-deps) - (find-locally name range) - (find-remote name range)))) + (find-dep-version-by-name-range name range known-deps))) `(,name ,@export-name-version-needed ,dep) )) @@ -536,12 +542,12 @@ s-expression" (deps (map (lambda (dep) (find-dep-version dep known-deps)) (package-dependencies package))) + (deps-with-export-symbol (map + (match-lambda ((_ export-symbol _ _ dep) + (list export-symbol dep))) + deps)) (sexp - (make-sexp metadata package - (map - (match-lambda ((_ export-symbol _ _ dep) - (list export-symbol dep))) - deps)))) + (make-sexp metadata package deps-with-export-symbol))) (values (package->definition sexp (latest? versions version)) (filter-map @@ -551,15 +557,12 @@ s-expression" #f))) deps)))) - (define initial-state - (list #f - (list - ;; packages to find - (list name (if version - version - (car (name->versions name))))) - ;; packages that have been found - (list))) + (define (initial-state name version) + `(#f + ;; packages to find + ,(list (list name version)) + ;; packages that have been found + ())) (define (step state) (match state @@ -573,11 +576,19 @@ s-expression" (cons (list next-name next-version) done)))) ((prev '() done) (list #f '() done)))) + + (define (create-stream initial-state) + (stream-unfold + ;; map: produce a stream element + (match-lambda ((latest queue done) latest)) + ;; predicate + (match-lambda ((latest queue done) latest)) + step + (step initial-state))) - (stream-unfold - ;; map: produce a stream element - (match-lambda ((latest queue done) latest)) - ;; predicate - (match-lambda ((latest queue done) latest)) - step - (step initial-state))) + (match (find-dep-version-by-name-range name range '()) + ((_ version #t) + (create-stream (initial-state name version))) + ;; if the initial package alread exsits then just return its export symbol + ((export-name _ #f) + (list->stream (list export-name))))) diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 4ed3a5e1da..022b8f2b32 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -190,7 +190,7 @@ (define* (test-recursive-importer name version #:optional (guix-name guix-name)) (recursive-import-semver #:name name - #:version version + #:range version #:name->metadata name->metadata #:metadata->package metadata->package #:metadata-versions metadata-semver-versions @@ -250,6 +250,19 @@ (dependcies ())))) (stream->list (test-recursive-importer "one-dep" "0.1.0"))) +(test-equal "recursive import test with a version range" + `((define-public test-one-dep + (package + (name "test-one-dep") + (version "1.0.0") + (dependcies (("test-no-deps" "test-no-deps"))))) + (define-public test-no-deps + (package + (name "test-no-deps") + (version "1.0.0") + (dependcies ())))) + (stream->list (test-recursive-importer "one-dep" "*"))) + (test-equal "recursive import test with with dependency that is already in the repo" `((define-public test-already-packaged (package (name "test-already-packaged") -- 2.24.0 From debbugs-submit-bounces@debbugs.gnu.org Mon Dec 16 18:31:29 2019 Received: (at 38408) by debbugs.gnu.org; 16 Dec 2019 23:31:29 +0000 Received: from localhost ([127.0.0.1]:40517 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1igzpj-0001qS-Cb for submit@debbugs.gnu.org; Mon, 16 Dec 2019 18:31:28 -0500 Received: from mx1.riseup.net ([198.252.153.129]:41436) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1igzpg-0001qE-1I for 38408@debbugs.gnu.org; Mon, 16 Dec 2019 18:31:21 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47cHYq37wJzFcfp for <38408@debbugs.gnu.org>; Mon, 16 Dec 2019 15:30:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576539077; bh=sZygSWcl2Zg02mPTEImh3z+KlSjfoIKzD9KwYTFffOQ=; h=Date:From:To:Subject:From; b=tMtZfUfbs10clOeAFAaTAJ8U/ig/b/F0B4cTOYO7XkawbcVdfp97ONha30FxfcyWH wpd/Y+OJZT3qd7dRbPkmAbZggqkb5Q/eE4fcrXstdMcGrjzLmlbcGQcF6nhG+jVvkH QQNua5hrGnrg2ulAmmgZDDGvNMysM18C2qcK6lq0= X-Riseup-User-ID: 4D4D63BC91CA8BBAF4DD4A351E721D1A16F3CE255A9E5A666B3C8AFACAD3661C Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47cHYq21b7z8vWg for <38408@debbugs.gnu.org>; Mon, 16 Dec 2019 15:30:07 -0800 (PST) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_6cf61fbac390ae8a81b1d5d4afc35664" Date: Mon, 16 Dec 2019 15:30:07 -0800 From: Martin Becze To: 38408@debbugs.gnu.org Subject: Rewrote recursive-import-semver based on topological-sort Message-ID: X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=_6cf61fbac390ae8a81b1d5d4afc35664 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII Hello Guix, I rewrote the recursive-import-semver procedure to use the new topological-sort procedure. I also return a list instead of a stream like (recursive-import). So to recap (recursive-import-semver) imports dependency using semantic version to find the correct version of a dependency. The crate importer has also be converted to use recursive-import-semver. It will now use recursive-import-semver when "guix import crate -r" is used. You can also specify the range that you would like to import such as guix import crate -r rand@^0.6". Here is an example of the format that it will produce. (define-public rust-bincode-1.2.1 (package (name "rust-bincode") (version "1.2.1") (source (origin (method url-fetch) (uri (crate-uri "bincode" version)) (file-name (string-append name "-" version ".crate")) (sha256 (base32 "1gvxm3n67xv1874fwxmnlircdlphlk1hcw75ykrrnw9l2nky4lsp")))) (build-system cargo-build-system) (arguments `(#:skip-build? #t #:cargo-inputs (("rust-byteorder-1.3.2" ,rust-byteorder-1.3.2) ("rust-serde-1.0.103" ,rust-serde-1.0.103)))) (home-page "https://github.com/servo/bincode") (synopsis "A binary serialization / deserialization strategy that uses Serde for transforming structs into bytes and vice versa!") (description "This package provides a binary serialization / deserialization strategy that uses Serde for transforming structs into bytes and vice versa!") (license license:expat))) -Martin --=_6cf61fbac390ae8a81b1d5d4afc35664 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0001-guix-import-added-recusive-import-semver.patch Content-Disposition: attachment; filename=0001-guix-import-added-recusive-import-semver.patch; size=9438 RnJvbSBlZWZmZGY1NjljNGQ3ZmJmZDg0M2UwYjQ4NDA0YjZhMmYzZDQ2MzQzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogTW9uLCAxNiBEZWMgMjAxOSAxNzowODoxNiAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggMS80XSBn dWl4OiBpbXBvcnQ6IGFkZGVkIHJlY3VzaXZlLWltcG9ydC1zZW12ZXIKCiogZ3VpeC9pbXBvcnQv dXRpbHMuc2NtIChyZWN1c2l2ZS1pbXBvcnQtc2VtdmVyKTogTmV3IFZhcmlibGUKKiBndWl4L2lt cG9ydC91dGlscy5zY20gKHBhY2thZ2UtPmRlZmluaXRpb24pW2FyZ3VtZW50c106IEFkZCBhcHBl bmQtdmVyaW9ucyBvcHRpb24KLS0tCiBndWl4L2ltcG9ydC91dGlscy5zY20gfCAxNjggKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tCiAxIGZpbGUgY2hhbmdlZCwgMTYx IGluc2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ3VpeC9pbXBvcnQv dXRpbHMuc2NtIGIvZ3VpeC9pbXBvcnQvdXRpbHMuc2NtCmluZGV4IGQxN2Q0MDBkZGYuLjdmNzVm NTBlMjMgMTAwNjQ0Ci0tLSBhL2d1aXgvaW1wb3J0L3V0aWxzLnNjbQorKysgYi9ndWl4L2ltcG9y dC91dGlscy5zY20KQEAgLTUsNiArNSw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMTcsIDIwMTkg UmljYXJkbyBXdXJtdXMgPHJla2Fkb0BlbGVwaGx5Lm5ldD4KIDs7OyBDb3B5cmlnaHQgwqkgMjAx OCBPbGVnIFB5a2hhbG92IDxnby53aWd1c3RAZ21haWwuY29tPgogOzs7IENvcHlyaWdodCDCqSAy MDE5IFJvYmVydCBWb2xsbWVydCA8cm9iQHZsbG1ydC5uZXQ+Cis7OzsgQ29weXJpZ2h0IMKpIDIw MTkgTWFydGluIEJlY3plIDxtamJlY3plQHJpc2V1cC5uZXQ+CiA7OzsKIDs7OyBUaGlzIGZpbGUg aXMgcGFydCBvZiBHTlUgR3VpeC4KIDs7OwpAQCAtNDAsMTAgKzQxLDEzIEBACiAgICM6dXNlLW1v ZHVsZSAoaWNlLTkgcmRlbGltKQogICAjOnVzZS1tb2R1bGUgKGljZS05IHJlY2VpdmUpCiAgICM6 dXNlLW1vZHVsZSAoaWNlLTkgcmVnZXgpCisgICM6dXNlLW1vZHVsZSAoc2VtdmVyKQorICAjOnVz ZS1tb2R1bGUgKHNlbXZlciByYW5nZXMpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEpCiAg ICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTkpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEx KQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0yNikKKyAgIzp1c2UtbW9kdWxlIChzcmZpIHNy ZmktNzEpCiAgICM6ZXhwb3J0IChmYWN0b3JpemUtdXJpCiAKICAgICAgICAgICAgIGZsYXR0ZW4K QEAgLTcwLDcgKzc0LDggQEAKIAogICAgICAgICAgICAgZ3VpeC1uYW1lCiAKLSAgICAgICAgICAg IHJlY3Vyc2l2ZS1pbXBvcnQpKQorICAgICAgICAgICAgcmVjdXJzaXZlLWltcG9ydAorICAgICAg ICAgICAgcmVjdXJzaXZlLWltcG9ydC1zZW12ZXIpKQogCiAoZGVmaW5lIChmYWN0b3JpemUtdXJp IHVyaSB2ZXJzaW9uKQogICAiRmFjdG9yaXplIFVSSSwgYSBwYWNrYWdlIHRhcmJhbGwgVVJJIGFz IGEgc3RyaW5nLCBzdWNoIHRoYXQgYW55IG9jY3VycmVuY2VzCkBAIC0yNTgsMTMgKzI2MywxMyBA QCBwYWNrYWdlIGRlZmluaXRpb24uIgogICAgICgocGFja2FnZS1pbnB1dHMgLi4uKQogICAgICBg KChuYXRpdmUtaW5wdXRzICgsJ3F1YXNpcXVvdGUgLHBhY2thZ2UtaW5wdXRzKSkpKSkpCiAKLShk ZWZpbmUgKHBhY2thZ2UtPmRlZmluaXRpb24gZ3VpeC1wYWNrYWdlKQorKGRlZmluZSogKHBhY2th Z2UtPmRlZmluaXRpb24gZ3VpeC1wYWNrYWdlICM6b3B0aW9uYWwgYXBwZW5kLXZlcnNpb24/KQog ICAobWF0Y2ggZ3VpeC1wYWNrYWdlCi0gICAgKCgncGFja2FnZSAoJ25hbWUgKD8gc3RyaW5nPyBu YW1lKSkgXyAuLi4pCi0gICAgIGAoZGVmaW5lLXB1YmxpYyAsKHN0cmluZy0+c3ltYm9sIG5hbWUp Ci0gICAgICAgICxndWl4LXBhY2thZ2UpKQotICAgICgoJ2xldCBhbnl0aGluZyAoJ3BhY2thZ2Ug KCduYW1lICg/IHN0cmluZz8gbmFtZSkpIF8gLi4uKSkKLSAgICAgYChkZWZpbmUtcHVibGljICwo c3RyaW5nLT5zeW1ib2wgbmFtZSkKKyAgICAoKG9yICgncGFja2FnZSAoJ25hbWUgbmFtZSkgKCd2 ZXJzaW9uIHZlcnNpb24pIC4gcmVzdCkKKyAgICAgICAgICgnbGV0IF8gKCdwYWNrYWdlICgnbmFt ZSBuYW1lKSAoJ3ZlcnNpb24gdmVyc2lvbikgLiByZXN0KSkpCisgICAgIGAoZGVmaW5lLXB1Ymxp YyAsKHN0cmluZy0+c3ltYm9sIChpZiBhcHBlbmQtdmVyc2lvbj8KKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNpb24p CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSkKICAg ICAgICAgLGd1aXgtcGFja2FnZSkpKSkKIAogKGRlZmluZSAoYnVpbGQtc3lzdGVtLW1vZHVsZXMp CkBAIC00MjgsMyArNDMzLDE1MiBAQCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVwc3RyZWFt IG5hbWUuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlIGV4aXN0cz8K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9kZS1kZXBlbmRlbmNp ZXMgbm9kZSkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLW5hbWUpKSkKKworKGRl ZmluZSogKHJlY3Vyc2l2ZS1pbXBvcnQtc2VtdmVyICM6a2V5CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChy YW5nZSAiKiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+bWV0YWRh dGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS0+cGFja2FnZQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLXZlcnNpb25zCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS1kZXBlbmRlbmNpZXMKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LW5hbWUKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LXJhbmdlCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZ3VpeC1uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWFrZS1zZXhwKQorICAiR2VuZXJhdGVzIGEgbGlzdCBvZiBwYWNrYWdlIGV4cHJlc3Np b25zIGZvciB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBnaXZlbiAKK05BTUUgYW5kIHZlcnNpb24g UkFOR0UuIFRoZSBkZXBlbmRlbmNpZXMgd2lsbCBiZSByZXNvbHZlZCB1c2luZyBzZW1hbnRpYyB2 ZXJzaW9uaW5nLgorVGhpcyBwcm9jZWR1cmUgbWFrZXMgdGhlIGFzc3VtcHRpb24gdGhhdCBtb3N0 IHBhY2thZ2UgcmVwb3NpdG9yaWVzIHdpbGwsIGZvciBhCitnaXZlbiBwYWNrYWdlIHByb3ZpZGUg c29tZSA8bWV0YWRhdGE+IG9uIHRoYXQgcGFja2FnZSB0aGF0IGluY2x1ZGVzIHdoYXQKK3ZlcnNp b25zIG9mIHRoZSBwYWNrYWdlIHRoYXQgYXJlIGF2YWlsYWJsZSBhbmQgYSBsaXN0IG9mIGRlcGVu ZGVuY2llcyBmb3IgZWFjaAordmVyc2lvbi4gRGVwZW5kZW5jaWVzIGFyZSBhc3N1bWVkIHRvIGJl IGNvbXBvc2VkIG9mIGEgTkFNRSwgYSBzZW1hbnRpYyBSQU5HRSBhbmQKK290aGVyIGRhdGEuCisK K1RoaXMgcHJvY2VkdXJlIHRha2VzIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgTkFNRSAtIFRoZSBu YW1lIG9mIHRoZSBwYWNrYWdlIHRvIGltcG9ydAorICBSQU5HRSAtIFRoZSB2ZXJzaW9uIHJhbmdl IG9mIHRoZSBwYWNrYWdlIHRvIGltcG9ydAorICBOQU1FLT5NRVRBREFUQSAtIEEgcHJvY2VkdXJl IHRoYXQgdGFrZXMgYSBOQU1FIG9mIGEgcGFja2FnZSBhbmQgcmV0dXJucyB0aGF0CitwYWNrYWdl J3MgPG1ldGFkYXRhPgorICBNRVRBREFUQS0+UEFDS0FHRSBBIHByb2NlZHVyZSB0aGF0IHRha2Vz IGEgcGFja2FnZSdzIDxtZXRhZGF0YT4gYW5kIFZFUlNJT04gCithbmQgcmV0dXJucyB0aGUgPHBh Y2thZ2U+IGZvciB0aGUgZ2l2ZW4gVkVSU0lPTgorICBNRVRBREFUQS1WRVJTSU9OUyBBIHByb2Nl ZHVyZSB0aGF0IHRoYXQgdGFrZXMgYSBwYWNrYWdlcyA8bWV0YWRhdGE+IGFuZAorcmV0dXJucyBh IGxpc3Qgb2YgdmVyc2lvbiBhcyBzdHJpbmdzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGdp dmVuIHBhY2thZ2UKKyAgUEFDS0FHRS1ERVBFTkRFTkNJRVMgYSBwcm9jZWR1cmUgdGhhdCByZXR1 cm5zIGEgbGlzdCBvZiA8ZGVwZW5kZW5jeT4gZ2l2ZW4gYSAKKzxwYWNrYWdlPgorICBERVBFTkRF TkNZLU5BTUUgQSBwcm9jZWR1cmUgdGhhdCB0YWtlcyBhIDxkZXBlbmRlbmN5PiBhbmQgcmV0dXJu cyB0aGUgaXRzIG5hbWUKKyAgREVQRU5ERU5DWS1SQU5HRSBBIHByb2NlZHVyZSB0aGF0IHRha2Vz IGEgPGRlcGVuZGVuY3k+IGFuZCByZXR1cm5zIHRoYXQKK2RlY2VuY3kncyByYW5nZSBhcyBhIHN0 cmluZworICBHVUlYLU5BTUUgQSBwcm9jZWR1cmUgdGhhdCB0YWtlIGEgTkFNRSBhbmQgcmV0dXJu cyB0aGUgR3VpeCB2ZXJzaW9uIG9mIGl0CisgIE1BS0UtU0VYUCBBIHByb2NlZHVyZSB0aGF0IHRh a2VzIDxtZXRhZGF0YT4sIDxwYWNrYWdlPiBhbmQgYSBsaXN0IG9mIHBhaXJzCitjb250YWluaW5n IChFWFBPUlQtTkFNRSA8ZGVwZW5kZW5jeT4pLCByZXR1cm5pbmcgdGhlIHBhY2thZ2UgZXhwcmVz c2lvbiBhcyBhbiAKK3MtZXhwcmVzc2lvbiIKKyAgKGRlZmluZS1yZWNvcmQtdHlwZSA8bm9kZS1k ZXBlbmRlbmN5PgorICAgIChtYWtlLW5vZGUtZGVwZW5kZW5jeSBkZXBlbmRlbmN5IHZlcnNpb24g ZXhpc3RzPykKKyAgICBub2RlLWRlcGVuZGVuY3k/CisgICAgKGRlcGVuZGVuY3kgIG5vZGUtZGVw ZW5kZW5jeS1kZXBlbmRlbmN5KQorICAgICh2ZXJzaW9uICAgICBub2RlLWRlcGVuZGVuY3ktdmVy c2lvbikKKyAgICAoZXhpc3RzPyAgICAgbm9kZS1kZXBlbmRlbmN5LWV4aXN0cz8pKQorCisgIChk ZWZpbmUtcmVjb3JkLXR5cGUgPG5vZGU+CisgICAgKG1ha2Utbm9kZSBuYW1lIHZlcnNpb24gbWV0 YWRhdGEgcGFja2FnZSBkZXBlbmRlbmNpZXMpCisgICAgbm9kZT8KKyAgICAobmFtZSAgICAgICAg IG5vZGUtbmFtZSkKKyAgICAodmVyc2lvbiAgICAgIG5vZGUtdmVyc2lvbikKKyAgICAobWV0YWRh dGEgICAgIG5vZGUtbWV0YWRhdGEpCisgICAgKHBhY2thZ2UgICAgICBub2RlLXBhY2thZ2UpCisg ICAgKGRlcGVuZGVuY2llcyBub2RlLWRlcGVuZGVuY2llcykpCisKKyAgKGRlZmluZSBtZW0tbmFt ZS0+bWV0YWRhdGEgKG1lbW9pemUgbmFtZS0+bWV0YWRhdGEpKQorICAoZGVmaW5lIG1lbS1wYWNr YWdlLWRlcGVuZGVuY2llcyAobWVtb2l6ZSBwYWNrYWdlLWRlcGVuZGVuY2llcykpCisKKyAgKGRl ZmluZSAoc2VtdmVyLXJhbmdlLWNvbnRhaW5zLXN0cmluZz8gcmFuZ2UgdmVyc2lvbikKKyAgICAo c2VtdmVyLXJhbmdlLWNvbnRhaW5zPyByYW5nZSAoc3RyaW5nLT5zZW12ZXIgdmVyc2lvbikpKQor CisgIChkZWZpbmUgKG5hbWUrdmVyc2lvbiBuYW1lIHZlcnNpb24pCisgICAgKHN0cmluZy1hcHBl bmQgbmFtZSAiLSIgdmVyc2lvbikpCisKKyAgKGRlZmluZSAocHVibGljLW5hbWUgbmFtZSB2ZXJz aW9uKQorICAgICJHaXZlbiBhIE5BTUUgYW5kIGEgVkVSU0lPTiBvZiBhIHBhY2thZ2UsIHJldHVy bnMgdGhlIG5hbWUgb2YgdGhlCitzeW1ib2wgdXNlZCBpcyBkZWZpbmUtcHVibGljIgorICAgIChn dWl4LW5hbWUgKG5hbWUrdmVyc2lvbiBuYW1lIHZlcnNpb24pKSkKKworICA7OyBzZWFyY2hlcyBz ZWFyY2hlcyBmb3IgYSBwYWNrYWdlIGluIGd1aXgKKyAgKGRlZmluZSAoZmluZC1sb2NhbGx5IG5h bWUgcmFuZ2UpCisgICAgKG1hdGNoIChmaW5kCisgICAgICAgICAgICAobGFtYmRhIChwYWNrYWdl KQorICAgICAgICAgICAgICAoc2VtdmVyLXJhbmdlLWNvbnRhaW5zLXN0cmluZz8KKyAgICAgICAg ICAgICAgIHJhbmdlCisgICAgICAgICAgICAgICAocGFja2FnZS12ZXJzaW9uIHBhY2thZ2UpKSkK KyAgICAgICAgICAgIChmaW5kLXBhY2thZ2VzLWJ5LW5hbWUgKGd1aXgtbmFtZSBuYW1lKSkpCisg ICAgICAoI2YgI2YpCisgICAgICAocGFja2FnZSAobGlzdCAocGFja2FnZS12ZXJzaW9uIHBhY2th Z2UpICN0KSkpKQorCisgIDs7IHNlYXJjaGVzIGZvciBhIHBhY2thZ2UgaW4gc29tZSBleHRlcm5h bCByZXBvCisgIChkZWZpbmUgKGZpbmQtcmVtb3RlIG5hbWUgcmFuZ2UpCisgICAgKGxldCogKCh2 ZXJzaW9ucyAoc29ydAorICAgICAgICAgICAgICAgICAgICAgIChtZXRhZGF0YS12ZXJzaW9ucwor ICAgICAgICAgICAgICAgICAgICAgICAobWVtLW5hbWUtPm1ldGFkYXRhIG5hbWUpKQorICAgICAg ICAgICAgICAgICAgICAgIHZlcnNpb24+PykpCisgICAgICAgICAgICh2ZXJzaW9uIChmaW5kCisg ICAgICAgICAgICAgICAgICAgICAobGFtYmRhICh2ZXIpCisgICAgICAgICAgICAgICAgICAgICAg IChzZW12ZXItcmFuZ2UtY29udGFpbnMtc3RyaW5nPyByYW5nZSB2ZXIpKQorICAgICAgICAgICAg ICAgICAgICAgdmVyc2lvbnMpKSkKKyAgICAgIChsaXN0IHZlcnNpb24gI2YpKSkKKworICAoZGVm aW5lIChmaW5kLWJ5LW5hbWUtcmFuZ2UgbmFtZSByYW5nZSkKKyAgICAiR2l2ZW4gYSBOQU1FLCBS QU5HRSB0aGlzIHdpbGwgcmV0dXJuIGEgVkVSU0lPTiBhbmQgQk9PTCB3aGljaCByZXBlc2VudHMK K3doZXRoZXIgdGhlIHBhY2thZ2UgaGFzIGJlZW4gZW5jb3VudGVyZWQgb3Igbm90LiIKKyAgICAo bGV0ICgoc2VtdmVyLXJhbmdlIChzdHJpbmctPnNlbXZlci1yYW5nZSByYW5nZSkpKQorICAgICAg KGFwcGx5IHZhbHVlcworICAgICAgICAgICAgIChvciAoZmluZC1sb2NhbGx5IG5hbWUgc2VtdmVy LXJhbmdlKQorICAgICAgICAgICAgICAgICAoZmluZC1yZW1vdGUgbmFtZSBzZW12ZXItcmFuZ2Up KSkpKQorCisgIChkZWZpbmUgKG1ha2UtcGFja2FnZS1kZWZpbml0aW9uIG5vZGUpCisgICAgKGxl dCogKChtZXRhZGF0YSAobm9kZS1tZXRhZGF0YSBub2RlKSkKKyAgICAgICAgICAgKHBhY2thZ2Ug KG5vZGUtcGFja2FnZSBub2RlKSkKKyAgICAgICAgICAgKGRlcGVuZGVuY2llcyA7OyBhIGxpc3Qg b2YgKHB1YmxpYy1uYW1lIGRlcGVuZGVuY3kpCisgICAgICAgICAgICAobWFwIChsYW1iZGEgKG5v ZGUtZGVwKQorICAgICAgICAgICAgICAgICAgIChsZXQqICgoZGVwIChub2RlLWRlcGVuZGVuY3kt ZGVwZW5kZW5jeSBub2RlLWRlcCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXIgKG5v ZGUtZGVwZW5kZW5jeS12ZXJzaW9uIG5vZGUtZGVwKSkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgKG5hbWUgKGRlcGVuZGVuY3ktbmFtZSBkZXApKSkKKyAgICAgICAgICAgICAgICAgICAgIChs aXN0IChwdWJsaWMtbmFtZSBuYW1lIHZlcikgZGVwKSkpCisgICAgICAgICAgICAgICAgIChub2Rl LWRlcGVuZGVuY2llcyBub2RlKSkpCisgICAgICAgICAgIChzZXhwIChtYWtlLXNleHAgbWV0YWRh dGEgcGFja2FnZSBkZXBlbmRlbmNpZXMpKSkKKyAgICAgIChwYWNrYWdlLT5kZWZpbml0aW9uIHNl eHAgI3QpKSkKKworICAoZGVmaW5lIChkZXBlbmRlbmN5LT5ub2RlLWRlcGVuZGVuY3kgZGVwKQor ICAgIChsZXQqICgobmFtZSAoZGVwZW5kZW5jeS1uYW1lIGRlcCkpCisgICAgICAgICAgIChyYW5n ZSAoZGVwZW5kZW5jeS1yYW5nZSBkZXApKQorICAgICAgICAgICAodmVyc2lvbiBleGlzdHM/IChm aW5kLWJ5LW5hbWUtcmFuZ2UgbmFtZSByYW5nZSkpKQorICAgICAgKG1ha2Utbm9kZS1kZXBlbmRl bmN5IGRlcCB2ZXJzaW9uIGV4aXN0cz8pKSkKKworICAoZGVmaW5lIChuYW1lLXZlcnNpb24tPm5v ZGUgbmFtZSB2ZXJzaW9uKQorICAgIChsZXQqICgobWV0YWRhdGEgKG1lbS1uYW1lLT5tZXRhZGF0 YSBuYW1lKSkKKyAgICAgICAgICAgKHBhY2thZ2UgKG1ldGFkYXRhLT5wYWNrYWdlIG1ldGFkYXRh IHZlcnNpb24pKQorICAgICAgICAgICAoZGVwZW5kZW5jaWVzIChtZW0tcGFja2FnZS1kZXBlbmRl bmNpZXMgcGFja2FnZSkpCisgICAgICAgICAgIChub2RlLWRlcGVuZGVuY2llcyAobWFwIChsYW1i ZGEgKGRlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVwZW5kZW5j eS0+bm9kZS1kZXBlbmRlbmN5IGRlcCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGRlcGVuZGVuY2llcykpKQorICAgICAgKG1ha2Utbm9kZSBuYW1lIHZlcnNpb24gbWV0YWRh dGEgcGFja2FnZSBub2RlLWRlcGVuZGVuY2llcykpKQorCisgIChkZWZpbmUgKG5vZGUtZGVwZW5k ZW5jeS0+bm9kZSBub2RlLWRlcGVuZGVuY3kpCisgICAgKGxldCogKChkZXBlbmRlbmN5IChub2Rl LWRlcGVuZGVuY3ktZGVwZW5kZW5jeSBub2RlLWRlcGVuZGVuY3kpKQorICAgICAgICAgICAobmFt ZSAoZGVwZW5kZW5jeS1uYW1lIGRlcGVuZGVuY3kpKQorICAgICAgICAgICAodmVyc2lvbiAobm9k ZS1kZXBlbmRlbmN5LXZlcnNpb24gbm9kZS1kZXBlbmRlbmN5KSkpCisgICAgICAobmFtZS12ZXJz aW9uLT5ub2RlIG5hbWUgdmVyc2lvbikpKQorCisgIChsZXQgKCh2ZXJzaW9uIGV4aXN0cz8gKGZp bmQtYnktbmFtZS1yYW5nZSBuYW1lIHJhbmdlKSkpCisgICAgKGlmIGV4aXN0cz8KKyAgICAgICAg KGRpc3BsYXkKKyAgICAgICAgIChzdHJpbmctYXBwZW5kICJwYWNrYWdlICIgKG5hbWUrdmVyc2lv biBuYW1lIHZlcnNpb24pICIgYWxyZWFkIGV4aXN0cyAtICIpCisgICAgICAgICAoY3VycmVudC1l cnJvci1wb3J0KSkKKyAgICAgICAgKG1hcCBtYWtlLXBhY2thZ2UtZGVmaW5pdGlvbgorICAgICAg ICAgICAgICh0b3BvbG9naWNhbC1zb3J0IChsaXN0IChuYW1lLXZlcnNpb24tPm5vZGUgbmFtZSB2 ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChub2RlKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAobGFtYmRhIChkZXApCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vZGUtZGVwZW5kZW5jeS0+bm9k ZSBkZXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlIG5v ZGUtZGVwZW5kZW5jeS1leGlzdHM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKG5vZGUtZGVwZW5kZW5jaWVzIG5vZGUpKSkpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKGxhbWJkYSAobm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChuYW1lK3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo bm9kZS1uYW1lIG5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vZGUt dmVyc2lvbiBub2RlKSkpKSkpKSkKLS0gCjIuMjQuMAoK --=_6cf61fbac390ae8a81b1d5d4afc35664 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0002-guix-import-crate-crate-recusive-import-use-recusive.patch Content-Disposition: attachment; filename=0002-guix-import-crate-crate-recusive-import-use-recusive.patch; size=23569 RnJvbSBkMzEzMGQ5N2EwMmYyOWJmZTM4ODY1MGZlNDAxMzFhYTVjNzYyZjA0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogTW9uLCAxNiBEZWMgMjAxOSAxNzozMzo1MCAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggMi80XSBn dWl4OiBpbXBvcnQ6IGNyYXRlOiBjcmF0ZS1yZWN1c2l2ZS1pbXBvcnQsIHVzZQogcmVjdXNpdmUt aW1wb3J0LXNlbXZlcgoKKiBndWl4L2ltcG9ydC9jcmF0ZS5zY20gKGNyYXRlLXJlY3VzaXZlLWlt cG9ydCk6IHVzZSByZWN1c2l2ZS1pbXBvcnQtc2VtdmVyCiogZ3VpeC9pbXBvcnQvY3JhdGUuc2Nt IChtYWtlLWNyYXRlLXNleHApW2FyZ3VtbmV0c106IHVzZSA8Y3JhdGU+IGFuZCA8dmVyc2lvbj4K KiBndWl4L2ltcG9ydC9jcmF0ZS5zY20gKGNyYXRlLXZlcnNpb24tZGVwZW5kZW5jaWVzKTogZGVk dXAgZGVwZW5kZW5jaWVzCiogZ3VpeC90ZXN0L2NyYXRlLnNjbTogdXBkYXRlZCB0ZXN0Ci0tLQog Z3VpeC9pbXBvcnQvY3JhdGUuc2NtIHwgMTc1ICsrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0t LS0KIHRlc3RzL2NyYXRlLnNjbSAgICAgICB8IDIzMiArKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tLS0tLS0tLS0KIDIgZmlsZXMgY2hhbmdlZCwgMjI5IGluc2VydGlvbnMoKyksIDE3 OCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9ndWl4L2ltcG9ydC9jcmF0ZS5zY20gYi9ndWl4 L2ltcG9ydC9jcmF0ZS5zY20KaW5kZXggNGMzZjgwMDBkMC4uM2U1YjAyMjg3MyAxMDA2NDQKLS0t IGEvZ3VpeC9pbXBvcnQvY3JhdGUuc2NtCisrKyBiL2d1aXgvaW1wb3J0L2NyYXRlLnNjbQpAQCAt MzgsNiArMzgsNyBAQAogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0xKQogICAjOnVzZS1tb2R1 bGUgKHNyZmkgc3JmaS0yKQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0yNikKKyAgIzp1c2Ut bW9kdWxlIChzcmZpIHNyZmktNzEpCiAgICM6ZXhwb3J0IChjcmF0ZS0+Z3VpeC1wYWNrYWdlCiAg ICAgICAgICAgICBndWl4LXBhY2thZ2UtPmNyYXRlLW5hbWUKICAgICAgICAgICAgIGNyYXRlLXJl Y3Vyc2l2ZS1pbXBvcnQKQEAgLTg1LDcgKzg2LDcgQEAKICAgY3JhdGUtZGVwZW5kZW5jeT8KICAg anNvbi0+Y3JhdGUtZGVwZW5kZW5jeQogICAoaWQgICAgICAgICAgICBjcmF0ZS1kZXBlbmRlbmN5 LWlkICJjcmF0ZV9pZCIpICA7c3RyaW5nCi0gIChraW5kICAgICAgICAgIGNyYXRlLWRlcGVuZGVu Y3kta2luZCAia2luZCIgICAgIDsnbm9ybWFsIHwgJ2RldgorICAoa2luZCAgICAgICAgICBjcmF0 ZS1kZXBlbmRlbmN5LWtpbmQgImtpbmQiICAgICA7J25vcm1hbCB8ICdkZXYgfCAnYnVpbGQKICAg ICAgICAgICAgICAgICAgc3RyaW5nLT5zeW1ib2wpCiAgIChyZXF1aXJlbWVudCAgIGNyYXRlLWRl cGVuZGVuY3ktcmVxdWlyZW1lbnQgInJlcSIpKSA7c3RyaW5nCiAKQEAgLTEwOCwxMyArMTA5LDIy IEBAIHJlY29yZCBvciAjZiBpZiBpdCB3YXMgbm90IGZvdW5kLiIKICAgIlJldHVybiB0aGUgbGlz dCBvZiA8Y3JhdGUtZGVwZW5kZW5jeT4gcmVjb3JkcyBvZiBWRVJTSU9OLCBhCiA8Y3JhdGUtdmVy c2lvbj4uIgogICAobGV0KiAoKHBhdGggKGFzc29jLXJlZiAoY3JhdGUtdmVyc2lvbi1saW5rcyB2 ZXJzaW9uKSAiZGVwZW5kZW5jaWVzIikpCi0gICAgICAgICAodXJsICAoc3RyaW5nLWFwcGVuZCAo JWNyYXRlLWJhc2UtdXJsKSBwYXRoKSkpCi0gICAgKG1hdGNoIChhc3NvYy1yZWYgKG9yIChqc29u LWZldGNoIHVybCkgJygpKSAiZGVwZW5kZW5jaWVzIikKLSAgICAgICgoPyB2ZWN0b3I/IHZlY3Rv cikKLSAgICAgICAobWFwIGpzb24tPmNyYXRlLWRlcGVuZGVuY3kgKHZlY3Rvci0+bGlzdCB2ZWN0 b3IpKSkKLSAgICAgIChfCi0gICAgICAgJygpKSkpKQotCisgICAgICAgICAodXJsICAoc3RyaW5n LWFwcGVuZCAoJWNyYXRlLWJhc2UtdXJsKSBwYXRoKSkKKyAgICAgICAgIChkZXBzLWxpc3QgKG1h dGNoIChhc3NvYy1yZWYgKG9yIChqc29uLWZldGNoIHVybCkgJygpKSAiZGVwZW5kZW5jaWVzIikK KyAgICAgICAgICAgICAgICAgICAgICAoKD8gdmVjdG9yPyB2ZWN0b3IpICh2ZWN0b3ItPmxpc3Qg dmVjdG9yKSkKKyAgICAgICAgICAgICAgICAgICAgICAoXworICAgICAgICAgICAgICAgICAgICAg ICAnKCkpKSkKKyAgICAgICAgIDs7IHR1cm4gdGhlIHJhdyBsaXN0IGludG8gPGRlcGVuZGVuY3k+ J3MgYW5kIHJlbW92ZSBkZXYgZGVwZW5lZGVuY2llcworICAgICAgICAgKGRlcHMgKGZpbHRlci1t YXAgKGxhbWJkYSAoanNvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKGRl cCAoanNvbi0+Y3JhdGUtZGVwZW5kZW5jeSBqc29uKSkpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGlmIChlcT8gKGNyYXRlLWRlcGVuZGVuY3kta2luZCBkZXApICdkZXYpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGRlcCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy1saXN0 KSkpCisgICAgOztyZW1vdmUgZHVwbGljYXRlIGRlcGVuZGVuY2llcworICAgIChhcHBseSBsc2V0 LWFkam9pbiBgKCwobGFtYmRhIChhIGIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0 cmluZy1jaT0/IChjcmF0ZS1kZXBlbmRlbmN5LWlkIGEpIChjcmF0ZS1kZXBlbmRlbmN5LWlkIGIp KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKSAsQGRlcHMpKSkpCiAMCiA7OzsKIDs7OyBD b252ZXJ0aW5nIGNyYXRlcyB0byBHdWl4IHBhY2thZ2VzLgpAQCAtMTQxLDQyICsxNTEsNTUgQEAg cmVjb3JkIG9yICNmIGlmIGl0IHdhcyBub3QgZm91bmQuIgogICAgICgoYXJncyAuLi4pCiAgICAg IGAoKGFyZ3VtZW50cyAoLCdxdWFzaXF1b3RlICxhcmdzKSkpKSkpCiAKLShkZWZpbmUqIChtYWtl LWNyYXRlLXNleHAgIzprZXkgbmFtZSB2ZXJzaW9uIGNhcmdvLWlucHV0cyBjYXJnby1kZXZlbG9w bWVudC1pbnB1dHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaG9tZS1wYWdlIHN5bm9wc2lz IGRlc2NyaXB0aW9uIGxpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIzphbGxvdy1v dGhlci1rZXlzKQotICAiUmV0dXJuIHRoZSBgcGFja2FnZScgcy1leHByZXNzaW9uIGZvciBhIHJ1 c3QgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBOQU1FLAotVkVSU0lPTiwgQ0FSR08tSU5QVVRTLCBD QVJHTy1ERVZFTE9QTUVOVC1JTlBVVFMsIEhPTUUtUEFHRSwgU1lOT1BTSVMsIERFU0NSSVBUSU9O LAotYW5kIExJQ0VOU0UuIgotICAobGV0KiAoKHBvcnQgKGh0dHAtZmV0Y2ggKGNyYXRlLXVyaSBu YW1lIHZlcnNpb24pKSkKKyhkZWZpbmUgKG1ha2UtY3JhdGUtc2V4cCBjcmF0ZSB2ZXJzaW9uKiBk ZXBlbmRlbmNpZXMpCisgICJSZXR1cm4gdGhlIGBwYWNrYWdlJyBzLWV4cHJlc3Npb24gZm9yIGEg cnVzdCBwYWNrYWdlIGdpdmVuIDxjcmF0ZT4sCisgPGNyYXRlLXZlcnNpb24+IGFuZCBhIGxpc3Qg b2YgPGNyYXRlLWRlcGVuZGVuY3k+IgorICAoZGVmaW5lIG5vcm1hbC1kZXBlbmRlbmN5PworICAg IChtYXRjaC1sYW1iZGEgKChfIGRlcCkgKG5vdCAoZXE/IChjcmF0ZS1kZXBlbmRlbmN5LWtpbmQg ZGVwKSAnZGV2KSkpKSkKKworICAobGV0KiAoKGRlcC1jcmF0ZXMgZGV2LWRlcC1jcmF0ZXMgKHBh cnRpdGlvbiBub3JtYWwtZGVwZW5kZW5jeT8gZGVwZW5kZW5jaWVzKSkKKyAgICAgICAgIChjYXJn by1pbnB1dHMgKHNvcnQgKHVuemlwMSBkZXAtY3JhdGVzKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJpbmctY2k8PykpCisgICAgICAgICAoY2FyZ28tZGV2ZWxvcG1lbnQtaW5wdXRz CisgICAgICAgICAgKHNvcnQgKHVuemlwMSBkZXYtZGVwLWNyYXRlcykKKyAgICAgICAgICAgICAg ICBzdHJpbmctY2k8PykpCisgICAgICAgICAobmFtZSAoY3JhdGUtbmFtZSBjcmF0ZSkpCisgICAg ICAgICAodmVyc2lvbiAoY3JhdGUtdmVyc2lvbi1udW1iZXIgdmVyc2lvbiopKQorICAgICAgICAg KGhvbWUtcGFnZSAob3IgKGNyYXRlLWhvbWUtcGFnZSBjcmF0ZSkKKyAgICAgICAgICAgICAgICAg ICAgICAgIChjcmF0ZS1yZXBvc2l0b3J5IGNyYXRlKSkpCisgICAgICAgICAoc3lub3BzaXMgKGNy YXRlLWRlc2NyaXB0aW9uIGNyYXRlKSkKKyAgICAgICAgIChkZXNjcmlwdGlvbiAoY3JhdGUtZGVz Y3JpcHRpb24gY3JhdGUpKQorICAgICAgICAgKGxpY2Vuc2UgKGFuZD0+IChjcmF0ZS12ZXJzaW9u LWxpY2Vuc2UgdmVyc2lvbiopCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLT5saWNl bnNlKSkKKyAgICAgICAgIChwb3J0IChodHRwLWZldGNoIChjcmF0ZS11cmkgbmFtZSB2ZXJzaW9u KSkgKQogICAgICAgICAgKGd1aXgtbmFtZSAoY3JhdGUtbmFtZS0+cGFja2FnZS1uYW1lIG5hbWUp KQotICAgICAgICAgKGNhcmdvLWlucHV0cyAobWFwIGNyYXRlLW5hbWUtPnBhY2thZ2UtbmFtZSBj YXJnby1pbnB1dHMpKQotICAgICAgICAgKGNhcmdvLWRldmVsb3BtZW50LWlucHV0cyAobWFwIGNy YXRlLW5hbWUtPnBhY2thZ2UtbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNhcmdvLWRldmVsb3BtZW50LWlucHV0cykpCiAgICAgICAgICAocGtnIGAocGFja2Fn ZQotICAgICAgICAgICAgICAgICAgIChuYW1lICxndWl4LW5hbWUpCi0gICAgICAgICAgICAgICAg ICAgKHZlcnNpb24gLHZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgKHNvdXJjZSAob3JpZ2lu Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXRob2QgdXJsLWZldGNoKQotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAodXJpIChjcmF0ZS11cmkgLG5hbWUgdmVyc2lvbikpCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUgKHN0cmluZy1hcHBlbmQgbmFt ZSAiLSIgdmVyc2lvbiAiLnRhci5neiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo c2hhMjU2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTMyCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLChieXRldmVjdG9yLT5uaXgtYmFzZTMyLXN0cmluZyAocG9y dC1zaGEyNTYgcG9ydCkpKSkpKQotICAgICAgICAgICAgICAgICAgIChidWlsZC1zeXN0ZW0gY2Fy Z28tYnVpbGQtc3lzdGVtKQotICAgICAgICAgICAgICAgICAgICxAKG1heWJlLWFyZ3VtZW50cyAo YXBwZW5kIChtYXliZS1jYXJnby1pbnB1dHMgY2FyZ28taW5wdXRzKQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXliZS1jYXJnby1kZXZlbG9wbWVudC1p bnB1dHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNh cmdvLWRldmVsb3BtZW50LWlucHV0cykpKQotICAgICAgICAgICAgICAgICAgIChob21lLXBhZ2Ug LChtYXRjaCBob21lLXBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKSAi IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfIGhvbWUtcGFnZSkpKQotICAg ICAgICAgICAgICAgICAgIChzeW5vcHNpcyAsc3lub3BzaXMpCi0gICAgICAgICAgICAgICAgICAg KGRlc2NyaXB0aW9uICwoYmVhdXRpZnktZGVzY3JpcHRpb24gZGVzY3JpcHRpb24pKQotICAgICAg ICAgICAgICAgICAgIChsaWNlbnNlICwobWF0Y2ggbGljZW5zZQotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICgoKSAjZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxp Y2Vuc2UpIGxpY2Vuc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF8gYChsaXN0 ICxAbGljZW5zZSkpKSkpKSkKLSAgICAgICAgIChjbG9zZS1wb3J0IHBvcnQpCi0gICAgICAgICBw a2cpKQorICAgICAgICAgICAgICAgICAobmFtZSAsZ3VpeC1uYW1lKQorICAgICAgICAgICAgICAg ICAodmVyc2lvbiAsdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgKHNvdXJjZSAob3JpZ2luCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICh1cmkgKGNyYXRlLXVyaSAsbmFtZSB2ZXJzaW9uKSkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIgdmVy c2lvbiAiLmNyYXRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hhMjU2CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2UzMgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAsKGJ5dGV2ZWN0b3ItPm5peC1iYXNlMzItc3RyaW5nIChwb3J0LXNoYTI1NiBwb3J0KSkp KSkpCisgICAgICAgICAgICAgICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVtKQor ICAgICAgICAgICAgICAgICAsQChtYXliZS1hcmd1bWVudHMgKGFwcGVuZCBgKCM6c2tpcC1idWls ZD8gI3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXli ZS1jYXJnby1pbnB1dHMgY2FyZ28taW5wdXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAobWF5YmUtY2FyZ28tZGV2ZWxvcG1lbnQtaW5wdXRzCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJnby1kZXZlbG9wbWVudC1p bnB1dHMpKSkKKyAgICAgICAgICAgICAgICAgKGhvbWUtcGFnZSAsKG1hdGNoIGhvbWUtcGFnZQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKSAiIikKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoXyBob21lLXBhZ2UpKSkKKyAgICAgICAgICAgICAgICAgKHN5bm9wc2lz ICxzeW5vcHNpcykKKyAgICAgICAgICAgICAgICAgKGRlc2NyaXB0aW9uICwoYmVhdXRpZnktZGVz Y3JpcHRpb24gZGVzY3JpcHRpb24pKQorICAgICAgICAgICAgICAgICAobGljZW5zZSAsKG1hdGNo IGxpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgpICNmKQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoKGxpY2Vuc2UpIGxpY2Vuc2UpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChfIGAobGlzdCAsQGxpY2Vuc2UpKSkpKSkpCisKKyAgICAoY2xvc2UtcG9y dCBwb3J0KQorICAgIHBrZykpCiAKIChkZWZpbmUgKHN0cmluZy0+bGljZW5zZSBzdHJpbmcpCiAg IChmaWx0ZXItbWFwIChsYW1iZGEgKGxpY2Vuc2UpCkBAIC0xODcsMTUgKzIxMCwyNCBAQCBhbmQg TElDRU5TRS4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Vua25vd24tbGljZW5zZSEpKSkK ICAgICAgICAgICAgICAgKHN0cmluZy1zcGxpdCBzdHJpbmcgKHN0cmluZy0+Y2hhci1zZXQgIiAv IikpKSkKIAorKGRlZmluZSAoY3JhdGUtPmNyYXRlLXZlcnNpb24gY3JhdGUgdmVyc2lvbi1udW1i ZXIpCisgICJyZXR1cm5zIHRoZSA8Y3JhdGUtdmVyc2lvbj4gZm9yIGEgZ2l2ZW4gQ1JBVEUgYW5k IFZFUlNJT04tTlVNQkVSIgorICAoZmluZCAobGFtYmRhICh2ZXJzaW9uKQorICAgICAgICAgICAg KHN0cmluZz0/IChjcmF0ZS12ZXJzaW9uLW51bWJlciB2ZXJzaW9uKQorICAgICAgICAgICAgICAg ICAgICAgIHZlcnNpb24tbnVtYmVyKSkKKyAgICAgICAgICAoY3JhdGUtdmVyc2lvbnMgY3JhdGUp KSkKKworKGRlZmluZSAoY3JhdGUtPnZlcnNpb25zIGNyYXRlKQorICAiUmV0dXJucyBhIGxpc3Qg b2YgdmVyc2lvbnMgZm9yIGEgZ2l2ZW4gQ1JBVEUiCisgIChtYXAgKGxhbWJkYSAodmVyc2lvbikK KyAgICAgICAgIChjcmF0ZS12ZXJzaW9uLW51bWJlciB2ZXJzaW9uKSkKKyAgICAgICAoY3JhdGUt dmVyc2lvbnMgY3JhdGUpKSkKKwogKGRlZmluZSogKGNyYXRlLT5ndWl4LXBhY2thZ2UgY3JhdGUt bmFtZSAjOm9wdGlvbmFsIHZlcnNpb24pCiAgICJGZXRjaCB0aGUgbWV0YWRhdGEgZm9yIENSQVRF LU5BTUUgZnJvbSBjcmF0ZXMuaW8sIGFuZCByZXR1cm4gdGhlCiBgcGFja2FnZScgcy1leHByZXNz aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBwYWNrYWdlLCBvciAjZiBvbiBmYWlsdXJlLgogV2hl biBWRVJTSU9OIGlzIHNwZWNpZmllZCwgYXR0ZW1wdCB0byBmZXRjaCB0aGF0IHZlcnNpb247IG90 aGVyd2lzZSBmZXRjaCB0aGUKIGxhdGVzdCB2ZXJzaW9uIG9mIENSQVRFLU5BTUUuIgotCi0gIChk ZWZpbmUgKG5vcm1hbC1kZXBlbmRlbmN5PyBkZXBlbmRlbmN5KQotICAgIChlcT8gKGNyYXRlLWRl cGVuZGVuY3kta2luZCBkZXBlbmRlbmN5KSAnbm9ybWFsKSkKLQogICAoZGVmaW5lIGNyYXRlCiAg ICAgKGxvb2t1cC1jcmF0ZSBjcmF0ZS1uYW1lKSkKIApAQCAtMjA0LDM4ICsyMzYsMjggQEAgbGF0 ZXN0IHZlcnNpb24gb2YgQ1JBVEUtTkFNRS4iCiAgICAgICAgIChjcmF0ZS1sYXRlc3QtdmVyc2lv biBjcmF0ZSkpKQogCiAgIChkZWZpbmUgdmVyc2lvbioKLSAgICAoZmluZCAobGFtYmRhICh2ZXJz aW9uKQotICAgICAgICAgICAgKHN0cmluZz0/IChjcmF0ZS12ZXJzaW9uLW51bWJlciB2ZXJzaW9u KQotICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24tbnVtYmVyKSkKLSAgICAgICAgICAoY3Jh dGUtdmVyc2lvbnMgY3JhdGUpKSkKKyAgICAoY3JhdGUtPmNyYXRlLXZlcnNpb24gY3JhdGUgdmVy c2lvbi1udW1iZXIpKQorCisgIChkZWZpbmUgZGVwZW5kZW5jaWVzIChtYXAKKyAgICAgICAgICAg ICAgICAgICAgICAgIChsYW1iZGEgKGRlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxp c3QgKGNyYXRlLW5hbWUtPnBhY2thZ2UtbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg KGNyYXRlLWRlcGVuZGVuY3ktaWQgZGVwKSkgZGVwKSkKKyAgICAgICAgICAgICAgICAgICAgICAg IChjcmF0ZS12ZXJzaW9uLWRlcGVuZGVuY2llcyB2ZXJzaW9uKikpKQorICAobWFrZS1jcmF0ZS1z ZXhwIGNyYXRlIHZlcnNpb24qIGRlcGVuZGVuY2llcykpCiAKLSAgKGFuZCBjcmF0ZSB2ZXJzaW9u KgotICAgICAgIChsZXQqICgoZGVwZW5kZW5jaWVzICAgKGNyYXRlLXZlcnNpb24tZGVwZW5kZW5j aWVzIHZlcnNpb24qKSkKLSAgICAgICAgICAgICAgKGRlcC1jcmF0ZXMgICAgIChmaWx0ZXIgbm9y bWFsLWRlcGVuZGVuY3k/IGRlcGVuZGVuY2llcykpCi0gICAgICAgICAgICAgIChkZXYtZGVwLWNy YXRlcyAocmVtb3ZlIG5vcm1hbC1kZXBlbmRlbmN5PyBkZXBlbmRlbmNpZXMpKQotICAgICAgICAg ICAgICAoY2FyZ28taW5wdXRzICAgKHNvcnQgKG1hcCBjcmF0ZS1kZXBlbmRlbmN5LWlkIGRlcC1j cmF0ZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmctY2k8Pykp Ci0gICAgICAgICAgICAgIChjYXJnby1kZXZlbG9wbWVudC1pbnB1dHMKLSAgICAgICAgICAgICAg IChzb3J0IChtYXAgY3JhdGUtZGVwZW5kZW5jeS1pZCBkZXYtZGVwLWNyYXRlcykKLSAgICAgICAg ICAgICAgICAgICAgIHN0cmluZy1jaTw/KSkpCi0gICAgICAgICAodmFsdWVzCi0gICAgICAgICAg KG1ha2UtY3JhdGUtc2V4cCAjOm5hbWUgY3JhdGUtbmFtZQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgIzp2ZXJzaW9uIChjcmF0ZS12ZXJzaW9uLW51bWJlciB2ZXJzaW9uKikKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICM6Y2FyZ28taW5wdXRzIGNhcmdvLWlucHV0cwotICAgICAgICAg ICAgICAgICAgICAgICAgICAgIzpjYXJnby1kZXZlbG9wbWVudC1pbnB1dHMgY2FyZ28tZGV2ZWxv cG1lbnQtaW5wdXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAjOmhvbWUtcGFnZSAob3Ig KGNyYXRlLWhvbWUtcGFnZSBjcmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoY3JhdGUtcmVwb3NpdG9yeSBjcmF0ZSkpCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAjOnN5bm9wc2lzIChjcmF0ZS1kZXNjcmlwdGlvbiBjcmF0ZSkKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICM6ZGVzY3JpcHRpb24gKGNyYXRlLWRlc2NyaXB0aW9uIGNyYXRlKQot ICAgICAgICAgICAgICAgICAgICAgICAgICAgIzpsaWNlbnNlIChhbmQ9PiAoY3JhdGUtdmVyc2lv bi1saWNlbnNlIHZlcnNpb24qKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJpbmctPmxpY2Vuc2UpKQotICAgICAgICAgIChhcHBlbmQgY2FyZ28taW5wdXRz IGNhcmdvLWRldmVsb3BtZW50LWlucHV0cykpKSkpCiAKLShkZWZpbmUgKGNyYXRlLXJlY3Vyc2l2 ZS1pbXBvcnQgY3JhdGUtbmFtZSkKLSAgKHJlY3Vyc2l2ZS1pbXBvcnQgY3JhdGUtbmFtZSAjZgot ICAgICAgICAgICAgICAgICAgICAjOnJlcG8tPmd1aXgtcGFja2FnZSAobGFtYmRhIChuYW1lIHJl cG8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyYXRlLT5n dWl4LXBhY2thZ2UgbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICM6Z3VpeC1uYW1lIGNyYXRl LW5hbWUtPnBhY2thZ2UtbmFtZSkpCisoZGVmaW5lKiAoY3JhdGUtcmVjdXJzaXZlLWltcG9ydCBu YW1lICM6b3B0aW9uYWwgcmFuZ2UpCisgIChyZWN1cnNpdmUtaW1wb3J0LXNlbXZlcgorICAgIzpu YW1lIG5hbWUKKyAgICM6cmFuZ2UgKGlmIHJhbmdlIHJhbmdlICIqIikKKyAgICM6bmFtZS0+bWV0 YWRhdGEgbG9va3VwLWNyYXRlCisgICAjOm1ldGFkYXRhLT5wYWNrYWdlIGNyYXRlLT5jcmF0ZS12 ZXJzaW9uCisgICAjOm1ldGFkYXRhLXZlcnNpb25zIGNyYXRlLT52ZXJzaW9ucworICAgIzpwYWNr YWdlLWRlcGVuZGVuY2llcyBjcmF0ZS12ZXJzaW9uLWRlcGVuZGVuY2llcworICAgIzpkZXBlbmRl bmN5LW5hbWUgY3JhdGUtZGVwZW5kZW5jeS1pZAorICAgIzpkZXBlbmRlbmN5LXJhbmdlIGNyYXRl LWRlcGVuZGVuY3ktcmVxdWlyZW1lbnQKKyAgICM6Z3VpeC1uYW1lIGNyYXRlLW5hbWUtPnBhY2th Z2UtbmFtZQorICAgIzptYWtlLXNleHAgbWFrZS1jcmF0ZS1zZXhwKSkKIAogKGRlZmluZSAoZ3Vp eC1wYWNrYWdlLT5jcmF0ZS1uYW1lIHBhY2thZ2UpCiAgICJSZXR1cm4gdGhlIGNyYXRlIG5hbWUg b2YgUEFDS0FHRS4iCkBAIC0yODQsNCArMzA2LDMgQEAgbGF0ZXN0IHZlcnNpb24gb2YgQ1JBVEUt TkFNRS4iCiAgICAoZGVzY3JpcHRpb24gIlVwZGF0ZXIgZm9yIGNyYXRlcy5pbyBwYWNrYWdlcyIp CiAgICAocHJlZCBjcmF0ZS1wYWNrYWdlPykKICAgIChsYXRlc3QgbGF0ZXN0LXJlbGVhc2UpKSkK LQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3JhdGUuc2NtIGIvdGVzdHMvY3JhdGUuc2NtCmluZGV4IDYx OTMzYThkZTguLjQyYzk0Yjk5OTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NyYXRlLnNjbQorKysgYi90 ZXN0cy9jcmF0ZS5zY20KQEAgLTIsNiArMiw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMTQgRGF2 aWQgVGhvbXBzb24gPGRhdmV0QGdudS5vcmc+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMTYgRGF2aWQg Q3JhdmVuIDxkYXZpZEBjcmF2ZW4uY2g+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMTkgTHVkb3ZpYyBD b3VydMOocyA8bHVkb0BnbnUub3JnPgorOzs7IENvcHlyaWdodCDCqSAyMDE5IE1hcnRpbiBCZWN6 ZSA8bWpiZWN6ZUByaXNldXAubmV0PgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05V IEd1aXguCiA7OzsKQEAgLTU2LDYgKzU3LDcgQEAKICAgICAgewogICAgICAgIFwiY3JhdGVfaWRc IjogXCJiYXJcIiwKICAgICAgICBcImtpbmRcIjogXCJub3JtYWxcIiwKKyAgICAgICBcInJlcVwi OiBcIjFcIgogICAgICB9CiAgIF0KIH0iKQpAQCAtODgsMTggKzkwLDIyIEBACiAgICAgIHsKICAg ICAgICBcImNyYXRlX2lkXCI6IFwiaW50ZXJtZWRpYXRlLTFcIiwKICAgICAgICBcImtpbmRcIjog XCJub3JtYWxcIiwKKyAgICAgICBcInJlcVwiOiBcIjFcIgogICAgICB9LAogICAgICB7CiAgICAg ICAgXCJjcmF0ZV9pZFwiOiBcImludGVybWVkaWF0ZS0yXCIsCiAgICAgICAgXCJraW5kXCI6IFwi bm9ybWFsXCIsCisgICAgICAgXCJyZXFcIjogXCIxXCIKICAgICAgfQogICAgICB7CiAgICAgICAg XCJjcmF0ZV9pZFwiOiBcImxlYWYtYWxpY2VcIiwKICAgICAgICBcImtpbmRcIjogXCJub3JtYWxc IiwKKyAgICAgICBcInJlcVwiOiBcIjFcIgogICAgICB9LAogICAgICB7CiAgICAgICAgXCJjcmF0 ZV9pZFwiOiBcImxlYWYtYm9iXCIsCiAgICAgICAgXCJraW5kXCI6IFwibm9ybWFsXCIsCisgICAg ICAgXCJyZXFcIjogXCIxXCIKICAgICAgfSwKICAgXQogfSIpCkBAIC0xMzIsMTQgKzEzOCwxNyBA QAogICAgICB7CiAgICAgICAgXCJjcmF0ZV9pZFwiOiBcImludGVybWVkaWF0ZS0yXCIsCiAgICAg ICAgXCJraW5kXCI6IFwibm9ybWFsXCIsCisgICAgICAgXCJyZXFcIjogXCIxXCIKICAgICAgfSwK ICAgICAgewogICAgICAgIFwiY3JhdGVfaWRcIjogXCJsZWFmLWFsaWNlXCIsCiAgICAgICAgXCJr aW5kXCI6IFwibm9ybWFsXCIsCisgICAgICAgXCJyZXFcIjogXCIxXCIKICAgICAgfSwKICAgICAg ewogICAgICAgIFwiY3JhdGVfaWRcIjogXCJsZWFmLWJvYlwiLAogICAgICAgIFwia2luZFwiOiBc Im5vcm1hbFwiLAorICAgICAgIFwicmVxXCI6IFwiMVwiCiAgICAgIH0KICAgXQogfSIpCkBAIC0x NzIsNiArMTgxLDcgQEAKICAgICAgewogICAgICAgIFwiY3JhdGVfaWRcIjogXCJsZWFmLWJvYlwi LAogICAgICAgIFwia2luZFwiOiBcIm5vcm1hbFwiLAorICAgICAgIFwicmVxXCI6IFwiMVwiCiAg ICAgIH0sCiAgIF0KIH0iKQpAQCAtMjY4LDE0ICsyNzgsMTUgQEAKICAgICAgICAgICgnc291cmNl ICgnb3JpZ2luCiAgICAgICAgICAgICAgICAgICAgICgnbWV0aG9kICd1cmwtZmV0Y2gpCiAgICAg ICAgICAgICAgICAgICAgICgndXJpICgnY3JhdGUtdXJpICJmb28iICd2ZXJzaW9uKSkKLSAgICAg ICAgICAgICAgICAgICAgKCdmaWxlLW5hbWUgKCdzdHJpbmctYXBwZW5kICduYW1lICItIiAndmVy c2lvbiAiLnRhci5neiIpKQorICAgICAgICAgICAgICAgICAgICAoJ2ZpbGUtbmFtZSAoJ3N0cmlu Zy1hcHBlbmQgJ25hbWUgIi0iICd2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAgICAgICAgICAg ICAgKCdzaGEyNTYKICAgICAgICAgICAgICAgICAgICAgICgnYmFzZTMyCiAgICAgICAgICAgICAg ICAgICAgICAgKD8gc3RyaW5nPyBoYXNoKSkpKSkKICAgICAgICAgICgnYnVpbGQtc3lzdGVtICdj YXJnby1idWlsZC1zeXN0ZW0pCiAgICAgICAgICAoJ2FyZ3VtZW50cwogICAgICAgICAgICgncXVh c2lxdW90ZQotICAgICAgICAgICAoJyM6Y2FyZ28taW5wdXRzICgoInJ1c3QtYmFyIiAoJ3VucXVv dGUgcnVzdC1iYXIpKSkpKSkKKyAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0CisgICAgICAg ICAgICAjOmNhcmdvLWlucHV0cyAoKCJydXN0LWJhciIgKCd1bnF1b3RlIHJ1c3QtYmFyKSkpKSkp CiAgICAgICAgICAoJ2hvbWUtcGFnZSAiaHR0cDovL2V4YW1wbGUuY29tIikKICAgICAgICAgICgn c3lub3BzaXMgInN1bW1hcnkiKQogICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCkBA IC0zMzUsMTA3ICszNDYsMTI2IEBACiAgICAgICAgICAgICAgKCJodHRwczovL2NyYXRlcy5pby9h cGkvdjEvY3JhdGVzL2xlYWYtYm9iLzEuMC4wL2RlcGVuZGVuY2llcyIKICAgICAgICAgICAgICAg KG9wZW4taW5wdXQtc3RyaW5nIHRlc3QtbGVhZi1ib2ItZGVwZW5kZW5jaWVzKSkKICAgICAgICAg ICAgICAoXyAoZXJyb3IgIlVuZXhwZWN0ZWQgVVJMOiAiIHVybCkpKSkpCisKICAgICAgICAgKG1h dGNoIChjcmF0ZS1yZWN1cnNpdmUtaW1wb3J0ICJyb290IikKICAgICAgICAgICA7OyBydXN0LWlu dGVybWVkaWF0ZS0yIGhhcyBubyBkZXBlbmRlbmN5IG9uIHRoZSBydXN0LWxlYWYtYWxpY2UgcGFj a2FnZSwgc28gdGhpcyBpcyBhIHZhbGlkIG9yZGVyaW5nCi0gICAgICAgICAgKCgoJ3BhY2thZ2UK LSAgICAgICAgICAgICAgKCduYW1lICJydXN0LWxlYWYtYWxpY2UiKQotICAgICAgICAgICAgICAo J3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIpKQotICAgICAgICAgICAgICAoJ3NvdXJjZQotICAgICAg ICAgICAgICAgKCdvcmlnaW4KLSAgICAgICAgICAgICAgICAgKCdtZXRob2QgJ3VybC1mZXRjaCkK LSAgICAgICAgICAgICAgICAgKCd1cmkgKCdjcmF0ZS11cmkgImxlYWYtYWxpY2UiICd2ZXJzaW9u KSkKLSAgICAgICAgICAgICAgICAgKCdmaWxlLW5hbWUKLSAgICAgICAgICAgICAgICAgICgnc3Ry aW5nLWFwcGVuZCAnbmFtZSAiLSIgJ3ZlcnNpb24gIi50YXIuZ3oiKSkKLSAgICAgICAgICAgICAg ICAgKCdzaGEyNTYKLSAgICAgICAgICAgICAgICAgICgnYmFzZTMyCi0gICAgICAgICAgICAgICAg ICAgKD8gc3RyaW5nPyBoYXNoKSkpKSkKLSAgICAgICAgICAgICAgKCdidWlsZC1zeXN0ZW0gJ2Nh cmdvLWJ1aWxkLXN5c3RlbSkKLSAgICAgICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6Ly9leGFt cGxlLmNvbSIpCi0gICAgICAgICAgICAgICgnc3lub3BzaXMgInN1bW1hcnkiKQotICAgICAgICAg ICAgICAoJ2Rlc2NyaXB0aW9uICJzdW1tYXJ5IikKLSAgICAgICAgICAgICAgKCdsaWNlbnNlICgn bGlzdCAnbGljZW5zZTpleHBhdCAnbGljZW5zZTphc2wyLjApKSkKLSAgICAgICAgICAgICgncGFj a2FnZQotICAgICAgICAgICAgICAoJ25hbWUgInJ1c3QtbGVhZi1ib2IiKQotICAgICAgICAgICAg ICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIpKQotICAgICAgICAgICAgICAoJ3NvdXJjZQotICAg ICAgICAgICAgICAgKCdvcmlnaW4KLSAgICAgICAgICAgICAgICAgKCdtZXRob2QgJ3VybC1mZXRj aCkKLSAgICAgICAgICAgICAgICAgKCd1cmkgKCdjcmF0ZS11cmkgImxlYWYtYm9iIiAndmVyc2lv bikpCi0gICAgICAgICAgICAgICAgICgnZmlsZS1uYW1lCi0gICAgICAgICAgICAgICAgICAoJ3N0 cmluZy1hcHBlbmQgJ25hbWUgIi0iICd2ZXJzaW9uICIudGFyLmd6IikpCi0gICAgICAgICAgICAg ICAgICgnc2hhMjU2Ci0gICAgICAgICAgICAgICAgICAoJ2Jhc2UzMgotICAgICAgICAgICAgICAg ICAgICg/IHN0cmluZz8gaGFzaCkpKSkpCi0gICAgICAgICAgICAgICgnYnVpbGQtc3lzdGVtICdj YXJnby1idWlsZC1zeXN0ZW0pCi0gICAgICAgICAgICAgICgnaG9tZS1wYWdlICJodHRwOi8vZXhh bXBsZS5jb20iKQotICAgICAgICAgICAgICAoJ3N5bm9wc2lzICJzdW1tYXJ5IikKLSAgICAgICAg ICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCi0gICAgICAgICAgICAgICgnbGljZW5zZSAo J2xpc3QgJ2xpY2Vuc2U6ZXhwYXQgJ2xpY2Vuc2U6YXNsMi4wKSkpCi0gICAgICAgICAgICAoJ3Bh Y2thZ2UKLSAgICAgICAgICAgICAgKCduYW1lICJydXN0LWludGVybWVkaWF0ZS0yIikKLSAgICAg ICAgICAgICAgKCd2ZXJzaW9uICg/IHN0cmluZz8gdmVyKSkKLSAgICAgICAgICAgICAgKCdzb3Vy Y2UKLSAgICAgICAgICAgICAgICgnb3JpZ2luCi0gICAgICAgICAgICAgICAgICgnbWV0aG9kICd1 cmwtZmV0Y2gpCi0gICAgICAgICAgICAgICAgICgndXJpICgnY3JhdGUtdXJpICJpbnRlcm1lZGlh dGUtMiIgJ3ZlcnNpb24pKQotICAgICAgICAgICAgICAgICAoJ2ZpbGUtbmFtZQotICAgICAgICAg ICAgICAgICAgKCdzdHJpbmctYXBwZW5kICduYW1lICItIiAndmVyc2lvbiAiLnRhci5neiIpKQot ICAgICAgICAgICAgICAgICAoJ3NoYTI1NgotICAgICAgICAgICAgICAgICAgKCdiYXNlMzIKLSAg ICAgICAgICAgICAgICAgICAoPyBzdHJpbmc/IGhhc2gpKSkpKQotICAgICAgICAgICAgICAoJ2J1 aWxkLXN5c3RlbSAnY2FyZ28tYnVpbGQtc3lzdGVtKQotICAgICAgICAgICAgICAoJ2FyZ3VtZW50 cwotICAgICAgICAgICAgICAgKCdxdWFzaXF1b3RlCi0gICAgICAgICAgICAgICAgKCcjOmNhcmdv LWlucHV0cyAoKCJydXN0LWxlYWYtYm9iIiAoJ3VucXVvdGUgcnVzdC1sZWFmLWJvYikpKSkpKQot ICAgICAgICAgICAgICAoJ2hvbWUtcGFnZSAiaHR0cDovL2V4YW1wbGUuY29tIikKLSAgICAgICAg ICAgICAgKCdzeW5vcHNpcyAic3VtbWFyeSIpCi0gICAgICAgICAgICAgICgnZGVzY3JpcHRpb24g InN1bW1hcnkiKQotICAgICAgICAgICAgICAoJ2xpY2Vuc2UgKCdsaXN0ICdsaWNlbnNlOmV4cGF0 ICdsaWNlbnNlOmFzbDIuMCkpKQotICAgICAgICAgICAgKCdwYWNrYWdlCi0gICAgICAgICAgICAg ICgnbmFtZSAicnVzdC1pbnRlcm1lZGlhdGUtMSIpCi0gICAgICAgICAgICAgICgndmVyc2lvbiAo PyBzdHJpbmc/IHZlcikpCi0gICAgICAgICAgICAgICgnc291cmNlCi0gICAgICAgICAgICAgICAo J29yaWdpbgotICAgICAgICAgICAgICAgICAoJ21ldGhvZCAndXJsLWZldGNoKQotICAgICAgICAg ICAgICAgICAoJ3VyaSAoJ2NyYXRlLXVyaSAiaW50ZXJtZWRpYXRlLTEiICd2ZXJzaW9uKSkKLSAg ICAgICAgICAgICAgICAgKCdmaWxlLW5hbWUKLSAgICAgICAgICAgICAgICAgICgnc3RyaW5nLWFw cGVuZCAnbmFtZSAiLSIgJ3ZlcnNpb24gIi50YXIuZ3oiKSkKLSAgICAgICAgICAgICAgICAgKCdz aGEyNTYKLSAgICAgICAgICAgICAgICAgICgnYmFzZTMyCi0gICAgICAgICAgICAgICAgICAgKD8g c3RyaW5nPyBoYXNoKSkpKSkKLSAgICAgICAgICAgICAgKCdidWlsZC1zeXN0ZW0gJ2NhcmdvLWJ1 aWxkLXN5c3RlbSkKLSAgICAgICAgICAgICAgKCdhcmd1bWVudHMKLSAgICAgICAgICAgICAgICgn cXVhc2lxdW90ZQotICAgICAgICAgICAgICAgICgnIzpjYXJnby1pbnB1dHMgKCgicnVzdC1pbnRl cm1lZGlhdGUtMiIgKCd1bnF1b3RlIHJ1c3QtaW50ZXJtZWRpYXRlLTIpKQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICgicnVzdC1sZWFmLWFsaWNlIiAoJ3VucXVvdGUgcnVzdC1s ZWFmLWFsaWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInJ1c3QtbGVh Zi1ib2IiICgndW5xdW90ZSBydXN0LWxlYWYtYm9iKSkpKSkpCi0gICAgICAgICAgICAgICgnaG9t ZS1wYWdlICJodHRwOi8vZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAoJ3N5bm9wc2lzICJz dW1tYXJ5IikKLSAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCi0gICAgICAg ICAgICAgICgnbGljZW5zZSAoJ2xpc3QgJ2xpY2Vuc2U6ZXhwYXQgJ2xpY2Vuc2U6YXNsMi4wKSkp Ci0gICAgICAgICAgICAoJ3BhY2thZ2UKLSAgICAgICAgICAgICAgKCduYW1lICJydXN0LXJvb3Qi KQotICAgICAgICAgICAgICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIpKQotICAgICAgICAgICAg ICAoJ3NvdXJjZQotICAgICAgICAgICAgICAgKCdvcmlnaW4KLSAgICAgICAgICAgICAgICAgKCdt ZXRob2QgJ3VybC1mZXRjaCkKLSAgICAgICAgICAgICAgICAgKCd1cmkgKCdjcmF0ZS11cmkgInJv b3QiICd2ZXJzaW9uKSkKLSAgICAgICAgICAgICAgICAgKCdmaWxlLW5hbWUKLSAgICAgICAgICAg ICAgICAgICgnc3RyaW5nLWFwcGVuZCAnbmFtZSAiLSIgJ3ZlcnNpb24gIi50YXIuZ3oiKSkKLSAg ICAgICAgICAgICAgICAgKCdzaGEyNTYKLSAgICAgICAgICAgICAgICAgICgnYmFzZTMyCi0gICAg ICAgICAgICAgICAgICAgKD8gc3RyaW5nPyBoYXNoKSkpKSkKLSAgICAgICAgICAgICAgKCdidWls ZC1zeXN0ZW0gJ2NhcmdvLWJ1aWxkLXN5c3RlbSkKLSAgICAgICAgICAgICAgKCdhcmd1bWVudHMK LSAgICAgICAgICAgICAgICgncXVhc2lxdW90ZQotICAgICAgICAgICAgICAgICgnIzpjYXJnby1p bnB1dHMgKCgicnVzdC1pbnRlcm1lZGlhdGUtMSIgKCd1bnF1b3RlIHJ1c3QtaW50ZXJtZWRpYXRl LTEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicnVzdC1pbnRlcm1lZGlh dGUtMiIgKCd1bnF1b3RlIHJ1c3QtaW50ZXJtZWRpYXRlLTIpKQotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICgicnVzdC1sZWFmLWFsaWNlIiAoJ3VucXVvdGUgcnVzdC1sZWFmLWFs aWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInJ1c3QtbGVhZi1ib2Ii ICgndW5xdW90ZSBydXN0LWxlYWYtYm9iKSkpKSkpCi0gICAgICAgICAgICAgICgnaG9tZS1wYWdl ICJodHRwOi8vZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAoJ3N5bm9wc2lzICJzdW1tYXJ5 IikKLSAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCi0gICAgICAgICAgICAg ICgnbGljZW5zZSAoJ2xpc3QgJ2xpY2Vuc2U6ZXhwYXQgJ2xpY2Vuc2U6YXNsMi4wKSkpKQorICAg ICAgICAgICgoKCdkZWZpbmUtcHVibGljICdydXN0LWludGVybWVkaWF0ZS0xLTEuMC4wCisgICAg ICAgICAgICAgICgncGFja2FnZQorICAgICAgICAgICAgICAgICgnbmFtZSAicnVzdC1pbnRlcm1l ZGlhdGUtMSIpCisgICAgICAgICAgICAgICAgKCd2ZXJzaW9uICg/IHN0cmluZz8gdmVyKSkKKyAg ICAgICAgICAgICAgICAoJ3NvdXJjZQorICAgICAgICAgICAgICAgICAoJ29yaWdpbgorICAgICAg ICAgICAgICAgICAgICgnbWV0aG9kICd1cmwtZmV0Y2gpCisgICAgICAgICAgICAgICAgICAgKCd1 cmkgKCdjcmF0ZS11cmkgImludGVybWVkaWF0ZS0xIiAndmVyc2lvbikpCisgICAgICAgICAgICAg ICAgICAgKCdmaWxlLW5hbWUKKyAgICAgICAgICAgICAgICAgICAgKCdzdHJpbmctYXBwZW5kICdu YW1lICItIiAndmVyc2lvbiAiLmNyYXRlIikpCisgICAgICAgICAgICAgICAgICAgKCdzaGEyNTYK KyAgICAgICAgICAgICAgICAgICAgKCdiYXNlMzIKKyAgICAgICAgICAgICAgICAgICAgICg/IHN0 cmluZz8gaGFzaCkpKSkpCisgICAgICAgICAgICAgICAgKCdidWlsZC1zeXN0ZW0gJ2NhcmdvLWJ1 aWxkLXN5c3RlbSkKKyAgICAgICAgICAgICAgICAoJ2FyZ3VtZW50cworICAgICAgICAgICAgICAg ICAoJ3F1YXNpcXVvdGUKKyAgICAgICAgICAgICAgICAgICgnIzpza2lwLWJ1aWxkPyAjdAorICAg ICAgICAgICAgICAgICAgICcjOmNhcmdvLWlucHV0cyAoKCJydXN0LWludGVybWVkaWF0ZS0yLTEu MC4wIiAoJ3VucXVvdGUgcnVzdC1pbnRlcm1lZGlhdGUtMi0xLjAuMCkpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoInJ1c3QtbGVhZi1hbGljZS0xLjAuMCIgKCd1bnF1b3Rl IHJ1c3QtbGVhZi1hbGljZS0xLjAuMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAoInJ1c3QtbGVhZi1ib2ItMS4wLjAiICgndW5xdW90ZSBydXN0LWxlYWYtYm9iLTEuMC4w KSkpKSkpCisgICAgICAgICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6Ly9leGFtcGxlLmNvbSIp CisgICAgICAgICAgICAgICAgKCdzeW5vcHNpcyAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAg KCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdsaWNlbnNlICgnbGlz dCAnbGljZW5zZTpleHBhdCAnbGljZW5zZTphc2wyLjApKSkpCisgICAgICAgICAgICAoJ2RlZmlu ZS1wdWJsaWMgJ3J1c3QtaW50ZXJtZWRpYXRlLTItMS4wLjAKKyAgICAgICAgICAgICAgKCdwYWNr YWdlCisgICAgICAgICAgICAgICAgKCduYW1lICJydXN0LWludGVybWVkaWF0ZS0yIikKKyAgICAg ICAgICAgICAgICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIpKQorICAgICAgICAgICAgICAgICgn c291cmNlCisgICAgICAgICAgICAgICAgICgnb3JpZ2luCisgICAgICAgICAgICAgICAgICAgKCdt ZXRob2QgJ3VybC1mZXRjaCkKKyAgICAgICAgICAgICAgICAgICAoJ3VyaSAoJ2NyYXRlLXVyaSAi aW50ZXJtZWRpYXRlLTIiICd2ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAoJ2ZpbGUtbmFt ZQorICAgICAgICAgICAgICAgICAgICAoJ3N0cmluZy1hcHBlbmQgJ25hbWUgIi0iICd2ZXJzaW9u ICIuY3JhdGUiKSkKKyAgICAgICAgICAgICAgICAgICAoJ3NoYTI1NgorICAgICAgICAgICAgICAg ICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAgKD8gc3RyaW5nPyBoYXNoKSkpKSkK KyAgICAgICAgICAgICAgICAoJ2J1aWxkLXN5c3RlbSAnY2FyZ28tYnVpbGQtc3lzdGVtKQorICAg ICAgICAgICAgICAgICgnYXJndW1lbnRzCisgICAgICAgICAgICAgICAgICgncXVhc2lxdW90ZQor ICAgICAgICAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0CisgICAgICAgICAgICAgICAgICAg JyM6Y2FyZ28taW5wdXRzICgoInJ1c3QtbGVhZi1ib2ItMS4wLjAiICgndW5xdW90ZSBydXN0LWxl YWYtYm9iLTEuMC4wKSkpKSkpCisgICAgICAgICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6Ly9l eGFtcGxlLmNvbSIpCisgICAgICAgICAgICAgICAgKCdzeW5vcHNpcyAic3VtbWFyeSIpCisgICAg ICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCds aWNlbnNlICgnbGlzdCAnbGljZW5zZTpleHBhdCAnbGljZW5zZTphc2wyLjApKSkpCisgICAgICAg ICAgICAoJ2RlZmluZS1wdWJsaWMgJ3J1c3QtbGVhZi1hbGljZS0xLjAuMAorICAgICAgICAgICAg ICAoJ3BhY2thZ2UKKyAgICAgICAgICAgICAgICAoJ25hbWUgInJ1c3QtbGVhZi1hbGljZSIpCisg ICAgICAgICAgICAgICAgKCd2ZXJzaW9uICg/IHN0cmluZz8gdmVyKSkKKyAgICAgICAgICAgICAg ICAoJ3NvdXJjZQorICAgICAgICAgICAgICAgICAoJ29yaWdpbgorICAgICAgICAgICAgICAgICAg ICgnbWV0aG9kICd1cmwtZmV0Y2gpCisgICAgICAgICAgICAgICAgICAgKCd1cmkgKCdjcmF0ZS11 cmkgImxlYWYtYWxpY2UiICd2ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAoJ2ZpbGUtbmFt ZQorICAgICAgICAgICAgICAgICAgICAoJ3N0cmluZy1hcHBlbmQgJ25hbWUgIi0iICd2ZXJzaW9u ICIuY3JhdGUiKSkKKyAgICAgICAgICAgICAgICAgICAoJ3NoYTI1NgorICAgICAgICAgICAgICAg ICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAgKD8gc3RyaW5nPyBoYXNoKSkpKSkK KyAgICAgICAgICAgICAgICAoJ2J1aWxkLXN5c3RlbSAnY2FyZ28tYnVpbGQtc3lzdGVtKQorICAg ICAgICAgICAgICAgICgnYXJndW1lbnRzCisgICAgICAgICAgICAgICAgICgncXVhc2lxdW90ZQor ICAgICAgICAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0KSkpCisgICAgICAgICAgICAgICAg KCdob21lLXBhZ2UgImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgICAgICAgICAgICAgKCdzeW5v cHNpcyAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIp CisgICAgICAgICAgICAgICAgKCdsaWNlbnNlICgnbGlzdCAnbGljZW5zZTpleHBhdCAnbGljZW5z ZTphc2wyLjApKSkpCisgICAgICAgICAgICAoJ2RlZmluZS1wdWJsaWMgJ3J1c3QtbGVhZi1ib2It MS4wLjAKKyAgICAgICAgICAgICAgKCdwYWNrYWdlCisgICAgICAgICAgICAgICAgKCduYW1lICJy dXN0LWxlYWYtYm9iIikKKyAgICAgICAgICAgICAgICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIp KQorICAgICAgICAgICAgICAgICgnc291cmNlCisgICAgICAgICAgICAgICAgICgnb3JpZ2luCisg ICAgICAgICAgICAgICAgICAgKCdtZXRob2QgJ3VybC1mZXRjaCkKKyAgICAgICAgICAgICAgICAg ICAoJ3VyaSAoJ2NyYXRlLXVyaSAibGVhZi1ib2IiICd2ZXJzaW9uKSkKKyAgICAgICAgICAgICAg ICAgICAoJ2ZpbGUtbmFtZQorICAgICAgICAgICAgICAgICAgICAoJ3N0cmluZy1hcHBlbmQgJ25h bWUgIi0iICd2ZXJzaW9uICIuY3JhdGUiKSkKKyAgICAgICAgICAgICAgICAgICAoJ3NoYTI1Ngor ICAgICAgICAgICAgICAgICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAgKD8gc3Ry aW5nPyBoYXNoKSkpKSkKKyAgICAgICAgICAgICAgICAoJ2J1aWxkLXN5c3RlbSAnY2FyZ28tYnVp bGQtc3lzdGVtKQorICAgICAgICAgICAgICAgICgnYXJndW1lbnRzCisgICAgICAgICAgICAgICAg ICgncXVhc2lxdW90ZQorICAgICAgICAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0KSkpCisg ICAgICAgICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgICAg ICAgICAgICAgKCdzeW5vcHNpcyAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdkZXNjcmlw dGlvbiAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdsaWNlbnNlICgnbGlzdCAnbGljZW5z ZTpleHBhdCAnbGljZW5zZTphc2wyLjApKSkpCisgICAgICAgICAgICAoJ2RlZmluZS1wdWJsaWMg J3J1c3Qtcm9vdC0xLjAuMAorICAgICAgICAgICAgICAoJ3BhY2thZ2UKKyAgICAgICAgICAgICAg ICAoJ25hbWUgInJ1c3Qtcm9vdCIpCisgICAgICAgICAgICAgICAgKCd2ZXJzaW9uICg/IHN0cmlu Zz8gdmVyKSkKKyAgICAgICAgICAgICAgICAoJ3NvdXJjZQorICAgICAgICAgICAgICAgICAoJ29y aWdpbgorICAgICAgICAgICAgICAgICAgICgnbWV0aG9kICd1cmwtZmV0Y2gpCisgICAgICAgICAg ICAgICAgICAgKCd1cmkgKCdjcmF0ZS11cmkgInJvb3QiICd2ZXJzaW9uKSkKKyAgICAgICAgICAg ICAgICAgICAoJ2ZpbGUtbmFtZQorICAgICAgICAgICAgICAgICAgICAoJ3N0cmluZy1hcHBlbmQg J25hbWUgIi0iICd2ZXJzaW9uICIuY3JhdGUiKSkKKyAgICAgICAgICAgICAgICAgICAoJ3NoYTI1 NgorICAgICAgICAgICAgICAgICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAgKD8g c3RyaW5nPyBoYXNoKSkpKSkKKyAgICAgICAgICAgICAgICAoJ2J1aWxkLXN5c3RlbSAnY2FyZ28t YnVpbGQtc3lzdGVtKQorICAgICAgICAgICAgICAgICgnYXJndW1lbnRzCisgICAgICAgICAgICAg ICAgICgncXVhc2lxdW90ZQorICAgICAgICAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0Cisg ICAgICAgICAgICAgICAgICAgJyM6Y2FyZ28taW5wdXRzICgoInJ1c3QtaW50ZXJtZWRpYXRlLTEt MS4wLjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd1bnF1b3RlIHJ1 c3QtaW50ZXJtZWRpYXRlLTEtMS4wLjApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKCJydXN0LWludGVybWVkaWF0ZS0yLTEuMC4wIgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICgndW5xdW90ZSBydXN0LWludGVybWVkaWF0ZS0yLTEuMC4wKSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicnVzdC1sZWFmLWFsaWNlLTEuMC4w IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgndW5xdW90ZSBydXN0LWxl YWYtYWxpY2UtMS4wLjApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJy dXN0LWxlYWYtYm9iLTEuMC4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICgndW5xdW90ZSBydXN0LWxlYWYtYm9iLTEuMC4wKSkpKSkpCisgICAgICAgICAgICAgICAgKCdo b21lLXBhZ2UgImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgICAgICAgICAgICAgKCdzeW5vcHNp cyAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCisg ICAgICAgICAgICAgICAgKCdsaWNlbnNlICgnbGlzdCAnbGljZW5zZTpleHBhdCAnbGljZW5zZTph c2wyLjApKSkpKQogICAgICAgICAgICAjdCkKICAgICAgICAgICAoeAogICAgICAgICAgICAocGsg J2ZhaWwgeCAjZikpKSkpCi0tIAoyLjI0LjAKCg== --=_6cf61fbac390ae8a81b1d5d4afc35664 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0003-guix-tests-added-tests-for-recursive-import-semver.patch Content-Disposition: attachment; filename=0003-guix-tests-added-tests-for-recursive-import-semver.patch; size=7375 RnJvbSA1NDk1ODM0Y2EzNzUxODY5MTJlZWVkNDBjN2M4Y2U5NjI1NGMzNmIzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogTW9uLCAxNiBEZWMgMjAxOSAxNzo0Njo0NyAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggMy80XSBn dWl4OiB0ZXN0czogYWRkZWQgdGVzdHMgZm9yIHJlY3Vyc2l2ZS1pbXBvcnQtc2VtdmVyCgoqIGd1 aXgvdGVzdHMvaW1wb3J0LXV0aWxzLnNjbTogdGVzdHMgZm9yIHJlY3Vyc2l2ZS1pbXBvcnQtc2Vt dmVyCi0tLQogdGVzdHMvaW1wb3J0LXV0aWxzLnNjbSB8IDE3NyArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDE3NSBpbnNlcnRpb25zKCsp LCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Rlc3RzL2ltcG9ydC11dGlscy5zY20gYi90 ZXN0cy9pbXBvcnQtdXRpbHMuc2NtCmluZGV4IDg3ZGRhMzIzOGYuLjJlZTgxMzg2ZWMgMTAwNjQ0 Ci0tLSBhL3Rlc3RzL2ltcG9ydC11dGlscy5zY20KKysrIGIvdGVzdHMvaW1wb3J0LXV0aWxzLnNj bQpAQCAtMSw2ICsxLDcgQEAKIDs7OyBHTlUgR3VpeCAtLS0gRnVuY3Rpb25hbCBwYWNrYWdlIG1h bmFnZW1lbnQgZm9yIEdOVQogOzs7IENvcHlyaWdodCDCqSAyMDE1LCAyMDE3IFJpY2FyZG8gV3Vy bXVzIDxyZWthZG9AZWxlcGhseS5uZXQ+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMTYgQmVuIFdvb2Rj cm9mdCA8ZG9udHRydXN0YmVuQGdtYWlsLmNvbT4KKzs7OyBDb3B5cmlnaHQgwqkgMjAxNiBNYXJ0 aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KIDs7OwogOzs7IFRoaXMgZmlsZSBpcyBwYXJ0 IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0yNCw4ICsyNSwxMCBAQAogICAjOnVzZS1tb2R1bGUgKGd1 aXggcGFja2FnZXMpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBidWlsZC1zeXN0ZW0pCiAgICM6dXNl LW1vZHVsZSAoZ251IHBhY2thZ2VzKQotICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS02NCkKLSAg Izp1c2UtbW9kdWxlIChpY2UtOSBtYXRjaCkpCisgICM6dXNlLW1vZHVsZSAoaWNlLTkgbWF0Y2gp CisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZp LTkpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTY0KSkKIAogKHRlc3QtYmVnaW4gImltcG9y dC11dGlscyIpCiAKQEAgLTE0MSw0ICsxNDQsMTc0IEBACiAgICAgICAgICAgICAgICAgICgibGlj ZW5zZSIgLiAjZikpKSkKICAgICAocGFja2FnZS1uYXRpdmUtaW5wdXRzIChhbGlzdC0+cGFja2Fn ZSBtZXRhKSkpKQogCisoZGVmaW5lLXJlY29yZC10eXBlIDxtZXRhZGF0YT4KKyAgKG1ha2UtbWV0 YWRhdGEgbmFtZSB2ZXJzaW9ucykKKyAgbWV0YWRhdGE/CisgIChuYW1lIG1ldGFkYXRhLW5hbWUp CisgICh2ZXJzaW9ucyAgbWV0YWRhdGEtdmVyc2lvbnMpKQorCisoZGVmaW5lLXJlY29yZC10eXBl IDxwYWNrYWdlPgorICAobWFrZS1wYWNrYWdlIHZlcnNpb24gZGVwZW5kZW5jaWVzKQorICBwYWNr YWdlPworICAodmVyc2lvbiBwYWNrYWdlLXZlcnNpb24pCisgIChkZXBlbmRlbmNpZXMgcGFja2Fn ZS1kZXBlbmRlbmNpZXMpKQorCisoZGVmaW5lLXJlY29yZC10eXBlIDxkZXBlbmRlbmN5PgorICAo bWFrZS1kZXBlbmRlbmN5IG5hbWUgcmFuZ2UpCisgIGRlcGVuZGVuY3k/CisgIChuYW1lIGRlcGVu ZGVuY3ktbmFtZSkKKyAgKHJhbmdlIGRlcGVuZGVuY3ktcmFuZ2UpKQorCisoZGVmaW5lIChtZXRh ZGF0YS1zZW12ZXItdmVyc2lvbnMgbWV0YWRhdGEpCisgIChtYXAgKGxhbWJkYSAocCkKKyAgICAg ICAgIChwYWNrYWdlLXZlcnNpb24gcCkpCisgICAgICAgKG1ldGFkYXRhLXZlcnNpb25zIG1ldGFk YXRhKSkpCisKKyhkZWZpbmUgKG1ldGFkYXRhLT5wYWNrYWdlIG1ldGFkYXRhIHZlcnNpb24pCisg IChmaW5kCisgICAobGFtYmRhIChwYWNrYWdlKQorICAgICAoZXF1YWw/IChwYWNrYWdlLXZlcnNp b24gcGFja2FnZSkgdmVyc2lvbikpCisgICAobWV0YWRhdGEtdmVyc2lvbnMgbWV0YWRhdGEpKSkK KworKGRlZmluZSAobWFrZS1zZXhwIG1ldGFkYXRhIHBhY2thZ2UgZGVwZW5kZW5jaWVzKQorICBg KHBhY2thZ2UKKyAgICAobmFtZSAsKGd1aXgtbmFtZSAobWV0YWRhdGEtbmFtZSBtZXRhZGF0YSkp KQorICAgICh2ZXJzaW9uICwocGFja2FnZS12ZXJzaW9uIHBhY2thZ2UpKQorICAgIChkZXBlbmRj aWVzICwobWFwCisgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhICgocHVibGljLW5hbWUg ZGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKGd1aXgtbmFtZSAo ZGVwZW5kZW5jeS1uYW1lIGRlcCkpIHB1YmxpYy1uYW1lKSkpCisgICAgICAgICAgICAgICAgICBk ZXBlbmRlbmNpZXMpKSkpCisKKyhkZWZpbmUgKGd1aXgtbmFtZSBuYW1lKQorICAoc3RyaW5nLWFw cGVuZCAidGVzdC0iIG5hbWUpKQorCisoZGVmaW5lIHBhY2thZ2VzCisgIGAoKCJuby1kZXBzIiAu ICgoIjEuMC4wIiAuICgpKSAoIjAuMS4wIiAuICgpKSkpCisgICAgKCJvbmUtZGVwIiAuICgoIjEu MC4wIiAuICgoIm5vLWRlcHMiICJeMS4wIikpKQorICAgICAgICAgICAgICAgICAgKCIwLjEuMCIg LiAoKCJuby1kZXBzIiAiXjAuMS4wIikpKSkpCisgICAgKCJzaGFyZWQtZGVwIiAuICgoIjEuMC4w IiAuICgoIm9uZS1kZXAiICJeMC4xLjAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKCJuby1kZXBzIiAiKiIpKSkpKQorICAgICgicmVjdXJzaXZlIiAuICgoIjEuMC4wIiAuICgo InJlY3Vyc2l2ZSIgIj0xLjAuMCIpKSkpKQorICAgICgiYWxyZWFkeS1wYWNrYWdlZCIgLiAoKCIx LjAuMCIgLiAoKCJydXN0IiAifjEuMjgiKSkpKSkpKQorCisoZGVmaW5lIChuYW1lLT5tZXRhZGF0 YSBuYW1lKQorICAobGV0ICgodmVyc2lvbnMgKGFzc29jLXJlZiBwYWNrYWdlcyBuYW1lKSkpCisg ICAgKG1ha2UtbWV0YWRhdGEgbmFtZQorICAgICAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAg ICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICAgICgodmVyc2lv biAuIGRlcHMpCisgICAgICAgICAgICAgICAgICAgICAgIChtYWtlLXBhY2thZ2UgdmVyc2lvbgor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAobmFtZS1yYW5nZSkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwbHkgbWFrZS1kZXBlbmRlbmN5IG5hbWUt cmFuZ2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzKSkpKQor ICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucykpKSkKKworKGRlZmluZSogKHRlc3QtcmVjdXJz aXZlLWltcG9ydGVyIG5hbWUgdmVyc2lvbiAjOm9wdGlvbmFsIChndWl4LW5hbWUgZ3VpeC1uYW1l KSkKKyAgKHJlY3Vyc2l2ZS1pbXBvcnQtc2VtdmVyICM6bmFtZSBuYW1lCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAjOnJhbmdlIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICM6bmFtZS0+bWV0YWRhdGEgbmFtZS0+bWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICM6bWV0YWRhdGEtPnBhY2thZ2UgbWV0YWRhdGEtPnBhY2thZ2UKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICM6bWV0YWRhdGEtdmVyc2lvbnMgbWV0YWRhdGEtc2VtdmVyLXZlcnNpb25z CisgICAgICAgICAgICAgICAgICAgICAgICAgICAjOnBhY2thZ2UtZGVwZW5kZW5jaWVzIHBhY2th Z2UtZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjOmRlcGVuZGVuY3kt bmFtZSBkZXBlbmRlbmN5LW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICM6ZGVwZW5k ZW5jeS1yYW5nZSBkZXBlbmRlbmN5LXJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAj Omd1aXgtbmFtZSBndWl4LW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICM6bWFrZS1z ZXhwIG1ha2Utc2V4cCkpCisKKyh0ZXN0LWVxdWFsICJyZWN1cnNpdmUgaW1wb3J0IHRlc3Qgd2l0 aCBubyBkZXBlbmRlbmNpZXMiCisgIGAoKGRlZmluZS1wdWJsaWMgdGVzdC1uby1kZXBzLTEuMC4w CisgICAgICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1uby1kZXBzIikKKyAgICAgICAg KHZlcnNpb24gIjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCkpKSkpCisgICh0ZXN0LXJl Y3Vyc2l2ZS1pbXBvcnRlciAibm8tZGVwcyIgIjEuMC4wIikpCisKKyh0ZXN0LWVxdWFsICJyZWN1 cnNpdmUgaW1wb3J0IHRlc3Qgd2l0aCBvbmUgZGVwZW5kZW5jaWVzIgorICBgKChkZWZpbmUtcHVi bGljIHRlc3Qtbm8tZGVwcy0xLjAuMAorICAgICAgKHBhY2thZ2UKKyAgICAgICAgKG5hbWUgInRl c3Qtbm8tZGVwcyIpCisgICAgICAgICh2ZXJzaW9uICIxLjAuMCIpCisgICAgICAgIChkZXBlbmRj aWVzICgpKSkpCisgICAgKGRlZmluZS1wdWJsaWMgdGVzdC1vbmUtZGVwLTEuMC4wCisgICAgICAo cGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1vbmUtZGVwIikKKyAgICAgICAgKHZlcnNpb24g IjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCgidGVzdC1uby1kZXBzIiAidGVzdC1uby1k ZXBzLTEuMC4wIikpKSkpKQorICAodGVzdC1yZWN1cnNpdmUtaW1wb3J0ZXIgIm9uZS1kZXAiICIx LjAuMCIpKQorCisodGVzdC1lcXVhbCAicmVjdXJzaXZlIGltcG9ydCB0ZXN0IHdpdGggcmVjdXJz dXZlIGRlcGVuZGVuY2llcyIKKyAgYCgoZGVmaW5lLXB1YmxpYyB0ZXN0LXJlY3Vyc2l2ZS0xLjAu MAorICAgICAgKHBhY2thZ2UKKyAgICAgICAgKG5hbWUgInRlc3QtcmVjdXJzaXZlIikKKyAgICAg ICAgKHZlcnNpb24gIjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCgidGVzdC1yZWN1cnNp dmUiICJ0ZXN0LXJlY3Vyc2l2ZS0xLjAuMCIpKSkpKSkKKyAgKHRlc3QtcmVjdXJzaXZlLWltcG9y dGVyICJyZWN1cnNpdmUiICIxLjAuMCIpKQorCisodGVzdC1lcXVhbCAicmVjdXJzaXZlIGltcG9y dCB0ZXN0IHdpdGggbm8gZGVwZW5kZW5jaWVzIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIgorICBgKChk ZWZpbmUtcHVibGljIHRlc3Qtbm8tZGVwcy0wLjEuMAorICAgICAgKHBhY2thZ2UKKyAgICAgICAg KG5hbWUgInRlc3Qtbm8tZGVwcyIpCisgICAgICAgICh2ZXJzaW9uICIwLjEuMCIpCisgICAgICAg IChkZXBlbmRjaWVzICgpKSkpKQorICAodGVzdC1yZWN1cnNpdmUtaW1wb3J0ZXIgIm5vLWRlcHMi ICIwLjEuMCIpKQorCisodGVzdC1lcXVhbCAicmVjdXJzaXZlIGltcG9ydCB0ZXN0IHdpdGggb25l IGRlcGVuZGVuY2llcyB1bnNpbmcgYW4gb2xkIHZlcnNpb24iCisgIGAoKGRlZmluZS1wdWJsaWMg dGVzdC1uby1kZXBzLTAuMS4wCisgICAgICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1u by1kZXBzIikKKyAgICAgICAgKHZlcnNpb24gIjAuMS4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMg KCkpKSkKKyAgICAoZGVmaW5lLXB1YmxpYyB0ZXN0LW9uZS1kZXAtMC4xLjAKKyAgICAgIChwYWNr YWdlCisgICAgICAgIChuYW1lICJ0ZXN0LW9uZS1kZXAiKQorICAgICAgICAodmVyc2lvbiAiMC4x LjAiKQorICAgICAgICAoZGVwZW5kY2llcyAoKCJ0ZXN0LW5vLWRlcHMiICJ0ZXN0LW5vLWRlcHMt MC4xLjAiKSkpKSkpCisgICh0ZXN0LXJlY3Vyc2l2ZS1pbXBvcnRlciAib25lLWRlcCIgIjAuMS4w IikpCisKKyh0ZXN0LWVxdWFsICJyZWN1cnNpdmUgaW1wb3J0IHRlc3Qgd2l0aCBhIHZlcnNpb24g cmFuZ2UiCisgIGAoKGRlZmluZS1wdWJsaWMgdGVzdC1uby1kZXBzLTEuMC4wCisgICAgICAocGFj a2FnZQorICAgICAgICAobmFtZSAidGVzdC1uby1kZXBzIikKKyAgICAgICAgKHZlcnNpb24gIjEu MC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCkpKSkKKyAgICAoZGVmaW5lLXB1YmxpYyB0ZXN0 LW9uZS1kZXAtMS4wLjAKKyAgICAgIChwYWNrYWdlCisgICAgICAgIChuYW1lICJ0ZXN0LW9uZS1k ZXAiKQorICAgICAgICAodmVyc2lvbiAiMS4wLjAiKQorICAgICAgICAoZGVwZW5kY2llcyAoKCJ0 ZXN0LW5vLWRlcHMiICJ0ZXN0LW5vLWRlcHMtMS4wLjAiKSkpKSkpCisgICh0ZXN0LXJlY3Vyc2l2 ZS1pbXBvcnRlciAib25lLWRlcCIgIioiKSkKKworKHRlc3QtZXF1YWwgInJlY3Vyc2l2ZSBpbXBv cnQgdGVzdCB3aXRoIHdpdGggZGVwZW5kZW5jeSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIHJlcG8i CisgIGAoKGRlZmluZS1wdWJsaWMgdGVzdC1hbHJlYWR5LXBhY2thZ2VkLTEuMC4wCisgICAgICAo cGFja2FnZSAobmFtZSAidGVzdC1hbHJlYWR5LXBhY2thZ2VkIikKKyAgICAgICAgICAgICAgICh2 ZXJzaW9uICIxLjAuMCIpCisgICAgICAgICAgICAgICAoZGVwZW5kY2llcworICAgICAgICAgICAg ICAgICgoInRlc3QtcnVzdCIgInJ1c3QtMS4yOC4wIikpKSkpKQorICAodGVzdC1yZWN1cnNpdmUt aW1wb3J0ZXIgImFscmVhZHktcGFja2FnZWQiICIxLjAuMCIgaWRlbnRpdHkpKQorCisodGVzdC1l cXVhbCAic2hhcmVkIGRlcGVuZGVuY2llcyIKKyAgYCgoZGVmaW5lLXB1YmxpYyB0ZXN0LW5vLWRl cHMtMS4wLjAKKyAgICAgIChwYWNrYWdlCisgICAgICAgIChuYW1lICJ0ZXN0LW5vLWRlcHMiKQor ICAgICAgICAodmVyc2lvbiAiMS4wLjAiKQorICAgICAgICAoZGVwZW5kY2llcyAoKSkpKQorICAg IChkZWZpbmUtcHVibGljIHRlc3Qtbm8tZGVwcy0wLjEuMAorICAgICAgKHBhY2thZ2UKKyAgICAg ICAgKG5hbWUgInRlc3Qtbm8tZGVwcyIpCisgICAgICAgICh2ZXJzaW9uICIwLjEuMCIpCisgICAg ICAgIChkZXBlbmRjaWVzICgpKSkpCisgICAgKGRlZmluZS1wdWJsaWMgdGVzdC1vbmUtZGVwLTAu MS4wCisgICAgICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1vbmUtZGVwIikKKyAgICAg ICAgKHZlcnNpb24gIjAuMS4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCgidGVzdC1uby1kZXBz IiAidGVzdC1uby1kZXBzLTAuMS4wIikpKSkpCisgICAgKGRlZmluZS1wdWJsaWMgdGVzdC1zaGFy ZWQtZGVwLTEuMC4wCisgICAgICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1zaGFyZWQt ZGVwIikKKyAgICAgICAgKHZlcnNpb24gIjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCgi dGVzdC1vbmUtZGVwIiAidGVzdC1vbmUtZGVwLTAuMS4wIikKKyAgICAgICAgICAgICAgICAgICAg ICgidGVzdC1uby1kZXBzIiAidGVzdC1uby1kZXBzLTEuMC4wIikpKSkpKQorICAodGVzdC1yZWN1 cnNpdmUtaW1wb3J0ZXIgInNoYXJlZC1kZXAiICIxLjAuMCIpKQorCiAodGVzdC1lbmQgImltcG9y dC11dGlscyIpCi0tIAoyLjI0LjAKCg== --=_6cf61fbac390ae8a81b1d5d4afc35664 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0004-gnu-scripts-import-crate-Remove-define-public-genera.patch Content-Disposition: attachment; filename=0004-gnu-scripts-import-crate-Remove-define-public-genera.patch; size=1270 RnJvbSBhYTZhYWVhY2I1ZjkxNTA4ZjQxNTg5OTliYTZlN2Y5NWU4MzA5YmVkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogTW9uLCAxNiBEZWMgMjAxOSAxODoxMTozOCAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggNC80XSBn bnU6IHNjcmlwdHM6IGltcG9ydDogY3JhdGU6IFJlbW92ZSBgZGVmaW5lLXB1YmxpY2AKIGdlbmVy YXRpb24gZnJvbSBVSQoKKiBndWl4L3NjcmlwdHMvaW1wb3J0L2NyYXRlLnNjbSAoZ3VpeC1pbXBv cnQtY3JhdGUpOiBSZW1vdmUgYGRlZmluZS1wdWJsaWNgIGdlbmVyYXRpb24gZnJvbSBVSQotLS0K IGd1aXgvc2NyaXB0cy9pbXBvcnQvY3JhdGUuc2NtIHwgNyArLS0tLS0tCiAxIGZpbGUgY2hhbmdl ZCwgMSBpbnNlcnRpb24oKyksIDYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ3VpeC9zY3Jp cHRzL2ltcG9ydC9jcmF0ZS5zY20gYi9ndWl4L3NjcmlwdHMvaW1wb3J0L2NyYXRlLnNjbQppbmRl eCA5MjAzNGRhYjNjLi45YTA4YzliOGI0IDEwMDY0NAotLS0gYS9ndWl4L3NjcmlwdHMvaW1wb3J0 L2NyYXRlLnNjbQorKysgYi9ndWl4L3NjcmlwdHMvaW1wb3J0L2NyYXRlLnNjbQpAQCAtOTUsMTIg Kzk1LDcgQEAgSW1wb3J0IGFuZCBjb252ZXJ0IHRoZSBjcmF0ZS5pbyBwYWNrYWdlIGZvciBQQUNL QUdFLU5BTUUuXG4iKSkKICAgICAgICAgIChwYWNrYWdlLW5hbWUtPm5hbWUrdmVyc2lvbiBzcGVj KSkKIAogICAgICAgIChpZiAoYXNzb2MtcmVmIG9wdHMgJ3JlY3Vyc2l2ZSkKLSAgICAgICAgICAg KG1hcCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAoKGFuZCAoJ3BhY2thZ2UgKCdu YW1lIG5hbWUpIC4gcmVzdCkgcGtnKQotICAgICAgICAgICAgICAgICAgIGAoZGVmaW5lLXB1Ymxp YyAsKHN0cmluZy0+c3ltYm9sIG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgLHBrZykpCi0g ICAgICAgICAgICAgICAgICAoXyAjZikpCi0gICAgICAgICAgICAgICAgKGNyYXRlLXJlY3Vyc2l2 ZS1pbXBvcnQgbmFtZSkpCisgICAgICAgICAgIChjcmF0ZS1yZWN1cnNpdmUtaW1wb3J0IG5hbWUg dmVyc2lvbikKICAgICAgICAgICAgKGxldCAoKHNleHAgKGNyYXRlLT5ndWl4LXBhY2thZ2UgbmFt ZSB2ZXJzaW9uKSkpCiAgICAgICAgICAgICAgKHVubGVzcyBzZXhwCiAgICAgICAgICAgICAgICAo bGVhdmUgKEdfICJmYWlsZWQgdG8gZG93bmxvYWQgbWV0YS1kYXRhIGZvciBwYWNrYWdlICd+YSd+ JSIpCi0tIAoyLjI0LjAKCg== --=_6cf61fbac390ae8a81b1d5d4afc35664-- From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 19 17:00:57 2019 Received: (at 38408) by debbugs.gnu.org; 19 Dec 2019 22:00:57 +0000 Received: from localhost ([127.0.0.1]:45630 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ii3qq-0005GF-TO for submit@debbugs.gnu.org; Thu, 19 Dec 2019 17:00:57 -0500 Received: from eggs.gnu.org ([209.51.188.92]:48148) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ii3qo-0005G1-Ju for 38408@debbugs.gnu.org; Thu, 19 Dec 2019 17:00:54 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:42554) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ii3qb-0004gh-RF; Thu, 19 Dec 2019 17:00:45 -0500 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=36016 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1ii3qY-0006Lv-8A; Thu, 19 Dec 2019 17:00:39 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Martin Becze Subject: Re: [bug#38408] [PATCH v4 1/6] gnu: added new function, find-packages-by-name*/direct References: Date: Thu, 19 Dec 2019 23:00:36 +0100 In-Reply-To: (Martin Becze's message of "Tue, 10 Dec 2019 14:23:38 -0500") Message-ID: <877e2sm0vv.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hello! I=E2=80=99m not a Crate expert so I=E2=80=99m only commenting on non-Crate-= specific bits. Martin Becze skribis: > * gnu/packages.scm (find-packages-by-naem*/direct) [...] > +(define* (fold-packages* proc init > + #:optional > + (modules (all-modules (%package-module-path) > + #:warn > + warn-about-load-error)) > + #:key (select? (negate hidden-package?))) > + "Call (PROC PACKAGE RESULT) for each available package defined in one = of > +MODULES that matches SELECT?, using INIT as the initial value of RESULT.= It > +is guaranteed to never traverse the same package twice." > + (fold-module-public-variables* (lambda (module symbol var result) > + (let ((object (variable-ref var))) > + (if (and (package? object) (select?= object)) > + (proc module symbol object res= ult) I=E2=80=99m wary of exposing variable names, especially in such a central A= PI. > +(define find-packages-by-name*/direct ;bypass the cache Providing an explicit cache bypassing method also sounds worrying to me: the cache is supposed to be transparent and semantics-preserving. More generally, I think adding new features to an importer shouldn=E2=80=99t require modifications in this area, as a matter of separating concerns. WDYT? Thanks, Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 19 17:07:30 2019 Received: (at 38408) by debbugs.gnu.org; 19 Dec 2019 22:07:30 +0000 Received: from localhost ([127.0.0.1]:45634 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ii3xC-0005PS-L3 for submit@debbugs.gnu.org; Thu, 19 Dec 2019 17:07:30 -0500 Received: from eggs.gnu.org ([209.51.188.92]:50790) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ii3xB-0005PF-GV for 38408@debbugs.gnu.org; Thu, 19 Dec 2019 17:07:29 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:42645) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ii3x4-0008EP-Um; Thu, 19 Dec 2019 17:07:23 -0500 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=36256 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1ii3x4-00056a-1K; Thu, 19 Dec 2019 17:07:22 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Martin Becze Subject: Re: [bug#38408] [PATCH v4 2/6] gnu: added new procedure, recusive-import-semver References: <5b82d5ab2c9d579d279db055b8f12509587234fa.1576005195.git.mjbecze@riseup.net> Date: Thu, 19 Dec 2019 23:07:19 +0100 In-Reply-To: <5b82d5ab2c9d579d279db055b8f12509587234fa.1576005195.git.mjbecze@riseup.net> (Martin Becze's message of "Tue, 10 Dec 2019 14:23:39 -0500") Message-ID: <87woaskm08.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Martin Becze skribis: > * gnu/packages.scm (recusive-import-semver): New Procedure > * gnu/packages.scm (package->definition)[arguments]: New argument, "lates= t" ^ This is actually guix/import/utils.scm. :-) > * tests/import-utils.scm: tests for recusive-import-semver > +(define* (recursive-import-semver #:key name > + (version #f) > + name->metadata > + metadata->package > + metadata-versions > + package-dependencies > + dependency-name > + dependency-range > + guix-name > + make-sexp) That=E2=80=99s intimidating. :-) Since there=E2=80=99s currently a single user, the Crate importer, I would rather have semver-handling directly in (guix import crate). Sure we can try to write it in a way that clearly separates semver handling from Crate-specific bits, but we shouldn=E2=80=99t try to make it too generic at= this point, IMO. WDYT? The and records provide the information needed to implement what you have in mind, I think. Thanks, Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 20 13:37:49 2019 Received: (at 38408) by debbugs.gnu.org; 20 Dec 2019 18:37:49 +0000 Received: from localhost ([127.0.0.1]:47244 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iiN9j-00051M-NA for submit@debbugs.gnu.org; Fri, 20 Dec 2019 13:37:49 -0500 Received: from mx1.riseup.net ([198.252.153.129]:42944) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iiN9g-00051C-4m for 38408@debbugs.gnu.org; Fri, 20 Dec 2019 13:37:41 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47fctW0t5lzDvqM; Fri, 20 Dec 2019 10:37:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576867059; bh=cHP+xD+ZJ0K9c5IqwHCPSiboA8DUMHdb4ztokfzcUAA=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=HcM+lr5ACXtF6AOkAIlMct9ppm+zfoLevz6o6l0dfc7z4DaUrtw625SHkS3r/2OkH 5rs/PquiumW2apo3Etmddvlk4UK4y8sd68NnT6nI0B/J0/2+8msWzSVDt/s5Y8zeJE BOQOSQDJSC7jNzxfXjIIh83o2xUdcUDUZqlfuHFc= X-Riseup-User-ID: 591F6F048A878B74046AF108F741057D19F41DCBC0972CA6AB297849DBF35AB6 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47fctV5TNgz8tXp; Fri, 20 Dec 2019 10:37:38 -0800 (PST) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_0f73ed518be0df091b86ace28f090251" Date: Fri, 20 Dec 2019 10:37:38 -0800 From: Martin Becze To: =?UTF-8?Q?Ludovic_Court=C3=A8s?= Subject: Re: [bug#38408] [PATCH v4 1/6] gnu: added new function, find-packages-by-name*/direct In-Reply-To: <877e2sm0vv.fsf@gnu.org> References: <877e2sm0vv.fsf@gnu.org> Message-ID: <6e56589639ea75bfec2c97f7e9e31ad9@riseup.net> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=_0f73ed518be0df091b86ace28f090251 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 > > Providing an explicit cache bypassing method also sounds worrying to me: > the cache is supposed to be transparent and semantics-preserving. > > More generally, I think adding new features to an importer shouldn’t > require modifications in this area, as a matter of separating concerns. > > WDYT? > > Thanks, > Ludo’. yes I agree, I removed that in the last version! Which also rebases off the new topological sort procedure. I'll attach the latest patches here, in case you missed it. --=_0f73ed518be0df091b86ace28f090251 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v5-0001-guix-import-added-recusive-import-semver.patch Content-Disposition: attachment; filename=v5-0001-guix-import-added-recusive-import-semver.patch; size=9441 RnJvbSBlZWZmZGY1NjljNGQ3ZmJmZDg0M2UwYjQ4NDA0YjZhMmYzZDQ2MzQzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogTW9uLCAxNiBEZWMgMjAxOSAxNzowODoxNiAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggdjUgMS80 XSBndWl4OiBpbXBvcnQ6IGFkZGVkIHJlY3VzaXZlLWltcG9ydC1zZW12ZXIKCiogZ3VpeC9pbXBv cnQvdXRpbHMuc2NtIChyZWN1c2l2ZS1pbXBvcnQtc2VtdmVyKTogTmV3IFZhcmlibGUKKiBndWl4 L2ltcG9ydC91dGlscy5zY20gKHBhY2thZ2UtPmRlZmluaXRpb24pW2FyZ3VtZW50c106IEFkZCBh cHBlbmQtdmVyaW9ucyBvcHRpb24KLS0tCiBndWl4L2ltcG9ydC91dGlscy5zY20gfCAxNjggKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tCiAxIGZpbGUgY2hhbmdlZCwg MTYxIGluc2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ3VpeC9pbXBv cnQvdXRpbHMuc2NtIGIvZ3VpeC9pbXBvcnQvdXRpbHMuc2NtCmluZGV4IGQxN2Q0MDBkZGYuLjdm NzVmNTBlMjMgMTAwNjQ0Ci0tLSBhL2d1aXgvaW1wb3J0L3V0aWxzLnNjbQorKysgYi9ndWl4L2lt cG9ydC91dGlscy5zY20KQEAgLTUsNiArNSw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMTcsIDIw MTkgUmljYXJkbyBXdXJtdXMgPHJla2Fkb0BlbGVwaGx5Lm5ldD4KIDs7OyBDb3B5cmlnaHQgwqkg MjAxOCBPbGVnIFB5a2hhbG92IDxnby53aWd1c3RAZ21haWwuY29tPgogOzs7IENvcHlyaWdodCDC qSAyMDE5IFJvYmVydCBWb2xsbWVydCA8cm9iQHZsbG1ydC5uZXQ+Cis7OzsgQ29weXJpZ2h0IMKp IDIwMTkgTWFydGluIEJlY3plIDxtamJlY3plQHJpc2V1cC5uZXQ+CiA7OzsKIDs7OyBUaGlzIGZp bGUgaXMgcGFydCBvZiBHTlUgR3VpeC4KIDs7OwpAQCAtNDAsMTAgKzQxLDEzIEBACiAgICM6dXNl LW1vZHVsZSAoaWNlLTkgcmRlbGltKQogICAjOnVzZS1tb2R1bGUgKGljZS05IHJlY2VpdmUpCiAg ICM6dXNlLW1vZHVsZSAoaWNlLTkgcmVnZXgpCisgICM6dXNlLW1vZHVsZSAoc2VtdmVyKQorICAj OnVzZS1tb2R1bGUgKHNlbXZlciByYW5nZXMpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEp CiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTkpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZp LTExKQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0yNikKKyAgIzp1c2UtbW9kdWxlIChzcmZp IHNyZmktNzEpCiAgICM6ZXhwb3J0IChmYWN0b3JpemUtdXJpCiAKICAgICAgICAgICAgIGZsYXR0 ZW4KQEAgLTcwLDcgKzc0LDggQEAKIAogICAgICAgICAgICAgZ3VpeC1uYW1lCiAKLSAgICAgICAg ICAgIHJlY3Vyc2l2ZS1pbXBvcnQpKQorICAgICAgICAgICAgcmVjdXJzaXZlLWltcG9ydAorICAg ICAgICAgICAgcmVjdXJzaXZlLWltcG9ydC1zZW12ZXIpKQogCiAoZGVmaW5lIChmYWN0b3JpemUt dXJpIHVyaSB2ZXJzaW9uKQogICAiRmFjdG9yaXplIFVSSSwgYSBwYWNrYWdlIHRhcmJhbGwgVVJJ IGFzIGEgc3RyaW5nLCBzdWNoIHRoYXQgYW55IG9jY3VycmVuY2VzCkBAIC0yNTgsMTMgKzI2Mywx MyBAQCBwYWNrYWdlIGRlZmluaXRpb24uIgogICAgICgocGFja2FnZS1pbnB1dHMgLi4uKQogICAg ICBgKChuYXRpdmUtaW5wdXRzICgsJ3F1YXNpcXVvdGUgLHBhY2thZ2UtaW5wdXRzKSkpKSkpCiAK LShkZWZpbmUgKHBhY2thZ2UtPmRlZmluaXRpb24gZ3VpeC1wYWNrYWdlKQorKGRlZmluZSogKHBh Y2thZ2UtPmRlZmluaXRpb24gZ3VpeC1wYWNrYWdlICM6b3B0aW9uYWwgYXBwZW5kLXZlcnNpb24/ KQogICAobWF0Y2ggZ3VpeC1wYWNrYWdlCi0gICAgKCgncGFja2FnZSAoJ25hbWUgKD8gc3RyaW5n PyBuYW1lKSkgXyAuLi4pCi0gICAgIGAoZGVmaW5lLXB1YmxpYyAsKHN0cmluZy0+c3ltYm9sIG5h bWUpCi0gICAgICAgICxndWl4LXBhY2thZ2UpKQotICAgICgoJ2xldCBhbnl0aGluZyAoJ3BhY2th Z2UgKCduYW1lICg/IHN0cmluZz8gbmFtZSkpIF8gLi4uKSkKLSAgICAgYChkZWZpbmUtcHVibGlj ICwoc3RyaW5nLT5zeW1ib2wgbmFtZSkKKyAgICAoKG9yICgncGFja2FnZSAoJ25hbWUgbmFtZSkg KCd2ZXJzaW9uIHZlcnNpb24pIC4gcmVzdCkKKyAgICAgICAgICgnbGV0IF8gKCdwYWNrYWdlICgn bmFtZSBuYW1lKSAoJ3ZlcnNpb24gdmVyc2lvbikgLiByZXN0KSkpCisgICAgIGAoZGVmaW5lLXB1 YmxpYyAsKHN0cmluZy0+c3ltYm9sIChpZiBhcHBlbmQtdmVyc2lvbj8KKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctYXBwZW5kIG5hbWUgIi0iIHZlcnNp b24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSkK ICAgICAgICAgLGd1aXgtcGFja2FnZSkpKSkKIAogKGRlZmluZSAoYnVpbGQtc3lzdGVtLW1vZHVs ZXMpCkBAIC00MjgsMyArNDMzLDE1MiBAQCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVwc3Ry ZWFtIG5hbWUuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlIGV4aXN0 cz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9kZS1kZXBlbmRl bmNpZXMgbm9kZSkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLW5hbWUpKSkKKwor KGRlZmluZSogKHJlY3Vyc2l2ZS1pbXBvcnQtc2VtdmVyICM6a2V5CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChyYW5nZSAiKiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+bWV0 YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS0+cGFja2Fn ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLXZlcnNpb25zCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS1kZXBlbmRlbmNpZXMKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LW5hbWUKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LXJhbmdlCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgZ3VpeC1uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbWFrZS1zZXhwKQorICAiR2VuZXJhdGVzIGEgbGlzdCBvZiBwYWNrYWdlIGV4cHJl c3Npb25zIGZvciB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBnaXZlbiAKK05BTUUgYW5kIHZlcnNp b24gUkFOR0UuIFRoZSBkZXBlbmRlbmNpZXMgd2lsbCBiZSByZXNvbHZlZCB1c2luZyBzZW1hbnRp YyB2ZXJzaW9uaW5nLgorVGhpcyBwcm9jZWR1cmUgbWFrZXMgdGhlIGFzc3VtcHRpb24gdGhhdCBt b3N0IHBhY2thZ2UgcmVwb3NpdG9yaWVzIHdpbGwsIGZvciBhCitnaXZlbiBwYWNrYWdlIHByb3Zp ZGUgc29tZSA8bWV0YWRhdGE+IG9uIHRoYXQgcGFja2FnZSB0aGF0IGluY2x1ZGVzIHdoYXQKK3Zl cnNpb25zIG9mIHRoZSBwYWNrYWdlIHRoYXQgYXJlIGF2YWlsYWJsZSBhbmQgYSBsaXN0IG9mIGRl cGVuZGVuY2llcyBmb3IgZWFjaAordmVyc2lvbi4gRGVwZW5kZW5jaWVzIGFyZSBhc3N1bWVkIHRv IGJlIGNvbXBvc2VkIG9mIGEgTkFNRSwgYSBzZW1hbnRpYyBSQU5HRSBhbmQKK290aGVyIGRhdGEu CisKK1RoaXMgcHJvY2VkdXJlIHRha2VzIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgTkFNRSAtIFRo ZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGltcG9ydAorICBSQU5HRSAtIFRoZSB2ZXJzaW9uIHJh bmdlIG9mIHRoZSBwYWNrYWdlIHRvIGltcG9ydAorICBOQU1FLT5NRVRBREFUQSAtIEEgcHJvY2Vk dXJlIHRoYXQgdGFrZXMgYSBOQU1FIG9mIGEgcGFja2FnZSBhbmQgcmV0dXJucyB0aGF0CitwYWNr YWdlJ3MgPG1ldGFkYXRhPgorICBNRVRBREFUQS0+UEFDS0FHRSBBIHByb2NlZHVyZSB0aGF0IHRh a2VzIGEgcGFja2FnZSdzIDxtZXRhZGF0YT4gYW5kIFZFUlNJT04gCithbmQgcmV0dXJucyB0aGUg PHBhY2thZ2U+IGZvciB0aGUgZ2l2ZW4gVkVSU0lPTgorICBNRVRBREFUQS1WRVJTSU9OUyBBIHBy b2NlZHVyZSB0aGF0IHRoYXQgdGFrZXMgYSBwYWNrYWdlcyA8bWV0YWRhdGE+IGFuZAorcmV0dXJu cyBhIGxpc3Qgb2YgdmVyc2lvbiBhcyBzdHJpbmdzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhl IGdpdmVuIHBhY2thZ2UKKyAgUEFDS0FHRS1ERVBFTkRFTkNJRVMgYSBwcm9jZWR1cmUgdGhhdCBy ZXR1cm5zIGEgbGlzdCBvZiA8ZGVwZW5kZW5jeT4gZ2l2ZW4gYSAKKzxwYWNrYWdlPgorICBERVBF TkRFTkNZLU5BTUUgQSBwcm9jZWR1cmUgdGhhdCB0YWtlcyBhIDxkZXBlbmRlbmN5PiBhbmQgcmV0 dXJucyB0aGUgaXRzIG5hbWUKKyAgREVQRU5ERU5DWS1SQU5HRSBBIHByb2NlZHVyZSB0aGF0IHRh a2VzIGEgPGRlcGVuZGVuY3k+IGFuZCByZXR1cm5zIHRoYXQKK2RlY2VuY3kncyByYW5nZSBhcyBh IHN0cmluZworICBHVUlYLU5BTUUgQSBwcm9jZWR1cmUgdGhhdCB0YWtlIGEgTkFNRSBhbmQgcmV0 dXJucyB0aGUgR3VpeCB2ZXJzaW9uIG9mIGl0CisgIE1BS0UtU0VYUCBBIHByb2NlZHVyZSB0aGF0 IHRha2VzIDxtZXRhZGF0YT4sIDxwYWNrYWdlPiBhbmQgYSBsaXN0IG9mIHBhaXJzCitjb250YWlu aW5nIChFWFBPUlQtTkFNRSA8ZGVwZW5kZW5jeT4pLCByZXR1cm5pbmcgdGhlIHBhY2thZ2UgZXhw cmVzc2lvbiBhcyBhbiAKK3MtZXhwcmVzc2lvbiIKKyAgKGRlZmluZS1yZWNvcmQtdHlwZSA8bm9k ZS1kZXBlbmRlbmN5PgorICAgIChtYWtlLW5vZGUtZGVwZW5kZW5jeSBkZXBlbmRlbmN5IHZlcnNp b24gZXhpc3RzPykKKyAgICBub2RlLWRlcGVuZGVuY3k/CisgICAgKGRlcGVuZGVuY3kgIG5vZGUt ZGVwZW5kZW5jeS1kZXBlbmRlbmN5KQorICAgICh2ZXJzaW9uICAgICBub2RlLWRlcGVuZGVuY3kt dmVyc2lvbikKKyAgICAoZXhpc3RzPyAgICAgbm9kZS1kZXBlbmRlbmN5LWV4aXN0cz8pKQorCisg IChkZWZpbmUtcmVjb3JkLXR5cGUgPG5vZGU+CisgICAgKG1ha2Utbm9kZSBuYW1lIHZlcnNpb24g bWV0YWRhdGEgcGFja2FnZSBkZXBlbmRlbmNpZXMpCisgICAgbm9kZT8KKyAgICAobmFtZSAgICAg ICAgIG5vZGUtbmFtZSkKKyAgICAodmVyc2lvbiAgICAgIG5vZGUtdmVyc2lvbikKKyAgICAobWV0 YWRhdGEgICAgIG5vZGUtbWV0YWRhdGEpCisgICAgKHBhY2thZ2UgICAgICBub2RlLXBhY2thZ2Up CisgICAgKGRlcGVuZGVuY2llcyBub2RlLWRlcGVuZGVuY2llcykpCisKKyAgKGRlZmluZSBtZW0t bmFtZS0+bWV0YWRhdGEgKG1lbW9pemUgbmFtZS0+bWV0YWRhdGEpKQorICAoZGVmaW5lIG1lbS1w YWNrYWdlLWRlcGVuZGVuY2llcyAobWVtb2l6ZSBwYWNrYWdlLWRlcGVuZGVuY2llcykpCisKKyAg KGRlZmluZSAoc2VtdmVyLXJhbmdlLWNvbnRhaW5zLXN0cmluZz8gcmFuZ2UgdmVyc2lvbikKKyAg ICAoc2VtdmVyLXJhbmdlLWNvbnRhaW5zPyByYW5nZSAoc3RyaW5nLT5zZW12ZXIgdmVyc2lvbikp KQorCisgIChkZWZpbmUgKG5hbWUrdmVyc2lvbiBuYW1lIHZlcnNpb24pCisgICAgKHN0cmluZy1h cHBlbmQgbmFtZSAiLSIgdmVyc2lvbikpCisKKyAgKGRlZmluZSAocHVibGljLW5hbWUgbmFtZSB2 ZXJzaW9uKQorICAgICJHaXZlbiBhIE5BTUUgYW5kIGEgVkVSU0lPTiBvZiBhIHBhY2thZ2UsIHJl dHVybnMgdGhlIG5hbWUgb2YgdGhlCitzeW1ib2wgdXNlZCBpcyBkZWZpbmUtcHVibGljIgorICAg IChndWl4LW5hbWUgKG5hbWUrdmVyc2lvbiBuYW1lIHZlcnNpb24pKSkKKworICA7OyBzZWFyY2hl cyBzZWFyY2hlcyBmb3IgYSBwYWNrYWdlIGluIGd1aXgKKyAgKGRlZmluZSAoZmluZC1sb2NhbGx5 IG5hbWUgcmFuZ2UpCisgICAgKG1hdGNoIChmaW5kCisgICAgICAgICAgICAobGFtYmRhIChwYWNr YWdlKQorICAgICAgICAgICAgICAoc2VtdmVyLXJhbmdlLWNvbnRhaW5zLXN0cmluZz8KKyAgICAg ICAgICAgICAgIHJhbmdlCisgICAgICAgICAgICAgICAocGFja2FnZS12ZXJzaW9uIHBhY2thZ2Up KSkKKyAgICAgICAgICAgIChmaW5kLXBhY2thZ2VzLWJ5LW5hbWUgKGd1aXgtbmFtZSBuYW1lKSkp CisgICAgICAoI2YgI2YpCisgICAgICAocGFja2FnZSAobGlzdCAocGFja2FnZS12ZXJzaW9uIHBh Y2thZ2UpICN0KSkpKQorCisgIDs7IHNlYXJjaGVzIGZvciBhIHBhY2thZ2UgaW4gc29tZSBleHRl cm5hbCByZXBvCisgIChkZWZpbmUgKGZpbmQtcmVtb3RlIG5hbWUgcmFuZ2UpCisgICAgKGxldCog KCh2ZXJzaW9ucyAoc29ydAorICAgICAgICAgICAgICAgICAgICAgIChtZXRhZGF0YS12ZXJzaW9u cworICAgICAgICAgICAgICAgICAgICAgICAobWVtLW5hbWUtPm1ldGFkYXRhIG5hbWUpKQorICAg ICAgICAgICAgICAgICAgICAgIHZlcnNpb24+PykpCisgICAgICAgICAgICh2ZXJzaW9uIChmaW5k CisgICAgICAgICAgICAgICAgICAgICAobGFtYmRhICh2ZXIpCisgICAgICAgICAgICAgICAgICAg ICAgIChzZW12ZXItcmFuZ2UtY29udGFpbnMtc3RyaW5nPyByYW5nZSB2ZXIpKQorICAgICAgICAg ICAgICAgICAgICAgdmVyc2lvbnMpKSkKKyAgICAgIChsaXN0IHZlcnNpb24gI2YpKSkKKworICAo ZGVmaW5lIChmaW5kLWJ5LW5hbWUtcmFuZ2UgbmFtZSByYW5nZSkKKyAgICAiR2l2ZW4gYSBOQU1F LCBSQU5HRSB0aGlzIHdpbGwgcmV0dXJuIGEgVkVSU0lPTiBhbmQgQk9PTCB3aGljaCByZXBlc2Vu dHMKK3doZXRoZXIgdGhlIHBhY2thZ2UgaGFzIGJlZW4gZW5jb3VudGVyZWQgb3Igbm90LiIKKyAg ICAobGV0ICgoc2VtdmVyLXJhbmdlIChzdHJpbmctPnNlbXZlci1yYW5nZSByYW5nZSkpKQorICAg ICAgKGFwcGx5IHZhbHVlcworICAgICAgICAgICAgIChvciAoZmluZC1sb2NhbGx5IG5hbWUgc2Vt dmVyLXJhbmdlKQorICAgICAgICAgICAgICAgICAoZmluZC1yZW1vdGUgbmFtZSBzZW12ZXItcmFu Z2UpKSkpKQorCisgIChkZWZpbmUgKG1ha2UtcGFja2FnZS1kZWZpbml0aW9uIG5vZGUpCisgICAg KGxldCogKChtZXRhZGF0YSAobm9kZS1tZXRhZGF0YSBub2RlKSkKKyAgICAgICAgICAgKHBhY2th Z2UgKG5vZGUtcGFja2FnZSBub2RlKSkKKyAgICAgICAgICAgKGRlcGVuZGVuY2llcyA7OyBhIGxp c3Qgb2YgKHB1YmxpYy1uYW1lIGRlcGVuZGVuY3kpCisgICAgICAgICAgICAobWFwIChsYW1iZGEg KG5vZGUtZGVwKQorICAgICAgICAgICAgICAgICAgIChsZXQqICgoZGVwIChub2RlLWRlcGVuZGVu Y3ktZGVwZW5kZW5jeSBub2RlLWRlcCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXIg KG5vZGUtZGVwZW5kZW5jeS12ZXJzaW9uIG5vZGUtZGVwKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgKG5hbWUgKGRlcGVuZGVuY3ktbmFtZSBkZXApKSkKKyAgICAgICAgICAgICAgICAgICAg IChsaXN0IChwdWJsaWMtbmFtZSBuYW1lIHZlcikgZGVwKSkpCisgICAgICAgICAgICAgICAgIChu b2RlLWRlcGVuZGVuY2llcyBub2RlKSkpCisgICAgICAgICAgIChzZXhwIChtYWtlLXNleHAgbWV0 YWRhdGEgcGFja2FnZSBkZXBlbmRlbmNpZXMpKSkKKyAgICAgIChwYWNrYWdlLT5kZWZpbml0aW9u IHNleHAgI3QpKSkKKworICAoZGVmaW5lIChkZXBlbmRlbmN5LT5ub2RlLWRlcGVuZGVuY3kgZGVw KQorICAgIChsZXQqICgobmFtZSAoZGVwZW5kZW5jeS1uYW1lIGRlcCkpCisgICAgICAgICAgIChy YW5nZSAoZGVwZW5kZW5jeS1yYW5nZSBkZXApKQorICAgICAgICAgICAodmVyc2lvbiBleGlzdHM/ IChmaW5kLWJ5LW5hbWUtcmFuZ2UgbmFtZSByYW5nZSkpKQorICAgICAgKG1ha2Utbm9kZS1kZXBl bmRlbmN5IGRlcCB2ZXJzaW9uIGV4aXN0cz8pKSkKKworICAoZGVmaW5lIChuYW1lLXZlcnNpb24t Pm5vZGUgbmFtZSB2ZXJzaW9uKQorICAgIChsZXQqICgobWV0YWRhdGEgKG1lbS1uYW1lLT5tZXRh ZGF0YSBuYW1lKSkKKyAgICAgICAgICAgKHBhY2thZ2UgKG1ldGFkYXRhLT5wYWNrYWdlIG1ldGFk YXRhIHZlcnNpb24pKQorICAgICAgICAgICAoZGVwZW5kZW5jaWVzIChtZW0tcGFja2FnZS1kZXBl bmRlbmNpZXMgcGFja2FnZSkpCisgICAgICAgICAgIChub2RlLWRlcGVuZGVuY2llcyAobWFwIChs YW1iZGEgKGRlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVwZW5k ZW5jeS0+bm9kZS1kZXBlbmRlbmN5IGRlcCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGRlcGVuZGVuY2llcykpKQorICAgICAgKG1ha2Utbm9kZSBuYW1lIHZlcnNpb24gbWV0 YWRhdGEgcGFja2FnZSBub2RlLWRlcGVuZGVuY2llcykpKQorCisgIChkZWZpbmUgKG5vZGUtZGVw ZW5kZW5jeS0+bm9kZSBub2RlLWRlcGVuZGVuY3kpCisgICAgKGxldCogKChkZXBlbmRlbmN5IChu b2RlLWRlcGVuZGVuY3ktZGVwZW5kZW5jeSBub2RlLWRlcGVuZGVuY3kpKQorICAgICAgICAgICAo bmFtZSAoZGVwZW5kZW5jeS1uYW1lIGRlcGVuZGVuY3kpKQorICAgICAgICAgICAodmVyc2lvbiAo bm9kZS1kZXBlbmRlbmN5LXZlcnNpb24gbm9kZS1kZXBlbmRlbmN5KSkpCisgICAgICAobmFtZS12 ZXJzaW9uLT5ub2RlIG5hbWUgdmVyc2lvbikpKQorCisgIChsZXQgKCh2ZXJzaW9uIGV4aXN0cz8g KGZpbmQtYnktbmFtZS1yYW5nZSBuYW1lIHJhbmdlKSkpCisgICAgKGlmIGV4aXN0cz8KKyAgICAg ICAgKGRpc3BsYXkKKyAgICAgICAgIChzdHJpbmctYXBwZW5kICJwYWNrYWdlICIgKG5hbWUrdmVy c2lvbiBuYW1lIHZlcnNpb24pICIgYWxyZWFkIGV4aXN0cyAtICIpCisgICAgICAgICAoY3VycmVu dC1lcnJvci1wb3J0KSkKKyAgICAgICAgKG1hcCBtYWtlLXBhY2thZ2UtZGVmaW5pdGlvbgorICAg ICAgICAgICAgICh0b3BvbG9naWNhbC1zb3J0IChsaXN0IChuYW1lLXZlcnNpb24tPm5vZGUgbmFt ZSB2ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChub2Rl KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAobGFtYmRhIChkZXApCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vZGUtZGVwZW5kZW5jeS0+ bm9kZSBkZXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3Zl IG5vZGUtZGVwZW5kZW5jeS1leGlzdHM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKG5vZGUtZGVwZW5kZW5jaWVzIG5vZGUpKSkpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKGxhbWJkYSAobm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChuYW1lK3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAobm9kZS1uYW1lIG5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5v ZGUtdmVyc2lvbiBub2RlKSkpKSkpKSkKLS0gCjIuMjQuMQoK --=_0f73ed518be0df091b86ace28f090251 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v5-0002-guix-import-crate-crate-recusive-import-use-recus.patch Content-Disposition: attachment; filename=v5-0002-guix-import-crate-crate-recusive-import-use-recus.patch; size=23572 RnJvbSBkMzEzMGQ5N2EwMmYyOWJmZTM4ODY1MGZlNDAxMzFhYTVjNzYyZjA0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogTW9uLCAxNiBEZWMgMjAxOSAxNzozMzo1MCAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggdjUgMi80 XSBndWl4OiBpbXBvcnQ6IGNyYXRlOiBjcmF0ZS1yZWN1c2l2ZS1pbXBvcnQsIHVzZQogcmVjdXNp dmUtaW1wb3J0LXNlbXZlcgoKKiBndWl4L2ltcG9ydC9jcmF0ZS5zY20gKGNyYXRlLXJlY3VzaXZl LWltcG9ydCk6IHVzZSByZWN1c2l2ZS1pbXBvcnQtc2VtdmVyCiogZ3VpeC9pbXBvcnQvY3JhdGUu c2NtIChtYWtlLWNyYXRlLXNleHApW2FyZ3VtbmV0c106IHVzZSA8Y3JhdGU+IGFuZCA8dmVyc2lv bj4KKiBndWl4L2ltcG9ydC9jcmF0ZS5zY20gKGNyYXRlLXZlcnNpb24tZGVwZW5kZW5jaWVzKTog ZGVkdXAgZGVwZW5kZW5jaWVzCiogZ3VpeC90ZXN0L2NyYXRlLnNjbTogdXBkYXRlZCB0ZXN0Ci0t LQogZ3VpeC9pbXBvcnQvY3JhdGUuc2NtIHwgMTc1ICsrKysrKysrKysrKysrKysrLS0tLS0tLS0t LS0tLS0KIHRlc3RzL2NyYXRlLnNjbSAgICAgICB8IDIzMiArKysrKysrKysrKysrKysrKysrKysr KystLS0tLS0tLS0tLS0tLS0tLS0KIDIgZmlsZXMgY2hhbmdlZCwgMjI5IGluc2VydGlvbnMoKyks IDE3OCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9ndWl4L2ltcG9ydC9jcmF0ZS5zY20gYi9n dWl4L2ltcG9ydC9jcmF0ZS5zY20KaW5kZXggNGMzZjgwMDBkMC4uM2U1YjAyMjg3MyAxMDA2NDQK LS0tIGEvZ3VpeC9pbXBvcnQvY3JhdGUuc2NtCisrKyBiL2d1aXgvaW1wb3J0L2NyYXRlLnNjbQpA QCAtMzgsNiArMzgsNyBAQAogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0xKQogICAjOnVzZS1t b2R1bGUgKHNyZmkgc3JmaS0yKQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0yNikKKyAgIzp1 c2UtbW9kdWxlIChzcmZpIHNyZmktNzEpCiAgICM6ZXhwb3J0IChjcmF0ZS0+Z3VpeC1wYWNrYWdl CiAgICAgICAgICAgICBndWl4LXBhY2thZ2UtPmNyYXRlLW5hbWUKICAgICAgICAgICAgIGNyYXRl LXJlY3Vyc2l2ZS1pbXBvcnQKQEAgLTg1LDcgKzg2LDcgQEAKICAgY3JhdGUtZGVwZW5kZW5jeT8K ICAganNvbi0+Y3JhdGUtZGVwZW5kZW5jeQogICAoaWQgICAgICAgICAgICBjcmF0ZS1kZXBlbmRl bmN5LWlkICJjcmF0ZV9pZCIpICA7c3RyaW5nCi0gIChraW5kICAgICAgICAgIGNyYXRlLWRlcGVu ZGVuY3kta2luZCAia2luZCIgICAgIDsnbm9ybWFsIHwgJ2RldgorICAoa2luZCAgICAgICAgICBj cmF0ZS1kZXBlbmRlbmN5LWtpbmQgImtpbmQiICAgICA7J25vcm1hbCB8ICdkZXYgfCAnYnVpbGQK ICAgICAgICAgICAgICAgICAgc3RyaW5nLT5zeW1ib2wpCiAgIChyZXF1aXJlbWVudCAgIGNyYXRl LWRlcGVuZGVuY3ktcmVxdWlyZW1lbnQgInJlcSIpKSA7c3RyaW5nCiAKQEAgLTEwOCwxMyArMTA5 LDIyIEBAIHJlY29yZCBvciAjZiBpZiBpdCB3YXMgbm90IGZvdW5kLiIKICAgIlJldHVybiB0aGUg bGlzdCBvZiA8Y3JhdGUtZGVwZW5kZW5jeT4gcmVjb3JkcyBvZiBWRVJTSU9OLCBhCiA8Y3JhdGUt dmVyc2lvbj4uIgogICAobGV0KiAoKHBhdGggKGFzc29jLXJlZiAoY3JhdGUtdmVyc2lvbi1saW5r cyB2ZXJzaW9uKSAiZGVwZW5kZW5jaWVzIikpCi0gICAgICAgICAodXJsICAoc3RyaW5nLWFwcGVu ZCAoJWNyYXRlLWJhc2UtdXJsKSBwYXRoKSkpCi0gICAgKG1hdGNoIChhc3NvYy1yZWYgKG9yIChq c29uLWZldGNoIHVybCkgJygpKSAiZGVwZW5kZW5jaWVzIikKLSAgICAgICgoPyB2ZWN0b3I/IHZl Y3RvcikKLSAgICAgICAobWFwIGpzb24tPmNyYXRlLWRlcGVuZGVuY3kgKHZlY3Rvci0+bGlzdCB2 ZWN0b3IpKSkKLSAgICAgIChfCi0gICAgICAgJygpKSkpKQotCisgICAgICAgICAodXJsICAoc3Ry aW5nLWFwcGVuZCAoJWNyYXRlLWJhc2UtdXJsKSBwYXRoKSkKKyAgICAgICAgIChkZXBzLWxpc3Qg KG1hdGNoIChhc3NvYy1yZWYgKG9yIChqc29uLWZldGNoIHVybCkgJygpKSAiZGVwZW5kZW5jaWVz IikKKyAgICAgICAgICAgICAgICAgICAgICAoKD8gdmVjdG9yPyB2ZWN0b3IpICh2ZWN0b3ItPmxp c3QgdmVjdG9yKSkKKyAgICAgICAgICAgICAgICAgICAgICAoXworICAgICAgICAgICAgICAgICAg ICAgICAnKCkpKSkKKyAgICAgICAgIDs7IHR1cm4gdGhlIHJhdyBsaXN0IGludG8gPGRlcGVuZGVu Y3k+J3MgYW5kIHJlbW92ZSBkZXYgZGVwZW5lZGVuY2llcworICAgICAgICAgKGRlcHMgKGZpbHRl ci1tYXAgKGxhbWJkYSAoanNvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAo KGRlcCAoanNvbi0+Y3JhdGUtZGVwZW5kZW5jeSBqc29uKSkpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGlmIChlcT8gKGNyYXRlLWRlcGVuZGVuY3kta2luZCBkZXApICdkZXYpCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGRlcCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy1s aXN0KSkpCisgICAgOztyZW1vdmUgZHVwbGljYXRlIGRlcGVuZGVuY2llcworICAgIChhcHBseSBs c2V0LWFkam9pbiBgKCwobGFtYmRhIChhIGIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg KHN0cmluZy1jaT0/IChjcmF0ZS1kZXBlbmRlbmN5LWlkIGEpIChjcmF0ZS1kZXBlbmRlbmN5LWlk IGIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKSAsQGRlcHMpKSkpCiAMCiA7OzsKIDs7 OyBDb252ZXJ0aW5nIGNyYXRlcyB0byBHdWl4IHBhY2thZ2VzLgpAQCAtMTQxLDQyICsxNTEsNTUg QEAgcmVjb3JkIG9yICNmIGlmIGl0IHdhcyBub3QgZm91bmQuIgogICAgICgoYXJncyAuLi4pCiAg ICAgIGAoKGFyZ3VtZW50cyAoLCdxdWFzaXF1b3RlICxhcmdzKSkpKSkpCiAKLShkZWZpbmUqICht YWtlLWNyYXRlLXNleHAgIzprZXkgbmFtZSB2ZXJzaW9uIGNhcmdvLWlucHV0cyBjYXJnby1kZXZl bG9wbWVudC1pbnB1dHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaG9tZS1wYWdlIHN5bm9w c2lzIGRlc2NyaXB0aW9uIGxpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIzphbGxv dy1vdGhlci1rZXlzKQotICAiUmV0dXJuIHRoZSBgcGFja2FnZScgcy1leHByZXNzaW9uIGZvciBh IHJ1c3QgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBOQU1FLAotVkVSU0lPTiwgQ0FSR08tSU5QVVRT LCBDQVJHTy1ERVZFTE9QTUVOVC1JTlBVVFMsIEhPTUUtUEFHRSwgU1lOT1BTSVMsIERFU0NSSVBU SU9OLAotYW5kIExJQ0VOU0UuIgotICAobGV0KiAoKHBvcnQgKGh0dHAtZmV0Y2ggKGNyYXRlLXVy aSBuYW1lIHZlcnNpb24pKSkKKyhkZWZpbmUgKG1ha2UtY3JhdGUtc2V4cCBjcmF0ZSB2ZXJzaW9u KiBkZXBlbmRlbmNpZXMpCisgICJSZXR1cm4gdGhlIGBwYWNrYWdlJyBzLWV4cHJlc3Npb24gZm9y IGEgcnVzdCBwYWNrYWdlIGdpdmVuIDxjcmF0ZT4sCisgPGNyYXRlLXZlcnNpb24+IGFuZCBhIGxp c3Qgb2YgPGNyYXRlLWRlcGVuZGVuY3k+IgorICAoZGVmaW5lIG5vcm1hbC1kZXBlbmRlbmN5Pwor ICAgIChtYXRjaC1sYW1iZGEgKChfIGRlcCkgKG5vdCAoZXE/IChjcmF0ZS1kZXBlbmRlbmN5LWtp bmQgZGVwKSAnZGV2KSkpKSkKKworICAobGV0KiAoKGRlcC1jcmF0ZXMgZGV2LWRlcC1jcmF0ZXMg KHBhcnRpdGlvbiBub3JtYWwtZGVwZW5kZW5jeT8gZGVwZW5kZW5jaWVzKSkKKyAgICAgICAgIChj YXJnby1pbnB1dHMgKHNvcnQgKHVuemlwMSBkZXAtY3JhdGVzKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJpbmctY2k8PykpCisgICAgICAgICAoY2FyZ28tZGV2ZWxvcG1lbnQtaW5w dXRzCisgICAgICAgICAgKHNvcnQgKHVuemlwMSBkZXYtZGVwLWNyYXRlcykKKyAgICAgICAgICAg ICAgICBzdHJpbmctY2k8PykpCisgICAgICAgICAobmFtZSAoY3JhdGUtbmFtZSBjcmF0ZSkpCisg ICAgICAgICAodmVyc2lvbiAoY3JhdGUtdmVyc2lvbi1udW1iZXIgdmVyc2lvbiopKQorICAgICAg ICAgKGhvbWUtcGFnZSAob3IgKGNyYXRlLWhvbWUtcGFnZSBjcmF0ZSkKKyAgICAgICAgICAgICAg ICAgICAgICAgIChjcmF0ZS1yZXBvc2l0b3J5IGNyYXRlKSkpCisgICAgICAgICAoc3lub3BzaXMg KGNyYXRlLWRlc2NyaXB0aW9uIGNyYXRlKSkKKyAgICAgICAgIChkZXNjcmlwdGlvbiAoY3JhdGUt ZGVzY3JpcHRpb24gY3JhdGUpKQorICAgICAgICAgKGxpY2Vuc2UgKGFuZD0+IChjcmF0ZS12ZXJz aW9uLWxpY2Vuc2UgdmVyc2lvbiopCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLT5s aWNlbnNlKSkKKyAgICAgICAgIChwb3J0IChodHRwLWZldGNoIChjcmF0ZS11cmkgbmFtZSB2ZXJz aW9uKSkgKQogICAgICAgICAgKGd1aXgtbmFtZSAoY3JhdGUtbmFtZS0+cGFja2FnZS1uYW1lIG5h bWUpKQotICAgICAgICAgKGNhcmdvLWlucHV0cyAobWFwIGNyYXRlLW5hbWUtPnBhY2thZ2UtbmFt ZSBjYXJnby1pbnB1dHMpKQotICAgICAgICAgKGNhcmdvLWRldmVsb3BtZW50LWlucHV0cyAobWFw IGNyYXRlLW5hbWUtPnBhY2thZ2UtbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNhcmdvLWRldmVsb3BtZW50LWlucHV0cykpCiAgICAgICAgICAocGtnIGAocGFj a2FnZQotICAgICAgICAgICAgICAgICAgIChuYW1lICxndWl4LW5hbWUpCi0gICAgICAgICAgICAg ICAgICAgKHZlcnNpb24gLHZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgKHNvdXJjZSAob3Jp Z2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXRob2QgdXJsLWZldGNoKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAodXJpIChjcmF0ZS11cmkgLG5hbWUgdmVyc2lvbikp Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUgKHN0cmluZy1hcHBlbmQg bmFtZSAiLSIgdmVyc2lvbiAiLnRhci5neiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoc2hhMjU2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZTMyCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLChieXRldmVjdG9yLT5uaXgtYmFzZTMyLXN0cmluZyAo cG9ydC1zaGEyNTYgcG9ydCkpKSkpKQotICAgICAgICAgICAgICAgICAgIChidWlsZC1zeXN0ZW0g Y2FyZ28tYnVpbGQtc3lzdGVtKQotICAgICAgICAgICAgICAgICAgICxAKG1heWJlLWFyZ3VtZW50 cyAoYXBwZW5kIChtYXliZS1jYXJnby1pbnB1dHMgY2FyZ28taW5wdXRzKQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXliZS1jYXJnby1kZXZlbG9wbWVu dC1pbnB1dHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNhcmdvLWRldmVsb3BtZW50LWlucHV0cykpKQotICAgICAgICAgICAgICAgICAgIChob21lLXBh Z2UgLChtYXRjaCBob21lLXBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgo KSAiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfIGhvbWUtcGFnZSkpKQot ICAgICAgICAgICAgICAgICAgIChzeW5vcHNpcyAsc3lub3BzaXMpCi0gICAgICAgICAgICAgICAg ICAgKGRlc2NyaXB0aW9uICwoYmVhdXRpZnktZGVzY3JpcHRpb24gZGVzY3JpcHRpb24pKQotICAg ICAgICAgICAgICAgICAgIChsaWNlbnNlICwobWF0Y2ggbGljZW5zZQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICgoKSAjZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo KGxpY2Vuc2UpIGxpY2Vuc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF8gYChs aXN0ICxAbGljZW5zZSkpKSkpKSkKLSAgICAgICAgIChjbG9zZS1wb3J0IHBvcnQpCi0gICAgICAg ICBwa2cpKQorICAgICAgICAgICAgICAgICAobmFtZSAsZ3VpeC1uYW1lKQorICAgICAgICAgICAg ICAgICAodmVyc2lvbiAsdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgKHNvdXJjZSAob3JpZ2lu CisgICAgICAgICAgICAgICAgICAgICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICh1cmkgKGNyYXRlLXVyaSAsbmFtZSB2ZXJzaW9uKSkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUgKHN0cmluZy1hcHBlbmQgbmFtZSAiLSIg dmVyc2lvbiAiLmNyYXRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hhMjU2Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2UzMgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAsKGJ5dGV2ZWN0b3ItPm5peC1iYXNlMzItc3RyaW5nIChwb3J0LXNoYTI1NiBwb3J0 KSkpKSkpCisgICAgICAgICAgICAgICAgIChidWlsZC1zeXN0ZW0gY2FyZ28tYnVpbGQtc3lzdGVt KQorICAgICAgICAgICAgICAgICAsQChtYXliZS1hcmd1bWVudHMgKGFwcGVuZCBgKCM6c2tpcC1i dWlsZD8gI3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICht YXliZS1jYXJnby1pbnB1dHMgY2FyZ28taW5wdXRzKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAobWF5YmUtY2FyZ28tZGV2ZWxvcG1lbnQtaW5wdXRzCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJnby1kZXZlbG9wbWVu dC1pbnB1dHMpKSkKKyAgICAgICAgICAgICAgICAgKGhvbWUtcGFnZSAsKG1hdGNoIGhvbWUtcGFn ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKSAiIikKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAoXyBob21lLXBhZ2UpKSkKKyAgICAgICAgICAgICAgICAgKHN5bm9w c2lzICxzeW5vcHNpcykKKyAgICAgICAgICAgICAgICAgKGRlc2NyaXB0aW9uICwoYmVhdXRpZnkt ZGVzY3JpcHRpb24gZGVzY3JpcHRpb24pKQorICAgICAgICAgICAgICAgICAobGljZW5zZSAsKG1h dGNoIGxpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgpICNmKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoKGxpY2Vuc2UpIGxpY2Vuc2UpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChfIGAobGlzdCAsQGxpY2Vuc2UpKSkpKSkpCisKKyAgICAoY2xvc2Ut cG9ydCBwb3J0KQorICAgIHBrZykpCiAKIChkZWZpbmUgKHN0cmluZy0+bGljZW5zZSBzdHJpbmcp CiAgIChmaWx0ZXItbWFwIChsYW1iZGEgKGxpY2Vuc2UpCkBAIC0xODcsMTUgKzIxMCwyNCBAQCBh bmQgTElDRU5TRS4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Vua25vd24tbGljZW5zZSEp KSkKICAgICAgICAgICAgICAgKHN0cmluZy1zcGxpdCBzdHJpbmcgKHN0cmluZy0+Y2hhci1zZXQg IiAvIikpKSkKIAorKGRlZmluZSAoY3JhdGUtPmNyYXRlLXZlcnNpb24gY3JhdGUgdmVyc2lvbi1u dW1iZXIpCisgICJyZXR1cm5zIHRoZSA8Y3JhdGUtdmVyc2lvbj4gZm9yIGEgZ2l2ZW4gQ1JBVEUg YW5kIFZFUlNJT04tTlVNQkVSIgorICAoZmluZCAobGFtYmRhICh2ZXJzaW9uKQorICAgICAgICAg ICAgKHN0cmluZz0/IChjcmF0ZS12ZXJzaW9uLW51bWJlciB2ZXJzaW9uKQorICAgICAgICAgICAg ICAgICAgICAgIHZlcnNpb24tbnVtYmVyKSkKKyAgICAgICAgICAoY3JhdGUtdmVyc2lvbnMgY3Jh dGUpKSkKKworKGRlZmluZSAoY3JhdGUtPnZlcnNpb25zIGNyYXRlKQorICAiUmV0dXJucyBhIGxp c3Qgb2YgdmVyc2lvbnMgZm9yIGEgZ2l2ZW4gQ1JBVEUiCisgIChtYXAgKGxhbWJkYSAodmVyc2lv bikKKyAgICAgICAgIChjcmF0ZS12ZXJzaW9uLW51bWJlciB2ZXJzaW9uKSkKKyAgICAgICAoY3Jh dGUtdmVyc2lvbnMgY3JhdGUpKSkKKwogKGRlZmluZSogKGNyYXRlLT5ndWl4LXBhY2thZ2UgY3Jh dGUtbmFtZSAjOm9wdGlvbmFsIHZlcnNpb24pCiAgICJGZXRjaCB0aGUgbWV0YWRhdGEgZm9yIENS QVRFLU5BTUUgZnJvbSBjcmF0ZXMuaW8sIGFuZCByZXR1cm4gdGhlCiBgcGFja2FnZScgcy1leHBy ZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBwYWNrYWdlLCBvciAjZiBvbiBmYWlsdXJlLgog V2hlbiBWRVJTSU9OIGlzIHNwZWNpZmllZCwgYXR0ZW1wdCB0byBmZXRjaCB0aGF0IHZlcnNpb247 IG90aGVyd2lzZSBmZXRjaCB0aGUKIGxhdGVzdCB2ZXJzaW9uIG9mIENSQVRFLU5BTUUuIgotCi0g IChkZWZpbmUgKG5vcm1hbC1kZXBlbmRlbmN5PyBkZXBlbmRlbmN5KQotICAgIChlcT8gKGNyYXRl LWRlcGVuZGVuY3kta2luZCBkZXBlbmRlbmN5KSAnbm9ybWFsKSkKLQogICAoZGVmaW5lIGNyYXRl CiAgICAgKGxvb2t1cC1jcmF0ZSBjcmF0ZS1uYW1lKSkKIApAQCAtMjA0LDM4ICsyMzYsMjggQEAg bGF0ZXN0IHZlcnNpb24gb2YgQ1JBVEUtTkFNRS4iCiAgICAgICAgIChjcmF0ZS1sYXRlc3QtdmVy c2lvbiBjcmF0ZSkpKQogCiAgIChkZWZpbmUgdmVyc2lvbioKLSAgICAoZmluZCAobGFtYmRhICh2 ZXJzaW9uKQotICAgICAgICAgICAgKHN0cmluZz0/IChjcmF0ZS12ZXJzaW9uLW51bWJlciB2ZXJz aW9uKQotICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24tbnVtYmVyKSkKLSAgICAgICAgICAo Y3JhdGUtdmVyc2lvbnMgY3JhdGUpKSkKKyAgICAoY3JhdGUtPmNyYXRlLXZlcnNpb24gY3JhdGUg dmVyc2lvbi1udW1iZXIpKQorCisgIChkZWZpbmUgZGVwZW5kZW5jaWVzIChtYXAKKyAgICAgICAg ICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg KGxpc3QgKGNyYXRlLW5hbWUtPnBhY2thZ2UtbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGNyYXRlLWRlcGVuZGVuY3ktaWQgZGVwKSkgZGVwKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgIChjcmF0ZS12ZXJzaW9uLWRlcGVuZGVuY2llcyB2ZXJzaW9uKikpKQorICAobWFrZS1jcmF0 ZS1zZXhwIGNyYXRlIHZlcnNpb24qIGRlcGVuZGVuY2llcykpCiAKLSAgKGFuZCBjcmF0ZSB2ZXJz aW9uKgotICAgICAgIChsZXQqICgoZGVwZW5kZW5jaWVzICAgKGNyYXRlLXZlcnNpb24tZGVwZW5k ZW5jaWVzIHZlcnNpb24qKSkKLSAgICAgICAgICAgICAgKGRlcC1jcmF0ZXMgICAgIChmaWx0ZXIg bm9ybWFsLWRlcGVuZGVuY3k/IGRlcGVuZGVuY2llcykpCi0gICAgICAgICAgICAgIChkZXYtZGVw LWNyYXRlcyAocmVtb3ZlIG5vcm1hbC1kZXBlbmRlbmN5PyBkZXBlbmRlbmNpZXMpKQotICAgICAg ICAgICAgICAoY2FyZ28taW5wdXRzICAgKHNvcnQgKG1hcCBjcmF0ZS1kZXBlbmRlbmN5LWlkIGRl cC1jcmF0ZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmctY2k8 PykpCi0gICAgICAgICAgICAgIChjYXJnby1kZXZlbG9wbWVudC1pbnB1dHMKLSAgICAgICAgICAg ICAgIChzb3J0IChtYXAgY3JhdGUtZGVwZW5kZW5jeS1pZCBkZXYtZGVwLWNyYXRlcykKLSAgICAg ICAgICAgICAgICAgICAgIHN0cmluZy1jaTw/KSkpCi0gICAgICAgICAodmFsdWVzCi0gICAgICAg ICAgKG1ha2UtY3JhdGUtc2V4cCAjOm5hbWUgY3JhdGUtbmFtZQotICAgICAgICAgICAgICAgICAg ICAgICAgICAgIzp2ZXJzaW9uIChjcmF0ZS12ZXJzaW9uLW51bWJlciB2ZXJzaW9uKikKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICM6Y2FyZ28taW5wdXRzIGNhcmdvLWlucHV0cwotICAgICAg ICAgICAgICAgICAgICAgICAgICAgIzpjYXJnby1kZXZlbG9wbWVudC1pbnB1dHMgY2FyZ28tZGV2 ZWxvcG1lbnQtaW5wdXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAjOmhvbWUtcGFnZSAo b3IgKGNyYXRlLWhvbWUtcGFnZSBjcmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoY3JhdGUtcmVwb3NpdG9yeSBjcmF0ZSkpCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAjOnN5bm9wc2lzIChjcmF0ZS1kZXNjcmlwdGlvbiBjcmF0ZSkKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICM6ZGVzY3JpcHRpb24gKGNyYXRlLWRlc2NyaXB0aW9uIGNyYXRl KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIzpsaWNlbnNlIChhbmQ9PiAoY3JhdGUtdmVy c2lvbi1saWNlbnNlIHZlcnNpb24qKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJpbmctPmxpY2Vuc2UpKQotICAgICAgICAgIChhcHBlbmQgY2FyZ28taW5w dXRzIGNhcmdvLWRldmVsb3BtZW50LWlucHV0cykpKSkpCiAKLShkZWZpbmUgKGNyYXRlLXJlY3Vy c2l2ZS1pbXBvcnQgY3JhdGUtbmFtZSkKLSAgKHJlY3Vyc2l2ZS1pbXBvcnQgY3JhdGUtbmFtZSAj ZgotICAgICAgICAgICAgICAgICAgICAjOnJlcG8tPmd1aXgtcGFja2FnZSAobGFtYmRhIChuYW1l IHJlcG8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyYXRl LT5ndWl4LXBhY2thZ2UgbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICM6Z3VpeC1uYW1lIGNy YXRlLW5hbWUtPnBhY2thZ2UtbmFtZSkpCisoZGVmaW5lKiAoY3JhdGUtcmVjdXJzaXZlLWltcG9y dCBuYW1lICM6b3B0aW9uYWwgcmFuZ2UpCisgIChyZWN1cnNpdmUtaW1wb3J0LXNlbXZlcgorICAg IzpuYW1lIG5hbWUKKyAgICM6cmFuZ2UgKGlmIHJhbmdlIHJhbmdlICIqIikKKyAgICM6bmFtZS0+ bWV0YWRhdGEgbG9va3VwLWNyYXRlCisgICAjOm1ldGFkYXRhLT5wYWNrYWdlIGNyYXRlLT5jcmF0 ZS12ZXJzaW9uCisgICAjOm1ldGFkYXRhLXZlcnNpb25zIGNyYXRlLT52ZXJzaW9ucworICAgIzpw YWNrYWdlLWRlcGVuZGVuY2llcyBjcmF0ZS12ZXJzaW9uLWRlcGVuZGVuY2llcworICAgIzpkZXBl bmRlbmN5LW5hbWUgY3JhdGUtZGVwZW5kZW5jeS1pZAorICAgIzpkZXBlbmRlbmN5LXJhbmdlIGNy YXRlLWRlcGVuZGVuY3ktcmVxdWlyZW1lbnQKKyAgICM6Z3VpeC1uYW1lIGNyYXRlLW5hbWUtPnBh Y2thZ2UtbmFtZQorICAgIzptYWtlLXNleHAgbWFrZS1jcmF0ZS1zZXhwKSkKIAogKGRlZmluZSAo Z3VpeC1wYWNrYWdlLT5jcmF0ZS1uYW1lIHBhY2thZ2UpCiAgICJSZXR1cm4gdGhlIGNyYXRlIG5h bWUgb2YgUEFDS0FHRS4iCkBAIC0yODQsNCArMzA2LDMgQEAgbGF0ZXN0IHZlcnNpb24gb2YgQ1JB VEUtTkFNRS4iCiAgICAoZGVzY3JpcHRpb24gIlVwZGF0ZXIgZm9yIGNyYXRlcy5pbyBwYWNrYWdl cyIpCiAgICAocHJlZCBjcmF0ZS1wYWNrYWdlPykKICAgIChsYXRlc3QgbGF0ZXN0LXJlbGVhc2Up KSkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3JhdGUuc2NtIGIvdGVzdHMvY3JhdGUuc2NtCmluZGV4 IDYxOTMzYThkZTguLjQyYzk0Yjk5OTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NyYXRlLnNjbQorKysg Yi90ZXN0cy9jcmF0ZS5zY20KQEAgLTIsNiArMiw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMTQg RGF2aWQgVGhvbXBzb24gPGRhdmV0QGdudS5vcmc+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMTYgRGF2 aWQgQ3JhdmVuIDxkYXZpZEBjcmF2ZW4uY2g+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMTkgTHVkb3Zp YyBDb3VydMOocyA8bHVkb0BnbnUub3JnPgorOzs7IENvcHlyaWdodCDCqSAyMDE5IE1hcnRpbiBC ZWN6ZSA8bWpiZWN6ZUByaXNldXAubmV0PgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg R05VIEd1aXguCiA7OzsKQEAgLTU2LDYgKzU3LDcgQEAKICAgICAgewogICAgICAgIFwiY3JhdGVf aWRcIjogXCJiYXJcIiwKICAgICAgICBcImtpbmRcIjogXCJub3JtYWxcIiwKKyAgICAgICBcInJl cVwiOiBcIjFcIgogICAgICB9CiAgIF0KIH0iKQpAQCAtODgsMTggKzkwLDIyIEBACiAgICAgIHsK ICAgICAgICBcImNyYXRlX2lkXCI6IFwiaW50ZXJtZWRpYXRlLTFcIiwKICAgICAgICBcImtpbmRc IjogXCJub3JtYWxcIiwKKyAgICAgICBcInJlcVwiOiBcIjFcIgogICAgICB9LAogICAgICB7CiAg ICAgICAgXCJjcmF0ZV9pZFwiOiBcImludGVybWVkaWF0ZS0yXCIsCiAgICAgICAgXCJraW5kXCI6 IFwibm9ybWFsXCIsCisgICAgICAgXCJyZXFcIjogXCIxXCIKICAgICAgfQogICAgICB7CiAgICAg ICAgXCJjcmF0ZV9pZFwiOiBcImxlYWYtYWxpY2VcIiwKICAgICAgICBcImtpbmRcIjogXCJub3Jt YWxcIiwKKyAgICAgICBcInJlcVwiOiBcIjFcIgogICAgICB9LAogICAgICB7CiAgICAgICAgXCJj cmF0ZV9pZFwiOiBcImxlYWYtYm9iXCIsCiAgICAgICAgXCJraW5kXCI6IFwibm9ybWFsXCIsCisg ICAgICAgXCJyZXFcIjogXCIxXCIKICAgICAgfSwKICAgXQogfSIpCkBAIC0xMzIsMTQgKzEzOCwx NyBAQAogICAgICB7CiAgICAgICAgXCJjcmF0ZV9pZFwiOiBcImludGVybWVkaWF0ZS0yXCIsCiAg ICAgICAgXCJraW5kXCI6IFwibm9ybWFsXCIsCisgICAgICAgXCJyZXFcIjogXCIxXCIKICAgICAg fSwKICAgICAgewogICAgICAgIFwiY3JhdGVfaWRcIjogXCJsZWFmLWFsaWNlXCIsCiAgICAgICAg XCJraW5kXCI6IFwibm9ybWFsXCIsCisgICAgICAgXCJyZXFcIjogXCIxXCIKICAgICAgfSwKICAg ICAgewogICAgICAgIFwiY3JhdGVfaWRcIjogXCJsZWFmLWJvYlwiLAogICAgICAgIFwia2luZFwi OiBcIm5vcm1hbFwiLAorICAgICAgIFwicmVxXCI6IFwiMVwiCiAgICAgIH0KICAgXQogfSIpCkBA IC0xNzIsNiArMTgxLDcgQEAKICAgICAgewogICAgICAgIFwiY3JhdGVfaWRcIjogXCJsZWFmLWJv YlwiLAogICAgICAgIFwia2luZFwiOiBcIm5vcm1hbFwiLAorICAgICAgIFwicmVxXCI6IFwiMVwi CiAgICAgIH0sCiAgIF0KIH0iKQpAQCAtMjY4LDE0ICsyNzgsMTUgQEAKICAgICAgICAgICgnc291 cmNlICgnb3JpZ2luCiAgICAgICAgICAgICAgICAgICAgICgnbWV0aG9kICd1cmwtZmV0Y2gpCiAg ICAgICAgICAgICAgICAgICAgICgndXJpICgnY3JhdGUtdXJpICJmb28iICd2ZXJzaW9uKSkKLSAg ICAgICAgICAgICAgICAgICAgKCdmaWxlLW5hbWUgKCdzdHJpbmctYXBwZW5kICduYW1lICItIiAn dmVyc2lvbiAiLnRhci5neiIpKQorICAgICAgICAgICAgICAgICAgICAoJ2ZpbGUtbmFtZSAoJ3N0 cmluZy1hcHBlbmQgJ25hbWUgIi0iICd2ZXJzaW9uICIuY3JhdGUiKSkKICAgICAgICAgICAgICAg ICAgICAgKCdzaGEyNTYKICAgICAgICAgICAgICAgICAgICAgICgnYmFzZTMyCiAgICAgICAgICAg ICAgICAgICAgICAgKD8gc3RyaW5nPyBoYXNoKSkpKSkKICAgICAgICAgICgnYnVpbGQtc3lzdGVt ICdjYXJnby1idWlsZC1zeXN0ZW0pCiAgICAgICAgICAoJ2FyZ3VtZW50cwogICAgICAgICAgICgn cXVhc2lxdW90ZQotICAgICAgICAgICAoJyM6Y2FyZ28taW5wdXRzICgoInJ1c3QtYmFyIiAoJ3Vu cXVvdGUgcnVzdC1iYXIpKSkpKSkKKyAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0CisgICAg ICAgICAgICAjOmNhcmdvLWlucHV0cyAoKCJydXN0LWJhciIgKCd1bnF1b3RlIHJ1c3QtYmFyKSkp KSkpCiAgICAgICAgICAoJ2hvbWUtcGFnZSAiaHR0cDovL2V4YW1wbGUuY29tIikKICAgICAgICAg ICgnc3lub3BzaXMgInN1bW1hcnkiKQogICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIp CkBAIC0zMzUsMTA3ICszNDYsMTI2IEBACiAgICAgICAgICAgICAgKCJodHRwczovL2NyYXRlcy5p by9hcGkvdjEvY3JhdGVzL2xlYWYtYm9iLzEuMC4wL2RlcGVuZGVuY2llcyIKICAgICAgICAgICAg ICAgKG9wZW4taW5wdXQtc3RyaW5nIHRlc3QtbGVhZi1ib2ItZGVwZW5kZW5jaWVzKSkKICAgICAg ICAgICAgICAoXyAoZXJyb3IgIlVuZXhwZWN0ZWQgVVJMOiAiIHVybCkpKSkpCisKICAgICAgICAg KG1hdGNoIChjcmF0ZS1yZWN1cnNpdmUtaW1wb3J0ICJyb290IikKICAgICAgICAgICA7OyBydXN0 LWludGVybWVkaWF0ZS0yIGhhcyBubyBkZXBlbmRlbmN5IG9uIHRoZSBydXN0LWxlYWYtYWxpY2Ug cGFja2FnZSwgc28gdGhpcyBpcyBhIHZhbGlkIG9yZGVyaW5nCi0gICAgICAgICAgKCgoJ3BhY2th Z2UKLSAgICAgICAgICAgICAgKCduYW1lICJydXN0LWxlYWYtYWxpY2UiKQotICAgICAgICAgICAg ICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIpKQotICAgICAgICAgICAgICAoJ3NvdXJjZQotICAg ICAgICAgICAgICAgKCdvcmlnaW4KLSAgICAgICAgICAgICAgICAgKCdtZXRob2QgJ3VybC1mZXRj aCkKLSAgICAgICAgICAgICAgICAgKCd1cmkgKCdjcmF0ZS11cmkgImxlYWYtYWxpY2UiICd2ZXJz aW9uKSkKLSAgICAgICAgICAgICAgICAgKCdmaWxlLW5hbWUKLSAgICAgICAgICAgICAgICAgICgn c3RyaW5nLWFwcGVuZCAnbmFtZSAiLSIgJ3ZlcnNpb24gIi50YXIuZ3oiKSkKLSAgICAgICAgICAg ICAgICAgKCdzaGEyNTYKLSAgICAgICAgICAgICAgICAgICgnYmFzZTMyCi0gICAgICAgICAgICAg ICAgICAgKD8gc3RyaW5nPyBoYXNoKSkpKSkKLSAgICAgICAgICAgICAgKCdidWlsZC1zeXN0ZW0g J2NhcmdvLWJ1aWxkLXN5c3RlbSkKLSAgICAgICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6Ly9l eGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICgnc3lub3BzaXMgInN1bW1hcnkiKQotICAgICAg ICAgICAgICAoJ2Rlc2NyaXB0aW9uICJzdW1tYXJ5IikKLSAgICAgICAgICAgICAgKCdsaWNlbnNl ICgnbGlzdCAnbGljZW5zZTpleHBhdCAnbGljZW5zZTphc2wyLjApKSkKLSAgICAgICAgICAgICgn cGFja2FnZQotICAgICAgICAgICAgICAoJ25hbWUgInJ1c3QtbGVhZi1ib2IiKQotICAgICAgICAg ICAgICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIpKQotICAgICAgICAgICAgICAoJ3NvdXJjZQot ICAgICAgICAgICAgICAgKCdvcmlnaW4KLSAgICAgICAgICAgICAgICAgKCdtZXRob2QgJ3VybC1m ZXRjaCkKLSAgICAgICAgICAgICAgICAgKCd1cmkgKCdjcmF0ZS11cmkgImxlYWYtYm9iIiAndmVy c2lvbikpCi0gICAgICAgICAgICAgICAgICgnZmlsZS1uYW1lCi0gICAgICAgICAgICAgICAgICAo J3N0cmluZy1hcHBlbmQgJ25hbWUgIi0iICd2ZXJzaW9uICIudGFyLmd6IikpCi0gICAgICAgICAg ICAgICAgICgnc2hhMjU2Ci0gICAgICAgICAgICAgICAgICAoJ2Jhc2UzMgotICAgICAgICAgICAg ICAgICAgICg/IHN0cmluZz8gaGFzaCkpKSkpCi0gICAgICAgICAgICAgICgnYnVpbGQtc3lzdGVt ICdjYXJnby1idWlsZC1zeXN0ZW0pCi0gICAgICAgICAgICAgICgnaG9tZS1wYWdlICJodHRwOi8v ZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAoJ3N5bm9wc2lzICJzdW1tYXJ5IikKLSAgICAg ICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCi0gICAgICAgICAgICAgICgnbGljZW5z ZSAoJ2xpc3QgJ2xpY2Vuc2U6ZXhwYXQgJ2xpY2Vuc2U6YXNsMi4wKSkpCi0gICAgICAgICAgICAo J3BhY2thZ2UKLSAgICAgICAgICAgICAgKCduYW1lICJydXN0LWludGVybWVkaWF0ZS0yIikKLSAg ICAgICAgICAgICAgKCd2ZXJzaW9uICg/IHN0cmluZz8gdmVyKSkKLSAgICAgICAgICAgICAgKCdz b3VyY2UKLSAgICAgICAgICAgICAgICgnb3JpZ2luCi0gICAgICAgICAgICAgICAgICgnbWV0aG9k ICd1cmwtZmV0Y2gpCi0gICAgICAgICAgICAgICAgICgndXJpICgnY3JhdGUtdXJpICJpbnRlcm1l ZGlhdGUtMiIgJ3ZlcnNpb24pKQotICAgICAgICAgICAgICAgICAoJ2ZpbGUtbmFtZQotICAgICAg ICAgICAgICAgICAgKCdzdHJpbmctYXBwZW5kICduYW1lICItIiAndmVyc2lvbiAiLnRhci5neiIp KQotICAgICAgICAgICAgICAgICAoJ3NoYTI1NgotICAgICAgICAgICAgICAgICAgKCdiYXNlMzIK LSAgICAgICAgICAgICAgICAgICAoPyBzdHJpbmc/IGhhc2gpKSkpKQotICAgICAgICAgICAgICAo J2J1aWxkLXN5c3RlbSAnY2FyZ28tYnVpbGQtc3lzdGVtKQotICAgICAgICAgICAgICAoJ2FyZ3Vt ZW50cwotICAgICAgICAgICAgICAgKCdxdWFzaXF1b3RlCi0gICAgICAgICAgICAgICAgKCcjOmNh cmdvLWlucHV0cyAoKCJydXN0LWxlYWYtYm9iIiAoJ3VucXVvdGUgcnVzdC1sZWFmLWJvYikpKSkp KQotICAgICAgICAgICAgICAoJ2hvbWUtcGFnZSAiaHR0cDovL2V4YW1wbGUuY29tIikKLSAgICAg ICAgICAgICAgKCdzeW5vcHNpcyAic3VtbWFyeSIpCi0gICAgICAgICAgICAgICgnZGVzY3JpcHRp b24gInN1bW1hcnkiKQotICAgICAgICAgICAgICAoJ2xpY2Vuc2UgKCdsaXN0ICdsaWNlbnNlOmV4 cGF0ICdsaWNlbnNlOmFzbDIuMCkpKQotICAgICAgICAgICAgKCdwYWNrYWdlCi0gICAgICAgICAg ICAgICgnbmFtZSAicnVzdC1pbnRlcm1lZGlhdGUtMSIpCi0gICAgICAgICAgICAgICgndmVyc2lv biAoPyBzdHJpbmc/IHZlcikpCi0gICAgICAgICAgICAgICgnc291cmNlCi0gICAgICAgICAgICAg ICAoJ29yaWdpbgotICAgICAgICAgICAgICAgICAoJ21ldGhvZCAndXJsLWZldGNoKQotICAgICAg ICAgICAgICAgICAoJ3VyaSAoJ2NyYXRlLXVyaSAiaW50ZXJtZWRpYXRlLTEiICd2ZXJzaW9uKSkK LSAgICAgICAgICAgICAgICAgKCdmaWxlLW5hbWUKLSAgICAgICAgICAgICAgICAgICgnc3RyaW5n LWFwcGVuZCAnbmFtZSAiLSIgJ3ZlcnNpb24gIi50YXIuZ3oiKSkKLSAgICAgICAgICAgICAgICAg KCdzaGEyNTYKLSAgICAgICAgICAgICAgICAgICgnYmFzZTMyCi0gICAgICAgICAgICAgICAgICAg KD8gc3RyaW5nPyBoYXNoKSkpKSkKLSAgICAgICAgICAgICAgKCdidWlsZC1zeXN0ZW0gJ2Nhcmdv LWJ1aWxkLXN5c3RlbSkKLSAgICAgICAgICAgICAgKCdhcmd1bWVudHMKLSAgICAgICAgICAgICAg ICgncXVhc2lxdW90ZQotICAgICAgICAgICAgICAgICgnIzpjYXJnby1pbnB1dHMgKCgicnVzdC1p bnRlcm1lZGlhdGUtMiIgKCd1bnF1b3RlIHJ1c3QtaW50ZXJtZWRpYXRlLTIpKQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICgicnVzdC1sZWFmLWFsaWNlIiAoJ3VucXVvdGUgcnVz dC1sZWFmLWFsaWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInJ1c3Qt bGVhZi1ib2IiICgndW5xdW90ZSBydXN0LWxlYWYtYm9iKSkpKSkpCi0gICAgICAgICAgICAgICgn aG9tZS1wYWdlICJodHRwOi8vZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAoJ3N5bm9wc2lz ICJzdW1tYXJ5IikKLSAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCi0gICAg ICAgICAgICAgICgnbGljZW5zZSAoJ2xpc3QgJ2xpY2Vuc2U6ZXhwYXQgJ2xpY2Vuc2U6YXNsMi4w KSkpCi0gICAgICAgICAgICAoJ3BhY2thZ2UKLSAgICAgICAgICAgICAgKCduYW1lICJydXN0LXJv b3QiKQotICAgICAgICAgICAgICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIpKQotICAgICAgICAg ICAgICAoJ3NvdXJjZQotICAgICAgICAgICAgICAgKCdvcmlnaW4KLSAgICAgICAgICAgICAgICAg KCdtZXRob2QgJ3VybC1mZXRjaCkKLSAgICAgICAgICAgICAgICAgKCd1cmkgKCdjcmF0ZS11cmkg InJvb3QiICd2ZXJzaW9uKSkKLSAgICAgICAgICAgICAgICAgKCdmaWxlLW5hbWUKLSAgICAgICAg ICAgICAgICAgICgnc3RyaW5nLWFwcGVuZCAnbmFtZSAiLSIgJ3ZlcnNpb24gIi50YXIuZ3oiKSkK LSAgICAgICAgICAgICAgICAgKCdzaGEyNTYKLSAgICAgICAgICAgICAgICAgICgnYmFzZTMyCi0g ICAgICAgICAgICAgICAgICAgKD8gc3RyaW5nPyBoYXNoKSkpKSkKLSAgICAgICAgICAgICAgKCdi dWlsZC1zeXN0ZW0gJ2NhcmdvLWJ1aWxkLXN5c3RlbSkKLSAgICAgICAgICAgICAgKCdhcmd1bWVu dHMKLSAgICAgICAgICAgICAgICgncXVhc2lxdW90ZQotICAgICAgICAgICAgICAgICgnIzpjYXJn by1pbnB1dHMgKCgicnVzdC1pbnRlcm1lZGlhdGUtMSIgKCd1bnF1b3RlIHJ1c3QtaW50ZXJtZWRp YXRlLTEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicnVzdC1pbnRlcm1l ZGlhdGUtMiIgKCd1bnF1b3RlIHJ1c3QtaW50ZXJtZWRpYXRlLTIpKQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICgicnVzdC1sZWFmLWFsaWNlIiAoJ3VucXVvdGUgcnVzdC1sZWFm LWFsaWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInJ1c3QtbGVhZi1i b2IiICgndW5xdW90ZSBydXN0LWxlYWYtYm9iKSkpKSkpCi0gICAgICAgICAgICAgICgnaG9tZS1w YWdlICJodHRwOi8vZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAoJ3N5bm9wc2lzICJzdW1t YXJ5IikKLSAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCi0gICAgICAgICAg ICAgICgnbGljZW5zZSAoJ2xpc3QgJ2xpY2Vuc2U6ZXhwYXQgJ2xpY2Vuc2U6YXNsMi4wKSkpKQor ICAgICAgICAgICgoKCdkZWZpbmUtcHVibGljICdydXN0LWludGVybWVkaWF0ZS0xLTEuMC4wCisg ICAgICAgICAgICAgICgncGFja2FnZQorICAgICAgICAgICAgICAgICgnbmFtZSAicnVzdC1pbnRl cm1lZGlhdGUtMSIpCisgICAgICAgICAgICAgICAgKCd2ZXJzaW9uICg/IHN0cmluZz8gdmVyKSkK KyAgICAgICAgICAgICAgICAoJ3NvdXJjZQorICAgICAgICAgICAgICAgICAoJ29yaWdpbgorICAg ICAgICAgICAgICAgICAgICgnbWV0aG9kICd1cmwtZmV0Y2gpCisgICAgICAgICAgICAgICAgICAg KCd1cmkgKCdjcmF0ZS11cmkgImludGVybWVkaWF0ZS0xIiAndmVyc2lvbikpCisgICAgICAgICAg ICAgICAgICAgKCdmaWxlLW5hbWUKKyAgICAgICAgICAgICAgICAgICAgKCdzdHJpbmctYXBwZW5k ICduYW1lICItIiAndmVyc2lvbiAiLmNyYXRlIikpCisgICAgICAgICAgICAgICAgICAgKCdzaGEy NTYKKyAgICAgICAgICAgICAgICAgICAgKCdiYXNlMzIKKyAgICAgICAgICAgICAgICAgICAgICg/ IHN0cmluZz8gaGFzaCkpKSkpCisgICAgICAgICAgICAgICAgKCdidWlsZC1zeXN0ZW0gJ2Nhcmdv LWJ1aWxkLXN5c3RlbSkKKyAgICAgICAgICAgICAgICAoJ2FyZ3VtZW50cworICAgICAgICAgICAg ICAgICAoJ3F1YXNpcXVvdGUKKyAgICAgICAgICAgICAgICAgICgnIzpza2lwLWJ1aWxkPyAjdAor ICAgICAgICAgICAgICAgICAgICcjOmNhcmdvLWlucHV0cyAoKCJydXN0LWludGVybWVkaWF0ZS0y LTEuMC4wIiAoJ3VucXVvdGUgcnVzdC1pbnRlcm1lZGlhdGUtMi0xLjAuMCkpCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoInJ1c3QtbGVhZi1hbGljZS0xLjAuMCIgKCd1bnF1 b3RlIHJ1c3QtbGVhZi1hbGljZS0xLjAuMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoInJ1c3QtbGVhZi1ib2ItMS4wLjAiICgndW5xdW90ZSBydXN0LWxlYWYtYm9iLTEu MC4wKSkpKSkpCisgICAgICAgICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6Ly9leGFtcGxlLmNv bSIpCisgICAgICAgICAgICAgICAgKCdzeW5vcHNpcyAic3VtbWFyeSIpCisgICAgICAgICAgICAg ICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdsaWNlbnNlICgn bGlzdCAnbGljZW5zZTpleHBhdCAnbGljZW5zZTphc2wyLjApKSkpCisgICAgICAgICAgICAoJ2Rl ZmluZS1wdWJsaWMgJ3J1c3QtaW50ZXJtZWRpYXRlLTItMS4wLjAKKyAgICAgICAgICAgICAgKCdw YWNrYWdlCisgICAgICAgICAgICAgICAgKCduYW1lICJydXN0LWludGVybWVkaWF0ZS0yIikKKyAg ICAgICAgICAgICAgICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2ZXIpKQorICAgICAgICAgICAgICAg ICgnc291cmNlCisgICAgICAgICAgICAgICAgICgnb3JpZ2luCisgICAgICAgICAgICAgICAgICAg KCdtZXRob2QgJ3VybC1mZXRjaCkKKyAgICAgICAgICAgICAgICAgICAoJ3VyaSAoJ2NyYXRlLXVy aSAiaW50ZXJtZWRpYXRlLTIiICd2ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAoJ2ZpbGUt bmFtZQorICAgICAgICAgICAgICAgICAgICAoJ3N0cmluZy1hcHBlbmQgJ25hbWUgIi0iICd2ZXJz aW9uICIuY3JhdGUiKSkKKyAgICAgICAgICAgICAgICAgICAoJ3NoYTI1NgorICAgICAgICAgICAg ICAgICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAgKD8gc3RyaW5nPyBoYXNoKSkp KSkKKyAgICAgICAgICAgICAgICAoJ2J1aWxkLXN5c3RlbSAnY2FyZ28tYnVpbGQtc3lzdGVtKQor ICAgICAgICAgICAgICAgICgnYXJndW1lbnRzCisgICAgICAgICAgICAgICAgICgncXVhc2lxdW90 ZQorICAgICAgICAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0CisgICAgICAgICAgICAgICAg ICAgJyM6Y2FyZ28taW5wdXRzICgoInJ1c3QtbGVhZi1ib2ItMS4wLjAiICgndW5xdW90ZSBydXN0 LWxlYWYtYm9iLTEuMC4wKSkpKSkpCisgICAgICAgICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6 Ly9leGFtcGxlLmNvbSIpCisgICAgICAgICAgICAgICAgKCdzeW5vcHNpcyAic3VtbWFyeSIpCisg ICAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAg KCdsaWNlbnNlICgnbGlzdCAnbGljZW5zZTpleHBhdCAnbGljZW5zZTphc2wyLjApKSkpCisgICAg ICAgICAgICAoJ2RlZmluZS1wdWJsaWMgJ3J1c3QtbGVhZi1hbGljZS0xLjAuMAorICAgICAgICAg ICAgICAoJ3BhY2thZ2UKKyAgICAgICAgICAgICAgICAoJ25hbWUgInJ1c3QtbGVhZi1hbGljZSIp CisgICAgICAgICAgICAgICAgKCd2ZXJzaW9uICg/IHN0cmluZz8gdmVyKSkKKyAgICAgICAgICAg ICAgICAoJ3NvdXJjZQorICAgICAgICAgICAgICAgICAoJ29yaWdpbgorICAgICAgICAgICAgICAg ICAgICgnbWV0aG9kICd1cmwtZmV0Y2gpCisgICAgICAgICAgICAgICAgICAgKCd1cmkgKCdjcmF0 ZS11cmkgImxlYWYtYWxpY2UiICd2ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAoJ2ZpbGUt bmFtZQorICAgICAgICAgICAgICAgICAgICAoJ3N0cmluZy1hcHBlbmQgJ25hbWUgIi0iICd2ZXJz aW9uICIuY3JhdGUiKSkKKyAgICAgICAgICAgICAgICAgICAoJ3NoYTI1NgorICAgICAgICAgICAg ICAgICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAgKD8gc3RyaW5nPyBoYXNoKSkp KSkKKyAgICAgICAgICAgICAgICAoJ2J1aWxkLXN5c3RlbSAnY2FyZ28tYnVpbGQtc3lzdGVtKQor ICAgICAgICAgICAgICAgICgnYXJndW1lbnRzCisgICAgICAgICAgICAgICAgICgncXVhc2lxdW90 ZQorICAgICAgICAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0KSkpCisgICAgICAgICAgICAg ICAgKCdob21lLXBhZ2UgImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgICAgICAgICAgICAgKCdz eW5vcHNpcyAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFy eSIpCisgICAgICAgICAgICAgICAgKCdsaWNlbnNlICgnbGlzdCAnbGljZW5zZTpleHBhdCAnbGlj ZW5zZTphc2wyLjApKSkpCisgICAgICAgICAgICAoJ2RlZmluZS1wdWJsaWMgJ3J1c3QtbGVhZi1i b2ItMS4wLjAKKyAgICAgICAgICAgICAgKCdwYWNrYWdlCisgICAgICAgICAgICAgICAgKCduYW1l ICJydXN0LWxlYWYtYm9iIikKKyAgICAgICAgICAgICAgICAoJ3ZlcnNpb24gKD8gc3RyaW5nPyB2 ZXIpKQorICAgICAgICAgICAgICAgICgnc291cmNlCisgICAgICAgICAgICAgICAgICgnb3JpZ2lu CisgICAgICAgICAgICAgICAgICAgKCdtZXRob2QgJ3VybC1mZXRjaCkKKyAgICAgICAgICAgICAg ICAgICAoJ3VyaSAoJ2NyYXRlLXVyaSAibGVhZi1ib2IiICd2ZXJzaW9uKSkKKyAgICAgICAgICAg ICAgICAgICAoJ2ZpbGUtbmFtZQorICAgICAgICAgICAgICAgICAgICAoJ3N0cmluZy1hcHBlbmQg J25hbWUgIi0iICd2ZXJzaW9uICIuY3JhdGUiKSkKKyAgICAgICAgICAgICAgICAgICAoJ3NoYTI1 NgorICAgICAgICAgICAgICAgICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAgKD8g c3RyaW5nPyBoYXNoKSkpKSkKKyAgICAgICAgICAgICAgICAoJ2J1aWxkLXN5c3RlbSAnY2FyZ28t YnVpbGQtc3lzdGVtKQorICAgICAgICAgICAgICAgICgnYXJndW1lbnRzCisgICAgICAgICAgICAg ICAgICgncXVhc2lxdW90ZQorICAgICAgICAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0KSkp CisgICAgICAgICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAg ICAgICAgICAgICAgKCdzeW5vcHNpcyAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdkZXNj cmlwdGlvbiAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdsaWNlbnNlICgnbGlzdCAnbGlj ZW5zZTpleHBhdCAnbGljZW5zZTphc2wyLjApKSkpCisgICAgICAgICAgICAoJ2RlZmluZS1wdWJs aWMgJ3J1c3Qtcm9vdC0xLjAuMAorICAgICAgICAgICAgICAoJ3BhY2thZ2UKKyAgICAgICAgICAg ICAgICAoJ25hbWUgInJ1c3Qtcm9vdCIpCisgICAgICAgICAgICAgICAgKCd2ZXJzaW9uICg/IHN0 cmluZz8gdmVyKSkKKyAgICAgICAgICAgICAgICAoJ3NvdXJjZQorICAgICAgICAgICAgICAgICAo J29yaWdpbgorICAgICAgICAgICAgICAgICAgICgnbWV0aG9kICd1cmwtZmV0Y2gpCisgICAgICAg ICAgICAgICAgICAgKCd1cmkgKCdjcmF0ZS11cmkgInJvb3QiICd2ZXJzaW9uKSkKKyAgICAgICAg ICAgICAgICAgICAoJ2ZpbGUtbmFtZQorICAgICAgICAgICAgICAgICAgICAoJ3N0cmluZy1hcHBl bmQgJ25hbWUgIi0iICd2ZXJzaW9uICIuY3JhdGUiKSkKKyAgICAgICAgICAgICAgICAgICAoJ3No YTI1NgorICAgICAgICAgICAgICAgICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAg KD8gc3RyaW5nPyBoYXNoKSkpKSkKKyAgICAgICAgICAgICAgICAoJ2J1aWxkLXN5c3RlbSAnY2Fy Z28tYnVpbGQtc3lzdGVtKQorICAgICAgICAgICAgICAgICgnYXJndW1lbnRzCisgICAgICAgICAg ICAgICAgICgncXVhc2lxdW90ZQorICAgICAgICAgICAgICAgICAgKCcjOnNraXAtYnVpbGQ/ICN0 CisgICAgICAgICAgICAgICAgICAgJyM6Y2FyZ28taW5wdXRzICgoInJ1c3QtaW50ZXJtZWRpYXRl LTEtMS4wLjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd1bnF1b3Rl IHJ1c3QtaW50ZXJtZWRpYXRlLTEtMS4wLjApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKCJydXN0LWludGVybWVkaWF0ZS0yLTEuMC4wIgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICgndW5xdW90ZSBydXN0LWludGVybWVkaWF0ZS0yLTEuMC4wKSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicnVzdC1sZWFmLWFsaWNlLTEu MC4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgndW5xdW90ZSBydXN0 LWxlYWYtYWxpY2UtMS4wLjApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KCJydXN0LWxlYWYtYm9iLTEuMC4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICgndW5xdW90ZSBydXN0LWxlYWYtYm9iLTEuMC4wKSkpKSkpCisgICAgICAgICAgICAgICAg KCdob21lLXBhZ2UgImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgICAgICAgICAgICAgKCdzeW5v cHNpcyAic3VtbWFyeSIpCisgICAgICAgICAgICAgICAgKCdkZXNjcmlwdGlvbiAic3VtbWFyeSIp CisgICAgICAgICAgICAgICAgKCdsaWNlbnNlICgnbGlzdCAnbGljZW5zZTpleHBhdCAnbGljZW5z ZTphc2wyLjApKSkpKQogICAgICAgICAgICAjdCkKICAgICAgICAgICAoeAogICAgICAgICAgICAo cGsgJ2ZhaWwgeCAjZikpKSkpCi0tIAoyLjI0LjEKCg== --=_0f73ed518be0df091b86ace28f090251 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v5-0003-guix-tests-added-tests-for-recursive-import-semve.patch Content-Disposition: attachment; filename=v5-0003-guix-tests-added-tests-for-recursive-import-semve.patch; size=7378 RnJvbSA1NDk1ODM0Y2EzNzUxODY5MTJlZWVkNDBjN2M4Y2U5NjI1NGMzNmIzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogTW9uLCAxNiBEZWMgMjAxOSAxNzo0Njo0NyAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggdjUgMy80 XSBndWl4OiB0ZXN0czogYWRkZWQgdGVzdHMgZm9yIHJlY3Vyc2l2ZS1pbXBvcnQtc2VtdmVyCgoq IGd1aXgvdGVzdHMvaW1wb3J0LXV0aWxzLnNjbTogdGVzdHMgZm9yIHJlY3Vyc2l2ZS1pbXBvcnQt c2VtdmVyCi0tLQogdGVzdHMvaW1wb3J0LXV0aWxzLnNjbSB8IDE3NyArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDE3NSBpbnNlcnRpb25z KCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Rlc3RzL2ltcG9ydC11dGlscy5zY20g Yi90ZXN0cy9pbXBvcnQtdXRpbHMuc2NtCmluZGV4IDg3ZGRhMzIzOGYuLjJlZTgxMzg2ZWMgMTAw NjQ0Ci0tLSBhL3Rlc3RzL2ltcG9ydC11dGlscy5zY20KKysrIGIvdGVzdHMvaW1wb3J0LXV0aWxz LnNjbQpAQCAtMSw2ICsxLDcgQEAKIDs7OyBHTlUgR3VpeCAtLS0gRnVuY3Rpb25hbCBwYWNrYWdl IG1hbmFnZW1lbnQgZm9yIEdOVQogOzs7IENvcHlyaWdodCDCqSAyMDE1LCAyMDE3IFJpY2FyZG8g V3VybXVzIDxyZWthZG9AZWxlcGhseS5uZXQ+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMTYgQmVuIFdv b2Rjcm9mdCA8ZG9udHRydXN0YmVuQGdtYWlsLmNvbT4KKzs7OyBDb3B5cmlnaHQgwqkgMjAxNiBN YXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KIDs7OwogOzs7IFRoaXMgZmlsZSBpcyBw YXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0yNCw4ICsyNSwxMCBAQAogICAjOnVzZS1tb2R1bGUg KGd1aXggcGFja2FnZXMpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBidWlsZC1zeXN0ZW0pCiAgICM6 dXNlLW1vZHVsZSAoZ251IHBhY2thZ2VzKQotICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS02NCkK LSAgIzp1c2UtbW9kdWxlIChpY2UtOSBtYXRjaCkpCisgICM6dXNlLW1vZHVsZSAoaWNlLTkgbWF0 Y2gpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBz cmZpLTkpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTY0KSkKIAogKHRlc3QtYmVnaW4gImlt cG9ydC11dGlscyIpCiAKQEAgLTE0MSw0ICsxNDQsMTc0IEBACiAgICAgICAgICAgICAgICAgICgi bGljZW5zZSIgLiAjZikpKSkKICAgICAocGFja2FnZS1uYXRpdmUtaW5wdXRzIChhbGlzdC0+cGFj a2FnZSBtZXRhKSkpKQogCisoZGVmaW5lLXJlY29yZC10eXBlIDxtZXRhZGF0YT4KKyAgKG1ha2Ut bWV0YWRhdGEgbmFtZSB2ZXJzaW9ucykKKyAgbWV0YWRhdGE/CisgIChuYW1lIG1ldGFkYXRhLW5h bWUpCisgICh2ZXJzaW9ucyAgbWV0YWRhdGEtdmVyc2lvbnMpKQorCisoZGVmaW5lLXJlY29yZC10 eXBlIDxwYWNrYWdlPgorICAobWFrZS1wYWNrYWdlIHZlcnNpb24gZGVwZW5kZW5jaWVzKQorICBw YWNrYWdlPworICAodmVyc2lvbiBwYWNrYWdlLXZlcnNpb24pCisgIChkZXBlbmRlbmNpZXMgcGFj a2FnZS1kZXBlbmRlbmNpZXMpKQorCisoZGVmaW5lLXJlY29yZC10eXBlIDxkZXBlbmRlbmN5Pgor ICAobWFrZS1kZXBlbmRlbmN5IG5hbWUgcmFuZ2UpCisgIGRlcGVuZGVuY3k/CisgIChuYW1lIGRl cGVuZGVuY3ktbmFtZSkKKyAgKHJhbmdlIGRlcGVuZGVuY3ktcmFuZ2UpKQorCisoZGVmaW5lICht ZXRhZGF0YS1zZW12ZXItdmVyc2lvbnMgbWV0YWRhdGEpCisgIChtYXAgKGxhbWJkYSAocCkKKyAg ICAgICAgIChwYWNrYWdlLXZlcnNpb24gcCkpCisgICAgICAgKG1ldGFkYXRhLXZlcnNpb25zIG1l dGFkYXRhKSkpCisKKyhkZWZpbmUgKG1ldGFkYXRhLT5wYWNrYWdlIG1ldGFkYXRhIHZlcnNpb24p CisgIChmaW5kCisgICAobGFtYmRhIChwYWNrYWdlKQorICAgICAoZXF1YWw/IChwYWNrYWdlLXZl cnNpb24gcGFja2FnZSkgdmVyc2lvbikpCisgICAobWV0YWRhdGEtdmVyc2lvbnMgbWV0YWRhdGEp KSkKKworKGRlZmluZSAobWFrZS1zZXhwIG1ldGFkYXRhIHBhY2thZ2UgZGVwZW5kZW5jaWVzKQor ICBgKHBhY2thZ2UKKyAgICAobmFtZSAsKGd1aXgtbmFtZSAobWV0YWRhdGEtbmFtZSBtZXRhZGF0 YSkpKQorICAgICh2ZXJzaW9uICwocGFja2FnZS12ZXJzaW9uIHBhY2thZ2UpKQorICAgIChkZXBl bmRjaWVzICwobWFwCisgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhICgocHVibGljLW5h bWUgZGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKGd1aXgtbmFt ZSAoZGVwZW5kZW5jeS1uYW1lIGRlcCkpIHB1YmxpYy1uYW1lKSkpCisgICAgICAgICAgICAgICAg ICBkZXBlbmRlbmNpZXMpKSkpCisKKyhkZWZpbmUgKGd1aXgtbmFtZSBuYW1lKQorICAoc3RyaW5n LWFwcGVuZCAidGVzdC0iIG5hbWUpKQorCisoZGVmaW5lIHBhY2thZ2VzCisgIGAoKCJuby1kZXBz IiAuICgoIjEuMC4wIiAuICgpKSAoIjAuMS4wIiAuICgpKSkpCisgICAgKCJvbmUtZGVwIiAuICgo IjEuMC4wIiAuICgoIm5vLWRlcHMiICJeMS4wIikpKQorICAgICAgICAgICAgICAgICAgKCIwLjEu MCIgLiAoKCJuby1kZXBzIiAiXjAuMS4wIikpKSkpCisgICAgKCJzaGFyZWQtZGVwIiAuICgoIjEu MC4wIiAuICgoIm9uZS1kZXAiICJeMC4xLjAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKCJuby1kZXBzIiAiKiIpKSkpKQorICAgICgicmVjdXJzaXZlIiAuICgoIjEuMC4wIiAu ICgoInJlY3Vyc2l2ZSIgIj0xLjAuMCIpKSkpKQorICAgICgiYWxyZWFkeS1wYWNrYWdlZCIgLiAo KCIxLjAuMCIgLiAoKCJydXN0IiAifjEuMjgiKSkpKSkpKQorCisoZGVmaW5lIChuYW1lLT5tZXRh ZGF0YSBuYW1lKQorICAobGV0ICgodmVyc2lvbnMgKGFzc29jLXJlZiBwYWNrYWdlcyBuYW1lKSkp CisgICAgKG1ha2UtbWV0YWRhdGEgbmFtZQorICAgICAgICAgICAgICAgICAgIChtYXAKKyAgICAg ICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICAgICgodmVy c2lvbiAuIGRlcHMpCisgICAgICAgICAgICAgICAgICAgICAgIChtYWtlLXBhY2thZ2UgdmVyc2lv bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAobmFtZS1yYW5nZSkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwbHkgbWFrZS1kZXBlbmRlbmN5IG5h bWUtcmFuZ2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzKSkp KQorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucykpKSkKKworKGRlZmluZSogKHRlc3QtcmVj dXJzaXZlLWltcG9ydGVyIG5hbWUgdmVyc2lvbiAjOm9wdGlvbmFsIChndWl4LW5hbWUgZ3VpeC1u YW1lKSkKKyAgKHJlY3Vyc2l2ZS1pbXBvcnQtc2VtdmVyICM6bmFtZSBuYW1lCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAjOnJhbmdlIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICM6bmFtZS0+bWV0YWRhdGEgbmFtZS0+bWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICM6bWV0YWRhdGEtPnBhY2thZ2UgbWV0YWRhdGEtPnBhY2thZ2UKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICM6bWV0YWRhdGEtdmVyc2lvbnMgbWV0YWRhdGEtc2VtdmVyLXZlcnNp b25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjOnBhY2thZ2UtZGVwZW5kZW5jaWVzIHBh Y2thZ2UtZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjOmRlcGVuZGVu Y3ktbmFtZSBkZXBlbmRlbmN5LW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICM6ZGVw ZW5kZW5jeS1yYW5nZSBkZXBlbmRlbmN5LXJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAjOmd1aXgtbmFtZSBndWl4LW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICM6bWFr ZS1zZXhwIG1ha2Utc2V4cCkpCisKKyh0ZXN0LWVxdWFsICJyZWN1cnNpdmUgaW1wb3J0IHRlc3Qg d2l0aCBubyBkZXBlbmRlbmNpZXMiCisgIGAoKGRlZmluZS1wdWJsaWMgdGVzdC1uby1kZXBzLTEu MC4wCisgICAgICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1uby1kZXBzIikKKyAgICAg ICAgKHZlcnNpb24gIjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCkpKSkpCisgICh0ZXN0 LXJlY3Vyc2l2ZS1pbXBvcnRlciAibm8tZGVwcyIgIjEuMC4wIikpCisKKyh0ZXN0LWVxdWFsICJy ZWN1cnNpdmUgaW1wb3J0IHRlc3Qgd2l0aCBvbmUgZGVwZW5kZW5jaWVzIgorICBgKChkZWZpbmUt cHVibGljIHRlc3Qtbm8tZGVwcy0xLjAuMAorICAgICAgKHBhY2thZ2UKKyAgICAgICAgKG5hbWUg InRlc3Qtbm8tZGVwcyIpCisgICAgICAgICh2ZXJzaW9uICIxLjAuMCIpCisgICAgICAgIChkZXBl bmRjaWVzICgpKSkpCisgICAgKGRlZmluZS1wdWJsaWMgdGVzdC1vbmUtZGVwLTEuMC4wCisgICAg ICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1vbmUtZGVwIikKKyAgICAgICAgKHZlcnNp b24gIjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCgidGVzdC1uby1kZXBzIiAidGVzdC1u by1kZXBzLTEuMC4wIikpKSkpKQorICAodGVzdC1yZWN1cnNpdmUtaW1wb3J0ZXIgIm9uZS1kZXAi ICIxLjAuMCIpKQorCisodGVzdC1lcXVhbCAicmVjdXJzaXZlIGltcG9ydCB0ZXN0IHdpdGggcmVj dXJzdXZlIGRlcGVuZGVuY2llcyIKKyAgYCgoZGVmaW5lLXB1YmxpYyB0ZXN0LXJlY3Vyc2l2ZS0x LjAuMAorICAgICAgKHBhY2thZ2UKKyAgICAgICAgKG5hbWUgInRlc3QtcmVjdXJzaXZlIikKKyAg ICAgICAgKHZlcnNpb24gIjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCgidGVzdC1yZWN1 cnNpdmUiICJ0ZXN0LXJlY3Vyc2l2ZS0xLjAuMCIpKSkpKSkKKyAgKHRlc3QtcmVjdXJzaXZlLWlt cG9ydGVyICJyZWN1cnNpdmUiICIxLjAuMCIpKQorCisodGVzdC1lcXVhbCAicmVjdXJzaXZlIGlt cG9ydCB0ZXN0IHdpdGggbm8gZGVwZW5kZW5jaWVzIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIgorICBg KChkZWZpbmUtcHVibGljIHRlc3Qtbm8tZGVwcy0wLjEuMAorICAgICAgKHBhY2thZ2UKKyAgICAg ICAgKG5hbWUgInRlc3Qtbm8tZGVwcyIpCisgICAgICAgICh2ZXJzaW9uICIwLjEuMCIpCisgICAg ICAgIChkZXBlbmRjaWVzICgpKSkpKQorICAodGVzdC1yZWN1cnNpdmUtaW1wb3J0ZXIgIm5vLWRl cHMiICIwLjEuMCIpKQorCisodGVzdC1lcXVhbCAicmVjdXJzaXZlIGltcG9ydCB0ZXN0IHdpdGgg b25lIGRlcGVuZGVuY2llcyB1bnNpbmcgYW4gb2xkIHZlcnNpb24iCisgIGAoKGRlZmluZS1wdWJs aWMgdGVzdC1uby1kZXBzLTAuMS4wCisgICAgICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVz dC1uby1kZXBzIikKKyAgICAgICAgKHZlcnNpb24gIjAuMS4wIikKKyAgICAgICAgKGRlcGVuZGNp ZXMgKCkpKSkKKyAgICAoZGVmaW5lLXB1YmxpYyB0ZXN0LW9uZS1kZXAtMC4xLjAKKyAgICAgIChw YWNrYWdlCisgICAgICAgIChuYW1lICJ0ZXN0LW9uZS1kZXAiKQorICAgICAgICAodmVyc2lvbiAi MC4xLjAiKQorICAgICAgICAoZGVwZW5kY2llcyAoKCJ0ZXN0LW5vLWRlcHMiICJ0ZXN0LW5vLWRl cHMtMC4xLjAiKSkpKSkpCisgICh0ZXN0LXJlY3Vyc2l2ZS1pbXBvcnRlciAib25lLWRlcCIgIjAu MS4wIikpCisKKyh0ZXN0LWVxdWFsICJyZWN1cnNpdmUgaW1wb3J0IHRlc3Qgd2l0aCBhIHZlcnNp b24gcmFuZ2UiCisgIGAoKGRlZmluZS1wdWJsaWMgdGVzdC1uby1kZXBzLTEuMC4wCisgICAgICAo cGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1uby1kZXBzIikKKyAgICAgICAgKHZlcnNpb24g IjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCkpKSkKKyAgICAoZGVmaW5lLXB1YmxpYyB0 ZXN0LW9uZS1kZXAtMS4wLjAKKyAgICAgIChwYWNrYWdlCisgICAgICAgIChuYW1lICJ0ZXN0LW9u ZS1kZXAiKQorICAgICAgICAodmVyc2lvbiAiMS4wLjAiKQorICAgICAgICAoZGVwZW5kY2llcyAo KCJ0ZXN0LW5vLWRlcHMiICJ0ZXN0LW5vLWRlcHMtMS4wLjAiKSkpKSkpCisgICh0ZXN0LXJlY3Vy c2l2ZS1pbXBvcnRlciAib25lLWRlcCIgIioiKSkKKworKHRlc3QtZXF1YWwgInJlY3Vyc2l2ZSBp bXBvcnQgdGVzdCB3aXRoIHdpdGggZGVwZW5kZW5jeSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIHJl cG8iCisgIGAoKGRlZmluZS1wdWJsaWMgdGVzdC1hbHJlYWR5LXBhY2thZ2VkLTEuMC4wCisgICAg ICAocGFja2FnZSAobmFtZSAidGVzdC1hbHJlYWR5LXBhY2thZ2VkIikKKyAgICAgICAgICAgICAg ICh2ZXJzaW9uICIxLjAuMCIpCisgICAgICAgICAgICAgICAoZGVwZW5kY2llcworICAgICAgICAg ICAgICAgICgoInRlc3QtcnVzdCIgInJ1c3QtMS4yOC4wIikpKSkpKQorICAodGVzdC1yZWN1cnNp dmUtaW1wb3J0ZXIgImFscmVhZHktcGFja2FnZWQiICIxLjAuMCIgaWRlbnRpdHkpKQorCisodGVz dC1lcXVhbCAic2hhcmVkIGRlcGVuZGVuY2llcyIKKyAgYCgoZGVmaW5lLXB1YmxpYyB0ZXN0LW5v LWRlcHMtMS4wLjAKKyAgICAgIChwYWNrYWdlCisgICAgICAgIChuYW1lICJ0ZXN0LW5vLWRlcHMi KQorICAgICAgICAodmVyc2lvbiAiMS4wLjAiKQorICAgICAgICAoZGVwZW5kY2llcyAoKSkpKQor ICAgIChkZWZpbmUtcHVibGljIHRlc3Qtbm8tZGVwcy0wLjEuMAorICAgICAgKHBhY2thZ2UKKyAg ICAgICAgKG5hbWUgInRlc3Qtbm8tZGVwcyIpCisgICAgICAgICh2ZXJzaW9uICIwLjEuMCIpCisg ICAgICAgIChkZXBlbmRjaWVzICgpKSkpCisgICAgKGRlZmluZS1wdWJsaWMgdGVzdC1vbmUtZGVw LTAuMS4wCisgICAgICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1vbmUtZGVwIikKKyAg ICAgICAgKHZlcnNpb24gIjAuMS4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMgKCgidGVzdC1uby1k ZXBzIiAidGVzdC1uby1kZXBzLTAuMS4wIikpKSkpCisgICAgKGRlZmluZS1wdWJsaWMgdGVzdC1z aGFyZWQtZGVwLTEuMC4wCisgICAgICAocGFja2FnZQorICAgICAgICAobmFtZSAidGVzdC1zaGFy ZWQtZGVwIikKKyAgICAgICAgKHZlcnNpb24gIjEuMC4wIikKKyAgICAgICAgKGRlcGVuZGNpZXMg KCgidGVzdC1vbmUtZGVwIiAidGVzdC1vbmUtZGVwLTAuMS4wIikKKyAgICAgICAgICAgICAgICAg ICAgICgidGVzdC1uby1kZXBzIiAidGVzdC1uby1kZXBzLTEuMC4wIikpKSkpKQorICAodGVzdC1y ZWN1cnNpdmUtaW1wb3J0ZXIgInNoYXJlZC1kZXAiICIxLjAuMCIpKQorCiAodGVzdC1lbmQgImlt cG9ydC11dGlscyIpCi0tIAoyLjI0LjEKCg== --=_0f73ed518be0df091b86ace28f090251 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v5-0004-gnu-scripts-import-crate-Remove-define-public-gen.patch Content-Disposition: attachment; filename=v5-0004-gnu-scripts-import-crate-Remove-define-public-gen.patch; size=1273 RnJvbSBhYTZhYWVhY2I1ZjkxNTA4ZjQxNTg5OTliYTZlN2Y5NWU4MzA5YmVkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gQmVjemUgPG1qYmVjemVAcmlzZXVwLm5ldD4KRGF0 ZTogTW9uLCAxNiBEZWMgMjAxOSAxODoxMTozOCAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggdjUgNC80 XSBnbnU6IHNjcmlwdHM6IGltcG9ydDogY3JhdGU6IFJlbW92ZSBgZGVmaW5lLXB1YmxpY2AKIGdl bmVyYXRpb24gZnJvbSBVSQoKKiBndWl4L3NjcmlwdHMvaW1wb3J0L2NyYXRlLnNjbSAoZ3VpeC1p bXBvcnQtY3JhdGUpOiBSZW1vdmUgYGRlZmluZS1wdWJsaWNgIGdlbmVyYXRpb24gZnJvbSBVSQot LS0KIGd1aXgvc2NyaXB0cy9pbXBvcnQvY3JhdGUuc2NtIHwgNyArLS0tLS0tCiAxIGZpbGUgY2hh bmdlZCwgMSBpbnNlcnRpb24oKyksIDYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ3VpeC9z Y3JpcHRzL2ltcG9ydC9jcmF0ZS5zY20gYi9ndWl4L3NjcmlwdHMvaW1wb3J0L2NyYXRlLnNjbQpp bmRleCA5MjAzNGRhYjNjLi45YTA4YzliOGI0IDEwMDY0NAotLS0gYS9ndWl4L3NjcmlwdHMvaW1w b3J0L2NyYXRlLnNjbQorKysgYi9ndWl4L3NjcmlwdHMvaW1wb3J0L2NyYXRlLnNjbQpAQCAtOTUs MTIgKzk1LDcgQEAgSW1wb3J0IGFuZCBjb252ZXJ0IHRoZSBjcmF0ZS5pbyBwYWNrYWdlIGZvciBQ QUNLQUdFLU5BTUUuXG4iKSkKICAgICAgICAgIChwYWNrYWdlLW5hbWUtPm5hbWUrdmVyc2lvbiBz cGVjKSkKIAogICAgICAgIChpZiAoYXNzb2MtcmVmIG9wdHMgJ3JlY3Vyc2l2ZSkKLSAgICAgICAg ICAgKG1hcCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAoKGFuZCAoJ3BhY2thZ2Ug KCduYW1lIG5hbWUpIC4gcmVzdCkgcGtnKQotICAgICAgICAgICAgICAgICAgIGAoZGVmaW5lLXB1 YmxpYyAsKHN0cmluZy0+c3ltYm9sIG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgLHBrZykp Ci0gICAgICAgICAgICAgICAgICAoXyAjZikpCi0gICAgICAgICAgICAgICAgKGNyYXRlLXJlY3Vy c2l2ZS1pbXBvcnQgbmFtZSkpCisgICAgICAgICAgIChjcmF0ZS1yZWN1cnNpdmUtaW1wb3J0IG5h bWUgdmVyc2lvbikKICAgICAgICAgICAgKGxldCAoKHNleHAgKGNyYXRlLT5ndWl4LXBhY2thZ2Ug bmFtZSB2ZXJzaW9uKSkpCiAgICAgICAgICAgICAgKHVubGVzcyBzZXhwCiAgICAgICAgICAgICAg ICAobGVhdmUgKEdfICJmYWlsZWQgdG8gZG93bmxvYWQgbWV0YS1kYXRhIGZvciBwYWNrYWdlICd+ YSd+JSIpCi0tIAoyLjI0LjEKCg== --=_0f73ed518be0df091b86ace28f090251-- From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 20 13:46:31 2019 Received: (at 38408) by debbugs.gnu.org; 20 Dec 2019 18:46:31 +0000 Received: from localhost ([127.0.0.1]:47248 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iiNIE-0005Du-Vw for submit@debbugs.gnu.org; Fri, 20 Dec 2019 13:46:31 -0500 Received: from mx1.riseup.net ([198.252.153.129]:48592) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iiNIC-0005Dl-Cd for 38408@debbugs.gnu.org; Fri, 20 Dec 2019 13:46:28 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 47fd4d6xvWzFbkQ; Fri, 20 Dec 2019 10:46:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1576867587; bh=geYq4sw+matz8DYcXZkSakAP+o/TkHPJOqkJHBXgmt4=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=nCWeVJlph9fBbSZYZXgm1++XFR+uOAefYOwlM7gORlDdtmD1CN0P+2KPaZeG+gnNd xJ69HAK98RyMlHnTisDR/Y/OsD7pJo2bomeKzZ5BizzxooqQciTYDTHA/EjwZpn+af hsGyYzf6sQmDEqf1idiD5LtJ+zBlCrMxdV4n6i8o= X-Riseup-User-ID: 2FCAF0CA08659D43984133EF0FD8312AA31D1201404CC8160E634C247776B8AD Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 47fd4C5XLgz8wK8; Fri, 20 Dec 2019 10:46:03 -0800 (PST) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Fri, 20 Dec 2019 10:46:03 -0800 From: Martin Becze To: =?UTF-8?Q?Ludovic_Court=C3=A8s?= Subject: Re: [bug#38408] [PATCH v4 2/6] gnu: added new procedure, recusive-import-semver In-Reply-To: <87woaskm08.fsf@gnu.org> References: <5b82d5ab2c9d579d279db055b8f12509587234fa.1576005195.git.mjbecze@riseup.net> <87woaskm08.fsf@gnu.org> Message-ID: <74e229c9340764337bbea3752a4f8c50@riseup.net> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) > Since there’s currently a single user, the Crate importer, I would > rather have semver-handling directly in (guix import crate). Sure we > can try to write it in a way that clearly separates semver handling from > Crate-specific bits, but we shouldn’t try to make it too generic at this > point, IMO. > > WDYT? I don't have strong opinion but I'm happy to write it this way! From debbugs-submit-bounces@debbugs.gnu.org Fri Dec 27 13:38:38 2019 Received: (at 38408) by debbugs.gnu.org; 27 Dec 2019 18:38:39 +0000 Received: from localhost ([127.0.0.1]:57790 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ikuVS-0000rd-K5 for submit@debbugs.gnu.org; Fri, 27 Dec 2019 13:38:38 -0500 Received: from eggs.gnu.org ([209.51.188.92]:48940) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ikuVP-0000rP-IN for 38408@debbugs.gnu.org; Fri, 27 Dec 2019 13:38:36 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:48806) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ikuV3-00059X-HG; Fri, 27 Dec 2019 13:38:17 -0500 Received: from [2a01:e35:2ffd:930:f25f:2121:7012:6c8e] (port=59150 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1ikuV3-0000j1-5Z; Fri, 27 Dec 2019 13:38:13 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Martin Becze Subject: Re: [bug#38408] [PATCH v4 1/6] gnu: added new function, find-packages-by-name*/direct References: <877e2sm0vv.fsf@gnu.org> <6e56589639ea75bfec2c97f7e9e31ad9@riseup.net> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 7 =?utf-8?Q?Niv=C3=B4se?= an 228 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Fri, 27 Dec 2019 19:38:10 +0100 In-Reply-To: <6e56589639ea75bfec2c97f7e9e31ad9@riseup.net> (Martin Becze's message of "Fri, 20 Dec 2019 10:37:38 -0800") Message-ID: <87blrtfwbx.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi Martin, Sorry for the late reply. Martin Becze skribis: >> Providing an explicit cache bypassing method also sounds worrying to me: >> the cache is supposed to be transparent and semantics-preserving. >>=20 >> More generally, I think adding new features to an importer shouldn=E2=80= =99t >> require modifications in this area, as a matter of separating concerns. >>=20 >> WDYT? >>=20 >> Thanks, >> Ludo=E2=80=99. > > yes I agree, I removed that in the last version! Which also rebases off > the new topological sort procedure. I'll attach the latest patches here, > in case you missed it. Thanks! > From eeffdf569c4d7fbfd843e0b48404b6a2f3d46343 Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Mon, 16 Dec 2019 17:08:16 -0500 > Subject: [PATCH v5 1/4] guix: import: added recusive-import-semver > > * guix/import/utils.scm (recusive-import-semver): New Varible > * guix/import/utils.scm (package->definition)[arguments]: Add append-veri= ons option [...] > +(define* (recursive-import-semver #:key > + name > + (range "*") > + name->metadata > + metadata->package > + metadata-versions > + package-dependencies > + dependency-name > + dependency-range > + guix-name > + make-sexp) > + "Generates a list of package expressions for the dependencies of the g= iven=20 > +NAME and version RANGE. The dependencies will be resolved using semantic= versioning. > +This procedure makes the assumption that most package repositories will,= for a > +given package provide some on that package that includes what > +versions of the package that are available and a list of dependencies fo= r each > +version. Dependencies are assumed to be composed of a NAME, a semantic R= ANGE and > +other data. > + > +This procedure takes the following keys: > + NAME - The name of the package to import > + RANGE - The version range of the package to import > + NAME->METADATA - A procedure that takes a NAME of a package and return= s that > +package's > + METADATA->PACKAGE A procedure that takes a package's and VE= RSION=20 > +and returns the for the given VERSION > + METADATA-VERSIONS A procedure that that takes a packages and > +returns a list of version as strings that are available for the given pa= ckage > + PACKAGE-DEPENDENCIES a procedure that returns a list of g= iven a=20 > + > + DEPENDENCY-NAME A procedure that takes a and returns the = its name > + DEPENDENCY-RANGE A procedure that takes a and returns that > +decency's range as a string > + GUIX-NAME A procedure that take a NAME and returns the Guix version of= it > + MAKE-SEXP A procedure that takes , and a list of p= airs > +containing (EXPORT-NAME ), returning the package expression = as an=20 > +s-expression" As noted in my previous message, I think this interface is too complex, and since it=E2=80=99s used in a single importer, it would be best to have = it directly in (guix import crate). If/when there=E2=80=99s a need to share that logic among several importers,= then we can look for ways to factorize whatever needs to be factorized. In the meantime, there are probably semver-related things that could naturally to a helper (guix import semver) module, although perhaps most of that is already provided by guile-semver? > + (define-record-type Also, as a rule of thumb, we wouldn=E2=80=99t want to duplicate these data = types and related code. WDYT? Thanks, Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Sat Jan 18 11:41:44 2020 Received: (at 38408) by debbugs.gnu.org; 18 Jan 2020 16:41:44 +0000 Received: from localhost ([127.0.0.1]:42091 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1isrAG-0007k8-7j for submit@debbugs.gnu.org; Sat, 18 Jan 2020 11:41:44 -0500 Received: from mx1.riseup.net ([198.252.153.129]:41646) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1isrAC-0007jy-Qs for 38408@debbugs.gnu.org; Sat, 18 Jan 2020 11:41:34 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 480NwB3VzHzFdXZ; Sat, 18 Jan 2020 08:40:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1579365692; bh=oPeoiqCv2yz8F4ZYf6YZ77uXcZjWiVT4Df/4mqrXn8Y=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=boAny8WjpdKiNcHCz1dyMNhADJQFhLuvf4skz4RLxXjm72T0iJ6htXg2cRCjdYCHP eXLOJoQMlcFbxz26mS56lHm2YzGzAtWjEIbD91rcn1WbzTwcMlrv4A6WiRmtnMIbRw FrRqn6cL2PAt02CtWZUMJ41viijPK4C++TaG9RwE= X-Riseup-User-ID: 1817BFDC78AA3F58751D7D7F2DA478448EC2950E36502CDD260E18FF65958D60 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 480Nw84bNSzJqjy; Sat, 18 Jan 2020 08:40:40 -0800 (PST) Subject: Re: [bug#38408] [PATCH v6] Semantic version aware recusive importer for crates To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <877e2sm0vv.fsf@gnu.org> <6e56589639ea75bfec2c97f7e9e31ad9@riseup.net> <87blrtfwbx.fsf@gnu.org> From: Martin Becze Message-ID: <4c06cf99-30bc-2440-e833-52781376e302@riseup.net> Date: Sat, 18 Jan 2020 11:40:37 -0500 MIME-Version: 1.0 In-Reply-To: <87blrtfwbx.fsf@gnu.org> Content-Type: multipart/mixed; boundary="------------F23251DF520B064EFB5C0863" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------F23251DF520B064EFB5C0863 Content-Type: multipart/alternative; boundary="------------D19E3F775F4780461428CFBF" --------------D19E3F775F4780461428CFBF Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit okkkie! finally got this rewote! Patches attached. > As noted in my previous message, I think this interface is too > complex, and since it’s used in a single importer, it would be best > to have it directly in (guix import crate). This is now done! > In the meantime, there are probably semver-related things that could > naturally to a helper (guix import semver) module, although perhaps > most of that is already provided by guile-semver? guile-semver is pretty easy to work with so I didn't need to use many helpers. The one I did use I think I will try to submit to guile-semver itself. On 12/27/19 1:38 PM, Ludovic Courtès wrote: > Hi Martin, > > Sorry for the late reply. > > Martin Becze skribis: > >>> Providing an explicit cache bypassing method also sounds >>> worrying to me: the cache is supposed to be transparent and >>> semantics-preserving. >>> >>> More generally, I think adding new features to an importer >>> shouldn’t require modifications in this area, as a matter of >>> separating concerns. >>> >>> WDYT? >>> >>> Thanks, Ludo’. >> >> yes I agree, I removed that in the last version! Which also >> rebases off the new topological sort procedure. I'll attach the >> latest patches here, in case you missed it. > > Thanks! > >> From eeffdf569c4d7fbfd843e0b48404b6a2f3d46343 Mon Sep 17 00:00:00 >> 2001 From: Martin Becze Date: Mon, 16 Dec >> 2019 17:08:16 -0500 Subject: [PATCH v5 1/4] guix: import: added >> recusive-import-semver >> >> * guix/import/utils.scm (recusive-import-semver): New Varible * >> guix/import/utils.scm (package->definition)[arguments]: Add >> append-verions option > > [...] > >> +(define* (recursive-import-semver #:key + name + (range "*") + >> name->metadata + metadata->package + metadata-versions + >> package-dependencies + dependency-name + dependency-range + >> guix-name + make-sexp) + "Generates a list of package expressions >> for the dependencies of the given +NAME and version RANGE. The >> dependencies will be resolved using semantic versioning. +This >> procedure makes the assumption that most package repositories will, >> for a +given package provide some on that package that >> includes what +versions of the package that are available and a >> list of dependencies for each +version. Dependencies are assumed to >> be composed of a NAME, a semantic RANGE and +other data. + +This >> procedure takes the following keys: + NAME - The name of the >> package to import + RANGE - The version range of the package to >> import + NAME->METADATA - A procedure that takes a NAME of a >> package and returns that +package's + METADATA->PACKAGE >> A procedure that takes a package's and VERSION +and >> returns the for the given VERSION + METADATA-VERSIONS A >> procedure that that takes a packages and +returns a >> list of version as strings that are available for the given package >> + PACKAGE-DEPENDENCIES a procedure that returns a list of >> given a + + DEPENDENCY-NAME A procedure >> that takes a and returns the its name + >> DEPENDENCY-RANGE A procedure that takes a and returns >> that +decency's range as a string + GUIX-NAME A procedure that >> take a NAME and returns the Guix version of it + MAKE-SEXP A >> procedure that takes , and a list of pairs >> +containing (EXPORT-NAME ), returning the package >> expression as an +s-expression" > > As noted in my previous message, I think this interface is too > complex, and since it’s used in a single importer, it would be best > to have it directly in (guix import crate). > > If/when there’s a need to share that logic among several importers, > then we can look for ways to factorize whatever needs to be > factorized. > > In the meantime, there are probably semver-related things that could > naturally to a helper (guix import semver) module, although perhaps > most of that is already provided by guile-semver? > >> + (define-record-type > > Also, as a rule of thumb, we wouldn’t want to duplicate these data > types and related code. > > WDYT? > > Thanks, Ludo’. --------------D19E3F775F4780461428CFBF Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit okkkie! finally got this rewote! Patches attached.

> As noted in my previous message, I think this interface is too > complex, and since it’s used in a single importer, it would be best > to have it directly in (guix import crate).
This is now done!

> In the meantime, there are probably semver-related things that could > naturally to a helper (guix import semver) module, although perhaps > most of that is already provided by guile-semver?
guile-semver is pretty easy to work with so I didn't need to use many helpers. The one I did use I think I will try to submit to guile-semver itself.

On 12/27/19 1:38 PM, Ludovic Courtès wrote:
> Hi Martin, > > Sorry for the late reply. > > Martin Becze <mjbecze@riseup.net> skribis: > >>> Providing an explicit cache bypassing method also sounds >>> worrying to me: the cache is supposed to be transparent and >>> semantics-preserving. >>> >>> More generally, I think adding new features to an importer >>> shouldn’t require modifications in this area, as a matter of >>> separating concerns. >>> >>> WDYT? >>> >>> Thanks, Ludo’. >> >> yes I agree, I removed that in the last version! Which also >> rebases off the new topological sort procedure. I'll attach the >> latest patches here, in case you missed it. > > Thanks! > >> From eeffdf569c4d7fbfd843e0b48404b6a2f3d46343 Mon Sep 17 00:00:00 >> 2001 From: Martin Becze <mjbecze@riseup.net> Date: Mon, 16 Dec >> 2019 17:08:16 -0500 Subject: [PATCH v5 1/4] guix: import: added >> recusive-import-semver >> >> * guix/import/utils.scm (recusive-import-semver): New Varible * >> guix/import/utils.scm (package->definition)[arguments]: Add >> append-verions option > > [...] > >> +(define* (recursive-import-semver #:key + name + (range "*") + >> name->metadata + metadata->package + metadata-versions + >> package-dependencies + dependency-name + dependency-range + >> guix-name + make-sexp) + "Generates a list of package expressions >> for the dependencies of the given +NAME and version RANGE. The >> dependencies will be resolved using semantic versioning. +This >> procedure makes the assumption that most package repositories will, >> for a +given package provide some <metadata> on that package that >> includes what +versions of the package that are available and a >> list of dependencies for each +version. Dependencies are assumed to >> be composed of a NAME, a semantic RANGE and +other data. + +This >> procedure takes the following keys: + NAME - The name of the >> package to import + RANGE - The version range of the package to >> import + NAME->METADATA - A procedure that takes a NAME of a >> package and returns that +package's <metadata> + METADATA->PACKAGE >> A procedure that takes a package's <metadata> and VERSION +and >> returns the <package> for the given VERSION + METADATA-VERSIONS A >> procedure that that takes a packages <metadata> and +returns a >> list of version as strings that are available for the given package >> + PACKAGE-DEPENDENCIES a procedure that returns a list of >> <dependency> given a +<package> + DEPENDENCY-NAME A procedure >> that takes a <dependency> and returns the its name + >> DEPENDENCY-RANGE A procedure that takes a <dependency> and returns >> that +decency's range as a string + GUIX-NAME A procedure that >> take a NAME and returns the Guix version of it + MAKE-SEXP A >> procedure that takes <metadata>, <package> and a list of pairs >> +containing (EXPORT-NAME <dependency>), returning the package >> expression as an +s-expression" > > As noted in my previous message, I think this interface is too > complex, and since it’s used in a single importer, it would be best > to have it directly in (guix import crate). > > If/when there’s a need to share that logic among several importers, > then we can look for ways to factorize whatever needs to be > factorized. > > In the meantime, there are probably semver-related things that could > naturally to a helper (guix import semver) module, although perhaps > most of that is already provided by guile-semver? > >> + (define-record-type <node-dependency> > > Also, as a rule of thumb, we wouldn’t want to duplicate these data > types and related code. > > WDYT? > > Thanks, Ludo’.
--------------D19E3F775F4780461428CFBF-- --------------F23251DF520B064EFB5C0863 Content-Type: text/x-patch; charset=UTF-8; name="v6-0001-guix-import-recursive-import-Allow-for-version-nu.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v6-0001-guix-import-recursive-import-Allow-for-version-nu.pa"; filename*1="tch" >From 7747d27ed32069acb193b3811b30a5a3cc8cfd5b Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sat, 18 Jan 2020 05:05:03 -0500 Subject: [PATCH v6 1/2] guix: import: (recursive-import) Allow for version numbers * guix/import/utils.scm (package->definition) [arguments] added optional `append-version?` * guix/import/utils.scm (recursive-import) [arguments] added key `version` and moved `repo` to be a key * tests/import-utils.scm * guix/import/cran.scm (cran->guix-package) [argument]: change `repo` to a key * guix/import/cran.scm (cran-recursive-import) [argument]: change `repo` to a key * guix/scripts/import/cran.scm: change `repo` to a key * guix/import/elpa.scm (elpa->guix-pakcage) [argumnets]: change `repo` to a key * guix/import/elpa.scm (elpa-recursive-import) [argumnets]: change `repo` to a key * guix/scripts/import/elpa.scm: change `repo` to a key * guix/import/gem.scm (gem->guix-package) [arguments]: change `repo` to a key * guix/import/gem.scm (recursive-import) [arguments]: change `repo` to a key * guix/import/opam.scm (opam-recurive-import) [arguments]: change `repo` to a key * guix/import/pypi.scm (pypi-recursive-import) [arguments]: change `repo` to a key * guix/import/stackage.scm (stackage-recursive-import) [arguments]: change `repo` to a key --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 5 ++-- guix/import/pypi.scm | 5 ++-- guix/import/stackage.scm | 5 ++-- guix/import/utils.scm | 57 +++++++++++++++++++++++------------- guix/scripts/import/cran.scm | 5 ++-- guix/scripts/import/elpa.scm | 4 ++- tests/import-utils.scm | 8 +++-- 10 files changed, 69 insertions(+), 40 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bcb37ed250..9e05dfcba8 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -506,7 +507,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -521,8 +522,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..9140bcdc34 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) #:allow-other-keys) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index 0bf9ff2552..e744d9e69d 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 David Thompson ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -117,7 +118,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((package (rubygems-fetch package-name))) @@ -201,6 +202,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index 394415fdd4..87c823a98c 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -311,8 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (opam->guix-package name)) #:guix-name ocaml-name->guix-name)) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index 354cae9c4c..f0702d6403 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017 Mathieu Othacehe ;;; Copyright © 2018 Ricardo Wurmus ;;; Copyright © 2019 Maxim Cournoyer +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -415,8 +416,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." description license)))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (pypi->guix-package name)) #:guix-name python->package-name)) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..6091cf2c64 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index d17d400ddf..59430d3e66 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -258,13 +260,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -399,32 +403,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) (lambda (node) - (map lookup-node - (remove exists? + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) (node-dependencies node)))) - node-name))) + (lambda (node) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.25.0 --------------F23251DF520B064EFB5C0863 Content-Type: text/x-patch; charset=UTF-8; name="v6-0002-guix-import-crate-Use-semver-to-resovle-module-ve.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v6-0002-guix-import-crate-Use-semver-to-resovle-module-ve.pa"; filename*1="tch" >From a405e3ffdf2716b9920f6b74e4690c9b7731f67a Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sat, 18 Jan 2020 10:44:18 -0500 Subject: [PATCH v6 2/2] guix: import: crate: Use semver to resovle module versions * guix/import/crate.scm (make-crate-sexp): formatting, added '#:skip-build?' to build system args; added package definition geneation * guix/import/crate.scm (crate->guix-package): [arguments] moved `verions` to a key. Use semver to resolve the correct module versions * guix/import/crate.scm (crate-name->package0name): [arguments] add #:optional `version` arguement * guix/scripts/import/crate.scm remove package definition generation; changed `version` to a key * tests/crate.scm: added version data to (recursuve-import) test --- guix/import/crate.scm | 140 +++++++++------- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 290 +++++++++++++++++++--------------- tests/elpa.scm | 3 +- 4 files changed, 258 insertions(+), 186 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 57823c3639..6847a7046b 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -35,9 +36,12 @@ #:use-module (ice-9 match) #:use-module (ice-9 regex) #:use-module (json) + #:use-module (semver) + #:use-module (semver ranges) #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,7 +90,7 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string @@ -105,6 +109,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define mem-lookup-crate (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -150,34 +156,40 @@ VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTIO and LICENSE." (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-inputs)) + (cargo-development-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-development-inputs)) (pkg `(package - (name ,guix-name) - (version ,version) - (source (origin - (method url-fetch) - (uri (crate-uri ,name version)) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 - (base32 - ,(bytevector->nix-base32-string (port-sha256 port)))))) - (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) - (maybe-cargo-development-inputs + (name ,guix-name) + (version ,version) + (source (origin + (method url-fetch) + (uri (crate-uri ,name version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + ,(bytevector->nix-base32-string (port-sha256 port)))))) + (build-system cargo-build-system) + ,@(maybe-arguments (append `(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) + (maybe-cargo-development-inputs cargo-development-inputs))) - (home-page ,(match home-page - (() "") - (_ home-page))) - (synopsis ,synopsis) - (description ,(beautify-description description)) - (license ,(match license - (() #f) - ((license) license) - (_ `(list ,@license))))))) - (close-port port) - pkg)) + (home-page ,(match home-page + (() "") + (_ home-page))) + (synopsis ,synopsis) + (description ,(beautify-description description)) + (license ,(match license + (() #f) + ((license) license) + (_ `(list ,@license))))))) + (close-port port) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,37 +200,60 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (mem-lookup-crate crate-name)) (define version-number (or version (crate-latest-version crate))) - (define version* + (define (find-version crate range) + "finds the a vesion of a crate that fulfils the semver " (find (lambda (version) - (string=? (crate-version-number version) - version-number)) + (semver-range-contains-string? + range + (crate-version-number version))) (crate-versions crate))) + (define version* + (find-version crate version-number)) + + (define (sort-map-deps deps) + "sorts the dependencies and maps the dependencies to a list + containing pairs of (name version)" + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (mem-lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -252,8 +284,11 @@ latest version of CRATE-NAME." (match parts ((name _ ...) name)))) -(define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) +(define* (crate-name->package-name name #:optional version) + (let ((name (guix-name "rust-" name))) + (if version + (string-append name "-" version) + name))) ;;; @@ -288,4 +323,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index aa51faebf9..39561d5745 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", + \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -88,18 +90,22 @@ { \"crate_id\": \"intermediate-1\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -132,14 +138,17 @@ { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -172,6 +181,7 @@ { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -252,34 +262,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -334,105 +358,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") -- 2.25.0 --------------F23251DF520B064EFB5C0863-- From debbugs-submit-bounces@debbugs.gnu.org Sat Jan 25 05:17:39 2020 Received: (at 38408) by debbugs.gnu.org; 25 Jan 2020 10:17:39 +0000 Received: from localhost ([127.0.0.1]:54983 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ivIVM-0000ad-46 for submit@debbugs.gnu.org; Sat, 25 Jan 2020 05:17:39 -0500 Received: from mx1.riseup.net ([198.252.153.129]:51060) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ivIVH-0000aS-1B for 38408@debbugs.gnu.org; Sat, 25 Jan 2020 05:17:26 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 484X4f1QjbzDrCs; Sat, 25 Jan 2020 02:17:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1579947442; bh=IndfiUCDkKrPAhY2BxKXgOo0yRxVd+tepkvvsUa5C6k=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Q/I8Ht8ot4gqbDWuKZGK/JGWs7uNK8CWPHMR+WbexJLDxQcJx1BZw90z7IhplWq3K VQ/bBWwLOuOHk1BS+niPvglaG6Ipa4qFHya0FFyQpdepYqTl1xNl2J8ouYzzCBtQMj vOVd7ON98CSnUDMRgVL88m0O+uG3LxlbaVy3hLzs= X-Riseup-User-ID: 401551FD8A6A7A083627487E7E280E6D64EA022445CC448D167A61FDC5BEBC0F Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 484X4c4T1FzJv17; Sat, 25 Jan 2020 02:17:20 -0800 (PST) Subject: Re: Importers as independent packages? To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <87eewpcnw8.fsf@gnu.org> From: Martin Becze Message-ID: <5ff41b52-03b6-c223-862f-2b480c1eed48@riseup.net> Date: Sat, 25 Jan 2020 05:17:18 -0500 MIME-Version: 1.0 In-Reply-To: <87eewpcnw8.fsf@gnu.org> Content-Type: multipart/mixed; boundary="------------4E9DB855253CD5F0F9287BE6" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: guix-devel@gnu.org, 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------4E9DB855253CD5F0F9287BE6 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Thank you Ludo, I added guile-semver to guix in the attached patch set, and I tested it by running ./pre-inst-env guix environment guix, which installed the guile-semver. > and Makefile.am may have to check whether guile-semver is available.) I didn't see anything in the Makefile.am that looks to check for guile modules. Let me know if anything needs fixing! =Martin --------------4E9DB855253CD5F0F9287BE6 Content-Type: text/x-patch; charset=UTF-8; name="v7-0001-guix-import-recursive-import-Allow-for-version-nu.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v7-0001-guix-import-recursive-import-Allow-for-version-nu.pa"; filename*1="tch" >From e4b022ce72582691dadae1b9f31ad6243914a5db Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sat, 18 Jan 2020 05:05:03 -0500 Subject: [PATCH v7 1/3] guix: import: (recursive-import) Allow for version numbers * guix/import/utils.scm (package->definition) [arguments] added optional `append-version?` * guix/import/utils.scm (recursive-import) [arguments] added key `version` and moved `repo` to be a key * tests/import-utils.scm * guix/import/cran.scm (cran->guix-package) [argument]: change `repo` to a key * guix/import/cran.scm (cran-recursive-import) [argument]: change `repo` to a key * guix/scripts/import/cran.scm: change `repo` to a key * guix/import/elpa.scm (elpa->guix-pakcage) [argumnets]: change `repo` to a key * guix/import/elpa.scm (elpa-recursive-import) [argumnets]: change `repo` to a key * guix/scripts/import/elpa.scm: change `repo` to a key * guix/import/gem.scm (gem->guix-package) [arguments]: change `repo` to a key * guix/import/gem.scm (recursive-import) [arguments]: change `repo` to a key * guix/import/opam.scm (opam-recurive-import) [arguments]: change `repo` to a key * guix/import/pypi.scm (pypi-recursive-import) [arguments]: change `repo` to a key * guix/import/stackage.scm (stackage-recursive-import) [arguments]: change `repo` to a key --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 5 ++-- guix/import/pypi.scm | 5 ++-- guix/import/stackage.scm | 5 ++-- guix/import/utils.scm | 57 +++++++++++++++++++++++------------- guix/scripts/import/cran.scm | 5 ++-- guix/scripts/import/elpa.scm | 4 ++- tests/import-utils.scm | 8 +++-- 10 files changed, 69 insertions(+), 40 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bcb37ed250..9e05dfcba8 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -506,7 +507,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -521,8 +522,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..9140bcdc34 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) #:allow-other-keys) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index 0bf9ff2552..e744d9e69d 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 David Thompson ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -117,7 +118,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((package (rubygems-fetch package-name))) @@ -201,6 +202,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index 394415fdd4..87c823a98c 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -311,8 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (opam->guix-package name)) #:guix-name ocaml-name->guix-name)) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index 354cae9c4c..f0702d6403 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017 Mathieu Othacehe ;;; Copyright © 2018 Ricardo Wurmus ;;; Copyright © 2019 Maxim Cournoyer +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -415,8 +416,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." description license)))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (pypi->guix-package name)) #:guix-name python->package-name)) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..6091cf2c64 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index d17d400ddf..59430d3e66 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -258,13 +260,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -399,32 +403,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) (lambda (node) - (map lookup-node - (remove exists? + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) (node-dependencies node)))) - node-name))) + (lambda (node) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.25.0 --------------4E9DB855253CD5F0F9287BE6 Content-Type: text/x-patch; charset=UTF-8; name="v7-0002-guix-import-crate-Use-semver-to-resovle-module-ve.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v7-0002-guix-import-crate-Use-semver-to-resovle-module-ve.pa"; filename*1="tch" >From 3ecb0a58a6d2fbb30e36d9fa3648afe932f6e465 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sat, 18 Jan 2020 10:44:18 -0500 Subject: [PATCH v7 2/3] guix: import: crate: Use semver to resovle module versions * guix/import/crate.scm (make-crate-sexp): formatting, added '#:skip-build?' to build system args; added package definition geneation * guix/import/crate.scm (crate->guix-package): [arguments] moved `verions` to a key. Use semver to resolve the correct module versions * guix/import/crate.scm (crate-name->package0name): [arguments] add #:optional `version` arguement * guix/scripts/import/crate.scm remove package definition generation; changed `version` to a key * tests/crate.scm: added version data to (recursuve-import) test --- guix/import/crate.scm | 140 +++++++++------- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 290 +++++++++++++++++++--------------- tests/elpa.scm | 3 +- 4 files changed, 258 insertions(+), 186 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 57823c3639..6847a7046b 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -35,9 +36,12 @@ #:use-module (ice-9 match) #:use-module (ice-9 regex) #:use-module (json) + #:use-module (semver) + #:use-module (semver ranges) #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,7 +90,7 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string @@ -105,6 +109,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define mem-lookup-crate (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -150,34 +156,40 @@ VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTIO and LICENSE." (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-inputs)) + (cargo-development-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-development-inputs)) (pkg `(package - (name ,guix-name) - (version ,version) - (source (origin - (method url-fetch) - (uri (crate-uri ,name version)) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 - (base32 - ,(bytevector->nix-base32-string (port-sha256 port)))))) - (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) - (maybe-cargo-development-inputs + (name ,guix-name) + (version ,version) + (source (origin + (method url-fetch) + (uri (crate-uri ,name version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + ,(bytevector->nix-base32-string (port-sha256 port)))))) + (build-system cargo-build-system) + ,@(maybe-arguments (append `(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) + (maybe-cargo-development-inputs cargo-development-inputs))) - (home-page ,(match home-page - (() "") - (_ home-page))) - (synopsis ,synopsis) - (description ,(beautify-description description)) - (license ,(match license - (() #f) - ((license) license) - (_ `(list ,@license))))))) - (close-port port) - pkg)) + (home-page ,(match home-page + (() "") + (_ home-page))) + (synopsis ,synopsis) + (description ,(beautify-description description)) + (license ,(match license + (() #f) + ((license) license) + (_ `(list ,@license))))))) + (close-port port) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,37 +200,60 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (mem-lookup-crate crate-name)) (define version-number (or version (crate-latest-version crate))) - (define version* + (define (find-version crate range) + "finds the a vesion of a crate that fulfils the semver " (find (lambda (version) - (string=? (crate-version-number version) - version-number)) + (semver-range-contains-string? + range + (crate-version-number version))) (crate-versions crate))) + (define version* + (find-version crate version-number)) + + (define (sort-map-deps deps) + "sorts the dependencies and maps the dependencies to a list + containing pairs of (name version)" + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (mem-lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -252,8 +284,11 @@ latest version of CRATE-NAME." (match parts ((name _ ...) name)))) -(define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) +(define* (crate-name->package-name name #:optional version) + (let ((name (guix-name "rust-" name))) + (if version + (string-append name "-" version) + name))) ;;; @@ -288,4 +323,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index aa51faebf9..39561d5745 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", + \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -88,18 +90,22 @@ { \"crate_id\": \"intermediate-1\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -132,14 +138,17 @@ { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -172,6 +181,7 @@ { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -252,34 +262,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -334,105 +358,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") -- 2.25.0 --------------4E9DB855253CD5F0F9287BE6 Content-Type: text/x-patch; charset=UTF-8; name="v7-0003-Added-Guile-Semver-as-a-dependency-to-guix.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="v7-0003-Added-Guile-Semver-as-a-dependency-to-guix.patch" >From c68ac6dc2ae5c3e2ffbbccfd05ad14e9eb3fda60 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sat, 25 Jan 2020 04:57:13 -0500 Subject: [PATCH v7 3/3] Added Guile-Semver as a dependency to guix * configure.ac: added check for guile-semver * gnu/packages/package-management.scm (guix): added guile-semver as dep --- configure.ac | 7 +++++++ doc/guix.texi | 2 ++ gnu/packages/package-management.scm | 7 +++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 06e86c209f..461ccaa8e7 100644 --- a/configure.ac +++ b/configure.ac @@ -118,12 +118,19 @@ if test "x$have_guile_git" != "xyes"; then AC_MSG_ERROR([Guile-Git is missing; please install it.]) fi +dnl Check for Guile-Semver +GUILE_MODULE_AVAILABLE([have_guile_semver], [(semver)]) +if test "x$have_guile_semver" != "xyes"; then + AC_MSG_ERROR([Guile-Semver is missing; please install it.]) +fi + dnl Check for Guile-JSON. GUIX_CHECK_GUILE_JSON if test "x$guix_cv_have_recent_guile_json" != "xyes"; then AC_MSG_ERROR([Guile-JSON is missing; please install it.]) fi + dnl Guile-Sqlite3 is used by the (guix store ...) modules. GUIX_CHECK_GUILE_SQLITE3 if test "x$guix_cv_have_recent_guile_sqlite3" != "xyes"; then diff --git a/doc/guix.texi b/doc/guix.texi index d674b9484f..eb6d980bca 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -72,6 +72,7 @@ Copyright @copyright{} 2019 Guillaume Le Vaillant@* Copyright @copyright{} 2020 Leo Prikler@* Copyright @copyright{} 2019, 2020 Simon Tournier@* Copyright @copyright{} 2020 Wiktor Żelazny@* +Copyright @copyright{} 2020 Martin Becze@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -761,6 +762,7 @@ or later; @uref{https://gitlab.com/guile-git/guile-git, Guile-Git}, from August 2017 or later; @item @uref{https://savannah.nongnu.org/projects/guile-json/, Guile-JSON} 3.x; +@item @uref{https://ngyro.com/software/guile-semver.html, Guile-Semver} 0.1.x; @item @url{https://zlib.net, zlib}; @item @url{https://www.gnu.org/software/make/, GNU Make}. @end itemize diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm index 422d4f1959..c456071a87 100644 --- a/gnu/packages/package-management.scm +++ b/gnu/packages/package-management.scm @@ -11,6 +11,7 @@ ;;; Copyright © 2018, 2019 Eric Bavier ;;; Copyright © 2019, 2020 Efraim Flashner ;;; Copyright © 2019 Jonathan Brielmaier +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -248,8 +249,9 @@ (ssh (assoc-ref inputs "guile-ssh")) (gnutls (assoc-ref inputs "gnutls")) (locales (assoc-ref inputs "glibc-utf8-locales")) + (semver (assoc-ref inputs "guile-semver")) (deps (list gcrypt json sqlite gnutls - git bs ssh)) + git bs ssh semver)) (effective (read-line (open-pipe* OPEN_READ @@ -322,7 +324,8 @@ ("guile-json" ,guile-json-3) ("guile-sqlite3" ,guile-sqlite3) ("guile-ssh" ,guile-ssh) - ("guile-git" ,guile-git))) + ("guile-git" ,guile-git) + ("guile-semver",guile-semver))) (home-page "https://www.gnu.org/software/guix/") (synopsis "Functional package manager for installed software packages and versions") -- 2.25.0 --------------4E9DB855253CD5F0F9287BE6-- From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:18:52 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:18:52 +0000 Received: from localhost ([127.0.0.1]:42701 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAE-0003jn-8D for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:52 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39250) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAC-0003jg-RI for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:45 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJ42SYBzF0M3; Tue, 4 Feb 2020 04:18:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818724; bh=GgKX2jNX8zNBXxEIO5RkSzmERgq5Y9KpBFG4VGW+sjY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rd8AznCA3tIxml/Xx4Au9QMv6IIFkt6CwVcgJTni0YGTYUscvgmyKg0j4/0C1beB4 lqDwurIyJs5ONfBcIcrrHsOMPkCO1i5qrYg3k1Vrb9SGwytGqB1cSYiFBYKZSZztZP LHSqi9xhu2R8uOGKJVYuTcbv6omf7J1++gK6VbRQ= X-Riseup-User-ID: 6AF19559B7B9D68B183E06B7289B845FC1A5AEF4DF82E69B9D856279232A9107 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJ25FS8z8sgN; Tue, 4 Feb 2020 04:18:42 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 1/8] guix: import: (recursive-import) Allow for version numbers Date: Tue, 4 Feb 2020 07:18:18 -0500 Message-Id: <4b0a9afd6559ee87734ef06d1d8adc0e60e63ee2.1580817140.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This adds a key VERSION to (recursive-import) and move the paramter REPO to a key. This also changes all the things that rely on (recursive-import) * guix/import/utils.scm (package->definition): added optional `append-version?` * guix/import/utils.scm (recursive-import): added key `version` and moved `repo` to be a key * guix/import/cran.scm (cran->guix-package): change `repo` to a key * guix/import/cran.scm (cran-recursive-import): change `repo` to a key * guix/scripts/import/cran.scm: change `repo` to a key * guix/import/elpa.scm (elpa->guix-pakcage): change `repo` to a key * guix/import/elpa.scm (elpa-recursive-import): change `repo` to a key * guix/scripts/import/elpa.scm: change `repo` to a key * guix/import/gem.scm (gem->guix-package): change `repo` to a key * guix/import/gem.scm (recursive-import): change `repo` to a key * guix/import/opam.scm (opam-recurive-import): change `repo` to a key * guix/import/pypi.scm (pypi-recursive-import): change `repo` to a key * guix/import/stackage.scm (stackage-recursive-import): change `repo` to a key --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 5 ++-- guix/import/pypi.scm | 5 ++-- guix/import/stackage.scm | 5 ++-- guix/import/utils.scm | 57 +++++++++++++++++++++++------------- guix/scripts/import/cran.scm | 5 ++-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 71 insertions(+), 41 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bcb37ed250..9e05dfcba8 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -506,7 +507,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -521,8 +522,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..9140bcdc34 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) #:allow-other-keys) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index 0bf9ff2552..e744d9e69d 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 David Thompson ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -117,7 +118,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((package (rubygems-fetch package-name))) @@ -201,6 +202,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index 394415fdd4..87c823a98c 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -311,8 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (opam->guix-package name)) #:guix-name ocaml-name->guix-name)) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index 354cae9c4c..f0702d6403 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017 Mathieu Othacehe ;;; Copyright © 2018 Ricardo Wurmus ;;; Copyright © 2019 Maxim Cournoyer +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -415,8 +416,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." description license)))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (pypi->guix-package name)) #:guix-name python->package-name)) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..6091cf2c64 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index d17d400ddf..59430d3e66 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -258,13 +260,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -399,32 +403,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) (lambda (node) - (map lookup-node - (remove exists? + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) (node-dependencies node)))) - node-name))) + (lambda (node) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:18:52 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:18:52 +0000 Received: from localhost ([127.0.0.1]:42707 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAK-0003kN-67 for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:52 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39226) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAB-0003jd-8i for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:47 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJ230q1zDsQm; Tue, 4 Feb 2020 04:18:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818722; bh=FRyCv1ffcgIXGEywXlVm6PGglhzSRKcQmhgJ1cPkmmk=; h=From:To:Cc:Subject:Date:From; b=T7+IlpdNhL0gnGK02ME6eHnDTYI34dhFEQ1/pv5HFvuShRrSoYyxzAG8fJs5AEDoj 5N89hqBI5R56SSmI/X5mB5m7EbWdGtJv3eNJVkVFWxDP8oSBN8x4D+yMWWZMxJM5/F C+efAvaWDxqWBKP6VVVxAxGQyPqlMVrx5EiqIikA= X-Riseup-User-ID: 97CEBD959F42DD303EE3BFDF9A12133A15522E6DA2428C658871E30D2BF9FCED Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJ06lS2z8sgN; Tue, 4 Feb 2020 04:18:40 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 0/8] recursive semver crate importer! Date: Tue, 4 Feb 2020 07:18:17 -0500 Message-Id: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Here is the another version of the recursive semver crate importer! And hopefully the best one so far. The first 3 commits actully implement the and add semver support. The rest are mainly ergonomics such as * triming version numbers from package name * better deduplication of dependencies * top level importing of development dependenies I think it has incorpated the feedback i got from everyone so far, but if i forgot something or if there is more to add let me know! Cheers ~Martin Martin Becze (8): guix: import: (recursive-import) Allow for version numbers guix: import: crate: Use semver to resovle module versions Added Guile-Semver as a dependency to guix guix: import: utils: allow generation of inputs to be version aware guix: import: crate: deduplicate dependencies guix: import: crate: memorize crate->guix-package guix: import: utils: trim patch version from names guix: import: parametrized importing of dev dependencies configure.ac | 7 + doc/guix.texi | 2 + gnu/packages/package-management.scm | 7 +- guix/import/cran.scm | 8 +- guix/import/crate.scm | 111 +++++++---- guix/import/elpa.scm | 6 +- guix/import/gem.scm | 6 +- guix/import/opam.scm | 5 +- guix/import/pypi.scm | 5 +- guix/import/stackage.scm | 5 +- guix/import/utils.scm | 79 +++++--- guix/scripts/import/cran.scm | 5 +- guix/scripts/import/crate.scm | 13 +- guix/scripts/import/elpa.scm | 4 +- tests/crate.scm | 289 ++++++++++++++++------------ tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +- 17 files changed, 346 insertions(+), 217 deletions(-) -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:18:53 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:18:53 +0000 Received: from localhost ([127.0.0.1]:42709 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAK-0003kU-ES for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:53 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39298) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAE-0003jp-Nh for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:48 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJ61cQvzDsNx; Tue, 4 Feb 2020 04:18:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818726; bh=88VDqE2fEg0iiEp8yzMznc9GkysvjOejN+RTqkIc1uA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oQIM2I/DhOSRCwOQGCNx0cE65p5Yg8V7R5U4KY2NjBJMrBh+L91Q5MZJ1wb0+zrIY k4OfMlAiHQBKcx4pg12Umrdgcq8rKBGeRYy0uCwQGilJBEJXbnVhmJ/BNTwQle8jqk jqZX4Sihjuzau7Iu26ML3nsLul3Sa7tgNNAm0/24= X-Riseup-User-ID: 1B86F1AC161AA55849FD9287EAB4F1926EDBEE00C6175EBDB10AA162410BF959 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJ44Z6cz8sgN; Tue, 4 Feb 2020 04:18:44 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 2/8] guix: import: crate: Use semver to resovle module versions Date: Tue, 4 Feb 2020 07:18:19 -0500 Message-Id: <7dbe9a73fe56e1116d3207ef3cb9547a32b9a773.1580817140.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (make-crate-sexp): formatting, added '#:skip-build?' to build system args; added package definition geneation * guix/import/crate.scm (crate->guix-package): Use semver to resolve the correct module versions * tests/crate.scm: added version data to (recursuve-import) test --- guix/import/crate.scm | 87 ++++++---- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 290 +++++++++++++++++++--------------- 3 files changed, 225 insertions(+), 163 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 57823c3639..84b152620c 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -35,9 +35,12 @@ #:use-module (ice-9 match) #:use-module (ice-9 regex) #:use-module (json) + #:use-module (semver) + #:use-module (semver ranges) #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,7 +89,7 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string @@ -150,9 +153,14 @@ VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTIO and LICENSE." (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-inputs)) + (cargo-development-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -164,9 +172,10 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs - cargo-development-inputs))) + cargo-development-inputs))) (home-page ,(match home-page (() "") (_ home-page))) @@ -177,7 +186,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,14 +197,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -204,21 +218,36 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate))) - (define version* + (define (find-version crate range) + "finds the a vesion of a crate that fulfils the semver " (find (lambda (version) - (string=? (crate-version-number version) - version-number)) + (semver-range-contains-string? + range + (crate-version-number version))) (crate-versions crate))) + (define version* + (find-version crate version-number)) + + (define (sort-map-deps deps) + "sorts the dependencies and maps the dependencies to a list + containing pairs of (name version)" + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -253,7 +279,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; @@ -288,4 +314,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index aa51faebf9..39561d5745 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", + \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -88,18 +90,22 @@ { \"crate_id\": \"intermediate-1\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -132,14 +138,17 @@ { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -172,6 +181,7 @@ { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -252,34 +262,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -334,105 +358,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:18:53 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:18:53 +0000 Received: from localhost ([127.0.0.1]:42711 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAL-0003kd-Af for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:53 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39298) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAH-0003jp-PE for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:50 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJ940RtzF0vD; Tue, 4 Feb 2020 04:18:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818729; bh=r//um4OgxLPxTsLJ5ysWuOL54KcpyYnCWnuAGObBx4Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JeyQErUvJXyW+MatQXO9+1tOv0JVvAz4I58V+1BGGHLcJFuY4ksxMSufmI6WPVlA+ Gz3jhfdzgpmTfFbXWx0LjwqFFh9UEtpv/sPNNHIjgMUAjOKmEQehCdQz7NTX5XDEXI 3cCIzdtISNyPpLLUWlJ12tgtryZ4nxxTXscYK5yI= X-Riseup-User-ID: 66FC47C66EB7ED29CBF8253D87D3F89188AAB40A22E6B76D917FC58079E7BCFF Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJ81J2sz8sgN; Tue, 4 Feb 2020 04:18:48 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 4/8] guix: import: utils: allow generation of inputs to be version aware Date: Tue, 4 Feb 2020 07:18:21 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/utils.scm (package-names->package-inputs): Added the ability to handle (name version) pairs * guix/import/crate.scm (make-crate-sexp): cleaned up input field generation --- guix/import/crate.scm | 17 +++++++++-------- guix/import/utils.scm | 21 ++++++++++++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 84b152620c..9128314370 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -151,16 +151,17 @@ record or #f if it was not found." "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs - (map - (lambda (name-version) - (apply crate-name->package-name name-version)) cargo-inputs)) - (cargo-development-inputs - (map - (lambda (name-version) - (apply crate-name->package-name name-version)) cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 59430d3e66..518877d476 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -233,13 +233,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:18:53 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:18:53 +0000 Received: from localhost ([127.0.0.1]:42714 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAL-0003kk-Jf for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:53 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39298) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAJ-0003jp-LV for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:51 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJC229TzFbdD; Tue, 4 Feb 2020 04:18:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818731; bh=VIRV41fqSf1EXmt2qT87mip+k6Nbo6jZtZsGxJozLD8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GehNA2oApAsIRqNGoUj+ca0k+C8KbgPUS1J8Q9pBnZsJxhEMnoUbREzE+Tpidyluk oAonTQwsdanLKmsh6F247SfDViZwr8XIzC4L2tcFtsqMGwDpgcQrOYVJaM6A0/8hzy 4tcl+KqgBWexTGN+5i/PvPQRTC/Fz7SquiEjsJp4= X-Riseup-User-ID: 0F50F3883329AB1E86BA7A05B08D1F70D5BAACFEE07A9CCA596C245C6274D41B Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJ968yMz8sgN; Tue, 4 Feb 2020 04:18:49 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 5/8] guix: import: crate: deduplicate dependencies Date: Tue, 4 Feb 2020 07:18:22 -0500 Message-Id: <24fe155b78d5df8046e5fa1953fb5e07b7532f75.1580817140.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/crate.scm (crate-version-dependencies): deduplicate dependencies --- guix/import/crate.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 9128314370..a82e5e877a 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -115,7 +115,7 @@ record or #f if it was not found." (url (string-append (%crate-base-url) path))) (match (assoc-ref (or (json-fetch url) '()) "dependencies") ((? vector? vector) - (map json->crate-dependency (vector->list vector))) + (delete-duplicates (map json->crate-dependency (vector->list vector)))) (_ '())))) -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:19:01 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:19:02 +0000 Received: from localhost ([127.0.0.1]:42716 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAL-0003ks-Ry for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:19:01 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39322) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAG-0003k2-Br for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:51 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJ76PPgzDsLW; Tue, 4 Feb 2020 04:18:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818728; bh=nJsTl1mO5lqbsGFhZMIaoAfJoswQycUz6Y1w1cLiO+w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f1OahuGAN+geqt0TTYmrkJRlCPxIQk2BKE2TMc+FBO6Kb0BS+3zbq6npQ5sFPMXy0 Sh14Tv4wUMhXWAZ6pRJOBCFC3vjCxATBr1Kp1+GYcmVKMuOADqCc1JmQgNj6eXFv5+ SX0dTw5YqI+NXK2ZUlUaB8YpjzD++6H6Z3H/eBeM= X-Riseup-User-ID: 1B4EF1CFD119E38004E844CB3FD1BA921CE2C1F5438DBBD2EC9EC3613F60E8AA Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJ63dghz8sgN; Tue, 4 Feb 2020 04:18:46 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 3/8] Added Guile-Semver as a dependency to guix Date: Tue, 4 Feb 2020 07:18:20 -0500 Message-Id: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * configure.ac: added check for guile-semver * gnu/packages/package-management.scm (guix): added guile-semver as dep --- configure.ac | 7 +++++++ doc/guix.texi | 2 ++ gnu/packages/package-management.scm | 7 +++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 06e86c209f..461ccaa8e7 100644 --- a/configure.ac +++ b/configure.ac @@ -118,12 +118,19 @@ if test "x$have_guile_git" != "xyes"; then AC_MSG_ERROR([Guile-Git is missing; please install it.]) fi +dnl Check for Guile-Semver +GUILE_MODULE_AVAILABLE([have_guile_semver], [(semver)]) +if test "x$have_guile_semver" != "xyes"; then + AC_MSG_ERROR([Guile-Semver is missing; please install it.]) +fi + dnl Check for Guile-JSON. GUIX_CHECK_GUILE_JSON if test "x$guix_cv_have_recent_guile_json" != "xyes"; then AC_MSG_ERROR([Guile-JSON is missing; please install it.]) fi + dnl Guile-Sqlite3 is used by the (guix store ...) modules. GUIX_CHECK_GUILE_SQLITE3 if test "x$guix_cv_have_recent_guile_sqlite3" != "xyes"; then diff --git a/doc/guix.texi b/doc/guix.texi index 956c25ba9e..8d3d5935cd 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -72,6 +72,7 @@ Copyright @copyright{} 2019 Guillaume Le Vaillant@* Copyright @copyright{} 2020 Leo Prikler@* Copyright @copyright{} 2019, 2020 Simon Tournier@* Copyright @copyright{} 2020 Wiktor Żelazny@* +Copyright @copyright{} 2020 Martin Becze@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -762,6 +763,7 @@ or later; @uref{https://gitlab.com/guile-git/guile-git, Guile-Git}, from August 2017 or later; @item @uref{https://savannah.nongnu.org/projects/guile-json/, Guile-JSON} 3.x; +@item @uref{https://ngyro.com/software/guile-semver.html, Guile-Semver} 0.1.x; @item @url{https://zlib.net, zlib}; @item @url{https://www.gnu.org/software/make/, GNU Make}. @end itemize diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm index 422d4f1959..c456071a87 100644 --- a/gnu/packages/package-management.scm +++ b/gnu/packages/package-management.scm @@ -11,6 +11,7 @@ ;;; Copyright © 2018, 2019 Eric Bavier ;;; Copyright © 2019, 2020 Efraim Flashner ;;; Copyright © 2019 Jonathan Brielmaier +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -248,8 +249,9 @@ (ssh (assoc-ref inputs "guile-ssh")) (gnutls (assoc-ref inputs "gnutls")) (locales (assoc-ref inputs "glibc-utf8-locales")) + (semver (assoc-ref inputs "guile-semver")) (deps (list gcrypt json sqlite gnutls - git bs ssh)) + git bs ssh semver)) (effective (read-line (open-pipe* OPEN_READ @@ -322,7 +324,8 @@ ("guile-json" ,guile-json-3) ("guile-sqlite3" ,guile-sqlite3) ("guile-ssh" ,guile-ssh) - ("guile-git" ,guile-git))) + ("guile-git" ,guile-git) + ("guile-semver",guile-semver))) (home-page "https://www.gnu.org/software/guix/") (synopsis "Functional package manager for installed software packages and versions") -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:19:02 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:19:02 +0000 Received: from localhost ([127.0.0.1]:42720 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAT-0003lO-Tj for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:19:02 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39426) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAL-0003kb-DR for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:53 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJD6yGZzFbg7; Tue, 4 Feb 2020 04:18:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818733; bh=miKnR8xP+CKQIMqNnpTrT0TEhQKQxK1AnqMhXOEIXaE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gn7JTJdHK2pDAdViUH8xlaYDRNGC5c8pwHtecuRLaIAqmbPOm08qKkIcRezCvr1mm Dk2JMWdUVDNLa6OU+A+emPfFnni1LK1+cgyzalhTJg4iJCSjkhuHthBQcz98MzZOsk fOXncSVSya+bSC6XFBoO3Z5B1rksrR9kfBhtLnD4= X-Riseup-User-ID: A5F2D504176C701E351F203688C385F4FA9DDA0B00789213848B3E45A51317CD Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJC4BSsz8sgN; Tue, 4 Feb 2020 04:18:51 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 6/8] guix: import: crate: memorize crate->guix-package Date: Tue, 4 Feb 2020 07:18:23 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This adds memorization to procedures that involve network lookups. (mem-lookup-crate) is used on every dependency of a package to find it's versions. (mem-crate->guix-package) is needed becuase (topological-sort) depduplicates after dependencies have been turned into dependencies. * guix/import/crate.scm (mem-crate->guix-package, mem-lookup-crate) --- guix/import/crate.scm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index a82e5e877a..630f4d3749 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -108,6 +109,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define mem-lookup-crate (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -213,7 +216,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (mem-lookup-crate crate-name)) (define version-number (or version @@ -235,7 +238,7 @@ latest version of CRATE-NAME." containing pairs of (name version)" (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (mem-lookup-crate name)) (req (crate-dependency-requirement dep)) (ver (find-version crate req))) (list name @@ -262,9 +265,11 @@ latest version of CRATE-NAME." string->license)) cargo-inputs)))) +(define mem-crate->guix-package (memoize crate->guix-package)) + (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package mem-crate->guix-package #:version version #:guix-name crate-name->package-name)) -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:19:02 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:19:02 +0000 Received: from localhost ([127.0.0.1]:42722 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAU-0003lb-7I for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:19:02 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39468) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAN-0003l4-3n for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:55 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJG4jhpzFbgl; Tue, 4 Feb 2020 04:18:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818734; bh=QVOljT6vMloDFD1CkTFmYpk7KAxvaDY3lvTpHDCkvW0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c1lvSCq4JfwCblB9swHmQQyGrJJmBv+ycm9iy6k39sK/5lrsLgQX+bq+6XsqaXaJ/ Z3ycMDWMqK0L1SlXXufkyx/T8IcVh+OT3xrILkLDggITELNAvoYc4huxkLlBfChOvn 5RSQW8iuCE1psN2fwamZt3hEvO15cx02FOVtocpM= X-Riseup-User-ID: 12B9C494FAEAB028921E3DB4E80BC75C60B8FD4A0815AF0BC5CAB6C6E8AD906A Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJF1z9tz8sgN; Tue, 4 Feb 2020 04:18:53 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 7/8] guix: import: utils: trim patch version from names Date: Tue, 4 Feb 2020 07:18:24 -0500 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) * guix/import/utils.scm (package->definition): trim patch version from names * tests/crate.scm: updated the tests --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 44 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 518877d476..b902f008fd 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -273,9 +273,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index 39561d5745..893dd70fc9 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -279,7 +279,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -295,7 +295,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -358,7 +358,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -377,7 +377,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -396,7 +396,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -413,13 +413,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" + (("rust-leaf-bob" ('unquote rust-leaf-bob-1.0.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -436,17 +436,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -463,14 +463,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 04 07:19:03 2020 Received: (at 38408) by debbugs.gnu.org; 4 Feb 2020 12:19:03 +0000 Received: from localhost ([127.0.0.1]:42724 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAU-0003lm-Lb for submit@debbugs.gnu.org; Tue, 04 Feb 2020 07:19:03 -0500 Received: from mx1.riseup.net ([198.252.153.129]:39502) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iyxAP-0003lC-3b for 38408@debbugs.gnu.org; Tue, 04 Feb 2020 07:18:57 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48BkJJ2qzwzFbVY; Tue, 4 Feb 2020 04:18:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1580818736; bh=NwMH3ei+TaxKlNru2D0ZXNGGfz/9SjZ6XUZSy4aBWjM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UeDXkJyZ+fI+k9beqRNhOmD9SmpzLk9QAD7rPsgOatwTcvDnGW7usuF24RFzEcu9c 1PYPD6D6Wpry7UlLQF6Cnv7GxGDZmga1h0Qr6Hlin2Z/2W4akl0T8QiemTrC3tVGdS mjPA6Zo/GiIqHvDvwBZXsB8gTUs33a4OJtBykZyk= X-Riseup-User-ID: D8EE206345572679F4230CCB1A26415D0198FC802BF353A674505B6B6FBF94DC Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48BkJG6vqPz8sgN; Tue, 4 Feb 2020 04:18:54 -0800 (PST) From: Martin Becze To: 38408@debbugs.gnu.org Subject: [PATCH v9 8/8] guix: import: parametrized importing of dev dependencies Date: Tue, 4 Feb 2020 07:18:25 -0500 Message-Id: <7e2ac30581e11f1efc9b24258f51fc6d04c60272.1580817140.git.mjbecze@riseup.net> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This changes the behavoir of the recusive crate importer so that it will include the importing of development dependencies for the top level package but will not inculded the development dependencies for any other imported package. * guix/import/crate.scm (crate->guix-package, make-crate-sexp) : added new parameter --- guix/import/crate.scm | 28 ++++++++++++++++++++-------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 630f4d3749..a370fddffe 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -149,7 +149,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license + home-page synopsis description license build? #:allow-other-keys) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, @@ -176,7 +176,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -201,11 +203,13 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version #:allow-other-keys) +(define* (crate->guix-package crate-name #:key version include-dev-deps? + #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -251,9 +255,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-deps dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-deps dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -263,13 +270,18 @@ latest version of CRATE-NAME." #:description (crate-description crate) #:license (and=> (crate-version-license version*) string->license)) - cargo-inputs)))) + (append cargo-inputs cargo-development-inputs))))) (define mem-crate->guix-package (memoize crate->guix-package)) (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package mem-crate->guix-package + #:repo->guix-package + (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name))) + (apply mem-crate->guix-package + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 893dd70fc9..6fb9b772d8 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -461,8 +461,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.25.0 From debbugs-submit-bounces@debbugs.gnu.org Mon Feb 17 05:04:01 2020 Received: (at 38408) by debbugs.gnu.org; 17 Feb 2020 10:04:01 +0000 Received: from localhost ([127.0.0.1]:38003 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3dFs-0003Sr-0O for submit@debbugs.gnu.org; Mon, 17 Feb 2020 05:04:01 -0500 Received: from flashner.co.il ([178.62.234.194]:35470) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3dFj-0003ST-3d for 38408@debbugs.gnu.org; Mon, 17 Feb 2020 05:03:54 -0500 Received: from localhost (unknown [141.226.13.108]) by flashner.co.il (Postfix) with ESMTPSA id 2C902401BE; Mon, 17 Feb 2020 10:03:41 +0000 (UTC) Date: Mon, 17 Feb 2020 12:03:09 +0200 From: Efraim Flashner To: Martin Becze Subject: Re: [PATCH v9 1/8] guix: import: (recursive-import) Allow for version numbers Message-ID: <20200217100309.GH1968@E5400> References: <4b0a9afd6559ee87734ef06d1d8adc0e60e63ee2.1580817140.git.mjbecze@riseup.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="NyChO5MpGs3JHJbz" Content-Disposition: inline In-Reply-To: <4b0a9afd6559ee87734ef06d1d8adc0e60e63ee2.1580817140.git.mjbecze@riseup.net> X-PGP-Key-ID: 0x41AAE7DCCA3D8351 X-PGP-Key: https://flashner.co.il/~efraim/efraim_flashner.asc X-PGP-Fingerprint: A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, ludo@gnu.org, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --NyChO5MpGs3JHJbz Content-Type: multipart/mixed; boundary="D6IIOQQv2Iwyp54J" Content-Disposition: inline --D6IIOQQv2Iwyp54J Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable The tree has moved a bit since you sent the patch, here's a copy I made that applies. --=20 Efraim Flashner =D7=90=D7=A4=D7=A8=D7=99=D7=9D = =D7=A4=D7=9C=D7=A9=D7=A0=D7=A8 GPG key =3D A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted --D6IIOQQv2Iwyp54J Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="0001-guix-import-recursive-import-Allow-for-version-numbe.patch" Content-Transfer-Encoding: quoted-printable =46rom 72be956188ead1aa11a1e9df972ad803323041cc Mon Sep 17 00:00:00 2001 =46rom: Martin Becze Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH 1/8] guix: import: (recursive-import) Allow for version numbers This adds a key VERSION to (recursive-import) and move the paramter REPO to= a key. This also changes all the things that rely on (recursive-import) * guix/import/utils.scm (package->definition): added optional `append-versi= on?` * guix/import/utils.scm (recursive-import): added key `version` and moved `repo` to be a key * guix/import/cran.scm (cran->guix-package): change `repo` to a key * guix/import/cran.scm (cran-recursive-import): change `repo` to a key * guix/scripts/import/cran.scm: change `repo` to a key * guix/import/elpa.scm (elpa->guix-pakcage): change `repo` to a key * guix/import/elpa.scm (elpa-recursive-import): change `repo` to a key * guix/scripts/import/elpa.scm: change `repo` to a key * guix/import/gem.scm (gem->guix-package): change `repo` to a key * guix/import/gem.scm (recursive-import): change `repo` to a key * guix/import/opam.scm (opam-recurive-import): change `repo` to a key * guix/import/pypi.scm (pypi-recursive-import): change `repo` to a key * guix/import/stackage.scm (stackage-recursive-import): change `repo` to a = key --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 4 ++- guix/import/opam.scm | 5 +-- guix/import/pypi.scm | 5 +-- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 71 insertions(+), 41 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bcb37ed250..9e05dfcba8 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright =C2=A9 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus ;;; Copyright =C2=A9 2015, 2016, 2017, 2019, 2020 Ludovic Court=C3=A8s ;;; Copyright =C2=A9 2017 Mathieu Othacehe +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -506,7 +507,7 @@ from the alist META, which was derived from the R packa= ge's DESCRIPTION file." =20 (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) "Fetch the metadata for PACKAGE-NAME from REPO and return the `packag= e' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -521,8 +522,9 @@ s-expression corresponding to that package, or #f on fa= ilure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) =20 -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) =20 diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..9140bcdc34 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright =C2=A9 2015 Federico Beffa ;;; Copyright =C2=A9 2015, 2016, 2017, 2018, 2020 Ludovic Court=C3=A8s ;;; Copyright =C2=A9 2018 Oleg Pykhalov +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) =20 -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) #:allow-other-keys) "Fetch the package NAME from REPO and produce a Guix package S-expressio= n." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) =20 (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) =20 diff --git a/guix/import/gem.scm b/guix/import/gem.scm index bd5d5b3569..54f158fa65 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright =C2=A9 2016 Ben Woodcroft ;;; Copyright =C2=A9 2018 Oleg Pykhalov ;;; Copyright =C2=A9 2020 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -200,6 +201,7 @@ package on RubyGems." (latest latest-release))) =20 (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index 394415fdd4..87c823a98c 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2018 Julien Lepiller +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -311,8 +312,8 @@ or #f on failure." dependencies)))))))) =20 (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (opam->guix-package name)) #:guix-name ocaml-name->guix-name)) =20 diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index 6897f42be3..abd933e2e1 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -6,6 +6,7 @@ ;;; Copyright =C2=A9 2018 Ricardo Wurmus ;;; Copyright =C2=A9 2019 Maxim Cournoyer ;;; Copyright =C2=A9 2020 Jakub K=C4=85dzio=C5=82ka +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -429,8 +430,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, = and LICENSE." description license)))))))) =20 (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (pypi->guix-package name)) #:guix-name python->package-name)) =20 diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..6091cf2c64 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2017 Federico Beffa ;;; Copyright =C2=A9 2018 Ricardo Wurmus +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-na= me)))))) =20 (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (apply stackage->guix-package (= cons name args))) #:guix-name hackage-name->package-name)) =20 diff --git a/guix/import/utils.scm b/guix/import/utils.scm index d17d400ddf..8c434a3eea 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright =C2=A9 2017, 2019 Ricardo Wurmus ;;; Copyright =C2=A9 2018 Oleg Pykhalov ;;; Copyright =C2=A9 2019 Robert Vollmert +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri =20 flatten @@ -258,13 +260,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) =20 -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) =20 (define (build-system-modules) @@ -399,32 +403,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) =20 -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package express= ion -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix packa= ge -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) =20 - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) =20 - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) =20 (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) + (lambda (node) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2014 Eric Bavier ;;; Copyright =C2=A9 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n= ")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) '= cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cra= n)))) + #:repo (or (assoc-ref opts 'rep= o) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'= ~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2015 Federico Beffa ;;; Copyright =C2=A9 2018 Oleg Pykhalov +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an EL= PA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'r= epo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-nam= e)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2015 Federico Beffa ;;; Copyright =C2=A9 2020 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2015, 2017 Ricardo Wurmus ;;; Copyright =C2=A9 2016 Ben Woodcroft +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) --=20 2.25.0 --D6IIOQQv2Iwyp54J-- --NyChO5MpGs3JHJbz Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAl5KZN0ACgkQQarn3Mo9 g1HpEA/9FCvCEmDejdFsSyQg+OfqUc5ODs9IOq1AFAsNlLMKcEH6a1ZsBTPPgqWz boXzb2BxLcSuiTMbMqpvJSW+ZmNBGRVRFkrvV/kf8hc7CXizRSmqEL9OVSQ3gda7 Yh1L/V4hB3dZ0BgnhT4YI318NZMx8MixcNaQJ6uOUr9dJHJpOYPUGwHBkJpKwQVw Z9cI41pos12kJ9BceEv8TA3OV1qtY6gNw3Co8TLKsGY+IG/jhyGQufLPFyPJFebf xFabXbsk5nua2HvH4N4Yck3t3BGmh7T28WXImAOAKonsRgXtpO9PYNlw91II3AqQ suESG2Aar971p96N0UfchgHraxBeTZuONBGnfQoZ1nj/pLMIuI9cu0hdDOl9CfaB Y/jNDc39FkZDlP3FdKILgMoTrKhqNZSW3VavtBoH/14qqT6K0f9Fxwt+ymH4klqn wAF5ZoulAvJdLAxesJJ8HHrVE9EBKK9zKDaEeH0+kprwAUMpWpN4PQolyHovNqUy 47iglyRa4DIOFmENO3TPpAL12PwZ/yA1bRu8FpoFBsPUd7m/Eko2lK45I7XGuKXW 0GRrYQ3a7T0cXrOPSpNUuLhclaroCKWdblcH+idj4jvELLmJq1RXZ5SROd8pu+KB ucuvmJvRuWuhAE9CqiUi7Yq1LI4wa7AnKX/jLJNtq6HI5tgt5+M= =Enae -----END PGP SIGNATURE----- --NyChO5MpGs3JHJbz-- From debbugs-submit-bounces@debbugs.gnu.org Mon Feb 17 05:04:36 2020 Received: (at 38408) by debbugs.gnu.org; 17 Feb 2020 10:04:36 +0000 Received: from localhost ([127.0.0.1]:38007 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3dGQ-0003U2-EY for submit@debbugs.gnu.org; Mon, 17 Feb 2020 05:04:36 -0500 Received: from flashner.co.il ([178.62.234.194]:35548) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3dGI-0003Tj-GX for 38408@debbugs.gnu.org; Mon, 17 Feb 2020 05:04:29 -0500 Received: from localhost (unknown [141.226.13.108]) by flashner.co.il (Postfix) with ESMTPSA id C20EE401BE; Mon, 17 Feb 2020 10:04:16 +0000 (UTC) Date: Mon, 17 Feb 2020 12:03:45 +0200 From: Efraim Flashner To: Martin Becze Subject: Re: [PATCH v9 3/8] Added Guile-Semver as a dependency to guix Message-ID: <20200217100345.GI1968@E5400> References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="XjbSsFHOHxvQpKib" Content-Disposition: inline In-Reply-To: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> X-PGP-Key-ID: 0x41AAE7DCCA3D8351 X-PGP-Key: https://flashner.co.il/~efraim/efraim_flashner.asc X-PGP-Fingerprint: A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, ludo@gnu.org, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --XjbSsFHOHxvQpKib Content-Type: multipart/mixed; boundary="IJFRpmOek+ZRSQoz" Content-Disposition: inline --IJFRpmOek+ZRSQoz Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable The tree has moved a bit since you sent the patch, here's a copy I made that applies --=20 Efraim Flashner =D7=90=D7=A4=D7=A8=D7=99=D7=9D = =D7=A4=D7=9C=D7=A9=D7=A0=D7=A8 GPG key =3D A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted --IJFRpmOek+ZRSQoz Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="0003-Added-Guile-Semver-as-a-dependency-to-guix.patch" Content-Transfer-Encoding: quoted-printable =46rom 578d6f023c706df999c1b1b1bb23c9771b279857 Mon Sep 17 00:00:00 2001 =46rom: Martin Becze Date: Tue, 4 Feb 2020 07:18:20 -0500 Subject: [PATCH 3/8] Added Guile-Semver as a dependency to guix * configure.ac: added check for guile-semver * gnu/packages/package-management.scm (guix): added guile-semver as dep Signed-off-by: Efraim Flashner --- configure.ac | 6 ++++++ doc/guix.texi | 2 ++ gnu/packages/package-management.scm | 7 +++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 06e86c209f..0896c23955 100644 --- a/configure.ac +++ b/configure.ac @@ -118,6 +118,12 @@ if test "x$have_guile_git" !=3D "xyes"; then AC_MSG_ERROR([Guile-Git is missing; please install it.]) fi =20 +dnl Check for Guile-Semver +GUILE_MODULE_AVAILABLE([have_guile_semver], [(semver)]) +if test "x$have_guile_semver" !=3D "xyes"; then + AC_MSG_ERROR([Guile-Semver is missing; please install it.]) +fi + dnl Check for Guile-JSON. GUIX_CHECK_GUILE_JSON if test "x$guix_cv_have_recent_guile_json" !=3D "xyes"; then diff --git a/doc/guix.texi b/doc/guix.texi index aa50340fe2..bc6a431b4c 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -74,6 +74,7 @@ Copyright @copyright{} 2019, 2020 Simon Tournier@* Copyright @copyright{} 2020 Wiktor =C5=BBelazny@* Copyright @copyright{} 2020 Damien Cassou@* Copyright @copyright{} 2020 Jakub K=C4=85dzio=C5=82ka@* +Copyright @copyright{} 2020 Martin Becze@* =20 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -764,6 +765,7 @@ or later; @uref{https://gitlab.com/guile-git/guile-git, Guile-Git}, from August 2017 or later; @item @uref{https://savannah.nongnu.org/projects/guile-json/, Guile-JSON} = 3.x; +@item @uref{https://ngyro.com/software/guile-semver.html, Guile-Semver} 0.= 1.x; @item @url{https://zlib.net, zlib}; @item @url{https://www.gnu.org/software/make/, GNU Make}. @end itemize diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-man= agement.scm index 09888ca9e2..2419f49184 100644 --- a/gnu/packages/package-management.scm +++ b/gnu/packages/package-management.scm @@ -11,6 +11,7 @@ ;;; Copyright =C2=A9 2018, 2019 Eric Bavier ;;; Copyright =C2=A9 2019, 2020 Efraim Flashner ;;; Copyright =C2=A9 2019 Jonathan Brielmaier +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -248,8 +249,9 @@ (ssh (assoc-ref inputs "guile-ssh")) (gnutls (assoc-ref inputs "gnutls")) (locales (assoc-ref inputs "glibc-utf8-loca= les")) + (semver (assoc-ref inputs "guile-semver")) (deps (list gcrypt json sqlite gnutls - git bs ssh)) + git bs ssh semver)) (effective (read-line (open-pipe* OPEN_READ @@ -322,7 +324,8 @@ ("guile-json" ,guile-json-3) ("guile-sqlite3" ,guile-sqlite3) ("guile-ssh" ,guile-ssh) - ("guile-git" ,guile-git))) + ("guile-git" ,guile-git) + ("guile-semver",guile-semver))) =20 (home-page "https://www.gnu.org/software/guix/") (synopsis "Functional package manager for installed software package= s and versions") --=20 2.25.0 --IJFRpmOek+ZRSQoz-- --XjbSsFHOHxvQpKib Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAl5KZQEACgkQQarn3Mo9 g1GYqxAAq5/Hi0t3NY4UC9tDFcZVz45JQ/ChWtuWdrd5WZUeNpwil2wPJ9LrBa3y PiigraurhVw8OBk/LBtK/ydyDU7seLQ2WVCZWgCLAFunVdJoqnNNklZWJ4HGFMZ8 69MmNYmrocV8yeJcHNGMp+adSsQMutpTlxqTHMcHOILHDYASMb/tQ0n+4AB1LEdi Go870H7fFezz6OFPaA1b7DaYx+yZ1+SEKJbAjyxw7Qp3LLn76yS8Cjth5eC/2BGr l1JKDTnxtwLJjIi6zy65JqPGJ94JFhc+mASPi9UJywTVv43Xur6H/JDA/eXjG1oi tVgpJX4nXJBXZx7V6Aan1AkACsZb8gT+o+psuhPe2D7aKBJEeYz5eX51r9F1UeiF RRjWMjm1Ha9wgtbd0N+zKRLqopKabJWHU4Lo+ceejLV7me+JZllyAqJCANSBlbYF WvqPn9p73YtJhUhIk8Egi9QDsMVKb4jyYqm+WNDhQHDTDEwzs+skoD6k0ATpMhxl k3kRIw3PJ+L40MRYRwiA8zQUjy9VOETIxhOUX/tdqZBzeJoqJZSNqr6Q85BV1tS5 0n+TFeGNZb7IIu+TwhjfXXkW4DHkyVIGQprrTJlSoP5egyKZBocGXfWpDyGSz76s YbdPiZZqevmJt75NQ8GwaXzmGqrwQjOaYJilnfWdEErJHR0KlwE= =7c6s -----END PGP SIGNATURE----- --XjbSsFHOHxvQpKib-- From debbugs-submit-bounces@debbugs.gnu.org Mon Feb 17 09:35:34 2020 Received: (at 38408) by debbugs.gnu.org; 17 Feb 2020 14:35:34 +0000 Received: from localhost ([127.0.0.1]:38194 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3hUk-0003ga-69 for submit@debbugs.gnu.org; Mon, 17 Feb 2020 09:35:34 -0500 Received: from eggs.gnu.org ([209.51.188.92]:48975) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3hUh-0003gJ-LH for 38408@debbugs.gnu.org; Mon, 17 Feb 2020 09:35:32 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:53108) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1j3hUb-0007h4-AR; Mon, 17 Feb 2020 09:35:25 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=48600 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1j3hUY-0000HH-I3; Mon, 17 Feb 2020 09:35:24 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Martin Becze Subject: Re: [bug#38408] [PATCH v9 2/8] guix: import: crate: Use semver to resovle module versions References: <7dbe9a73fe56e1116d3207ef3cb9547a32b9a773.1580817140.git.mjbecze@riseup.net> Date: Mon, 17 Feb 2020 15:35:20 +0100 In-Reply-To: <7dbe9a73fe56e1116d3207ef3cb9547a32b9a773.1580817140.git.mjbecze@riseup.net> (Martin Becze's message of "Tue, 4 Feb 2020 07:18:19 -0500") Message-ID: <87y2t17047.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, efraim@flashner.co.il, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Martin & Efraim, Thinking more about it, I=E2=80=99m not sure I fully understand why we need= to pay attention to semver here: Martin Becze skribis: > +(define* (crate->guix-package crate-name #:key version #:allow-other-key= s) > "Fetch the metadata for CRATE-NAME from crates.io, and return the > `package' s-expression corresponding to that package, or #f on failure. > When VERSION is specified, attempt to fetch that version; otherwise fetc= h the > latest version of CRATE-NAME." >=20=20 > + (define (semver-range-contains-string? range version) > + (semver-range-contains? (string->semver-range range) > + (string->semver version))) > + > (define (normal-dependency? dependency) > - (eq? (crate-dependency-kind dependency) 'normal)) > + (or (eq? (crate-dependency-kind dependency) 'build) > + (eq? (crate-dependency-kind dependency) 'normal))) >=20=20 > (define crate > (lookup-crate crate-name)) > @@ -204,21 +218,36 @@ latest version of CRATE-NAME." > (or version > (crate-latest-version crate))) >=20=20 > - (define version* > + (define (find-version crate range) > + "finds the a vesion of a crate that fulfils the semver " > (find (lambda (version) > - (string=3D? (crate-version-number version) > - version-number)) > + (semver-range-contains-string? > + range > + (crate-version-number version))) > (crate-versions crate))) The reason I wonder is that the HTTP API gives us rather precise dependency requirements: --8<---------------cut here---------------start------------->8--- scheme@(guix import crate)> (crate-version-dependencies (car (crate-version= s (lookup-crate "blake2-rfc")))) $8 =3D (#< id: "arrayvec" kind: normal requirement: "^0.4= .6"> #< id: "constant_time_eq" kind: normal requirement: = "^0.1.0"> #< id: "data-encoding" kind: dev requirement: "= ^2.0.0"> #< id: "clippy" kind: normal requirement: "^0.0.= 41">) --8<---------------cut here---------------end--------------->8--- In the example above, the importer could =E2=80=9Cjust=E2=80=9D fetch versi= on 0.4.6 of arrayvec, version 0.1.0 of constant_time_eq, etc., no? It=E2=80=99s an approximation because the caret (^) means more than just th= is, but hopefully it=E2=80=99s a good approximation. Am I missing something? Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Mon Feb 17 09:36:15 2020 Received: (at 38408) by debbugs.gnu.org; 17 Feb 2020 14:36:15 +0000 Received: from localhost ([127.0.0.1]:38198 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3hVP-0003hr-Gs for submit@debbugs.gnu.org; Mon, 17 Feb 2020 09:36:15 -0500 Received: from eggs.gnu.org ([209.51.188.92]:49125) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3hVO-0003hf-8X for 38408@debbugs.gnu.org; Mon, 17 Feb 2020 09:36:14 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:53117) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1j3hVJ-00007Q-4Q; Mon, 17 Feb 2020 09:36:09 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=48602 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1j3hVH-0000yN-Az; Mon, 17 Feb 2020 09:36:07 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Efraim Flashner Subject: Re: [PATCH v9 3/8] Added Guile-Semver as a dependency to guix References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 29 =?utf-8?Q?Pluvi=C3=B4se?= an 228 de la =?utf-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Mon, 17 Feb 2020 15:36:05 +0100 In-Reply-To: <20200217100345.GI1968@E5400> (Efraim Flashner's message of "Mon, 17 Feb 2020 12:03:45 +0200") Message-ID: <87wo8l702y.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi, Efraim Flashner skribis: > From 578d6f023c706df999c1b1b1bb23c9771b279857 Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Tue, 4 Feb 2020 07:18:20 -0500 > Subject: [PATCH 3/8] Added Guile-Semver as a dependency to guix > > * configure.ac: added check for guile-semver > * gnu/packages/package-management.scm (guix): added guile-semver as dep [...] > +dnl Check for Guile-Semver > +GUILE_MODULE_AVAILABLE([have_guile_semver], [(semver)]) > +if test "x$have_guile_semver" !=3D "xyes"; then > + AC_MSG_ERROR([Guile-Semver is missing; please install it.]) > +fi I think a hard dependency like this is too much. I would very much prefer to deal with it similar to how we deal with Guile-Newt or Guile-Charting: a soft dependency that=E2=80=99s entirely optional. But I guess that also depends on what Guile-Semver is used for. I just posted a question on this topic in that thread. :-) Thanks for reviving this patch series! Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Mon Feb 17 09:58:38 2020 Received: (at 38408) by debbugs.gnu.org; 17 Feb 2020 14:58:38 +0000 Received: from localhost ([127.0.0.1]:39040 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3hr4-0004R3-7Z for submit@debbugs.gnu.org; Mon, 17 Feb 2020 09:58:38 -0500 Received: from flashner.co.il ([178.62.234.194]:38944) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3hr2-0004Qr-Mh for 38408@debbugs.gnu.org; Mon, 17 Feb 2020 09:58:37 -0500 Received: from localhost (unknown [141.226.13.108]) by flashner.co.il (Postfix) with ESMTPSA id C1C234018C; Mon, 17 Feb 2020 14:58:30 +0000 (UTC) Date: Mon, 17 Feb 2020 16:57:59 +0200 From: Efraim Flashner To: Ludovic =?utf-8?Q?Court=C3=A8s?= Subject: Re: [bug#38408] [PATCH v9 2/8] guix: import: crate: Use semver to resovle module versions Message-ID: <20200217145759.GM1968@E5400> References: <7dbe9a73fe56e1116d3207ef3cb9547a32b9a773.1580817140.git.mjbecze@riseup.net> <87y2t17047.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="Thv7PGoFpDPJ7Oar" Content-Disposition: inline In-Reply-To: <87y2t17047.fsf@gnu.org> X-PGP-Key-ID: 0x41AAE7DCCA3D8351 X-PGP-Key: https://flashner.co.il/~efraim/efraim_flashner.asc X-PGP-Fingerprint: A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --Thv7PGoFpDPJ7Oar Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Feb 17, 2020 at 03:35:20PM +0100, Ludovic Court=C3=A8s wrote: > Hi Martin & Efraim, >=20 > Thinking more about it, I=E2=80=99m not sure I fully understand why we ne= ed to > pay attention to semver here: >=20 > Martin Becze skribis: >=20 > > +(define* (crate->guix-package crate-name #:key version #:allow-other-k= eys) > > "Fetch the metadata for CRATE-NAME from crates.io, and return the > > `package' s-expression corresponding to that package, or #f on failure. > > When VERSION is specified, attempt to fetch that version; otherwise fe= tch the > > latest version of CRATE-NAME." > > =20 > > + (define (semver-range-contains-string? range version) > > + (semver-range-contains? (string->semver-range range) > > + (string->semver version))) > > + > > (define (normal-dependency? dependency) > > - (eq? (crate-dependency-kind dependency) 'normal)) > > + (or (eq? (crate-dependency-kind dependency) 'build) > > + (eq? (crate-dependency-kind dependency) 'normal))) > > =20 > > (define crate > > (lookup-crate crate-name)) > > @@ -204,21 +218,36 @@ latest version of CRATE-NAME." > > (or version > > (crate-latest-version crate))) > > =20 > > - (define version* > > + (define (find-version crate range) > > + "finds the a vesion of a crate that fulfils the semver " > > (find (lambda (version) > > - (string=3D? (crate-version-number version) > > - version-number)) > > + (semver-range-contains-string? > > + range > > + (crate-version-number version))) > > (crate-versions crate))) >=20 > The reason I wonder is that the HTTP API gives us rather precise > dependency requirements: >=20 > --8<---------------cut here---------------start------------->8--- > scheme@(guix import crate)> (crate-version-dependencies (car (crate-versi= ons (lookup-crate "blake2-rfc")))) > $8 =3D (#< id: "arrayvec" kind: normal requirement: "^0= =2E4.6"> #< id: "constant_time_eq" kind: normal requireme= nt: "^0.1.0"> #< id: "data-encoding" kind: dev requiremen= t: "^2.0.0"> #< id: "clippy" kind: normal requirement: "^= 0.0.41">) > --8<---------------cut here---------------end--------------->8--- >=20 > In the example above, the importer could =E2=80=9Cjust=E2=80=9D fetch ver= sion 0.4.6 of > arrayvec, version 0.1.0 of constant_time_eq, etc., no? >=20 > It=E2=80=99s an approximation because the caret (^) means more than just = this, > but hopefully it=E2=80=99s a good approximation. >=20 > Am I missing something? >=20 > Ludo=E2=80=99. Here we're looking at a minimum of 0.4.6 for arrayvec. According to here=C2=B9 we'd really want to import 0.4.12, which is the latest 0.4.x release. =C2=B9 https://crates.io/crates/arrayvec/versions --=20 Efraim Flashner =D7=90=D7=A4=D7=A8=D7=99=D7=9D = =D7=A4=D7=9C=D7=A9=D7=A0=D7=A8 GPG key =3D A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted --Thv7PGoFpDPJ7Oar Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAl5KqfcACgkQQarn3Mo9 g1HUPw//V4YL5yf/EOoR7XB/s3SMPKSVQKIz/VbcqqvxZCPgVI0GQ0RShuVyTGmh 9gkG2FTNem9NAMte14rr1bYuVMdba25XKZWSiuvNK4p5CeWrjXVuJTSd8059UUWz mVRoxqOU1hAxqPvowfoO4SFjIBQQE1NTAstWd7uXrWk+SZgJJ4+RpBaaCKtXUz8C 8eqfCkt8XUJeoUwfafOi2bdGF9MHAkeZy3o8bSfgZ4QsTiIsmvUca07ERtxAszLX E4+gBb/sW4etW8imoEVRcahfa3HkSgPO2oFl4SL/DknoutbCwkVV3zOj9gZlo/21 YI8uXDkEzhqTpdpKb7MJEXQHmnyvAQxZt8wmBkNoOhQKrXsaaLNRQFd7zazJA2p0 F/GZdBTwmr4rTBQfDwyxns6zQmv65F1FbaatHVE8V/+ZnJXsevYMK0PJZXn/XrTm 6yyuHmc+9H+Rgi4XNAtSoVpjcCcgS9yv8yfEBErIwlPchm8fkVMokywpnYLjR21R cBR7AyqjUZdckHCDQl9TK7pBZ4TqmAf3HIT1mpfHoY01Dp1owncwZYeY+vjOHgqy jMKlEkRTJpY5WA+FQbxfSeJMlUrWWWFJaKONh5MhrdUqAPphNn3pOStKMob1kKlE 5ZSZFe6Qz43mjifSEVQ1IOfu1SOHoVI1geQi3KnFvvke+rLueEo= =zRpi -----END PGP SIGNATURE----- --Thv7PGoFpDPJ7Oar-- From debbugs-submit-bounces@debbugs.gnu.org Mon Feb 17 10:37:36 2020 Received: (at 38408) by debbugs.gnu.org; 17 Feb 2020 15:37:36 +0000 Received: from localhost ([127.0.0.1]:39094 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3iSm-0005Qg-JL for submit@debbugs.gnu.org; Mon, 17 Feb 2020 10:37:36 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60502) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3iSl-0005QU-8T for 38408@debbugs.gnu.org; Mon, 17 Feb 2020 10:37:35 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:54387) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1j3iSf-0006P0-LM; Mon, 17 Feb 2020 10:37:29 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=48702 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1j3iSe-0000YS-TT; Mon, 17 Feb 2020 10:37:29 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Efraim Flashner Subject: Re: [bug#38408] [PATCH v9 2/8] guix: import: crate: Use semver to resovle module versions References: <7dbe9a73fe56e1116d3207ef3cb9547a32b9a773.1580817140.git.mjbecze@riseup.net> <87y2t17047.fsf@gnu.org> <20200217145759.GM1968@E5400> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 29 =?utf-8?Q?Pluvi=C3=B4se?= an 228 de la =?utf-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Mon, 17 Feb 2020 16:37:25 +0100 In-Reply-To: <20200217145759.GM1968@E5400> (Efraim Flashner's message of "Mon, 17 Feb 2020 16:57:59 +0200") Message-ID: <87v9o55ioa.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, jsoo1@asu.edu, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Efraim Flashner skribis: > On Mon, Feb 17, 2020 at 03:35:20PM +0100, Ludovic Court=C3=A8s wrote: [...] >> --8<---------------cut here---------------start------------->8--- >> scheme@(guix import crate)> (crate-version-dependencies (car (crate-vers= ions (lookup-crate "blake2-rfc")))) >> $8 =3D (#< id: "arrayvec" kind: normal requirement: "^= 0.4.6"> #< id: "constant_time_eq" kind: normal requiremen= t: "^0.1.0"> #< id: "data-encoding" kind: dev requirement= : "^2.0.0"> #< id: "clippy" kind: normal requirement: "^0= .0.41">) >> --8<---------------cut here---------------end--------------->8--- >>=20 >> In the example above, the importer could =E2=80=9Cjust=E2=80=9D fetch ve= rsion 0.4.6 of >> arrayvec, version 0.1.0 of constant_time_eq, etc., no? >>=20 >> It=E2=80=99s an approximation because the caret (^) means more than just= this, >> but hopefully it=E2=80=99s a good approximation. >>=20 >> Am I missing something? >>=20 >> Ludo=E2=80=99. > > Here we're looking at a minimum of 0.4.6 for arrayvec. According to > here=C2=B9 we'd really want to import 0.4.12, which is the latest 0.4.x > release. That=E2=80=99s why I wrote that 0.4.6 is an approximation (probably a good = one because it=E2=80=99s apparently known to work.) We can do something smarter, but then it=E2=80=99s only useful if the updat= er is equally smart=E2=80=94that is, it can update 0.4.6 to 0.4.13 whenever that version is out, knowing that blake2-rfc will still work fine. Tricky! WDYT? Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 18 03:57:05 2020 Received: (at 38408) by debbugs.gnu.org; 18 Feb 2020 08:57:05 +0000 Received: from localhost ([127.0.0.1]:39543 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3ygj-0007c2-84 for submit@debbugs.gnu.org; Tue, 18 Feb 2020 03:57:05 -0500 Received: from mx1.riseup.net ([198.252.153.129]:57934) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3ygh-0007bt-Ix for 38408@debbugs.gnu.org; Tue, 18 Feb 2020 03:57:04 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48MF8t4MpwzF00S; Tue, 18 Feb 2020 00:57:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1582016222; bh=54x745Mm35bb+u+sC/bxxRLvVmZXgX7o2Kdko3A/UcI=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=XZ8kgJnEqgQIXuo5KhMZwRwQHI8PksrzrkhwaK/bId7CqQN4pBOlAtoG/CGQXg/B5 0l40AjwoAxY/N1WDrwC1vxT4poB6cWCUk6Kpz3exUGp30ZMWKCCFfWLyUFRqpwr2nr P/KdIdj4xYYZrNS1XN1Aun52tswc4AAJmFfzZ7rc= X-Riseup-User-ID: 259D8BE1AECA108C035E4C003A813F6E027106A08BB9B3CBD4AFE9FDA21892A9 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 48MF8r72xxzJvBN; Tue, 18 Feb 2020 00:57:00 -0800 (PST) Subject: Re: [bug#38408] [PATCH v9 2/8] guix: import: crate: Use semver to resovle module versions To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= , Efraim Flashner References: <7dbe9a73fe56e1116d3207ef3cb9547a32b9a773.1580817140.git.mjbecze@riseup.net> <87y2t17047.fsf@gnu.org> <20200217145759.GM1968@E5400> <87v9o55ioa.fsf@gnu.org> From: Martin Becze Message-ID: Date: Tue, 18 Feb 2020 03:56:59 -0500 MIME-Version: 1.0 In-Reply-To: <87v9o55ioa.fsf@gnu.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On 2/17/20 10:37 AM, Ludovic Courtès wrote: > That’s why I wrote that 0.4.6 is an approximation (probably a good one > because it’s apparently known to work.) Just grabbing the version from the semver range would work for some ranage would break on Hyphenated ranges (1.2.3 - 2), Combining ranges (>=0.14 <16) and on the asterisk range operator (1.*.* or 2.*) Currently we are just trying to pick the most recent version that fits in the semver range. > We can do something smarter, but then it’s only useful if the updater is > equally smart—that is, it can update 0.4.6 to 0.4.13 whenever that > version is out, knowing that blake2-rfc will still work fine. Yep argeed! I would like to fix the updater as well, but i thought i should wait to send that in after this one gets in. Also it can quickly turns in to a SAT problem. I think we have two basic options though. 1) update everything to the newest possible version (easiest and this is what the importer does currently) 2) make the smallest possible dependency graph for all packages (harder, involves a SAT solver) From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 18 04:30:44 2020 Received: (at 38408) by debbugs.gnu.org; 18 Feb 2020 09:30:44 +0000 Received: from localhost ([127.0.0.1]:39552 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3zDI-0008Oz-He for submit@debbugs.gnu.org; Tue, 18 Feb 2020 04:30:44 -0500 Received: from mx1.riseup.net ([198.252.153.129]:42900) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j3zDG-0008Oq-6y for 38408@debbugs.gnu.org; Tue, 18 Feb 2020 04:30:42 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48MFvj3mLFzFchZ; Tue, 18 Feb 2020 01:30:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1582018241; bh=GF+bj53twJtaSjkpdc3WHDB5Or2Km1eixq9IrE++5mg=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Fxt1slUxLMkfmj0DTI4uoaOwZYSec8PEhwvDzaM2b7U32sY4Z+OIYkFqIVp/GHJZ/ enkwXneilpcrTQMVU+7tulOtoyeSpEEI5X2Znvo8oRo3LnmyuQyTkLWLL3mvbKfTCf guinYTuVFs2qQgEzdcx4SQUC9nE57Js57Wa2JCGc= X-Riseup-User-ID: 51280957BA8F0D5C5689E6003B2BE1F73D465C409C26FA677958C15E54A22550 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 48MFvg5HQczJvRZ; Tue, 18 Feb 2020 01:30:39 -0800 (PST) Subject: Re: [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= , Efraim Flashner References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> From: Martin Becze Message-ID: Date: Tue, 18 Feb 2020 04:30:37 -0500 MIME-Version: 1.0 In-Reply-To: <87wo8l702y.fsf@gnu.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) I'm looking at guile-charting now, and i don't understand how it is being used as a soft dependency. in guix/scripts/size.scm line 195 it is getting used with "(module-autoload!"... is that it? On 2/17/20 9:36 AM, Ludovic Courtès wrote: > Hi, > > Efraim Flashner skribis: > >> From 578d6f023c706df999c1b1b1bb23c9771b279857 Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Tue, 4 Feb 2020 07:18:20 -0500 >> Subject: [PATCH 3/8] Added Guile-Semver as a dependency to guix >> >> * configure.ac: added check for guile-semver >> * gnu/packages/package-management.scm (guix): added guile-semver as dep > > [...] > >> +dnl Check for Guile-Semver >> +GUILE_MODULE_AVAILABLE([have_guile_semver], [(semver)]) >> +if test "x$have_guile_semver" != "xyes"; then >> + AC_MSG_ERROR([Guile-Semver is missing; please install it.]) >> +fi > > I think a hard dependency like this is too much. > > I would very much prefer to deal with it similar to how we deal with > Guile-Newt or Guile-Charting: a soft dependency that’s entirely > optional. > > But I guess that also depends on what Guile-Semver is used for. > I just posted a question on this topic in that thread. :-) > > Thanks for reviving this patch series! > > Ludo’. > From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 20 04:40:25 2020 Received: (at 38408) by debbugs.gnu.org; 20 Feb 2020 09:40:25 +0000 Received: from localhost ([127.0.0.1]:43845 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j4iJk-00058Z-2e for submit@debbugs.gnu.org; Thu, 20 Feb 2020 04:40:24 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38829) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j4iJi-00058M-7B for 38408@debbugs.gnu.org; Thu, 20 Feb 2020 04:40:22 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:56211) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1j4iJc-00084l-N6; Thu, 20 Feb 2020 04:40:16 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=45960 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1j4iJc-00059I-1E; Thu, 20 Feb 2020 04:40:16 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Martin Becze Subject: Re: [PATCH v9 3/8] Added Guile-Semver as a dependency to guix References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 2 =?utf-8?Q?Vent=C3=B4se?= an 228 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Thu, 20 Feb 2020 10:40:14 +0100 In-Reply-To: (Martin Becze's message of "Tue, 18 Feb 2020 04:30:37 -0500") Message-ID: <874kvld2bl.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi, Martin Becze skribis: > I'm looking at guile-charting now, and i don't understand how it is > being used as a soft dependency. in guix/scripts/size.scm line 195 it > is getting used with "(module-autoload!"... is that it? Yes, exactly. The thing is, Guile-Charting is not used at all unless one passes the =E2=80=98--map-file=E2=80=99 option to =E2=80=98guix size=E2= =80=99. Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 20 11:54:54 2020 Received: (at 38408) by debbugs.gnu.org; 20 Feb 2020 16:54:54 +0000 Received: from localhost ([127.0.0.1]:45752 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j4p6D-00075N-Oy for submit@debbugs.gnu.org; Thu, 20 Feb 2020 11:54:53 -0500 Received: from mx1.riseup.net ([198.252.153.129]:59580) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j4p6C-00075F-87 for 38408@debbugs.gnu.org; Thu, 20 Feb 2020 11:54:52 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48NggH3DQ5zF0Ms; Thu, 20 Feb 2020 08:54:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1582217691; bh=p6cDgC+SNKIKYQTCi7MgMCbB/0JNKq/yHcGws9fEkNc=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=MCg/W3Bsl+NvBynVA2Z329kjqRlGpyGpp9taYEMWhlfqlOUuKS/N2fKf2r1m4gopO WHCv7cIGGtHfoyWPPQ+ULKP+c/6hhgut8iBpPzTGpaxRO2/MhvD8TsPdbT2A3DKr+J 2faD4Ru3Bo6B5DWj7/KoY0GLfpchLc2b3ozccHGA= X-Riseup-User-ID: 9D4EF3D4746B173E12A7C17F00F202EBA16440E37A3FBE305527A61234651AE7 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 48NggF6LCfzJnm9; Thu, 20 Feb 2020 08:54:49 -0800 (PST) Subject: Re: [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> From: Martin Becze Message-ID: Date: Thu, 20 Feb 2020 11:54:47 -0500 MIME-Version: 1.0 In-Reply-To: <874kvld2bl.fsf@gnu.org> Content-Type: multipart/mixed; boundary="------------71DD4D4BF11F0CDD680CB736" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This is a multi-part message in MIME format. --------------71DD4D4BF11F0CDD680CB736 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Ok cool! I have tested it now. Attached is a patch that adds that behavior. Please drop the first patch and apply this one at the end. On 2/20/20 4:40 AM, Ludovic Courtès wrote: > exactly. The thing is, Guile-Charting is not used at all unless > one passes --------------71DD4D4BF11F0CDD680CB736 Content-Type: text/x-patch; charset=UTF-8; name="v9-0009-guix-import-crate-Added-guile-semver-as-a-soft-de.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v9-0009-guix-import-crate-Added-guile-semver-as-a-soft-de.pa"; filename*1="tch" >From ef8f1a6365c321662248885d4c97c949c5c0a167 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 20 Feb 2020 11:49:11 -0500 Subject: [PATCH v9] guix: import: crate: Added guile-semver as a soft dep * guix/import/crate.scm Added guile-semver as a soft dep --- guix/import/crate.scm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index a370fddffe..91e38839bd 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -36,8 +36,6 @@ #:use-module (ice-9 match) #:use-module (ice-9 regex) #:use-module (json) - #:use-module (semver) - #:use-module (semver ranges) #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) @@ -94,6 +92,11 @@ string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." -- 2.25.1 --------------71DD4D4BF11F0CDD680CB736-- From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 20 13:53:19 2020 Received: (at 38408) by debbugs.gnu.org; 20 Feb 2020 18:53:19 +0000 Received: from localhost ([127.0.0.1]:45863 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j4qwp-0001aY-8C for submit@debbugs.gnu.org; Thu, 20 Feb 2020 13:53:19 -0500 Received: from wout4-smtp.messagingengine.com ([64.147.123.20]:34779) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j4qwo-0001aL-3e for 38408@debbugs.gnu.org; Thu, 20 Feb 2020 13:53:18 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.west.internal (Postfix) with ESMTP id 18ED1554; Thu, 20 Feb 2020 13:53:12 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Thu, 20 Feb 2020 13:53:12 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=famulari.name; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=mesmtp; bh=if+Xwi8jK/o/YyOhp5AuogFk IAXh0M4OPV+p1rux1Bk=; b=jYorYAvK+AZF/vwx3pjAj8iXXxOLY5qn9Sr4IGa0 ySzZSTk4Hjl72Y/w7mqHaBVJC6siDYSnGJddDLyMkohI4ZSqPDN/PLUWe6+rWzhA wbI7mZ+T2vq/K6dr4xutmyCW2wHFONR6fgUVeNZ53mhsI+xl5Xymv57HYkRTkfIZ tFE= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=if+Xwi 8jK/o/YyOhp5AuogFkIAXh0M4OPV+p1rux1Bk=; b=Z/RpeykQbWYjQwRmqJJ0oQ sLLk1FYwxfqvFjpixjYBib4P7jALZWRx4Ay/232jB9+QuR9zMvGQhO+A+o4SG9Xn RSAXxmNfu9ILN+qj3ppA1FjW0s0sxuJDTE4sxkw/Jh3b9aM1vwb+UGAEXCPbA4st JvtpFbokHDBOI8aIRuzw0wIvtTOFqWC7tZ8grgmY2hBw01HsyyCSMWryK+JDKNk0 BIHCmf4LjN1pwa9dEmP1LfXvSTdlntMZirM3RZQ0FrHIFm77Le73mINj0PVlOLs3 RTRBLxfdJTp2793UPdOq0g/iyHHcI6KbPKIi6+NNkAXEzONzgGzpdnw+ymzVGyOg == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedugedrkedvgdduvddtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepfffhvffukfhfgggtuggjsehttdertddttddvnecuhfhrohhmpefnvghoucfh rghmuhhlrghrihcuoehlvghosehfrghmuhhlrghrihdrnhgrmhgvqeenucffohhmrghinh epfeefrdhithenucfkphepjeeirdduvdegrddufeekrdeifeenucevlhhushhtvghrufhi iigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehlvghosehfrghmuhhlrghrihdrnh grmhgv X-ME-Proxy: Received: from localhost (c-76-124-138-63.hsd1.pa.comcast.net [76.124.138.63]) by mail.messagingengine.com (Postfix) with ESMTPA id 199193060FD3; Thu, 20 Feb 2020 13:53:11 -0500 (EST) Date: Thu, 20 Feb 2020 13:53:10 -0500 From: Leo Famulari To: Martin Becze Subject: Re: [bug#38408] [PATCH v9 0/8] recursive semver crate importer! Message-ID: <20200220185310.GA12545@jasmine.lan> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On Tue, Feb 04, 2020 at 07:18:17AM -0500, Martin Becze wrote: > Here is the another version of the recursive semver crate importer! And hopefully the best one so far. The first 3 commits actully implement the and add semver support. The rest are mainly ergonomics such as > * triming version numbers from package name > * better deduplication of dependencies > * top level importing of development dependenies Wow, this is great! It makes it possible to get a (very close to) working rav1e package. The only things really missing are non-Rust dependencies of rav1e but I think that is not in scope for your importer. > I think it has incorpated the feedback i got from everyone so far, but if i forgot something or if there is more to add let me know! A minor bug: Sometimes if a dependency is already existing, the importer will construct its variable name incorrectly. For example, some of the packages I imported require version 2.33 of rust-clap. We already have this package, and the variable is named 'rust-clap-2', but the importer makes the packages depend on 'rust-clap-2.33'. It has to be adjusted by hand. You should be able to reproduce the bug with the following command. It doesn't matter if guile-semver is a hard dependency or autoloaded. `guix environment guix --ad-hoc guile-json guile-semver -- ./pre-inst-env guix import crate --recursive rav1e` Also, it prints the skip-build? argument on multiple lines, like this... #:skip-build? #t From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 21 03:35:40 2020 Received: (at 38408) by debbugs.gnu.org; 21 Feb 2020 08:35:40 +0000 Received: from localhost ([127.0.0.1]:46337 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j53me-0003Qe-7s for submit@debbugs.gnu.org; Fri, 21 Feb 2020 03:35:40 -0500 Received: from mx1.riseup.net ([198.252.153.129]:57662) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j53mc-0003QV-63 for 38408@debbugs.gnu.org; Fri, 21 Feb 2020 03:35:38 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48P4Xn15d2zF0Fr; Fri, 21 Feb 2020 00:35:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1582274137; bh=vvlfZEN13Ma/1WFXM8RVQ+9nMyGWkk9ZCW4U65x7cXs=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=ZlcpG/dGMg/sldHPgH5ZITCut7WauNlspMssF28WtXgJfkUlPmvOBNdSNWHv1iS7w nw9IH74/lefzq7HL2ya1TG67IExiaNUO7jISwkC+Cxm3lVNGknkOK75ju/7Lxxw28L votk34rV7sqlP4LADsevXmkguGZOPUS0yjLtOhMg= X-Riseup-User-ID: E5A530ADDDEE3042BE7CD7FB1DC41C04A3DDFC8968AA30257B676F0DC91D3CE5 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 48P4Xk6Mw2zJsK2; Fri, 21 Feb 2020 00:35:34 -0800 (PST) Subject: Re: [bug#38408] [PATCH v9 0/8] recursive semver crate importer! To: Leo Famulari References: <20200220185310.GA12545@jasmine.lan> From: Martin Becze Message-ID: <02e2004c-0271-b0fa-3919-04428d6d0570@riseup.net> Date: Fri, 21 Feb 2020 03:35:31 -0500 MIME-Version: 1.0 In-Reply-To: <20200220185310.GA12545@jasmine.lan> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, ludo@gnu.org, efraim@flashner.co.il, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On 2/20/20 1:53 PM, Leo Famulari wrote: > 'rust-clap-2', but the importer makes the packages depend on > 'rust-clap-2.33'. It has to be adjusted by hand. Thats actually not a bug, I think we probably should change rust-clap-2 -> rust-clap-2.33. > > Also, it prints the skip-build? argument on multiple lines, like this... > > #:skip-build? > #t Yeah that is annoying, its a problem with (ice-9 pretty-print). Would be nice to fix. From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 21 04:01:50 2020 Received: (at 38408) by debbugs.gnu.org; 21 Feb 2020 09:01:50 +0000 Received: from localhost ([127.0.0.1]:46371 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j54By-00047R-FD for submit@debbugs.gnu.org; Fri, 21 Feb 2020 04:01:50 -0500 Received: from eggs.gnu.org ([209.51.188.92]:40082) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j54Bx-00047E-3e for 38408@debbugs.gnu.org; Fri, 21 Feb 2020 04:01:49 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:45217) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1j54Br-000680-DN; Fri, 21 Feb 2020 04:01:43 -0500 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=41836 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1j54Bo-000397-Uf; Fri, 21 Feb 2020 04:01:42 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Martin Becze Subject: Re: [PATCH v9 3/8] Added Guile-Semver as a dependency to guix References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 3 =?utf-8?Q?Vent=C3=B4se?= an 228 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Fri, 21 Feb 2020 10:01:39 +0100 In-Reply-To: (Martin Becze's message of "Thu, 20 Feb 2020 11:54:47 -0500") Message-ID: <87sgj4nwjw.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Martin, Martin Becze skribis: > +(module-autoload! (current-module) > + '(semver) '(string->semver)) > +(module-autoload! (current-module) > + '(semver ranges) '(string->semver-range semver-range-contains?)) Sounds good. Could you please squash it with the commit that adds support for semver? Also, we may want to add guile-semver to =E2=80=98dependencies=E2=80=99 in =E2=80=98compiled-guix=E2=80=99 in (guix self). That way, a pulled guix wi= ll have guile-semver available, and thus =E2=80=98guix import crate=E2=80=99 will w= ork out of the box. Thanks, Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 21 07:15:54 2020 Received: (at 38408) by debbugs.gnu.org; 21 Feb 2020 12:15:54 +0000 Received: from localhost ([127.0.0.1]:46504 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j57Dm-0002os-Gn for submit@debbugs.gnu.org; Fri, 21 Feb 2020 07:15:54 -0500 Received: from flashner.co.il ([178.62.234.194]:39124) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j57Dj-0002oe-W5 for 38408@debbugs.gnu.org; Fri, 21 Feb 2020 07:15:52 -0500 Received: from [127.0.0.1] (unknown [141.226.13.108]) by flashner.co.il (Postfix) with ESMTPSA id B2A784002B; Fri, 21 Feb 2020 12:15:45 +0000 (UTC) Date: Fri, 21 Feb 2020 12:15:17 +0000 From: Efraim Flashner To: Martin Becze , Leo Famulari Subject: Re: [bug#38408] [PATCH v9 0/8] recursive semver crate importer! User-Agent: K-9 Mail for Android In-Reply-To: <02e2004c-0271-b0fa-3919-04428d6d0570@riseup.net> References: <20200220185310.GA12545@jasmine.lan> <02e2004c-0271-b0fa-3919-04428d6d0570@riseup.net> Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, ludo@gnu.org, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On February 21, 2020 8:35:31 AM UTC, Martin Becze w= rote: > > >On 2/20/20 1:53 PM, Leo Famulari wrote: >> 'rust-clap-2', but the importer makes the packages depend on >> 'rust-clap-2=2E33'=2E It has to be adjusted by hand=2E > >Thats actually not a bug, I think we probably should change rust-clap-2= =20 >-> rust-clap-2=2E33=2E > Talking to others at FOSDEM the other distro maintainers are pretty sure t= hat all of the rust-clap-2 versions should be compatible, and similarly for= other packages with a major version other than 0=2E So I'd personally pref= er to change them to just the major version (and keep it as rust-clap-2)=2E >>=20 >> Also, it prints the skip-build? argument on multiple lines, like this= =2E=2E=2E >>=20 >> #:skip-build? >> #t > >Yeah that is annoying, its a problem with (ice-9 pretty-print)=2E Would b= e=20 >nice to fix=2E --=20 Sent from my Android device with K-9 Mail=2E Please excuse my brevity=2E From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 21 11:25:48 2020 Received: (at 38408) by debbugs.gnu.org; 21 Feb 2020 16:25:48 +0000 Received: from localhost ([127.0.0.1]:47879 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5B7T-000706-Ci for submit@debbugs.gnu.org; Fri, 21 Feb 2020 11:25:48 -0500 Received: from mx1.riseup.net ([198.252.153.129]:42132) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5B7Q-0006zv-94 for 38408@debbugs.gnu.org; Fri, 21 Feb 2020 11:25:38 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48PGz31wWVzFd9g; Fri, 21 Feb 2020 08:25:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1582302335; bh=5hAFR0thVzwDM6j/ZDmt9sZh0ko6IwJosclI7wQdl+E=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=TmgtRWYI2l0o1SuAwVl6a6rexHOvroez0D1n7NpW6srQ+8+dxdCoY2p3LPxrGlrsw hSerVZdIk03nBYE/Bokjbmtt/wiUkM/rRUs/qH9uZVfkA+XSTZXLFUK1BIu1+UjnSJ 4sg0717Qk+gWBBAEGHCiUwvrmDO+Hm5mw9HaL7ro= X-Riseup-User-ID: 569A1769A146096FB6E594F9A94B4FBF323E10F5834F5B83B22E29C47B3828D4 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 48PGz01Kf4zJqVQ; Fri, 21 Feb 2020 08:25:31 -0800 (PST) Subject: Re: [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> From: Martin Becze Message-ID: <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> Date: Fri, 21 Feb 2020 11:25:30 -0500 MIME-Version: 1.0 In-Reply-To: <87sgj4nwjw.fsf@gnu.org> Content-Type: multipart/mixed; boundary="------------403F429BDEEEFFF8B69B1BF6" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit On 2/21/20 4:01 AM, Ludovic Courtès wrote: > Hi Martin, > Sounds good. Could you please squash it with the commit that adds > support for semver? Squashed and attached as v10-0002-guix-import-crate-Use-semver-to-resovle-module-v.patch > Also, we may want to add guile-semver to ‘dependencies’ in > ‘compiled-guix’ in (guix self). That way, a pulled guix will have > guile-semver available, and thus ‘guix import crate’ will work out of > the box. I added that it is attached as v10-0008-guix-self-added-guile-semver-as-a-depenedency.patch But I'm not sure how to test guix pull to see if it correctly brought in guile-semver! --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/x-patch; charset=UTF-8; name="v10-0008-guix-self-added-guile-semver-as-a-depenedency.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v10-0008-guix-self-added-guile-semver-as-a-depenedency.patch" >From ee19656f5e63955e43922301f1abf32cfc629779 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Fri, 21 Feb 2020 10:41:44 -0500 Subject: [PATCH v10 8/8] guix: self: added guile-semver as a depenedency * guix/self.scm (compliled-guix) added guile-semver as a depenedency --- guix/self.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index 6b633f9bc0..c0506a0a60 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ ("guile-git" (ref '(gnu packages guile) 'guile3.0-git)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile3.0-sqlite3)) ("guile-gcrypt" (ref '(gnu packages gnupg) 'guile3.0-gcrypt)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile-semver)) ("gnutls" (ref '(gnu packages tls) 'guile3.0-gnutls)) ("zlib" (ref '(gnu packages compression) 'zlib)) ("lzlib" (ref '(gnu packages compression) 'lzlib)) @@ -682,6 +684,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -690,7 +695,7 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3)) + guile-ssh guile-sqlite3 guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.25.1 --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/x-patch; charset=UTF-8; name="v10-0007-guix-import-parametrized-importing-of-dev-depend.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v10-0007-guix-import-parametrized-importing-of-dev-depend.pa"; filename*1="tch" >From 3f1d5662f75abda64fb042f2d12dd8afc5523e17 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 3 Feb 2020 16:19:49 -0500 Subject: [PATCH v10 7/8] guix: import: parametrized importing of dev dependencies This changes the behavoir of the recusive crate importer so that it will include the importing of development dependencies for the top level package but will not inculded the development dependencies for any other imported package. * guix/import/crate.scm (crate->guix-package, make-crate-sexp) : added new parameter --- guix/import/crate.scm | 28 ++++++++++++++++++++-------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 00ac6ee318..91e38839bd 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -152,7 +152,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license + home-page synopsis description license build? #:allow-other-keys) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, @@ -179,7 +179,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -204,11 +206,13 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version #:allow-other-keys) +(define* (crate->guix-package crate-name #:key version include-dev-deps? + #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -254,9 +258,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-deps dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-deps dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -266,13 +273,18 @@ latest version of CRATE-NAME." #:description (crate-description crate) #:license (and=> (crate-version-license version*) string->license)) - cargo-inputs)))) + (append cargo-inputs cargo-development-inputs))))) (define mem-crate->guix-package (memoize crate->guix-package)) (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package mem-crate->guix-package + #:repo->guix-package + (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name))) + (apply mem-crate->guix-package + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 893dd70fc9..6fb9b772d8 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -461,8 +461,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.25.1 --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/x-patch; charset=UTF-8; name="v10-0006-guix-import-utils-trim-patch-version-from-names.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v10-0006-guix-import-utils-trim-patch-version-from-names.pat"; filename*1="ch" >From 58f6c611aa4d49e9fef0ea6a0ed7125cd3942bef Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:19:13 -0500 Subject: [PATCH v10 6/8] guix: import: utils: trim patch version from names * guix/import/utils.scm (package->definition): trim patch version from names * tests/crate.scm: updated the tests --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 44 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index c60a164271..649b9f9b85 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -273,9 +273,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index 39561d5745..893dd70fc9 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -279,7 +279,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -295,7 +295,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -358,7 +358,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -377,7 +377,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -396,7 +396,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -413,13 +413,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" + (("rust-leaf-bob" ('unquote rust-leaf-bob-1.0.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -436,17 +436,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -463,14 +463,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.25.1 --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/x-patch; charset=UTF-8; name="v10-0005-guix-import-crate-memorize-crate-guix-package.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v10-0005-guix-import-crate-memorize-crate-guix-package.patch" >From 6a4e13a7b16c7647fd47f3412bb27252dbd054a1 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:17:00 -0500 Subject: [PATCH v10 5/8] guix: import: crate: memorize crate->guix-package This adds memorization to procedures that involve network lookups. (mem-lookup-crate) is used on every dependency of a package to find it's versions. (mem-crate->guix-package) is needed becuase (topological-sort) depduplicates after dependencies have been turned into dependencies. * guix/import/crate.scm (mem-crate->guix-package, mem-lookup-crate) --- guix/import/crate.scm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index b2a3dd7e70..00ac6ee318 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -111,6 +112,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define mem-lookup-crate (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -216,7 +219,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (mem-lookup-crate crate-name)) (define version-number (or version @@ -238,7 +241,7 @@ latest version of CRATE-NAME." containing pairs of (name version)" (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (mem-lookup-crate name)) (req (crate-dependency-requirement dep)) (ver (find-version crate req))) (list name @@ -265,9 +268,11 @@ latest version of CRATE-NAME." string->license)) cargo-inputs)))) +(define mem-crate->guix-package (memoize crate->guix-package)) + (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package mem-crate->guix-package #:version version #:guix-name crate-name->package-name)) -- 2.25.1 --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/x-patch; charset=UTF-8; name="v10-0004-guix-import-crate-deduplicate-dependencies.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v10-0004-guix-import-crate-deduplicate-dependencies.patch" >From f93800713be11754aba4572009c859d30256adac Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 10:52:28 -0500 Subject: [PATCH v10 4/8] guix: import: crate: deduplicate dependencies * guix/import/crate.scm (crate-version-dependencies): deduplicate dependencies --- guix/import/crate.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 7e61bc21b6..b2a3dd7e70 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -118,7 +118,7 @@ record or #f if it was not found." (url (string-append (%crate-base-url) path))) (match (assoc-ref (or (json-fetch url) '()) "dependencies") ((? vector? vector) - (map json->crate-dependency (vector->list vector))) + (delete-duplicates (map json->crate-dependency (vector->list vector)))) (_ '())))) -- 2.25.1 --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/x-patch; charset=UTF-8; name="v10-0003-guix-import-utils-allow-generation-of-inputs-to-.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v10-0003-guix-import-utils-allow-generation-of-inputs-to-.pa"; filename*1="tch" >From ee5d7412e0cad9bad9be3b26195cd298ed37ca30 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 27 Jan 2020 06:45:10 -0500 Subject: [PATCH v10 3/8] guix: import: utils: allow generation of inputs to be version aware * guix/import/utils.scm (package-names->package-inputs): Added the ability to handle (name version) pairs * guix/import/crate.scm (make-crate-sexp): cleaned up input field generation --- guix/import/crate.scm | 17 +++++++++-------- guix/import/utils.scm | 21 ++++++++++++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index d711820b81..7e61bc21b6 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -154,16 +154,17 @@ record or #f if it was not found." "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs - (map - (lambda (name-version) - (apply crate-name->package-name name-version)) cargo-inputs)) - (cargo-development-inputs - (map - (lambda (name-version) - (apply crate-name->package-name name-version)) cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 8c434a3eea..c60a164271 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -233,13 +233,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) -- 2.25.1 --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/x-patch; charset=UTF-8; name="v10-0002-guix-import-crate-Use-semver-to-resovle-module-v.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v10-0002-guix-import-crate-Use-semver-to-resovle-module-v.pa"; filename*1="tch" >From ed3365f11107556d45b189da6588e353b2ef5e46 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 03:50:48 -0500 Subject: [PATCH v10 2/8] guix: import: crate: Use semver to resovle module versions * guix/import/crate.scm (make-crate-sexp): formatting, added '#:skip-build?' to build system args; added package definition geneation * guix/import/crate.scm (crate->guix-package): Use semver to resolve the correct module versions * guix/import/crate.scm Added guile-semver as a soft dep * tests/crate.scm: added version data to (recursuve-import) test --- guix/import/crate.scm | 90 +++++++---- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 290 +++++++++++++++++++--------------- 3 files changed, 228 insertions(+), 163 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 57823c3639..d711820b81 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,10 +87,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -150,9 +156,14 @@ VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTIO and LICENSE." (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-inputs)) + (cargo-development-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -164,9 +175,10 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs - cargo-development-inputs))) + cargo-development-inputs))) (home-page ,(match home-page (() "") (_ home-page))) @@ -177,7 +189,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,14 +200,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -204,21 +221,36 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate))) - (define version* + (define (find-version crate range) + "finds the a vesion of a crate that fulfils the semver " (find (lambda (version) - (string=? (crate-version-number version) - version-number)) + (semver-range-contains-string? + range + (crate-version-number version))) (crate-versions crate))) + (define version* + (find-version crate version-number)) + + (define (sort-map-deps deps) + "sorts the dependencies and maps the dependencies to a list + containing pairs of (name version)" + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -253,7 +282,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; @@ -288,4 +317,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index aa51faebf9..39561d5745 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", + \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -88,18 +90,22 @@ { \"crate_id\": \"intermediate-1\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -132,14 +138,17 @@ { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -172,6 +181,7 @@ { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -252,34 +262,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -334,105 +358,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.25.1 --------------403F429BDEEEFFF8B69B1BF6 Content-Type: text/x-patch; charset=UTF-8; name="v10-0001-guix-import-recursive-import-Allow-for-version-n.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v10-0001-guix-import-recursive-import-Allow-for-version-n.pa"; filename*1="tch" >From a7b88911a9ef1348a65145027c689bae63d9a41f Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH v10 1/8] guix: import: (recursive-import) Allow for version numbers This adds a key VERSION to (recursive-import) and move the paramter REPO to a key. This also changes all the things that rely on (recursive-import) * guix/import/utils.scm (package->definition): added optional `append-version?` * guix/import/utils.scm (recursive-import): added key `version` and moved `repo` to be a key * guix/import/cran.scm (cran->guix-package): change `repo` to a key * guix/import/cran.scm (cran-recursive-import): change `repo` to a key * guix/scripts/import/cran.scm: change `repo` to a key * guix/import/elpa.scm (elpa->guix-pakcage): change `repo` to a key * guix/import/elpa.scm (elpa-recursive-import): change `repo` to a key * guix/scripts/import/elpa.scm: change `repo` to a key * guix/import/gem.scm (gem->guix-package): change `repo` to a key * guix/import/gem.scm (recursive-import): change `repo` to a key * guix/import/opam.scm (opam-recurive-import): change `repo` to a key * guix/import/pypi.scm (pypi-recursive-import): change `repo` to a key * guix/import/stackage.scm (stackage-recursive-import): change `repo` to a key --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 4 ++- guix/import/opam.scm | 5 +-- guix/import/pypi.scm | 5 +-- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 71 insertions(+), 41 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bcb37ed250..9e05dfcba8 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -506,7 +507,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -521,8 +522,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..9140bcdc34 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) #:allow-other-keys) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index bd5d5b3569..54f158fa65 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -200,6 +201,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index 394415fdd4..87c823a98c 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -311,8 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (opam->guix-package name)) #:guix-name ocaml-name->guix-name)) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index 6897f42be3..abd933e2e1 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2018 Ricardo Wurmus ;;; Copyright © 2019 Maxim Cournoyer ;;; Copyright © 2020 Jakub Kądziołka +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -429,8 +430,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." description license)))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (pypi->guix-package name)) #:guix-name python->package-name)) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..6091cf2c64 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index d17d400ddf..8c434a3eea 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -258,13 +260,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -399,32 +403,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) + (lambda (node) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.25.1 --------------403F429BDEEEFFF8B69B1BF6-- From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 21 11:27:50 2020 Received: (at 38408) by debbugs.gnu.org; 21 Feb 2020 16:27:50 +0000 Received: from localhost ([127.0.0.1]:47891 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5B9a-00074S-9c for submit@debbugs.gnu.org; Fri, 21 Feb 2020 11:27:50 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:40063) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5B9Y-00074D-IT for 38408@debbugs.gnu.org; Fri, 21 Feb 2020 11:27:48 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 6AFEC22008; Fri, 21 Feb 2020 11:27:43 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 21 Feb 2020 11:27:43 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=famulari.name; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=mesmtp; bh=BqSMz3P7cX5oU+txtuNfUge0 HIi8udJWysCbodR9nag=; b=0JauFc5uJoBQLJ5qDFJqpAjwAdZT2Lbbp+TTLHxr QyHkjhdUsu1hyC39cqQKVlk3P50Ho6oY+s5IHCcxOdaXqDqcYfrunquDBaW5D92m MQK6vvvLsMAG+tRrPxTmsKjoePopfKr7FxSSKOWoEw0RP5nBGc7uJ2l/qiKzY1yO RRs= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=BqSMz3 P7cX5oU+txtuNfUge0HIi8udJWysCbodR9nag=; b=t5XbkG4y67UpIWDeHi/P0b FT4duIE2XyVNe3hQ0EJSWhfziI64IWj8nt4BcqIS5maEUOEDP3Rbs/QK7ZYPVIy+ EqRED47mNukxrXp/ujGp04SEqhejOXLs5Etfcs1M4EGB/EFLuHL3wK4gmy8noXma 5HFLtTcO5sDEYVr0al7lHkhI0znHWXBpNCgTDp21kPNOIrE7cTtDYCAgrqq+oORL 0x1vPLwmollDmKqTN2+2jESdu1MmXpSnw8wSSp6mevwdhSSlCavXosx+RBfyRmpt ksG6QMQrkMbRXgytaiJ1mj00Pb3DfuX8/ZYTKOUxXfmalQh9pJZaaHlo36jzH9kA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedugedrkeeggdekkecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpeffhffvuffkfhggtggujgesthdtredttddtvdenucfhrhhomhepnfgvohcuhfgr mhhulhgrrhhiuceolhgvohesfhgrmhhulhgrrhhirdhnrghmvgeqnecukfhppeejiedrud dvgedrudefkedrieefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghi lhhfrhhomheplhgvohesfhgrmhhulhgrrhhirdhnrghmvg X-ME-Proxy: Received: from localhost (c-76-124-138-63.hsd1.pa.comcast.net [76.124.138.63]) by mail.messagingengine.com (Postfix) with ESMTPA id D12943280059; Fri, 21 Feb 2020 11:27:42 -0500 (EST) Date: Fri, 21 Feb 2020 11:27:42 -0500 From: Leo Famulari To: Martin Becze Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix Message-ID: <20200221162742.GA6923@jasmine.lan> References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Ludovic =?iso-8859-1?Q?Court=E8s?= , Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On Fri, Feb 21, 2020 at 11:25:30AM -0500, Martin Becze wrote: > I added that it is attached as > v10-0008-guix-self-added-guile-semver-as-a-depenedency.patch > But I'm not sure how to test guix pull to see if it correctly brought in > guile-semver! You can do `guix pull --url=/home/martin/guix` with whatever your source code path is. From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 21 11:29:25 2020 Received: (at 38408) by debbugs.gnu.org; 21 Feb 2020 16:29:25 +0000 Received: from localhost ([127.0.0.1]:47900 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5BB6-00077d-Us for submit@debbugs.gnu.org; Fri, 21 Feb 2020 11:29:25 -0500 Received: from mx1.riseup.net ([198.252.153.129]:44016) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5BB5-00077U-OK for 38408@debbugs.gnu.org; Fri, 21 Feb 2020 11:29:24 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48PH3R0PBbzFdFq; Fri, 21 Feb 2020 08:29:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1582302563; bh=jfu9TawWnFU94g9DxhpjB9yHRFWT59QZpwPhpA9J9Xc=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=FwpUgnsnhCXukhoKf8dzYrEFYzoTNQFvXdDlCsh7OqUHtPeadxENaYp3Zqr5nR9F7 lGjh9wE/EyZOsKT8iti0pJbzHj7Z0U2fepU675xjYUt6q+cwbFhZ+jhbFLu5U4tP/i EjCiPketlAVRWho6u3Go7gJ06gFcpTcys6WYKtUg= X-Riseup-User-ID: 1EE74B93570DEF253DEB8142B2A44DBC95484EAD5EF7F3907AD2202E4F930131 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 48PH3P5sy6zJr3q; Fri, 21 Feb 2020 08:29:21 -0800 (PST) Subject: Re: [bug#38408] [PATCH v9 0/8] recursive semver crate importer! To: Efraim Flashner , Leo Famulari References: <20200220185310.GA12545@jasmine.lan> <02e2004c-0271-b0fa-3919-04428d6d0570@riseup.net> From: Martin Becze Message-ID: <404710b1-c277-8fce-2e12-598bd0801a71@riseup.net> Date: Fri, 21 Feb 2020 11:29:20 -0500 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, ludo@gnu.org, jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) ah good to know. So one option is that we can change the importor to resolve the exported symbols of the package, but I think it add a bit of complexity. Once semver is in, I might give it a shot though. On 2/21/20 7:15 AM, Efraim Flashner wrote: > > > On February 21, 2020 8:35:31 AM UTC, Martin Becze wrote: >> >> >> On 2/20/20 1:53 PM, Leo Famulari wrote: >>> 'rust-clap-2', but the importer makes the packages depend on >>> 'rust-clap-2.33'. It has to be adjusted by hand. >> >> Thats actually not a bug, I think we probably should change rust-clap-2 >> -> rust-clap-2.33. >> > > Talking to others at FOSDEM the other distro maintainers are pretty sure that all of the rust-clap-2 versions should be compatible, and similarly for other packages with a major version other than 0. So I'd personally prefer to change them to just the major version (and keep it as rust-clap-2). > >>> >>> Also, it prints the skip-build? argument on multiple lines, like this... >>> >>> #:skip-build? >>> #t >> >> Yeah that is annoying, its a problem with (ice-9 pretty-print). Would be >> nice to fix. > From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 23 15:34:12 2020 Received: (at 38408) by debbugs.gnu.org; 23 Feb 2020 20:34:12 +0000 Received: from localhost ([127.0.0.1]:51652 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5xx6-0008Mm-CZ for submit@debbugs.gnu.org; Sun, 23 Feb 2020 15:34:12 -0500 Received: from mx1.riseup.net ([198.252.153.129]:54256) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5xx4-0008Me-EQ for 38408@debbugs.gnu.org; Sun, 23 Feb 2020 15:34:11 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48QcNx5d3kzFccN; Sun, 23 Feb 2020 12:34:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1582490049; bh=yrlZEh8wjrmMhW9Q1ST6V+tPaWYeOmCBgHyhEnaUTHQ=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=BYPVUdRL2Kz8v/a2lWx+RzlUy6oIt/L21P4fFsRBU0KVkcoMu6n+FfF7URnTADgOj HZoOyq+Lc6p1WYMVQYc5Rs+mU4cZUQR28w4e/9x5rBevvv9kYOfTdE2T1dSwDWKKLK 6+V2TYNv8LWaVxrKaf7PotsDJNc5b+e6NT9fcK6M= X-Riseup-User-ID: FFA35606DC36D84192B6C50B1309C781FD2EFD5668D86886A7F1272EA53CCF51 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48QcNv4Rwpz8sXK; Sun, 23 Feb 2020 12:34:07 -0800 (PST) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: Leo Famulari References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <20200221162742.GA6923@jasmine.lan> From: Martin Becze Message-ID: Date: Sun, 23 Feb 2020 15:34:03 -0500 MIME-Version: 1.0 In-Reply-To: <20200221162742.GA6923@jasmine.lan> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, =?UTF-8?Q?Ludovic_Court=c3=a8s?= , Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) ah thanks Leo! There is needed a probably here, ill update the patch soon. On 2/21/20 11:27 AM, Leo Famulari wrote: > On Fri, Feb 21, 2020 at 11:25:30AM -0500, Martin Becze wrote: >> I added that it is attached as >> v10-0008-guix-self-added-guile-semver-as-a-depenedency.patch >> But I'm not sure how to test guix pull to see if it correctly brought in >> guile-semver! > > You can do `guix pull --url=/home/martin/guix` with whatever your source > code path is. > From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 23 16:05:26 2020 Received: (at 38408) by debbugs.gnu.org; 23 Feb 2020 21:05:26 +0000 Received: from localhost ([127.0.0.1]:51661 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5yRK-0000iv-2u for submit@debbugs.gnu.org; Sun, 23 Feb 2020 16:05:26 -0500 Received: from mx1.riseup.net ([198.252.153.129]:35058) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j5yRI-0000im-GC for 38408@debbugs.gnu.org; Sun, 23 Feb 2020 16:05:25 -0500 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48Qd4n5QMLzFdbg; Sun, 23 Feb 2020 13:05:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1582491923; bh=UmMLOgDFJyXkQqadhPqZ04kc8Dc4ZkhvjqZldp3T4OI=; h=Subject:From:To:Cc:References:Date:In-Reply-To:From; b=fHA9TMQa5CmA7+lHHMilE3ipQ22t0/4XRxu9slmbV8C33qqkyCHpTaQiyFUFdvz8l GMM4JHrcuYVTix4Ux9yGhmxDQ12mUix30fNb6nZ23gYD4RDDFk9++/nf0ZnEIPNvUc l0yw0fiZZKJNZzCdxpgVt/Q+1i0pkLOZzNq2Ovyo= X-Riseup-User-ID: 52C062E0177D543C5A94D694A7568CE4B92B0482907B86FC79914B5667D9336C Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48Qd4m3xjFz8tpv; Sun, 23 Feb 2020 13:05:12 -0800 (PST) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix From: Martin Becze To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> Message-ID: Date: Sun, 23 Feb 2020 16:05:11 -0500 MIME-Version: 1.0 In-Reply-To: <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> Content-Type: multipart/mixed; boundary="------------9A5BE1BFE1FC943380BBD5D1" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This is a multi-part message in MIME format. --------------9A5BE1BFE1FC943380BBD5D1 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Ok here is a correct version, I addded guile3.0-semver and used that in (guix self) instead of guile-semver. Let me know if this works! Cheers! On 2/21/20 11:25 AM, Martin Becze wrote: > > > On 2/21/20 4:01 AM, Ludovic Courtès wrote: >> Hi Martin, > >> Sounds good.  Could you please squash it with the commit that adds >> support for semver? > > Squashed and attached as > v10-0002-guix-import-crate-Use-semver-to-resovle-module-v.patch > >> Also, we may want to add guile-semver to ‘dependencies’ in >> ‘compiled-guix’ in (guix self).  That way, a pulled guix will have >> guile-semver available, and thus ‘guix import crate’ will work out of >> the box. > > I added that it is attached as > v10-0008-guix-self-added-guile-semver-as-a-depenedency.patch > But I'm not sure how to test guix pull to see if it correctly brought in > guile-semver! --------------9A5BE1BFE1FC943380BBD5D1 Content-Type: text/x-patch; charset=UTF-8; name="0003-guix-self-added-guile-semver-as-a-depenedency.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="0003-guix-self-added-guile-semver-as-a-depenedency.patch" >From 7eed4dcafc4635d17e8bc7af520b6293187ef008 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Fri, 21 Feb 2020 10:41:44 -0500 Subject: [PATCH 3/3] guix: self: added guile-semver as a depenedency * guix/self.scm (compliled-guix) added guile-semver as a depenedency --- guix/self.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index 6b633f9bc0..7da7fdea81 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ ("guile-git" (ref '(gnu packages guile) 'guile3.0-git)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile3.0-sqlite3)) ("guile-gcrypt" (ref '(gnu packages gnupg) 'guile3.0-gcrypt)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("gnutls" (ref '(gnu packages tls) 'guile3.0-gnutls)) ("zlib" (ref '(gnu packages compression) 'zlib)) ("lzlib" (ref '(gnu packages compression) 'lzlib)) @@ -682,6 +684,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -690,7 +695,7 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3)) + guile-ssh guile-sqlite3 guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.25.1 --------------9A5BE1BFE1FC943380BBD5D1 Content-Type: text/x-patch; charset=UTF-8; name="0002-gnu-Add-guile3.0-semver.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="0002-gnu-Add-guile3.0-semver.patch" >From 07dccc523ff215a58558e5b1549784dc0495192f Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sun, 23 Feb 2020 04:27:42 -0500 Subject: [PATCH 2/3] gnu: Add guile3.0-semver * gnu/packages/guile-xyz.scm --- gnu/packages/guile-xyz.scm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm index 8b8a1306de..45efa44e83 100644 --- a/gnu/packages/guile-xyz.scm +++ b/gnu/packages/guile-xyz.scm @@ -23,6 +23,7 @@ ;;; Copyright © 2019 swedebugia ;;; Copyright © 2019 Amar Singh ;;; Copyright © 2019 Timothy Sample +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -2981,6 +2982,13 @@ comparing, and writing Semantic Versions. It also includes ranges in the style of the Node Package Manager (NPM).") (license license:gpl3+))) +(define-public guile3.0-semver + (package + (inherit guile-semver) + (name "guile3.0-semver") + (inputs + `(("guile" ,guile-3.0))))) + (define-public guile-hashing (package (name "guile-hashing") -- 2.25.1 --------------9A5BE1BFE1FC943380BBD5D1 Content-Type: text/x-patch; charset=UTF-8; name="0001-gnu-guile-semver-updated-to-0.1.1.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-gnu-guile-semver-updated-to-0.1.1.patch" >From 5652089496642edb3fea8d09a061bc9fc7353c33 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sun, 23 Feb 2020 15:07:20 -0500 Subject: [PATCH 1/3] gnu: guile-semver: updated to 0.1.1 * gnu/packages/guile-xyx.scm --- gnu/packages/guile-xyz.scm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm index 16b408900c..8b8a1306de 100644 --- a/gnu/packages/guile-xyz.scm +++ b/gnu/packages/guile-xyz.scm @@ -2960,14 +2960,14 @@ tests being run, resulting clearer and more specific output.") (define-public guile-semver (package (name "guile-semver") - (version "0.1.0") + (version "0.1.1") (source (origin (method url-fetch) (uri (string-append "https://files.ngyro.com/guile-semver/" "guile-semver-" version ".tar.gz")) (sha256 (base32 - "06b66rj7nyhr6i3dpkwvfw1xb10w2pngrsw2hxfxkznwsbh9byfz")))) + "109p4n39ln44cxvwdccf9kgb96qx54makvd2ir521ssz6wchjyag")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config) -- 2.25.1 --------------9A5BE1BFE1FC943380BBD5D1-- From debbugs-submit-bounces@debbugs.gnu.org Wed Mar 11 16:20:35 2020 Received: (at 38408) by debbugs.gnu.org; 11 Mar 2020 20:20:35 +0000 Received: from localhost ([127.0.0.1]:55601 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jC7qE-0000mh-Qe for submit@debbugs.gnu.org; Wed, 11 Mar 2020 16:20:34 -0400 Received: from mx1.riseup.net ([198.252.153.129]:39806) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jC7qC-0000mY-VD for 38408@debbugs.gnu.org; Wed, 11 Mar 2020 16:20:33 -0400 Received: from capuchin.riseup.net (unknown [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48d3HN10dXzDrs3; Wed, 11 Mar 2020 13:20:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1583958032; bh=QTT3iKc6Xn7BfMBYlZgvJtJCynwYlbVs5zsfsbzH8mg=; h=Subject:From:To:Cc:References:Date:In-Reply-To:From; b=rjXR2hlvOGNu6aFM71kxC55l7F23ayMO7wbXL7xfwPQ1so0KK0S0n4fZO2RknArKb 7QyCz3z3k9iSRkb5JgN48X8LTnUgQ0eZd/3evNR+SzYVpQd7S+J+FT96N5HGQNEQ48 f7naoSkyeS4tnR+ui/HiZfZJCSgCSx8H7vcriEUk= X-Riseup-User-ID: 654ED213CF58A0F02496FF25628AA4384DF1951977E050DF1F0F2D560DDECBAD Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48d3HL4tXxz8tJf; Wed, 11 Mar 2020 13:20:30 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix From: Martin Becze To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> Message-ID: <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> Date: Wed, 11 Mar 2020 16:20:27 -0400 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This seems stuck again. Is there anymore to do or discuss with this patch? Thanks! On 2/23/20 4:05 PM, Martin Becze wrote: > Ok here is a correct version, I addded guile3.0-semver and used that in > (guix self) instead of guile-semver. Let me know if this works! Cheers! > > On 2/21/20 11:25 AM, Martin Becze wrote: >> >> >> On 2/21/20 4:01 AM, Ludovic Courtès wrote: >>> Hi Martin, >> >>> Sounds good.  Could you please squash it with the commit that adds >>> support for semver? >> >> Squashed and attached as >> v10-0002-guix-import-crate-Use-semver-to-resovle-module-v.patch >> >>> Also, we may want to add guile-semver to ‘dependencies’ in >>> ‘compiled-guix’ in (guix self).  That way, a pulled guix will have >>> guile-semver available, and thus ‘guix import crate’ will work out of >>> the box. >> >> I added that it is attached as >> v10-0008-guix-self-added-guile-semver-as-a-depenedency.patch >> But I'm not sure how to test guix pull to see if it correctly brought >> in guile-semver! From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 21 14:36:17 2020 Received: (at 38408) by debbugs.gnu.org; 21 Mar 2020 18:36:17 +0000 Received: from localhost ([127.0.0.1]:47990 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jFiyd-0005yO-1W for submit@debbugs.gnu.org; Sat, 21 Mar 2020 14:36:17 -0400 Received: from mx1.riseup.net ([198.252.153.129]:41776) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jFiyZ-0005yB-BT for 38408@debbugs.gnu.org; Sat, 21 Mar 2020 14:36:06 -0400 Received: from bell.riseup.net (unknown [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48l8VB1RTbzFdft; Sat, 21 Mar 2020 11:36:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1584815762; bh=MFaN7uX1xIPz7aBHBtHhgeK19FW/g67XZxu3QG5IcsQ=; h=Subject:From:To:Cc:References:Date:In-Reply-To:From; b=Ao8R6zyc2OLE/lfJniOhVq7umQV7i1Xqyh5QmrS6fmJ4F4eRvWcC1hNp9s0B5I8ze czeK0JnyJDi6BKXc+Vt19WTm1rAQ91kuy6/H9OLI/vteF8kVuAbkeEMAWuCY69U3I2 BZ4cQwD44WhNO24d3rC7Jpd+XUyEorOm27nb6Uvs= X-Riseup-User-ID: 55A17BDAD45FF4447C5AA0A0E7A62DF06F8B84B9BA27E22C62AFA28AC1B8F63B Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 48l8V053x2zJrt3; Sat, 21 Mar 2020 11:35:52 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix From: Martin Becze To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <8a86631d201313b1da427a5ceb2ca5f201e6546c.1580817140.git.mjbecze@riseup.net> <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> Message-ID: <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> Date: Sat, 21 Mar 2020 14:35:47 -0400 MIME-Version: 1.0 In-Reply-To: <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> Content-Type: multipart/mixed; boundary="------------CB40779AD71DBC225DA0375B" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------CB40779AD71DBC225DA0375B Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit A few things got stale and need to be merged so I have regenerated the patch set! Let me know if there is anymore things to do. On 3/11/20 4:20 PM, Martin Becze wrote: > This seems stuck again. Is there anymore to do or discuss with this > patch? Thanks! > > On 2/23/20 4:05 PM, Martin Becze wrote: >> Ok here is a correct version, I addded guile3.0-semver and used that >> in (guix self) instead of guile-semver. Let me know if this works! >> Cheers! >> >> On 2/21/20 11:25 AM, Martin Becze wrote: >>> >>> >>> On 2/21/20 4:01 AM, Ludovic Courtès wrote: >>>> Hi Martin, >>> >>>> Sounds good.  Could you please squash it with the commit that adds >>>> support for semver? >>> >>> Squashed and attached as >>> v10-0002-guix-import-crate-Use-semver-to-resovle-module-v.patch >>> >>>> Also, we may want to add guile-semver to ‘dependencies’ in >>>> ‘compiled-guix’ in (guix self).  That way, a pulled guix will have >>>> guile-semver available, and thus ‘guix import crate’ will work out of >>>> the box. >>> >>> I added that it is attached as >>> v10-0008-guix-self-added-guile-semver-as-a-depenedency.patch >>> But I'm not sure how to test guix pull to see if it correctly brought >>> in guile-semver! > > > --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0009-guix-self-added-guile-semver-as-a-depenedency.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v11-0009-guix-self-added-guile-semver-as-a-depenedency.patch" >From 6b04afb3cfcc7cf6cc6a4884932e966e0fb13894 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Fri, 21 Feb 2020 10:41:44 -0500 Subject: [PATCH v11 9/9] guix: self: added guile-semver as a depenedency * guix/self.scm (compliled-guix) added guile-semver as a depenedency --- guix/self.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index 6b633f9bc0..7da7fdea81 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ ("guile-git" (ref '(gnu packages guile) 'guile3.0-git)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile3.0-sqlite3)) ("guile-gcrypt" (ref '(gnu packages gnupg) 'guile3.0-gcrypt)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("gnutls" (ref '(gnu packages tls) 'guile3.0-gnutls)) ("zlib" (ref '(gnu packages compression) 'zlib)) ("lzlib" (ref '(gnu packages compression) 'lzlib)) @@ -682,6 +684,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -690,7 +695,7 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3)) + guile-ssh guile-sqlite3 guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.25.1 --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0008-gnu-Add-guile3.0-semver.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="v11-0008-gnu-Add-guile3.0-semver.patch" >From ba6cb8f8e34ac0ce39f14f391c94756aa53a0d10 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sun, 23 Feb 2020 04:27:42 -0500 Subject: [PATCH v11 8/9] gnu: Add guile3.0-semver * gnu/packages/guile-xyz.scm --- gnu/packages/guile-xyz.scm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm index a2430b7ea3..09427da487 100644 --- a/gnu/packages/guile-xyz.scm +++ b/gnu/packages/guile-xyz.scm @@ -23,6 +23,7 @@ ;;; Copyright © 2019 swedebugia ;;; Copyright © 2019, 2020 Amar Singh ;;; Copyright © 2019 Timothy Sample +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -2996,6 +2997,13 @@ comparing, and writing Semantic Versions. It also includes ranges in the style of the Node Package Manager (NPM).") (license license:gpl3+))) +(define-public guile3.0-semver + (package + (inherit guile-semver) + (name "guile3.0-semver") + (inputs + `(("guile" ,guile-3.0))))) + (define-public guile-hashing (package (name "guile-hashing") -- 2.25.1 --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0007-guix-import-parametrized-importing-of-dev-depend.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v11-0007-guix-import-parametrized-importing-of-dev-depend.pa"; filename*1="tch" >From 57d4347e68480f83dbf7dceb5e50fc4b05285e75 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 3 Feb 2020 16:19:49 -0500 Subject: [PATCH v11 7/9] guix: import: parametrized importing of dev dependencies This changes the behavoir of the recusive crate importer so that it will include the importing of development dependencies for the top level package but will not inculded the development dependencies for any other imported package. * guix/import/crate.scm (crate->guix-package, make-crate-sexp) : added new parameter --- guix/import/crate.scm | 28 ++++++++++++++++++++-------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 00ac6ee318..91e38839bd 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -152,7 +152,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license + home-page synopsis description license build? #:allow-other-keys) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, @@ -179,7 +179,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -204,11 +206,13 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version #:allow-other-keys) +(define* (crate->guix-package crate-name #:key version include-dev-deps? + #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -254,9 +258,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-deps dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-deps dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -266,13 +273,18 @@ latest version of CRATE-NAME." #:description (crate-description crate) #:license (and=> (crate-version-license version*) string->license)) - cargo-inputs)))) + (append cargo-inputs cargo-development-inputs))))) (define mem-crate->guix-package (memoize crate->guix-package)) (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package mem-crate->guix-package + #:repo->guix-package + (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name))) + (apply mem-crate->guix-package + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 893dd70fc9..6fb9b772d8 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -461,8 +461,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.25.1 --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0006-guix-import-utils-trim-patch-version-from-names.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v11-0006-guix-import-utils-trim-patch-version-from-names.pat"; filename*1="ch" >From 3aa7e808a243d1a72b69d8ebf0114f51c1fd1f6d Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:19:13 -0500 Subject: [PATCH v11 6/9] guix: import: utils: trim patch version from names * guix/import/utils.scm (package->definition): trim patch version from names * tests/crate.scm: updated the tests --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 44 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 709cd718f6..a0aacdc6de 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -265,9 +265,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index 39561d5745..893dd70fc9 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -279,7 +279,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -295,7 +295,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -358,7 +358,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -377,7 +377,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -396,7 +396,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -413,13 +413,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" + (("rust-leaf-bob" ('unquote rust-leaf-bob-1.0.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -436,17 +436,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -463,14 +463,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.25.1 --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0005-guix-import-crate-memorize-crate-guix-package.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v11-0005-guix-import-crate-memorize-crate-guix-package.patch" >From a1123353f0448408e1dee9008f81cf0188cfcb7f Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:17:00 -0500 Subject: [PATCH v11 5/9] guix: import: crate: memorize crate->guix-package This adds memorization to procedures that involve network lookups. (mem-lookup-crate) is used on every dependency of a package to find it's versions. (mem-crate->guix-package) is needed becuase (topological-sort) depduplicates after dependencies have been turned into dependencies. * guix/import/crate.scm (mem-crate->guix-package, mem-lookup-crate) --- guix/import/crate.scm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index b2a3dd7e70..00ac6ee318 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -111,6 +112,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define mem-lookup-crate (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -216,7 +219,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (mem-lookup-crate crate-name)) (define version-number (or version @@ -238,7 +241,7 @@ latest version of CRATE-NAME." containing pairs of (name version)" (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (mem-lookup-crate name)) (req (crate-dependency-requirement dep)) (ver (find-version crate req))) (list name @@ -265,9 +268,11 @@ latest version of CRATE-NAME." string->license)) cargo-inputs)))) +(define mem-crate->guix-package (memoize crate->guix-package)) + (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package mem-crate->guix-package #:version version #:guix-name crate-name->package-name)) -- 2.25.1 --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0004-guix-import-crate-deduplicate-dependencies.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v11-0004-guix-import-crate-deduplicate-dependencies.patch" >From 98d6988239e447e445715801c1d2d6b97b0426f7 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 10:52:28 -0500 Subject: [PATCH v11 4/9] guix: import: crate: deduplicate dependencies * guix/import/crate.scm (crate-version-dependencies): deduplicate dependencies --- guix/import/crate.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 7e61bc21b6..b2a3dd7e70 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -118,7 +118,7 @@ record or #f if it was not found." (url (string-append (%crate-base-url) path))) (match (assoc-ref (or (json-fetch url) '()) "dependencies") ((? vector? vector) - (map json->crate-dependency (vector->list vector))) + (delete-duplicates (map json->crate-dependency (vector->list vector)))) (_ '())))) -- 2.25.1 --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0003-guix-import-utils-allow-generation-of-inputs-to-.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v11-0003-guix-import-utils-allow-generation-of-inputs-to-.pa"; filename*1="tch" >From 01bb6a944f4637a7528207e432aeda40105a2070 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 27 Jan 2020 06:45:10 -0500 Subject: [PATCH v11 3/9] guix: import: utils: allow generation of inputs to be version aware * guix/import/utils.scm (package-names->package-inputs): Added the ability to handle (name version) pairs * guix/import/crate.scm (make-crate-sexp): cleaned up input field generation --- guix/import/crate.scm | 17 +++++++++-------- guix/import/utils.scm | 21 ++++++++++++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index d711820b81..7e61bc21b6 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -154,16 +154,17 @@ record or #f if it was not found." "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs - (map - (lambda (name-version) - (apply crate-name->package-name name-version)) cargo-inputs)) - (cargo-development-inputs - (map - (lambda (name-version) - (apply crate-name->package-name name-version)) cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index cd92cf7dd8..709cd718f6 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -225,13 +225,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) -- 2.25.1 --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0002-guix-import-crate-Use-semver-to-resovle-module-v.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v11-0002-guix-import-crate-Use-semver-to-resovle-module-v.pa"; filename*1="tch" >From e240ac375abbd5881f58cb9005122bb48691035e Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 03:50:48 -0500 Subject: [PATCH v11 2/9] guix: import: crate: Use semver to resovle module versions * guix/import/crate.scm (make-crate-sexp): formatting, added '#:skip-build?' to build system args; added package definition geneation * guix/import/crate.scm (crate->guix-package): Use semver to resolve the correct module versions * guix/import/crate.scm Added guile-semver as a soft dep * tests/crate.scm: added version data to (recursuve-import) test --- guix/import/crate.scm | 90 +++++++---- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 290 +++++++++++++++++++--------------- 3 files changed, 228 insertions(+), 163 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 57823c3639..d711820b81 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,10 +87,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -150,9 +156,14 @@ VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTIO and LICENSE." (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-inputs)) + (cargo-development-inputs + (map + (lambda (name-version) + (apply crate-name->package-name name-version)) cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -164,9 +175,10 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs - cargo-development-inputs))) + cargo-development-inputs))) (home-page ,(match home-page (() "") (_ home-page))) @@ -177,7 +189,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,14 +200,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -204,21 +221,36 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate))) - (define version* + (define (find-version crate range) + "finds the a vesion of a crate that fulfils the semver " (find (lambda (version) - (string=? (crate-version-number version) - version-number)) + (semver-range-contains-string? + range + (crate-version-number version))) (crate-versions crate))) + (define version* + (find-version crate version-number)) + + (define (sort-map-deps deps) + "sorts the dependencies and maps the dependencies to a list + containing pairs of (name version)" + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -253,7 +282,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; @@ -288,4 +317,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index aa51faebf9..39561d5745 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", + \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -88,18 +90,22 @@ { \"crate_id\": \"intermediate-1\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -132,14 +138,17 @@ { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -172,6 +181,7 @@ { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -252,34 +262,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -334,105 +358,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.25.1 --------------CB40779AD71DBC225DA0375B Content-Type: text/x-patch; charset=UTF-8; name="v11-0001-guix-import-recursive-import-Allow-for-version-n.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v11-0001-guix-import-recursive-import-Allow-for-version-n.pa"; filename*1="tch" >From 3d5b2e6671d90e29868eafdcbce4fb40cbd63c0b Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH v11 1/9] guix: import: (recursive-import) Allow for version numbers This adds a key VERSION to (recursive-import) and move the paramter REPO to a key. This also changes all the things that rely on (recursive-import) * guix/import/utils.scm (package->definition): added optional `append-version?` * guix/import/utils.scm (recursive-import): added key `version` and moved `repo` to be a key * guix/import/cran.scm (cran->guix-package): change `repo` to a key * guix/import/cran.scm (cran-recursive-import): change `repo` to a key * guix/scripts/import/cran.scm: change `repo` to a key * guix/import/elpa.scm (elpa->guix-pakcage): change `repo` to a key * guix/import/elpa.scm (elpa-recursive-import): change `repo` to a key * guix/scripts/import/elpa.scm: change `repo` to a key * guix/import/gem.scm (gem->guix-package): change `repo` to a key * guix/import/gem.scm (recursive-import): change `repo` to a key * guix/import/opam.scm (opam-recurive-import): change `repo` to a key * guix/import/pypi.scm (pypi-recursive-import): change `repo` to a key * guix/import/stackage.scm (stackage-recursive-import): change `repo` to a key --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 4 ++- guix/import/opam.scm | 5 +-- guix/import/pypi.scm | 5 +-- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 71 insertions(+), 41 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bb8226f714..2cef1f4d4a 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -511,7 +512,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -526,8 +527,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..9140bcdc34 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) #:allow-other-keys) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index bd5d5b3569..54f158fa65 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -200,6 +201,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index ae7df8a8b5..5e09220386 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -311,8 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (opam->guix-package name)) #:guix-name ocaml-name->guix-name)) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index f93fa8831f..46012cb135 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2019 Maxim Cournoyer ;;; Copyright © 2020 Jakub Kądziołka ;;; Copyright © 2020 Lars-Dominik Braun +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -492,8 +493,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (project-info-license info))))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (pypi->guix-package name)) #:guix-name python->package-name)) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..6091cf2c64 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 94c8cb040b..cd92cf7dd8 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -250,13 +252,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -391,32 +395,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) + (lambda (node) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.25.1 --------------CB40779AD71DBC225DA0375B-- From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 22 15:26:51 2020 Received: (at 38408) by debbugs.gnu.org; 22 Mar 2020 19:26:51 +0000 Received: from localhost ([127.0.0.1]:50925 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jG6FH-0002xU-6P for submit@debbugs.gnu.org; Sun, 22 Mar 2020 15:26:51 -0400 Received: from wout4-smtp.messagingengine.com ([64.147.123.20]:41009) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jG6FF-0002xH-IM for 38408@debbugs.gnu.org; Sun, 22 Mar 2020 15:26:49 -0400 Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) by mailout.west.internal (Postfix) with ESMTP id 9311543A; Sun, 22 Mar 2020 15:26:43 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute2.internal (MEProxy); Sun, 22 Mar 2020 15:26:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=famulari.name; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=mesmtp; bh=wiRrKlNdrlsz4n8UvrPEwQoh yuu0d7Lj5pEpln75q34=; b=BRKUmfpxSyH0A+zsJT7TyuG6qokXF3+VM9IpvHtZ lSamHkL+EShNwLoG7GbTu0mWKTQuB3tU3XQDRx1Y7RmXnfJGzr5fqTLusnY6pDX7 3uK+6RiLpAiRytpuTG20nj+L9zzshFacsdHCnoEOuGoQ+JBNz7Q+462iTcOguXg8 l8c= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=wiRrKl Ndrlsz4n8UvrPEwQohyuu0d7Lj5pEpln75q34=; b=mJ7Io1EJ1ZkVZq1eE/Bz8F JoG6TN2F1xak7iE0a9kc82RwnaANXSNyiBvDpE5y0YK7qDBCz/U7LBltL2BDJBQq kOCpKpiSAJZIM1o4Qu7jPxSrBpppfQRG9UE8VCNpDh/03uFnTr1rBBiGZeKe7uMR uV0yIFEMoqf8n6sYAcaL5Vt83NU9ys0btefsPP5RKdLNcDl1BWOoaPYOmbS/tqq3 hL5b+c9Foo0UvmHmH64qtzbaxuCpc2P1hBVpqPz7QpenA91jKYO9cRPwwnOAYA6o 4UlgPjbF/0EOk3LwIAeweCMH2ep+1c9Tmi7PIOPsOZAL8+/tp4HSyd/yHBs5A5IQ == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedugedrudegiedguddvjecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd enucfjughrpeffhffvuffkfhggtggujgesthdtredttddtvdenucfhrhhomhepnfgvohcu hfgrmhhulhgrrhhiuceolhgvohesfhgrmhhulhgrrhhirdhnrghmvgeqnecukfhppeejie druddvgedrudefkedrieefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehm rghilhhfrhhomheplhgvohesfhgrmhhulhgrrhhirdhnrghmvg X-ME-Proxy: Received: from localhost (c-76-124-138-63.hsd1.pa.comcast.net [76.124.138.63]) by mail.messagingengine.com (Postfix) with ESMTPA id AD3D83062AFB; Sun, 22 Mar 2020 15:26:42 -0400 (EDT) Date: Sun, 22 Mar 2020 15:26:38 -0400 From: Leo Famulari To: Martin Becze Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix Message-ID: <20200322192638.GA16716@jasmine.lan> References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Ludovic =?iso-8859-1?Q?Court=E8s?= , Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On Sat, Mar 21, 2020 at 02:35:47PM -0400, Martin Becze wrote: > A few things got stale and need to be merged so I have regenerated the patch > set! Let me know if there is anymore things to do. Thanks, I am taking a look at it now. From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 22 16:10:33 2020 Received: (at 38408) by debbugs.gnu.org; 22 Mar 2020 20:10:33 +0000 Received: from localhost ([127.0.0.1]:50937 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jG6vZ-0004CE-1j for submit@debbugs.gnu.org; Sun, 22 Mar 2020 16:10:33 -0400 Received: from wout4-smtp.messagingengine.com ([64.147.123.20]:60223) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jG6vX-0004Br-Mf for 38408@debbugs.gnu.org; Sun, 22 Mar 2020 16:10:32 -0400 Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) by mailout.west.internal (Postfix) with ESMTP id B9326418; Sun, 22 Mar 2020 16:10:25 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Sun, 22 Mar 2020 16:10:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=famulari.name; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=mesmtp; bh=ePdzqKnWYg9fSktINuGMud13 Lh98d0+Xy0PZ1OxRtvk=; b=yrHEbXE11m4/sZckifEMhOBOAIDctjnQSc0kBtJO zKDayqwE/UcBlETHeeKGDYGLg+IeEuOGUzKmSTnm2G17ehzYm8S78Dorh7Entnqm pG9//iZkmqcDcpM1b5wyvtB7bB6WKVBMIh/j0wC/qjfaurGPWZI0EfDEL48XO3SC J0Q= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=ePdzqK nWYg9fSktINuGMud13Lh98d0+Xy0PZ1OxRtvk=; b=dt7TwKHShmwMC7QYB5WhI/ +N+KKvjTK71m8bV2FkwG+HKrtrObKsLeX0Xs+WkBZmg4vnDgqHOtbGPjHAmolQ55 Q7FbzGeivokKWMzRA1FZnSj2Bv2WBwd5ecO+Eq8vwoxdLx/N5kG0PpDY1yPSEYeY Wsf+EorkEYw9UhvWbqBJ7LsxD/tLKM7NGhumQhA2enlZUQhO5cEh7GsbnDNvNXAp T6A0I2LAKcB19qj3BzrMIosPQ2l6Lg1g2uL9VPpUWkP+kFYdHEWM0Jp3ck2R/mbG BB9VOJfFe+P0RoarYjhANNURndzxP9+CadsJB8qqXI/fqOplPYhKbXKDURMAUebw == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedugedrudegiedgudefhecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd enucfjughrpeffhffvuffkfhggtggujgesthdtredttddtvdenucfhrhhomhepnfgvohcu hfgrmhhulhgrrhhiuceolhgvohesfhgrmhhulhgrrhhirdhnrghmvgeqnecukfhppeejie druddvgedrudefkedrieefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehm rghilhhfrhhomheplhgvohesfhgrmhhulhgrrhhirdhnrghmvg X-ME-Proxy: Received: from localhost (c-76-124-138-63.hsd1.pa.comcast.net [76.124.138.63]) by mail.messagingengine.com (Postfix) with ESMTPA id C9A9F328005E; Sun, 22 Mar 2020 16:10:24 -0400 (EDT) Date: Sun, 22 Mar 2020 16:10:18 -0400 From: Leo Famulari To: Martin Becze Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix Message-ID: <20200322201018.GB16716@jasmine.lan> References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Ludovic =?iso-8859-1?Q?Court=E8s?= , Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On Sat, Mar 21, 2020 at 02:35:47PM -0400, Martin Becze wrote: > A few things got stale and need to be merged so I have regenerated the patch > set! Let me know if there is anymore things to do. Alright, I started taking a close look at the patches and they need some more work. At least, the commit messages need to be completed. The importer does work, which is amazing, so we are almost there :) In general, the commit messages need to be rewritten to match our style. This means they should use complete English sentences with standard capitalization and punctuation. I'm happy to help if necessary. English is my native language. We also should try to match previous commit messages that touch the same code, because they are good examples. Take this example, the first patch: > Subject: [PATCH v11 1/9] guix: import: (recursive-import) Allow for version > numbers This commit title should be written like this: import: utils: 'recursive-import' accepts an optional version parameter. I learned that by doing `git log guix/import/utils.scm` and reading the previous commits. > * guix/import/utils.scm (package->definition): added optional `append-version?` > * guix/import/utils.scm (recursive-import): added key `version` and > moved `repo` to be a key When changing multiple variables in the same file, the filename can be mentioned only once. I would write that like this: * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. (package->definition): Accept an optional 'append-version?' key. I began to rewrite the rest of the commit message like this: * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. (cran-recursive-import): Likewise. * guix/import/elpa.scm (elpa->guix-package): Likewise. (elpa-recursive-import): Likewise. * guix/import/gem.scm (gem-recursive-import): Likewise. * guix/scripts/import/cran.scm (guix-import-cran): Likewise. * guix/scripts/import/elpa.scm (guix-import-elpa): Likewise. * guix/import/opam.scm (opam-recursive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. However, I found some issues. > * guix/import/gem.scm (gem->guix-package): change `repo` to a key This change does not exist in this commit. > tests/elpa.scm | 3 +- > tests/import-utils.scm | 8 +++-- And these changes are not mentioned in the commit message. These issues make it hard to review the patches effectively. What do you think? Can you make these changes? From debbugs-submit-bounces@debbugs.gnu.org Mon Mar 23 05:51:01 2020 Received: (at 38408) by debbugs.gnu.org; 23 Mar 2020 09:51:01 +0000 Received: from localhost ([127.0.0.1]:51473 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGJjY-0001Lx-Rv for submit@debbugs.gnu.org; Mon, 23 Mar 2020 05:51:01 -0400 Received: from mx1.riseup.net ([198.252.153.129]:48872) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGJjW-0001Lj-FE for 38408@debbugs.gnu.org; Mon, 23 Mar 2020 05:50:59 -0400 Received: from capuchin.riseup.net (unknown [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48m8lP408nzFfCx; Mon, 23 Mar 2020 02:50:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1584957057; bh=SbCRWsiGO61qqzIBqg6vjXpoz1EvaIGzfp6lLKbZ2rQ=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=kwKo67DDqYtGOnM65EBCF360dQ7/zJVSfRmQxveDd8QOafJ8+bFl418nm8UWdgTPR FT464jPK1nDZtkOXO5e1Y4bfrqmCj/cUGdPiVih7mkK8uSAgmXYQ/zq18L3kqjH+5D XTTS0mrq5bzAahim8zc8oDV7/6nDTzQF0isnhJYk= X-Riseup-User-ID: 6111D830D25861F96DC6F80459F29E84B48A2DE7B1B2CED5AD82DF6919B95988 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48m8lM6Nx8z8t6n; Mon, 23 Mar 2020 02:50:55 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: Leo Famulari References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> From: Martin Becze Message-ID: <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> Date: Mon, 23 Mar 2020 05:50:53 -0400 MIME-Version: 1.0 In-Reply-To: <20200322201018.GB16716@jasmine.lan> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, =?UTF-8?Q?Ludovic_Court=c3=a8s?= , Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Thanks for the feedback Leo! I will work on this today. On 3/22/20 4:10 PM, Leo Famulari wrote: > On Sat, Mar 21, 2020 at 02:35:47PM -0400, Martin Becze wrote: >> A few things got stale and need to be merged so I have regenerated the patch >> set! Let me know if there is anymore things to do. > > Alright, I started taking a close look at the patches and they need some > more work. At least, the commit messages need to be completed. The > importer does work, which is amazing, so we are almost there :) > > In general, the commit messages need to be rewritten to match our style. > This means they should use complete English sentences with standard > capitalization and punctuation. I'm happy to help if necessary. English > is my native language. > > We also should try to match previous commit messages that touch the same > code, because they are good examples. Take this example, the first patch: > >> Subject: [PATCH v11 1/9] guix: import: (recursive-import) Allow for version >> numbers > > This commit title should be written like this: > > import: utils: 'recursive-import' accepts an optional version parameter. > > I learned that by doing `git log guix/import/utils.scm` and reading the > previous commits. > >> * guix/import/utils.scm (package->definition): added optional `append-version?` >> * guix/import/utils.scm (recursive-import): added key `version` and >> moved `repo` to be a key > > When changing multiple variables in the same file, the filename can be > mentioned only once. I would write that like this: > > * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. > (package->definition): Accept an optional 'append-version?' key. > > I began to rewrite the rest of the commit message like this: > > * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. > (cran-recursive-import): Likewise. > * guix/import/elpa.scm (elpa->guix-package): Likewise. > (elpa-recursive-import): Likewise. > * guix/import/gem.scm (gem-recursive-import): Likewise. > * guix/scripts/import/cran.scm (guix-import-cran): Likewise. > * guix/scripts/import/elpa.scm (guix-import-elpa): Likewise. > * guix/import/opam.scm (opam-recursive-import): Likewise. > * guix/import/pypi.scm (pypi-recursive-import): Likewise. > * guix/import/stackage.scm (stackage-recursive-import): Likewise. > > > However, I found some issues. > >> * guix/import/gem.scm (gem->guix-package): change `repo` to a key > > This change does not exist in this commit. > >> tests/elpa.scm | 3 +- >> tests/import-utils.scm | 8 +++-- > > And these changes are not mentioned in the commit message. > > These issues make it hard to review the patches effectively. > > What do you think? Can you make these changes? > From debbugs-submit-bounces@debbugs.gnu.org Mon Mar 23 12:28:24 2020 Received: (at 38408) by debbugs.gnu.org; 23 Mar 2020 16:28:24 +0000 Received: from localhost ([127.0.0.1]:53436 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGPvx-0006On-Qq for submit@debbugs.gnu.org; Mon, 23 Mar 2020 12:28:23 -0400 Received: from mx1.riseup.net ([198.252.153.129]:54320) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGPvu-0006Oe-5k for 38408@debbugs.gnu.org; Mon, 23 Mar 2020 12:28:12 -0400 Received: from capuchin.riseup.net (unknown [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48mKYh31J2zFfjk; Mon, 23 Mar 2020 09:28:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1584980889; bh=ZtKHa4NUA+FQRebcfbwPr/Ymmx2BahaQev46YFN87g4=; h=Subject:From:To:Cc:References:Date:In-Reply-To:From; b=ChPHAT3poEw7wp8HeaY3f08QIT88RqowudTCtvuhzbNWj57D0pgC2iisqfYEuEw3F m8sy+9GUXi6blegE2t7sz+2Ms9OYKa/XmfF8pcf/uvyohIzK2ZeukHxMC7DJ3zy6vU b6YhpL4mIfmSa4OixioBGc0bCZTR6isqucqTGOxg= X-Riseup-User-ID: B0880E4197326CE7CED574AC31ED96256806F6C9CB38D065D0E91B9A62017511 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48mKYf1FKGz8tHv; Mon, 23 Mar 2020 09:28:05 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix From: Martin Becze To: Leo Famulari References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> Message-ID: Date: Mon, 23 Mar 2020 12:28:04 -0400 MIME-Version: 1.0 In-Reply-To: <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> Content-Type: multipart/mixed; boundary="------------0AC17FC6EDF18AC5FE1AEF52" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, =?UTF-8?Q?Ludovic_Court=c3=a8s?= , Efraim Flashner , jsoo1@asu.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Attached I the updated patch set with cleaned up commit log. Let me know if you see any more mistakes. Thanks! On 3/23/20 5:50 AM, Martin Becze wrote: > Thanks for the feedback Leo! I will work on this today. > > On 3/22/20 4:10 PM, Leo Famulari wrote: >> On Sat, Mar 21, 2020 at 02:35:47PM -0400, Martin Becze wrote: >>> A few things got stale and need to be merged so I have regenerated >>> the patch >>> set! Let me know if there is anymore things to do. >> >> Alright, I started taking a close look at the patches and they need some >> more work. At least, the commit messages need to be completed. The >> importer does work, which is amazing, so we are almost there :) >> >> In general, the commit messages need to be rewritten to match our style. >> This means they should use complete English sentences with standard >> capitalization and punctuation. I'm happy to help if necessary. English >> is my native language. >> >> We also should try to match previous commit messages that touch the same >> code, because they are good examples. Take this example, the first patch: >> >>> Subject: [PATCH v11 1/9] guix: import: (recursive-import) Allow for >>> version >>>   numbers >> >> This commit title should be written like this: >> >> import: utils: 'recursive-import' accepts an optional version parameter. >> >> I learned that by doing `git log guix/import/utils.scm` and reading the >> previous commits. >> >>> * guix/import/utils.scm (package->definition): added optional >>> `append-version?` >>> * guix/import/utils.scm (recursive-import): added key `version` and >>>    moved `repo` to be a key >> >> When changing multiple variables in the same file, the filename can be >> mentioned only once. I would write that like this: >> >> * guix/import/utils.scm (recursive-import): Add the VERSION key. Make >> REPO a key. >> (package->definition): Accept an optional 'append-version?' key. >> >> I began to rewrite the rest of the commit message like this: >> >> * guix/import/cran.scm (cran->guix-package): Change the REPO parameter >> to a key. >> (cran-recursive-import): Likewise. >> * guix/import/elpa.scm (elpa->guix-package): Likewise. >> (elpa-recursive-import): Likewise. >> * guix/import/gem.scm (gem-recursive-import): Likewise. >> * guix/scripts/import/cran.scm (guix-import-cran): Likewise. >> * guix/scripts/import/elpa.scm (guix-import-elpa): Likewise. >> * guix/import/opam.scm (opam-recursive-import): Likewise. >> * guix/import/pypi.scm (pypi-recursive-import): Likewise. >> * guix/import/stackage.scm (stackage-recursive-import): Likewise. >> >> >> However, I found some issues. >> >>> * guix/import/gem.scm (gem->guix-package): change `repo` to a key >> >> This change does not exist in this commit. >> >>>   tests/elpa.scm               |  3 +- >>>   tests/import-utils.scm       |  8 +++-- >> >> And these changes are not mentioned in the commit message. >> >> These issues make it hard to review the patches effectively. >> >> What do you think? Can you make these changes? >> > > > --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/x-patch; charset=UTF-8; name="v12-0008-guix-self-Adds-guile-semver-as-a-depenedency.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v12-0008-guix-self-Adds-guile-semver-as-a-depenedency.patch" >From 494f7c874781f64b702e31841c95c95c68fb28fc Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Fri, 21 Feb 2020 10:41:44 -0500 Subject: [PATCH v12 8/8] guix: self: Adds guile-semver as a depenedency. * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. --- guix/self.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index 6b633f9bc0..7da7fdea81 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ ("guile-git" (ref '(gnu packages guile) 'guile3.0-git)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile3.0-sqlite3)) ("guile-gcrypt" (ref '(gnu packages gnupg) 'guile3.0-gcrypt)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("gnutls" (ref '(gnu packages tls) 'guile3.0-gnutls)) ("zlib" (ref '(gnu packages compression) 'zlib)) ("lzlib" (ref '(gnu packages compression) 'lzlib)) @@ -682,6 +684,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -690,7 +695,7 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3)) + guile-ssh guile-sqlite3 guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.25.1 --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/x-patch; charset=UTF-8; name="v12-0007-gnu-Add-guile3.0-semver.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="v12-0007-gnu-Add-guile3.0-semver.patch" >From 492db2aed32bb68e50eb43660d5ec3811fdb9a80 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Sun, 23 Feb 2020 04:27:42 -0500 Subject: [PATCH v12 7/8] gnu: Add guile3.0-semver. * gnu/packages/guile-xyz.scm (guile3.0-semver): New variable. --- gnu/packages/guile-xyz.scm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm index a2430b7ea3..09427da487 100644 --- a/gnu/packages/guile-xyz.scm +++ b/gnu/packages/guile-xyz.scm @@ -23,6 +23,7 @@ ;;; Copyright © 2019 swedebugia ;;; Copyright © 2019, 2020 Amar Singh ;;; Copyright © 2019 Timothy Sample +;;; Copyright © 2019 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -2996,6 +2997,13 @@ comparing, and writing Semantic Versions. It also includes ranges in the style of the Node Package Manager (NPM).") (license license:gpl3+))) +(define-public guile3.0-semver + (package + (inherit guile-semver) + (name "guile3.0-semver") + (inputs + `(("guile" ,guile-3.0))))) + (define-public guile-hashing (package (name "guile-hashing") -- 2.25.1 --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/x-patch; charset=UTF-8; name="v12-0006-import-crate-Parametrized-importing-of-dev-depen.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v12-0006-import-crate-Parametrized-importing-of-dev-depen.pa"; filename*1="tch" >From 2561fbf64e7ea47a0436b3751cbeea0032f8a77b Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 3 Feb 2020 16:19:49 -0500 Subject: [PATCH v12 6/8] import: crate: Parametrized importing of dev dependencies. This changes the behavoir of the recusive crate importer so that it will include importing of development dependencies for the top level package but will not inculded the development dependencies for any other imported package. * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. (crate-recursive-import): Likewise. * guix/scripts/import/crate.scm (guix-import-crate): Likewise. * tests/crate.scm (cargo-recursive-import): Likewise. --- guix/import/crate.scm | 28 ++++++++++++++++++++-------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 00ac6ee318..91e38839bd 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -152,7 +152,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license + home-page synopsis description license build? #:allow-other-keys) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, @@ -179,7 +179,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -204,11 +206,13 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version #:allow-other-keys) +(define* (crate->guix-package crate-name #:key version include-dev-deps? + #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -254,9 +258,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-deps dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-deps dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -266,13 +273,18 @@ latest version of CRATE-NAME." #:description (crate-description crate) #:license (and=> (crate-version-license version*) string->license)) - cargo-inputs)))) + (append cargo-inputs cargo-development-inputs))))) (define mem-crate->guix-package (memoize crate->guix-package)) (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package mem-crate->guix-package + #:repo->guix-package + (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name))) + (apply mem-crate->guix-package + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 893dd70fc9..6fb9b772d8 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -461,8 +461,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.25.1 --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/x-patch; charset=UTF-8; name="v12-0005-import-utils-Trim-patch-version-from-names.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v12-0005-import-utils-Trim-patch-version-from-names.patch" >From cb69a7c4844c68f89b783a1026751ab945fcab5d Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:19:13 -0500 Subject: [PATCH v12 5/8] import: utils: Trim patch version from names. This remove the the patch version from input names. For example 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1' * guix/import/utils.scm (package->definition): Trim patch version from generated package names. * tests/crate.scm: (cargo>guix-package): Likewise. (cargo-recursive-import): Likewise. --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 44 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 709cd718f6..a0aacdc6de 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -265,9 +265,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index 39561d5745..893dd70fc9 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -279,7 +279,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -295,7 +295,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -358,7 +358,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -377,7 +377,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -396,7 +396,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -413,13 +413,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" + (("rust-leaf-bob" ('unquote rust-leaf-bob-1.0.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -436,17 +436,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -463,14 +463,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.25.1 --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/x-patch; charset=UTF-8; name="v12-0004-import-crate-Memorize-crate-guix-package.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v12-0004-import-crate-Memorize-crate-guix-package.patch" >From 3f2dbc2a47a2e5e46871fbdeabe951f55d26b557 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:17:00 -0500 Subject: [PATCH v12 4/8] import: crate: Memorize crate->guix-package. This adds memorization to procedures that involve network lookups. 'mem-lookup-crate; is used on every dependency of a package to find it's versions. 'mem-crate->guix-package; is needed becuase 'topological-sort' depduplicates after dependencies have been turned into packages. * guix/import/crate.scm (mem-crate->guix-package): New procedure. (mem-lookup-crate): New procedure. --- guix/import/crate.scm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index b2a3dd7e70..00ac6ee318 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -111,6 +112,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define mem-lookup-crate (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -216,7 +219,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (mem-lookup-crate crate-name)) (define version-number (or version @@ -238,7 +241,7 @@ latest version of CRATE-NAME." containing pairs of (name version)" (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (mem-lookup-crate name)) (req (crate-dependency-requirement dep)) (ver (find-version crate req))) (list name @@ -265,9 +268,11 @@ latest version of CRATE-NAME." string->license)) cargo-inputs)))) +(define mem-crate->guix-package (memoize crate->guix-package)) + (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package mem-crate->guix-package #:version version #:guix-name crate-name->package-name)) -- 2.25.1 --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/x-patch; charset=UTF-8; name="v12-0003-import-crate-Deduplicate-dependencies.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v12-0003-import-crate-Deduplicate-dependencies.patch" >From 81056961d065e197fe8f1f2096c858776debf485 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 10:52:28 -0500 Subject: [PATCH v12 3/8] import: crate: Deduplicate dependencies. * guix/import/crate.scm (crate-version-dependencies): Deduplicate crate dependencies. --- guix/import/crate.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 7e61bc21b6..b2a3dd7e70 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -118,7 +118,7 @@ record or #f if it was not found." (url (string-append (%crate-base-url) path))) (match (assoc-ref (or (json-fetch url) '()) "dependencies") ((? vector? vector) - (map json->crate-dependency (vector->list vector))) + (delete-duplicates (map json->crate-dependency (vector->list vector)))) (_ '())))) -- 2.25.1 --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/x-patch; charset=UTF-8; name="v12-0002-import-crate-Use-guile-semver-to-resovle-module-.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v12-0002-import-crate-Use-guile-semver-to-resovle-module-.pa"; filename*1="tch" >From 98129432b4d746fd2a12a005ebe2d36e8ee0f600 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 03:50:48 -0500 Subject: [PATCH v12 2/8] import: crate: Use guile-semver to resovle module versions. * guix/import/crate.scm (make-crate-sexp): Added '#:skip-build?' to build system args. Pass a VERSION argument to 'cargo-inputs'. Move 'package-definition' from scripts/import/crate.scm to here. (crate->guix-package): Use guile-semver to resolve the correct module versions. (crate-name->package-name): Reuse the procedure 'guix-name' instead of duplicating its logic. (module) Added guile-semver as a soft dependency. * guix/import/utils.scm (package-names->package-inputs): Implemented handling of (name version) pairs. * guix/scripts/import/crate.scm (guix-import-crate): Move 'package-definition' from here to guix/import/crate.scm. * tests/crate.scm: (recursuve-import) Added version data to the test. --- guix/import/crate.scm | 91 +++++++---- guix/import/utils.scm | 21 ++- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 290 +++++++++++++++++++--------------- 4 files changed, 243 insertions(+), 170 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 57823c3639..7e61bc21b6 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,10 +87,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -148,11 +154,17 @@ record or #f if it was not found." "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -164,9 +176,10 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs - cargo-development-inputs))) + cargo-development-inputs))) (home-page ,(match home-page (() "") (_ home-page))) @@ -177,7 +190,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,14 +201,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -204,21 +222,36 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate))) - (define version* + (define (find-version crate range) + "finds the a vesion of a crate that fulfils the semver " (find (lambda (version) - (string=? (crate-version-number version) - version-number)) + (semver-range-contains-string? + range + (crate-version-number version))) (crate-versions crate))) + (define version* + (find-version crate version-number)) + + (define (sort-map-deps deps) + "sorts the dependencies and maps the dependencies to a list + containing pairs of (name version)" + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -253,7 +283,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; @@ -288,4 +318,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/import/utils.scm b/guix/import/utils.scm index cd92cf7dd8..709cd718f6 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -225,13 +225,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index aa51faebf9..39561d5745 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", + \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -88,18 +90,22 @@ { \"crate_id\": \"intermediate-1\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -132,14 +138,17 @@ { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -172,6 +181,7 @@ { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -252,34 +262,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -334,105 +358,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.25.1 --------------0AC17FC6EDF18AC5FE1AEF52 Content-Type: text/x-patch; charset=UTF-8; name="v12-0001-import-utils-recursive-import-accepts-an-optiona.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v12-0001-import-utils-recursive-import-accepts-an-optiona.pa"; filename*1="tch" >From 356bf29011097367a6e95dd45e71050db8bfa8e4 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH v12 1/8] import: utils: 'recursive-import' accepts an optional version parameter. This adds a key VERSION to 'recursive-import' and move the paramter REPO to a key. This also changes all the things that rely on 'recursive-import' * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. (package->definition): Added optional 'append-version?'. * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. (cran-recursive-import): Likewise. * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. (elpa-recursive-import): Likewise. * guix/import/gem.scm (gem->guix-package): Likewise. (recursive-import): Likewise. * guix/import/opam.scm (opam-recurive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. * tests/elpa.scm: (eval-test-with-elpa) Likewise. * tests/import-utils.scm Likewise. --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 5 +-- guix/import/pypi.scm | 5 +-- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 72 insertions(+), 42 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bb8226f714..2cef1f4d4a 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -511,7 +512,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -526,8 +527,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..9140bcdc34 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) #:allow-other-keys) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index bd5d5b3569..345d6f003c 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -122,7 +123,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((gem (rubygems-fetch package-name))) @@ -200,6 +201,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index ae7df8a8b5..5e09220386 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -311,8 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (opam->guix-package name)) #:guix-name ocaml-name->guix-name)) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index f93fa8831f..46012cb135 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2019 Maxim Cournoyer ;;; Copyright © 2020 Jakub Kądziołka ;;; Copyright © 2020 Lars-Dominik Braun +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -492,8 +493,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (project-info-license info))))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (pypi->guix-package name)) #:guix-name python->package-name)) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..6091cf2c64 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda (name . _) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 94c8cb040b..cd92cf7dd8 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -250,13 +252,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -391,32 +395,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) + (lambda (node) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.25.1 --------------0AC17FC6EDF18AC5FE1AEF52-- From debbugs-submit-bounces@debbugs.gnu.org Tue Mar 24 06:18:21 2020 Received: (at 38408) by debbugs.gnu.org; 24 Mar 2020 10:18:22 +0000 Received: from localhost ([127.0.0.1]:53914 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGgdZ-0002kk-DF for submit@debbugs.gnu.org; Tue, 24 Mar 2020 06:18:21 -0400 Received: from eggs.gnu.org ([209.51.188.92]:36257) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGgdW-0002kS-EN for 38408@debbugs.gnu.org; Tue, 24 Mar 2020 06:18:19 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:44811) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1jGgdP-00039v-Fp; Tue, 24 Mar 2020 06:18:11 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=44460 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jGgdO-0006NB-TA; Tue, 24 Mar 2020 06:18:11 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Martin Becze Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 5 Germinal an 228 de la =?utf-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Tue, 24 Mar 2020 11:18:08 +0100 In-Reply-To: (Martin Becze's message of "Mon, 23 Mar 2020 12:28:04 -0400") Message-ID: <87mu86njj3.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Martin & all, I apologize for taking so long and dropping the ball. Partly that=E2=80=99s because this is non-trivial, thanks for working on it, Martin! Some quick comments: Martin Becze skribis: > From 494f7c874781f64b702e31841c95c95c68fb28fc Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Fri, 21 Feb 2020 10:41:44 -0500 > Subject: [PATCH v12 8/8] guix: self: Adds guile-semver as a depenedency. > > * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. Good. > From 492db2aed32bb68e50eb43660d5ec3811fdb9a80 Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Sun, 23 Feb 2020 04:27:42 -0500 > Subject: [PATCH v12 7/8] gnu: Add guile3.0-semver. > > * gnu/packages/guile-xyz.scm (guile3.0-semver): New variable. Applied. > From 2561fbf64e7ea47a0436b3751cbeea0032f8a77b Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Mon, 3 Feb 2020 16:19:49 -0500 > Subject: [PATCH v12 6/8] import: crate: Parametrized importing of dev > dependencies. > > This changes the behavoir of the recusive crate importer so that it will > include importing of development dependencies for the top level package > but will not inculded the development dependencies for any other imported > package. > > * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. > (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. > (crate-recursive-import): Likewise. > * guix/scripts/import/crate.scm (guix-import-crate): Likewise. > * tests/crate.scm (cargo-recursive-import): Likewise. LGTM. > From cb69a7c4844c68f89b783a1026751ab945fcab5d Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Thu, 30 Jan 2020 11:19:13 -0500 > Subject: [PATCH v12 5/8] import: utils: Trim patch version from names. > > This remove the the patch version from input names. For example > 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1' > > * guix/import/utils.scm (package->definition): Trim patch version from > generated package names. > * tests/crate.scm: (cargo>guix-package): Likewise. > (cargo-recursive-import): Likewise. LGTM. > From 3f2dbc2a47a2e5e46871fbdeabe951f55d26b557 Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Thu, 30 Jan 2020 11:17:00 -0500 > Subject: [PATCH v12 4/8] import: crate: Memorize crate->guix-package. > > This adds memorization to procedures that involve network lookups. > 'mem-lookup-crate; is used on every dependency of a package to find > it's versions. 'mem-crate->guix-package; is needed becuase > 'topological-sort' depduplicates after dependencies have been turned > into packages. > > * guix/import/crate.scm (mem-crate->guix-package): New procedure. > (mem-lookup-crate): New procedure. This should also mention changes to =E2=80=98crate-recursive-import=E2=80= =99. Regarding identifiers, please avoid abbreviations (info "(guix) Formatting Code"). > +(define mem-lookup-crate (memoize lookup-crate)) > + > (define (crate-version-dependencies version) > "Return the list of records of VERSION, a > ." > @@ -216,7 +219,7 @@ latest version of CRATE-NAME." > (eq? (crate-dependency-kind dependency) 'normal))) >=20=20 > (define crate > - (lookup-crate crate-name)) > + (mem-lookup-crate crate-name)) I=E2=80=99d suggest calling =E2=80=98mem-lookup-crate=E2=80=99 =E2=80=98loo= kup-crate*=E2=80=99 for instance. Can we also make its definition local to =E2=80=98crate-version-dependencie= s=E2=80=99 or would that defeat your caching goals? > (define version-number > (or version > @@ -238,7 +241,7 @@ latest version of CRATE-NAME." > containing pairs of (name version)" > (sort (map (lambda (dep) > (let* ((name (crate-dependency-id dep)) > - (crate (lookup-crate name)) > + (crate (mem-lookup-crate name)) > (req (crate-dependency-requirement dep)) > (ver (find-version crate req))) > (list name > @@ -265,9 +268,11 @@ latest version of CRATE-NAME." > string->license)) > cargo-inputs)))) >=20=20 > +(define mem-crate->guix-package (memoize crate->guix-package)) > + > (define* (crate-recursive-import crate-name #:key version) > (recursive-import crate-name > - #:repo->guix-package crate->guix-package > + #:repo->guix-package mem-crate->guix-package Please make =E2=80=98mem-crate->guix-package=E2=80=99 local to =E2=80=98cra= te-recursive-import=E2=80=99 and call it =E2=80=98crate->guix-package*=E2=80=99 for instance. (Memoization should always be used as a last resort: it=E2=80=99s a neat ha= ck, but it=E2=80=99s a hack. :-) In particular, it has the problem that its c= ache cannot be easily invalidated. That said, I realize that other importers do this already, so that=E2=80=99s OK.) > From 81056961d065e197fe8f1f2096c858776debf485 Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Thu, 30 Jan 2020 10:52:28 -0500 > Subject: [PATCH v12 3/8] import: crate: Deduplicate dependencies. > > * guix/import/crate.scm (crate-version-dependencies): Deduplicate crate d= ependencies. Applied. > From 98129432b4d746fd2a12a005ebe2d36e8ee0f600 Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Tue, 4 Feb 2020 03:50:48 -0500 > Subject: [PATCH v12 2/8] import: crate: Use guile-semver to resovle module ^^ Typo. :-) > * guix/import/crate.scm (make-crate-sexp): Added '#:skip-build?' to build > system args. Pass a VERSION argument to 'cargo-inputs'. Move > 'package-definition' from scripts/import/crate.scm to here. > (crate->guix-package): Use guile-semver to resolve the correct module = versions. > (crate-name->package-name): Reuse the procedure 'guix-name' instead of > duplicating its logic. > (module) Added guile-semver as a soft dependency. > * guix/import/utils.scm (package-names->package-inputs): Implemented > handling of (name version) pairs. > * guix/scripts/import/crate.scm (guix-import-crate): Move > 'package-definition' from here to guix/import/crate.scm. > * tests/crate.scm: (recursuve-import) Added version data to the test. [...] > + (define (format-inputs inputs) > + (map > + (match-lambda > + ((name version) (list (crate-name->package-name name) > + (version-major+minor version)))) > + inputs)) Nitpick: please format as: (map (match-lambda ((name version) (list =E2=80=A6))) inputs) > +(define* (crate->guix-package crate-name #:key version #:allow-other-key= s) Please avoid #:allow-other-keys. In general, it=E2=80=99s best to know exa= ctly what parameters a procedure expects and to benefit from compile-time warnings when we make a mistake; thus, #:allow-other-keys should only be used as a last resort. > + (define (find-version crate range) > + "finds the a vesion of a crate that fulfils the semver " ^ ^ Typos. For inner procedures, please write a comment instead of a docstring. > From 356bf29011097367a6e95dd45e71050db8bfa8e4 Mon Sep 17 00:00:00 2001 > From: Martin Becze > Date: Tue, 4 Feb 2020 07:18:18 -0500 > Subject: [PATCH v12 1/8] import: utils: 'recursive-import' accepts an opt= ional > version parameter. > > This adds a key VERSION to 'recursive-import' and move the paramter REPO = to a > key. This also changes all the things that rely on 'recursive-import' > > * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REP= O a > key. > (package->definition): Added optional 'append-version?'. > * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to= a key. > (cran-recursive-import): Likewise. > * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. > (elpa-recursive-import): Likewise. > * guix/import/gem.scm (gem->guix-package): Likewise. > (recursive-import): Likewise. > * guix/import/opam.scm (opam-recurive-import): Likewise. > * guix/import/pypi.scm (pypi-recursive-import): Likewise. > * guix/import/stackage.scm (stackage-recursive-import): Likewise. > * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. > * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. > * tests/elpa.scm: (eval-test-with-elpa) Likewise. > * tests/import-utils.scm Likewise. [...] > (define cran->guix-package > (memoize > - (lambda* (package-name #:optional (repo 'cran)) > + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) I would change #:allow-other-keys to just =E2=80=98version=E2=80=99 (a #:ve= rsion parameter) in all the importers. It does mean that #:version would be ignored by those importers, so perhaps we can add a TODO comment, but eventually someone might implement it. If you want you can resubmit patches #1 and #2 to begin with. Thank you! Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Tue Mar 24 10:19:22 2020 Received: (at 38408) by debbugs.gnu.org; 24 Mar 2020 14:19:22 +0000 Received: from localhost ([127.0.0.1]:55410 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGkOo-0005FR-CU for submit@debbugs.gnu.org; Tue, 24 Mar 2020 10:19:22 -0400 Received: from mx1.riseup.net ([198.252.153.129]:58786) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGkOm-0005FH-0W for 38408@debbugs.gnu.org; Tue, 24 Mar 2020 10:19:20 -0400 Received: from bell.riseup.net (unknown [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48mtfY5vWyzFfKg; Tue, 24 Mar 2020 07:19:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1585059558; bh=y3nAln+N5KBumGV8JyC9wt37hLihjS1uFSOJU4yO7Ts=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=aUg+l06LgTfKKX2tVPMNykzr3vevWAN8I6w74OpXMkVRMHhnRlMRi8S1dEvk9s4c4 +2lqE2/OmUXQmMmfmVZtJ+NYLGHrQmFA/41lhp7paL3GyQX64gtCaaJfhtQ/gCxOJ9 CiLFkJpiWhtigHCjesrgHCSj/KRj2lyMbG6wf4Sk= X-Riseup-User-ID: B098F83C91A006DEF8E99CB92C75B47130AB3F6A40B7A6904C1742FE739FADC8 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 48mtfW6P01zJp2R; Tue, 24 Mar 2020 07:19:15 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> From: Martin Becze Message-ID: <34c9958a-2453-601d-574f-9c9d59214b17@riseup.net> Date: Tue, 24 Mar 2020 10:19:12 -0400 MIME-Version: 1.0 In-Reply-To: <87mu86njj3.fsf@gnu.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Thanks for the feedback Ludo! I will try to get this done today. On 3/24/20 6:18 AM, Ludovic Courtès wrote: > Hi Martin & all, > > I apologize for taking so long and dropping the ball. Partly that’s > because this is non-trivial, thanks for working on it, Martin! > > Some quick comments: > > Martin Becze skribis: > >> From 494f7c874781f64b702e31841c95c95c68fb28fc Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Fri, 21 Feb 2020 10:41:44 -0500 >> Subject: [PATCH v12 8/8] guix: self: Adds guile-semver as a depenedency. >> >> * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. > > Good. > >> From 492db2aed32bb68e50eb43660d5ec3811fdb9a80 Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Sun, 23 Feb 2020 04:27:42 -0500 >> Subject: [PATCH v12 7/8] gnu: Add guile3.0-semver. >> >> * gnu/packages/guile-xyz.scm (guile3.0-semver): New variable. > > Applied. > >> From 2561fbf64e7ea47a0436b3751cbeea0032f8a77b Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Mon, 3 Feb 2020 16:19:49 -0500 >> Subject: [PATCH v12 6/8] import: crate: Parametrized importing of dev >> dependencies. >> >> This changes the behavoir of the recusive crate importer so that it will >> include importing of development dependencies for the top level package >> but will not inculded the development dependencies for any other imported >> package. >> >> * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. >> (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. >> (crate-recursive-import): Likewise. >> * guix/scripts/import/crate.scm (guix-import-crate): Likewise. >> * tests/crate.scm (cargo-recursive-import): Likewise. > > LGTM. > >> From cb69a7c4844c68f89b783a1026751ab945fcab5d Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Thu, 30 Jan 2020 11:19:13 -0500 >> Subject: [PATCH v12 5/8] import: utils: Trim patch version from names. >> >> This remove the the patch version from input names. For example >> 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1' >> >> * guix/import/utils.scm (package->definition): Trim patch version from >> generated package names. >> * tests/crate.scm: (cargo>guix-package): Likewise. >> (cargo-recursive-import): Likewise. > > LGTM. > >> From 3f2dbc2a47a2e5e46871fbdeabe951f55d26b557 Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Thu, 30 Jan 2020 11:17:00 -0500 >> Subject: [PATCH v12 4/8] import: crate: Memorize crate->guix-package. >> >> This adds memorization to procedures that involve network lookups. >> 'mem-lookup-crate; is used on every dependency of a package to find >> it's versions. 'mem-crate->guix-package; is needed becuase >> 'topological-sort' depduplicates after dependencies have been turned >> into packages. >> >> * guix/import/crate.scm (mem-crate->guix-package): New procedure. >> (mem-lookup-crate): New procedure. > > This should also mention changes to ‘crate-recursive-import’. > > Regarding identifiers, please avoid abbreviations (info "(guix) > Formatting Code"). > >> +(define mem-lookup-crate (memoize lookup-crate)) >> + >> (define (crate-version-dependencies version) >> "Return the list of records of VERSION, a >> ." >> @@ -216,7 +219,7 @@ latest version of CRATE-NAME." >> (eq? (crate-dependency-kind dependency) 'normal))) >> >> (define crate >> - (lookup-crate crate-name)) >> + (mem-lookup-crate crate-name)) > > I’d suggest calling ‘mem-lookup-crate’ ‘lookup-crate*’ for instance. > Can we also make its definition local to ‘crate-version-dependencies’ or > would that defeat your caching goals? > >> (define version-number >> (or version >> @@ -238,7 +241,7 @@ latest version of CRATE-NAME." >> containing pairs of (name version)" >> (sort (map (lambda (dep) >> (let* ((name (crate-dependency-id dep)) >> - (crate (lookup-crate name)) >> + (crate (mem-lookup-crate name)) >> (req (crate-dependency-requirement dep)) >> (ver (find-version crate req))) >> (list name >> @@ -265,9 +268,11 @@ latest version of CRATE-NAME." >> string->license)) >> cargo-inputs)))) >> >> +(define mem-crate->guix-package (memoize crate->guix-package)) >> + >> (define* (crate-recursive-import crate-name #:key version) >> (recursive-import crate-name >> - #:repo->guix-package crate->guix-package >> + #:repo->guix-package mem-crate->guix-package > > Please make ‘mem-crate->guix-package’ local to ‘crate-recursive-import’ > and call it ‘crate->guix-package*’ for instance. > > (Memoization should always be used as a last resort: it’s a neat hack, > but it’s a hack. :-) In particular, it has the problem that its cache > cannot be easily invalidated. That said, I realize that other importers > do this already, so that’s OK.) > >> From 81056961d065e197fe8f1f2096c858776debf485 Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Thu, 30 Jan 2020 10:52:28 -0500 >> Subject: [PATCH v12 3/8] import: crate: Deduplicate dependencies. >> >> * guix/import/crate.scm (crate-version-dependencies): Deduplicate crate dependencies. > > Applied. > >> From 98129432b4d746fd2a12a005ebe2d36e8ee0f600 Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Tue, 4 Feb 2020 03:50:48 -0500 >> Subject: [PATCH v12 2/8] import: crate: Use guile-semver to resovle module > ^^ > Typo. :-) > > >> * guix/import/crate.scm (make-crate-sexp): Added '#:skip-build?' to build >> system args. Pass a VERSION argument to 'cargo-inputs'. Move >> 'package-definition' from scripts/import/crate.scm to here. >> (crate->guix-package): Use guile-semver to resolve the correct module versions. >> (crate-name->package-name): Reuse the procedure 'guix-name' instead of >> duplicating its logic. >> (module) Added guile-semver as a soft dependency. >> * guix/import/utils.scm (package-names->package-inputs): Implemented >> handling of (name version) pairs. >> * guix/scripts/import/crate.scm (guix-import-crate): Move >> 'package-definition' from here to guix/import/crate.scm. >> * tests/crate.scm: (recursuve-import) Added version data to the test. > > [...] > >> + (define (format-inputs inputs) >> + (map >> + (match-lambda >> + ((name version) (list (crate-name->package-name name) >> + (version-major+minor version)))) >> + inputs)) > > Nitpick: please format as: > > (map (match-lambda > ((name version) > (list …))) > inputs) > >> +(define* (crate->guix-package crate-name #:key version #:allow-other-keys) > > Please avoid #:allow-other-keys. In general, it’s best to know exactly > what parameters a procedure expects and to benefit from compile-time > warnings when we make a mistake; thus, #:allow-other-keys should only be > used as a last resort. > >> + (define (find-version crate range) >> + "finds the a vesion of a crate that fulfils the semver " > ^ ^ > Typos. > For inner procedures, please write a comment instead of a docstring. > >> From 356bf29011097367a6e95dd45e71050db8bfa8e4 Mon Sep 17 00:00:00 2001 >> From: Martin Becze >> Date: Tue, 4 Feb 2020 07:18:18 -0500 >> Subject: [PATCH v12 1/8] import: utils: 'recursive-import' accepts an optional >> version parameter. >> >> This adds a key VERSION to 'recursive-import' and move the paramter REPO to a >> key. This also changes all the things that rely on 'recursive-import' >> >> * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a >> key. >> (package->definition): Added optional 'append-version?'. >> * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. >> (cran-recursive-import): Likewise. >> * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. >> (elpa-recursive-import): Likewise. >> * guix/import/gem.scm (gem->guix-package): Likewise. >> (recursive-import): Likewise. >> * guix/import/opam.scm (opam-recurive-import): Likewise. >> * guix/import/pypi.scm (pypi-recursive-import): Likewise. >> * guix/import/stackage.scm (stackage-recursive-import): Likewise. >> * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. >> * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. >> * tests/elpa.scm: (eval-test-with-elpa) Likewise. >> * tests/import-utils.scm Likewise. > > [...] > >> (define cran->guix-package >> (memoize >> - (lambda* (package-name #:optional (repo 'cran)) >> + (lambda* (package-name #:key (repo 'cran) #:allow-other-keys) > > I would change #:allow-other-keys to just ‘version’ (a #:version > parameter) in all the importers. > > It does mean that #:version would be ignored by those importers, so > perhaps we can add a TODO comment, but eventually someone might > implement it. > > If you want you can resubmit patches #1 and #2 to begin with. > > Thank you! > > Ludo’. > From debbugs-submit-bounces@debbugs.gnu.org Tue Mar 24 15:01:19 2020 Received: (at 38408) by debbugs.gnu.org; 24 Mar 2020 19:01:19 +0000 Received: from localhost ([127.0.0.1]:55608 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGonV-0001zZ-T2 for submit@debbugs.gnu.org; Tue, 24 Mar 2020 15:01:19 -0400 Received: from mx1.riseup.net ([198.252.153.129]:41430) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jGonS-0001zK-3D for 38408@debbugs.gnu.org; Tue, 24 Mar 2020 15:01:08 -0400 Received: from capuchin.riseup.net (unknown [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 48n0tY4STQzFfX1; Tue, 24 Mar 2020 12:00:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1585076464; bh=IiZjAUEcHFIll5Zpe6KjPYk2Xud1WrZsF8ncWa2Sil0=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=LKPwQIfovT6TlYXFuk6tgY42CVfnrhZO0cUvKFmBUky1edRqV7Xdn7yklKr7DPbG4 baGyqhR26xlPXtrppfvN3oZRDxJYmlLwaH8ItkHmDg4+l5E729IvQ+zL7g/EyqYIkQ 2FNZSII7LbwfrA1yg1YcaTNLMZlsu1UkxNLF9Vcg= X-Riseup-User-ID: 06A053884244EAFB01C1EE7C0464B61145940EB94742E3FC47443064F3F05DF6 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 48n0tV5l8Zz8tJk; Tue, 24 Mar 2020 12:00:02 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> From: Martin Becze Message-ID: <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> Date: Tue, 24 Mar 2020 15:00:01 -0400 MIME-Version: 1.0 In-Reply-To: <87mu86njj3.fsf@gnu.org> Content-Type: multipart/mixed; boundary="------------C75C5AFF3F0EC8C4AA52A5D4" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------C75C5AFF3F0EC8C4AA52A5D4 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Ok Ludo, so I think I have worked through everything that you mentioned and attached is a new patch set. On 3/24/20 6:18 AM, Ludovic Courtès wrote: >> +(define mem-lookup-crate (memoize lookup-crate)) >> + >> (define (crate-version-dependencies version) >> "Return the list of records of VERSION, a >> ." >> @@ -216,7 +219,7 @@ latest version of CRATE-NAME." >> (eq? (crate-dependency-kind dependency) 'normal))) >> >> (define crate >> - (lookup-crate crate-name)) >> + (mem-lookup-crate crate-name)) > > I’d suggest calling ‘mem-lookup-crate’ ‘lookup-crate*’ for instance. > Can we also make its definition local to ‘crate-version-dependencies’ or > would that defeat your caching goals? I think it would, 'crate-version-dependencies' only deal with looking up the dependencies. If I made it local 'crate->guix-package' it aslo wouldn't work because we to cache across multiple calls to 'crate->guix-package'. >> (define version-number >> (or version >> @@ -238,7 +241,7 @@ latest version of CRATE-NAME." >> containing pairs of (name version)" >> (sort (map (lambda (dep) >> (let* ((name (crate-dependency-id dep)) >> - (crate (lookup-crate name)) >> + (crate (mem-lookup-crate name)) >> (req (crate-dependency-requirement dep)) >> (ver (find-version crate req))) >> (list name >> @@ -265,9 +268,11 @@ latest version of CRATE-NAME." >> string->license)) >> cargo-inputs)))) >> >> +(define mem-crate->guix-package (memoize crate->guix-package)) >> + >> (define* (crate-recursive-import crate-name #:key version) >> (recursive-import crate-name >> - #:repo->guix-package crate->guix-package >> + #:repo->guix-package mem-crate->guix-package > > Please make ‘mem-crate->guix-package’ local to ‘crate-recursive-import’ > and call it ‘crate->guix-package*’ for instance. > > (Memoization should always be used as a last resort: it’s a neat hack, > but it’s a hack. :-) In particular, it has the problem that its cache > cannot be easily invalidated. That said, I realize that other importers > do this already, so that’s OK.) Understood. If its any trouble it is easy to drop this commit. Though on slow networks it can help quite a bit. Let me know if anything else needs changed! Thanks, Martni --------------C75C5AFF3F0EC8C4AA52A5D4 Content-Type: text/x-patch; charset=UTF-8; name="v13-0006-guix-self-Adds-guile-semver-as-a-depenedency.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v13-0006-guix-self-Adds-guile-semver-as-a-depenedency.patch" >From 1eefe635b4d0fd42a62bc1b8896f35224416e0f7 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Fri, 21 Feb 2020 10:41:44 -0500 Subject: [PATCH v13 6/6] guix: self: Adds guile-semver as a depenedency. * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. --- guix/self.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index 6b633f9bc0..7da7fdea81 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ ("guile-git" (ref '(gnu packages guile) 'guile3.0-git)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile3.0-sqlite3)) ("guile-gcrypt" (ref '(gnu packages gnupg) 'guile3.0-gcrypt)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("gnutls" (ref '(gnu packages tls) 'guile3.0-gnutls)) ("zlib" (ref '(gnu packages compression) 'zlib)) ("lzlib" (ref '(gnu packages compression) 'lzlib)) @@ -682,6 +684,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -690,7 +695,7 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3)) + guile-ssh guile-sqlite3 guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.25.2 --------------C75C5AFF3F0EC8C4AA52A5D4 Content-Type: text/x-patch; charset=UTF-8; name="v13-0005-import-crate-Parametrized-importing-of-dev-depen.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v13-0005-import-crate-Parametrized-importing-of-dev-depen.pa"; filename*1="tch" >From 9a8281e0836a6304db61930490c45a88aea5eb45 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 3 Feb 2020 16:19:49 -0500 Subject: [PATCH v13 5/6] import: crate: Parametrized importing of dev dependencies. This changes the behavoir of the recusive crate importer so that it will include importing of development dependencies for the top level package but will not inculded the development dependencies for any other imported package. * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. (crate-recursive-import): Likewise. * guix/scripts/import/crate.scm (guix-import-crate): Likewise. * tests/crate.scm (cargo-recursive-import): Likewise. --- guix/import/crate.scm | 27 +++++++++++++++++++-------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 96cf8d9b55..622b0c1975 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -152,7 +152,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license) + home-page synopsis description license build?) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." @@ -179,7 +179,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -204,11 +206,12 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version repo) +(define* (crate->guix-package crate-name #:key version include-dev-deps? repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -254,9 +257,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-dependencies dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-dependencies dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -266,11 +272,16 @@ latest version of CRATE-NAME." #:description (crate-description crate) #:license (and=> (crate-version-license version*) string->license)) - cargo-inputs)))) + (append cargo-inputs cargo-development-inputs))))) (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package (memoize crate->guix-package) + #:repo->guix-package (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name)) + (crate->guix-package* (memoize crate->guix-package))) + (apply crate->guix-package* + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 893dd70fc9..6fb9b772d8 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -461,8 +461,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.25.2 --------------C75C5AFF3F0EC8C4AA52A5D4 Content-Type: text/x-patch; charset=UTF-8; name="v13-0004-import-utils-Trim-patch-version-from-names.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v13-0004-import-utils-Trim-patch-version-from-names.patch" >From 844a1f2009d9267e0b199bd50c086e0d693437aa Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:19:13 -0500 Subject: [PATCH v13 4/6] import: utils: Trim patch version from names. This remove the the patch version from input names. For example 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1' * guix/import/utils.scm (package->definition): Trim patch version from generated package names. * tests/crate.scm: (cargo>guix-package): Likewise. (cargo-recursive-import): Likewise. --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 44 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 709cd718f6..a0aacdc6de 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -265,9 +265,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index 39561d5745..893dd70fc9 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -279,7 +279,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -295,7 +295,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -358,7 +358,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -377,7 +377,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -396,7 +396,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -413,13 +413,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" + (("rust-leaf-bob" ('unquote rust-leaf-bob-1.0.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -436,17 +436,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -463,14 +463,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.25.2 --------------C75C5AFF3F0EC8C4AA52A5D4 Content-Type: text/x-patch; charset=UTF-8; name="v13-0003-import-crate-Memorize-crate-guix-package.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v13-0003-import-crate-Memorize-crate-guix-package.patch" >From b5dd33db1f33e44d88aab110dfa373470d73f4ed Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:17:00 -0500 Subject: [PATCH v13 3/6] import: crate: Memorize crate->guix-package. This adds memorization to procedures that involve network lookups. 'lookup-crate*' is used on every dependency of a package to get its version list. It is also used to lookup a packages metadata. 'crate-recursive-import' is also memorized since creating the same package twice will trigger a lookup on in its dependencies. * guix/import/crate.scm (lookup-crate*): New procedure. (crate->guix-package): Memorize package metadata lookups. (crate-recursive-import): Memorize package creation. --- guix/import/crate.scm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 633893765c..96cf8d9b55 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -111,6 +112,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define lookup-crate* (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -216,7 +219,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (lookup-crate* crate-name)) (define version-number (or version @@ -238,7 +241,7 @@ latest version of CRATE-NAME." (define (sort-map-dependencies deps) (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (lookup-crate* name)) (req (crate-dependency-requirement dep)) (ver (find-version crate req))) (list name @@ -267,7 +270,7 @@ latest version of CRATE-NAME." (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package (memoize crate->guix-package) #:version version #:guix-name crate-name->package-name)) -- 2.25.2 --------------C75C5AFF3F0EC8C4AA52A5D4 Content-Type: text/x-patch; charset=UTF-8; name="v13-0002-import-crate-Use-guile-semver-to-resolve-module-.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v13-0002-import-crate-Use-guile-semver-to-resolve-module-.pa"; filename*1="tch" >From 950e7888fd73731a54347984755a232bab2068d0 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 03:50:48 -0500 Subject: [PATCH v13 2/6] import: crate: Use guile-semver to resolve module versions. * guix/import/crate.scm (make-crate-sexp): Added '#:skip-build?' to build system args. Pass a VERSION argument to 'cargo-inputs'. Move 'package-definition' from scripts/import/crate.scm to here. (crate->guix-package): Use guile-semver to resolve the correct module versions. (crate-name->package-name): Reuse the procedure 'guix-name' instead of duplicating its logic. (module) Added guile-semver as a soft dependency. * guix/import/utils.scm (package-names->package-inputs): Implemented handling of (name version) pairs. * guix/scripts/import/crate.scm (guix-import-crate): Move 'package-definition' from here to guix/import/crate.scm. * tests/crate.scm: (recursuve-import) Added version data to the test. --- guix/import/crate.scm | 95 +++++++---- guix/import/utils.scm | 21 ++- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 290 +++++++++++++++++++--------------- 4 files changed, 245 insertions(+), 172 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 0b4482e876..633893765c 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,10 +87,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -143,16 +149,22 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) + home-page synopsis description license) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) + (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -164,9 +176,10 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs - cargo-development-inputs))) + cargo-development-inputs))) (home-page ,(match home-page (() "") (_ home-page))) @@ -177,7 +190,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,14 +201,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -204,21 +222,36 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate))) - (define version* + ;; finds the a version of a crate that fulfills the semver + (define (find-version crate range) (find (lambda (version) - (string=? (crate-version-number version) - version-number)) + (semver-range-contains-string? + range + (crate-version-number version))) (crate-versions crate))) + (define version* + (find-version crate version-number)) + + ;; sorts the dependencies and maps the dependencies to a list containing + ;; pairs of (name version) + (define (sort-map-dependencies deps) + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -253,7 +283,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; @@ -288,4 +318,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/import/utils.scm b/guix/import/utils.scm index cd92cf7dd8..709cd718f6 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -225,13 +225,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index aa51faebf9..39561d5745 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", + \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -88,18 +90,22 @@ { \"crate_id\": \"intermediate-1\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -132,14 +138,17 @@ { \"crate_id\": \"intermediate-2\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-alice\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", } ] }") @@ -172,6 +181,7 @@ { \"crate_id\": \"leaf-bob\", \"kind\": \"normal\", + \"req\": \"1.0.0\", }, ] }") @@ -252,34 +262,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -334,105 +358,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.25.2 --------------C75C5AFF3F0EC8C4AA52A5D4 Content-Type: text/x-patch; charset=UTF-8; name="v13-0001-import-utils-recursive-import-accepts-an-optiona.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v13-0001-import-utils-recursive-import-accepts-an-optiona.pa"; filename*1="tch" >From e1d599345980b3f0a18eeaced2156c0926b7d926 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH v13 1/6] import: utils: 'recursive-import' accepts an optional version parameter. This adds a key VERSION to 'recursive-import' and move the paramter REPO to a key. This also changes all the things that rely on 'recursive-import' * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. (package->definition): Added optional 'append-version?'. * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. (cran-recursive-import): Likewise. * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. (elpa-recursive-import): Likewise. * guix/import/gem.scm (gem->guix-package): Likewise. (recursive-import): Likewise. * guix/import/opam.scm (opam-recurive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. * tests/elpa.scm: (eval-test-with-elpa) Likewise. * tests/import-utils.scm Likewise. --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 8 ++--- guix/import/pypi.scm | 8 ++--- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 74 insertions(+), 46 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index bb8226f714..0651796c60 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -511,7 +512,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) version) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -526,8 +527,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..0e32a6508d 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) version) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index bd5d5b3569..345d6f003c 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -122,7 +123,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((gem (rubygems-fetch package-name))) @@ -200,6 +201,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index ae7df8a8b5..81f178e6a9 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -250,7 +251,7 @@ path to the repository." (substring version 1) version))))) -(define* (opam->guix-package name #:key (repository (get-opam-repository))) +(define* (opam->guix-package name #:key (repository (get-opam-repository)) version) "Import OPAM package NAME from REPOSITORY (a directory name) or, if REPOSITORY is #f, from the official OPAM repository. Return a 'package' sexp or #f on failure." @@ -311,9 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (opam->guix-package name)) + (recursive-import package-name + #:repo->guix-package opam->guix-package #:guix-name ocaml-name->guix-name)) (define (guix-name->opam-name name) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index f93fa8831f..3ec984b1f4 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2019 Maxim Cournoyer ;;; Copyright © 2020 Jakub Kądziołka ;;; Copyright © 2020 Lars-Dominik Braun +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -468,7 +469,7 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (define pypi->guix-package (memoize - (lambda* (package-name) + (lambda* (package-name #:key repo version) "Fetch the metadata for PACKAGE-NAME from pypi.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let* ((project (pypi-fetch package-name)) @@ -492,9 +493,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (project-info-license info))))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (pypi->guix-package name)) + (recursive-import package-name + #:repo->guix-package pypi->guix-package #:guix-name python->package-name)) (define (string->license str) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..767fc491bf 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda* (name #:key repo version) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 94c8cb040b..cd92cf7dd8 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -250,13 +252,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -391,32 +395,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) + (lambda (node) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.25.2 --------------C75C5AFF3F0EC8C4AA52A5D4-- From debbugs-submit-bounces@debbugs.gnu.org Sun Apr 12 11:08:00 2020 Received: (at 38408) by debbugs.gnu.org; 12 Apr 2020 15:08:00 +0000 Received: from localhost ([127.0.0.1]:58669 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jNeDI-0002rm-E9 for submit@debbugs.gnu.org; Sun, 12 Apr 2020 11:08:00 -0400 Received: from mx1.riseup.net ([198.252.153.129]:42222) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jNeDH-0002rf-K2 for 38408@debbugs.gnu.org; Sun, 12 Apr 2020 11:08:00 -0400 Received: from capuchin.riseup.net (unknown [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 490Zqy6HTqzFdnk; Sun, 12 Apr 2020 08:07:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1586704078; bh=eRY8HzQ9r40oDkwxh3OtpOvM/v/fObqY3Qjjm3x65lI=; h=Subject:From:To:Cc:References:Date:In-Reply-To:From; b=N9zPd+z21wPUeGVsZyTrIHvVcMW1N01OSRTFfB1IzaoAkNkpQyeCSgeBCHlMPTFEZ DdIBU8F/YwQV4pvc7uSjPMdaDiXmPoWskULGB0gS8BfJh/4ghaqFLSq4bF78ysef9v pC7X5KjXV2Z6dUTVrtihg771xM9rkmFuYNKfS40U= X-Riseup-User-ID: 42CC396253D96013EBA12AFFF05B7AEC83A81FDF103462382E161FDE258E066E Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 490Zqx22y8z8tHr; Sun, 12 Apr 2020 08:07:56 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix From: Martin Becze To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> Message-ID: <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> Date: Sun, 12 Apr 2020 10:07:55 -0500 MIME-Version: 1.0 In-Reply-To: <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Its time to bump this again! Ok so here is where we left off. Ludo suggested name changes > This should also mention changes to ‘crate-recursive-import’. > > Regarding identifiers, please avoid abbreviations (info "(guix) > Formatting Code"). Which should be done (But I didn't change identifiers that I don't introduce) > I would change #:allow-other-keys to just ‘version’ (a #:version > parameter) in all the importers. Did that thingy! And also Fixed some typos. The previous email had the attached set (v13). Let me know if it got lost and I need to send it again. Thanks! -Martin From debbugs-submit-bounces@debbugs.gnu.org Sun Apr 12 12:59:27 2020 Received: (at 38408) by debbugs.gnu.org; 12 Apr 2020 16:59:27 +0000 Received: from localhost ([127.0.0.1]:58739 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jNfx9-0005c0-JN for submit@debbugs.gnu.org; Sun, 12 Apr 2020 12:59:27 -0400 Received: from eggs.gnu.org ([209.51.188.92]:59922) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jNfx8-0005bp-LF for 38408@debbugs.gnu.org; Sun, 12 Apr 2020 12:59:26 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:33129) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1jNfx2-0003lS-Uk; Sun, 12 Apr 2020 12:59:20 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=39496 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jNfwz-0007Hn-Uh; Sun, 12 Apr 2020 12:59:19 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Martin Becze Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 24 Germinal an 228 de la =?utf-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Sun, 12 Apr 2020 18:59:15 +0200 In-Reply-To: <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> (Martin Becze's message of "Sun, 12 Apr 2020 10:07:55 -0500") Message-ID: <87lfn0myho.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Martin, Martin Becze skribis: > The previous email had the attached set (v13). Let me know if it got > lost and I need to send it again. I think it just needs some more review time, everything is good on your side! I=E2=80=99m sorry it takes this long. As far as I=E2=80=99m concerned, I= =E2=80=99m focusing on getting the release out of the door currently=E2=80=A6 almost there! Thank you, Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Fri Apr 17 10:57:33 2020 Received: (at 38408) by debbugs.gnu.org; 17 Apr 2020 14:57:33 +0000 Received: from localhost ([127.0.0.1]:41442 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jPSQv-000088-LQ for submit@debbugs.gnu.org; Fri, 17 Apr 2020 10:57:33 -0400 Received: from mx1.riseup.net ([198.252.153.129]:43234) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jPSQt-000080-F3 for 38408@debbugs.gnu.org; Fri, 17 Apr 2020 10:57:32 -0400 Received: from bell.riseup.net (unknown [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 493fMZ4S7PzFdH2; Fri, 17 Apr 2020 07:57:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1587135450; bh=xEdC5BlqEFtshdg3HtnmyP/qX9ThpONs9mlnudL8+TA=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=WdUcjqGzxHo+8o1x6iqZ8OxTd/1yURPYLbbS99U6s2798vBo43kgmM7+cytyBrroN PwsWqUwIaeLzRTrClXCKkYKw1hhPDt9WIsdjMUC8T6z8rTPhL1qz/wpwuNBqHqrs3V ZwJS5ixE5wU0EucahEkSQl905X8ZG+vl8kv0e1C8= X-Riseup-User-ID: FA62CFBD222ED01D8587F6FDAFFB90E72AEA3021BEC44F4A5A1B545E7B6D74BF Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 493fMW3WFXzJqQZ; Fri, 17 Apr 2020 07:57:26 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> <87lfn0myho.fsf@gnu.org> From: Martin Becze Autocrypt: addr=mjbecze@riseup.net; keydata= mQENBE9w5AMBCADgJkbsy1TAb9x2MHupHGu+Rb7utyvsx/tdv2amgkm80PdzDWOAVJGvRX8g UQfnUUIUwXhicdd0mG5Xmf1S6YreV2qM2rYqO8rFk6cWyLK6901NpD+gXJgjKLipvjk+8370 l7yUJmoSDdNDK7kIhWOs6HYkMK5No/Bs4SbtY5PjF1tVmNbk5KzlyKUDmMclQB1gI0cmrJ2s doTuLz4IC90UZYhV9pq/MIGjlh4eY8aQR5Uj6/jXtrwneS9V3ouhB+R9uHtKqqyok5nNdPlC UvfA/bo/2er9UAmSkewLQOTKOfwj0Ei5IQ2eRLtO5LZLZi3K4m6FOB9s37gZ5K8tp/KtABEB AAG0G21hcnRpbiA8bWpiZWN6ZUByaXNldXAubmV0PokBTwQTAQIAOQIbIwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l0SRB/9GFqbQeOADWJe9ke5RAAvD5HVGQCPCAsp+h+krgdsaOUySVAoVjo29fRQVoqmF1KY2 iCw9WQGiiwD8aMCEH1W+o9QPxMYeWFFyhqErEsv/BQRWNbvS9xb5YUXcB9QY68WDP83v5he2 pL7DI7fWwAx6xAAw9rgEduABewULNCsTUJzd9UG6HILEY7DLl/addQjvtTaITfKPYrrLnHND fQlGtxgzsfbkxezO8gYLARQBxAWETjOYxpt8d9J36FNnQN8OcsuXjEgYWh7dsPtp+w3P8Yj9 5YrEu/9+eehSy9ath6vhRF9N+/gvmR5WAb5EB8w/hm11pjeX9tY8vK7vuTt9uQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEW OslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsE wBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2e MfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6f Znyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+ WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz 7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/ 3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jp QKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr 2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN 1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4f z2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu6 4goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1F KV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WY klm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd 9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tB E3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA 2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8Aap WeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWu ad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee 0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69Y rAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDey qz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDS vxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O 0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFF FIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx +/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67 LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9 lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32 bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/E J2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72 yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv 6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ /52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm2 9JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gck Rxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBc hIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZ JDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAA u6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAK CRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHx CsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdn MQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6T EW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3 RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV uQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9 HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8 IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWA g4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiY uQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEB AAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneF VhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ld tZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/ gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6br lmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV Message-ID: <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> Date: Fri, 17 Apr 2020 09:57:24 -0500 MIME-Version: 1.0 In-Reply-To: <87lfn0myho.fsf@gnu.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Sounds good! There seems to be a regression now. guix pull fails to build extra-modules, it can't find the guile-semver module. Any clues on what to look for to fix this? On 4/12/20 11:59 AM, Ludovic Courtès wrote: > Hi Martin, > > Martin Becze skribis: > >> The previous email had the attached set (v13). Let me know if it got >> lost and I need to send it again. > > I think it just needs some more review time, everything is good on your > side! > > I’m sorry it takes this long. As far as I’m concerned, I’m focusing on > getting the release out of the door currently… almost there! > > Thank you, > Ludo’. > From debbugs-submit-bounces@debbugs.gnu.org Wed Apr 29 15:52:43 2020 Received: (at submit) by debbugs.gnu.org; 29 Apr 2020 19:52:43 +0000 Received: from localhost ([127.0.0.1]:44759 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jTsl2-0005UO-8Z for submit@debbugs.gnu.org; Wed, 29 Apr 2020 15:52:43 -0400 Received: from lists.gnu.org ([209.51.188.17]:41150) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jTsks-0005U7-6Q for submit@debbugs.gnu.org; Wed, 29 Apr 2020 15:52:35 -0400 Received: from eggs.gnu.org ([209.51.188.92]:49304) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jTskf-000511-3L for guix-patches@gnu.org; Wed, 29 Apr 2020 15:52:25 -0400 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS, T_FILL_THIS_FORM_SHORT,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.2 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.90_1) (envelope-from ) id 1jTsjj-0002jg-Rp for guix-patches@gnu.org; Wed, 29 Apr 2020 15:52:12 -0400 Received: from mx1.riseup.net ([198.252.153.129]:36322) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jTsji-0002TV-Qt for guix-patches@gnu.org; Wed, 29 Apr 2020 15:51:15 -0400 Received: from bell.riseup.net (unknown [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 49C8Jv672czFcv9 for ; Wed, 29 Apr 2020 12:51:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1588189872; bh=As5D6eHLVuPkGRbtr+PcAUGHzpbSR16rvKJIeP05X8g=; h=Subject:To:References:From:Date:In-Reply-To:From; b=dyXkASE9LEyF9hDGrWARH+S0yqABO3AUOon2x21I0pjqVDUsWXIR3LE6HdjUgijiu 1l4w0i2t8xch0jsB6lmEQw/aa7oA0x1ScFg4/jUgCGGXeiQ7pjlyzQtvV7qZaQ47Dz WYT3L8HemRTHcQ3LdX1bw5kqpC2So2tF0Te40qNg= X-Riseup-User-ID: 044EAA1D19F9662D29907E1BDE9A1E56E3E80152E56FD811247D9DC354462DC8 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 49C8Jh1VRJzJqTc for ; Wed, 29 Apr 2020 12:50:59 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: guix-patches@gnu.org References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> <87lfn0myho.fsf@gnu.org> <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> From: Martin Becze Autocrypt: addr=mjbecze@riseup.net; keydata= mQENBE9w5AMBCADgJkbsy1TAb9x2MHupHGu+Rb7utyvsx/tdv2amgkm80PdzDWOAVJGvRX8g UQfnUUIUwXhicdd0mG5Xmf1S6YreV2qM2rYqO8rFk6cWyLK6901NpD+gXJgjKLipvjk+8370 l7yUJmoSDdNDK7kIhWOs6HYkMK5No/Bs4SbtY5PjF1tVmNbk5KzlyKUDmMclQB1gI0cmrJ2s doTuLz4IC90UZYhV9pq/MIGjlh4eY8aQR5Uj6/jXtrwneS9V3ouhB+R9uHtKqqyok5nNdPlC UvfA/bo/2er9UAmSkewLQOTKOfwj0Ei5IQ2eRLtO5LZLZi3K4m6FOB9s37gZ5K8tp/KtABEB AAG0G21hcnRpbiA8bWpiZWN6ZUByaXNldXAubmV0PokBTwQTAQIAOQIbIwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l0SRB/9GFqbQeOADWJe9ke5RAAvD5HVGQCPCAsp+h+krgdsaOUySVAoVjo29fRQVoqmF1KY2 iCw9WQGiiwD8aMCEH1W+o9QPxMYeWFFyhqErEsv/BQRWNbvS9xb5YUXcB9QY68WDP83v5he2 pL7DI7fWwAx6xAAw9rgEduABewULNCsTUJzd9UG6HILEY7DLl/addQjvtTaITfKPYrrLnHND fQlGtxgzsfbkxezO8gYLARQBxAWETjOYxpt8d9J36FNnQN8OcsuXjEgYWh7dsPtp+w3P8Yj9 5YrEu/9+eehSy9ath6vhRF9N+/gvmR5WAb5EB8w/hm11pjeX9tY8vK7vuTt9uQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEW OslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsE wBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2e MfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6f Znyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+ WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz 7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/ 3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jp QKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr 2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN 1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4f z2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu6 4goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1F KV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WY klm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd 9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tB E3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA 2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8Aap WeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWu ad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee 0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69Y rAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDey qz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDS vxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O 0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFF FIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx +/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67 LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9 lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32 bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/E J2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72 yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv 6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ /52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm2 9JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gck Rxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBc hIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZ JDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAA u6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAK CRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHx CsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdn MQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6T EW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3 RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV uQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9 HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8 IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWA g4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiY uQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEB AAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneF VhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ld tZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/ gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6br lmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV Message-ID: <5fc49f7d-bf97-c5a7-555c-bafcba07c8e9@riseup.net> Date: Wed, 29 Apr 2020 14:50:55 -0500 MIME-Version: 1.0 In-Reply-To: <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> Content-Type: multipart/mixed; boundary="------------E1C8FF4A3A61D44C08CEAF24" Content-Language: en-US Received-SPF: pass client-ip=198.252.153.129; envelope-from=mjbecze@riseup.net; helo=mx1.riseup.net X-detected-operating-system: by eggs.gnu.org: First seen = 2020/04/29 15:51:12 X-ACL-Warn: Detected OS = Linux 3.11 and newer [fuzzy] X-Received-From: 198.252.153.129 X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.1 (/) This is a multi-part message in MIME format. --------------E1C8FF4A3A61D44C08CEAF24 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit This patch has gotten stall again, with commits 5fbc753ab524809cd81e3e5c54b3d0acbe33792d and 5dfe02c60767a633c67f7f6fc9557b54b3c99b63\ here is an updated patch set. Also git pull work on this agian! not sure why, but prob something on my end. as always let me know if there is anything that needs to be fixed. thanks! On 4/17/20 9:57 AM, Martin Becze wrote: > Sounds good! > There seems to be a regression now. guix pull fails to build > extra-modules, it can't find the guile-semver module. Any clues on what > to look for to fix this? > > On 4/12/20 11:59 AM, Ludovic Courtès wrote: >> Hi Martin, >> >> Martin Becze skribis: >> >>> The previous email had the attached set (v13). Let me know if it got >>> lost and I need to send it again. >> >> I think it just needs some more review time, everything is good on your >> side! >> >> I’m sorry it takes this long. As far as I’m concerned, I’m focusing on >> getting the release out of the door currently… almost there! >> >> Thank you, >> Ludo’. >> > > > --------------E1C8FF4A3A61D44C08CEAF24 Content-Type: text/x-patch; charset=UTF-8; name="v14-0006-guix-self-Adds-guile-semver-as-a-depenedency.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v14-0006-guix-self-Adds-guile-semver-as-a-depenedency.patch" >From 03cb901b537222121caf87eb62fefc1e066e4ef9 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Fri, 21 Feb 2020 10:41:44 -0500 Subject: [PATCH v14 6/6] guix: self: Adds guile-semver as a depenedency. * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. --- guix/self.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index 4682cd221c..37fc59c410 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ ("guile-git" (ref '(gnu packages guile) 'guile3.0-git)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile3.0-sqlite3)) ("guile-gcrypt" (ref '(gnu packages gnupg) 'guile3.0-gcrypt)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("gnutls" (ref '(gnu packages tls) 'guile3.0-gnutls)) ("zlib" (ref '(gnu packages compression) 'zlib)) ("lzlib" (ref '(gnu packages compression) 'lzlib)) @@ -711,6 +713,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -719,7 +724,7 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3)) + guile-ssh guile-sqlite3 guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.26.2 --------------E1C8FF4A3A61D44C08CEAF24 Content-Type: text/x-patch; charset=UTF-8; name="v14-0005-import-crate-Parametrized-importing-of-dev-depen.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v14-0005-import-crate-Parametrized-importing-of-dev-depen.pa"; filename*1="tch" >From efce0190880ae04df2ba767b4709cfc4c71dadbc Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 3 Feb 2020 16:19:49 -0500 Subject: [PATCH v14 5/6] import: crate: Parametrized importing of dev dependencies. This changes the behavoir of the recusive crate importer so that it will include importing of development dependencies for the top level package but will not inculded the development dependencies for any other imported package. * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. (crate-recursive-import): Likewise. * guix/scripts/import/crate.scm (guix-import-crate): Likewise. * tests/crate.scm (cargo-recursive-import): Likewise. --- guix/import/crate.scm | 27 +++++++++++++++++++-------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index ffb74bd8cc..42a18faff3 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -152,7 +152,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license) + home-page synopsis description license build?) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." @@ -179,7 +179,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -204,11 +206,12 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version repo) +(define* (crate->guix-package crate-name #:key version include-dev-deps? repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -256,9 +259,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-dependencies dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-dependencies dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -268,11 +274,16 @@ latest version of CRATE-NAME." #:description (crate-description crate) #:license (and=> (crate-version-license version*) string->license)) - cargo-inputs)))) + (append cargo-inputs cargo-development-inputs))))) (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package (memoize crate->guix-package) + #:repo->guix-package (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name)) + (crate->guix-package* (memoize crate->guix-package))) + (apply crate->guix-package* + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 65d5ac3389..76bd3707df 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -462,8 +462,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.26.2 --------------E1C8FF4A3A61D44C08CEAF24 Content-Type: text/x-patch; charset=UTF-8; name="v14-0004-import-utils-Trim-patch-version-from-names.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v14-0004-import-utils-Trim-patch-version-from-names.patch" >From 6e9b04821dce30be6ae4b76c8ff36b2ae80c01c2 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:19:13 -0500 Subject: [PATCH v14 4/6] import: utils: Trim patch version from names. This remove the the patch version from input names. For example 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1' * guix/import/utils.scm (package->definition): Trim patch version from generated package names. * tests/crate.scm: (cargo>guix-package): Likewise. (cargo-recursive-import): Likewise. --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 44 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index a147d0d693..a97cfb1185 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -265,9 +265,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index beaa696be0..65d5ac3389 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -280,7 +280,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -296,7 +296,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -359,7 +359,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -378,7 +378,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -397,7 +397,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -414,13 +414,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" + (("rust-leaf-bob" ('unquote rust-leaf-bob-1.0.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -437,17 +437,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -464,14 +464,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.26.2 --------------E1C8FF4A3A61D44C08CEAF24 Content-Type: text/x-patch; charset=UTF-8; name="v14-0003-import-crate-Memorize-crate-guix-package.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v14-0003-import-crate-Memorize-crate-guix-package.patch" >From ce235399e2e1f47eb8e76387de2b88850304f284 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:17:00 -0500 Subject: [PATCH v14 3/6] import: crate: Memorize crate->guix-package. This adds memorization to procedures that involve network lookups. 'lookup-crate*' is used on every dependency of a package to get its version list. It is also used to lookup a packages metadata. 'crate-recursive-import' is also memorized since creating the same package twice will trigger a lookup on in its dependencies. * guix/import/crate.scm (lookup-crate*): New procedure. (crate->guix-package): Memorize package metadata lookups. (crate-recursive-import): Memorize package creation. --- guix/import/crate.scm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 6054246fa3..ffb74bd8cc 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -111,6 +112,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define lookup-crate* (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -216,7 +219,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (lookup-crate* crate-name)) (define version-number (and crate @@ -240,7 +243,7 @@ latest version of CRATE-NAME." (define (sort-map-dependencies deps) (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (lookup-crate* name)) (req (crate-dependency-requirement dep)) (ver (find-version crate req))) (list name @@ -269,7 +272,7 @@ latest version of CRATE-NAME." (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package (memoize crate->guix-package) #:version version #:guix-name crate-name->package-name)) -- 2.26.2 --------------E1C8FF4A3A61D44C08CEAF24 Content-Type: text/x-patch; charset=UTF-8; name="v14-0002-import-crate-Use-guile-semver-to-resolve-module-.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v14-0002-import-crate-Use-guile-semver-to-resolve-module-.pa"; filename*1="tch" >From 8d59f45d5a819b4da31706180ca7c84b5ce0512d Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 03:50:48 -0500 Subject: [PATCH v14 2/6] import: crate: Use guile-semver to resolve module versions. * guix/import/crate.scm (make-crate-sexp): Added '#:skip-build?' to build system args. Pass a VERSION argument to 'cargo-inputs'. Move 'package-definition' from scripts/import/crate.scm to here. (crate->guix-package): Use guile-semver to resolve the correct module versions. (crate-name->package-name): Reuse the procedure 'guix-name' instead of duplicating its logic. (module) Added guile-semver as a soft dependency. * guix/import/utils.scm (package-names->package-inputs): Implemented handling of (name version) pairs. * guix/scripts/import/crate.scm (guix-import-crate): Move 'package-definition' from here to guix/import/crate.scm. * tests/crate.scm: (recursuve-import) Added version data to the test. --- guix/import/crate.scm | 97 ++++++---- guix/import/utils.scm | 21 ++- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 330 +++++++++++++++++++--------------- 4 files changed, 266 insertions(+), 193 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index e3ec11d7f8..6054246fa3 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,10 +87,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -143,16 +149,22 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) + home-page synopsis description license) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) + (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -164,9 +176,10 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs - cargo-development-inputs))) + cargo-development-inputs))) (home-page ,(match home-page (() "") (_ home-page))) @@ -177,7 +190,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,14 +201,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -205,22 +223,37 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate)))) + ;; finds the a version of a crate that fulfills the semver + (define (find-version crate range) + (find (lambda (version) + (semver-range-contains-string? + range + (crate-version-number version))) + (crate-versions crate))) + (define version* (and crate - (find (lambda (version) - (string=? (crate-version-number version) - version-number)) - (crate-versions crate)))) + (find-version crate version-number))) + + ;; sorts the dependencies and maps the dependencies to a list containing + ;; pairs of (name version) + (define (sort-map-dependencies deps) + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -255,7 +285,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; @@ -290,4 +320,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 3f559a9f31..a147d0d693 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -225,13 +225,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index 61a04f986b..beaa696be0 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,8 +37,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"foo\", \"num\": \"1.0.0\", @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", - \"kind\": \"normal\" + \"crate_id\": \"leaf-alice\", + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -68,8 +70,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"foo\", \"num\": \"1.0.0\", @@ -87,19 +89,23 @@ \"dependencies\": [ { \"crate_id\": \"intermediate-1\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -112,8 +118,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"intermediate-1\", \"num\": \"1.0.0\", @@ -131,15 +137,18 @@ \"dependencies\": [ { \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -152,8 +161,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"intermediate-2\", \"num\": \"1.0.0\", @@ -171,7 +180,8 @@ \"dependencies\": [ { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -184,8 +194,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"leaf-alice\", \"num\": \"1.0.0\", @@ -211,7 +221,7 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], + \"keywords\": [\"dummy\", \"test\"], \"categories\": [\"test\"] \"actual_versions\": [ { \"id\": \"leaf-bob\", @@ -253,34 +263,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -335,105 +359,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.26.2 --------------E1C8FF4A3A61D44C08CEAF24 Content-Type: text/x-patch; charset=UTF-8; name="v14-0001-import-utils-recursive-import-accepts-an-optiona.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v14-0001-import-utils-recursive-import-accepts-an-optiona.pa"; filename*1="tch" >From d0caf07961ae15799475d176705bd4adc81ab306 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH v14 1/6] import: utils: 'recursive-import' accepts an optional version parameter. This adds a key VERSION to 'recursive-import' and move the paramter REPO to a key. This also changes all the things that rely on 'recursive-import' * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. (package->definition): Added optional 'append-version?'. * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. (cran-recursive-import): Likewise. * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. (elpa-recursive-import): Likewise. * guix/import/gem.scm (gem->guix-package): Likewise. (recursive-import): Likewise. * guix/import/opam.scm (opam-recurive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. * tests/elpa.scm: (eval-test-with-elpa) Likewise. * tests/import-utils.scm Likewise. --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 8 ++--- guix/import/pypi.scm | 8 ++--- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 74 insertions(+), 46 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index 53b930acd0..0c2a388c68 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -567,7 +568,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) version) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -585,8 +586,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..0e32a6508d 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) version) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index bd5d5b3569..345d6f003c 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -122,7 +123,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((gem (rubygems-fetch package-name))) @@ -200,6 +201,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index ae7df8a8b5..81f178e6a9 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -250,7 +251,7 @@ path to the repository." (substring version 1) version))))) -(define* (opam->guix-package name #:key (repository (get-opam-repository))) +(define* (opam->guix-package name #:key (repository (get-opam-repository)) version) "Import OPAM package NAME from REPOSITORY (a directory name) or, if REPOSITORY is #f, from the official OPAM repository. Return a 'package' sexp or #f on failure." @@ -311,9 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (opam->guix-package name)) + (recursive-import package-name + #:repo->guix-package opam->guix-package #:guix-name ocaml-name->guix-name)) (define (guix-name->opam-name name) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index f93fa8831f..3ec984b1f4 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2019 Maxim Cournoyer ;;; Copyright © 2020 Jakub Kądziołka ;;; Copyright © 2020 Lars-Dominik Braun +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -468,7 +469,7 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (define pypi->guix-package (memoize - (lambda* (package-name) + (lambda* (package-name #:key repo version) "Fetch the metadata for PACKAGE-NAME from pypi.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let* ((project (pypi-fetch package-name)) @@ -492,9 +493,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (project-info-license info))))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (pypi->guix-package name)) + (recursive-import package-name + #:repo->guix-package pypi->guix-package #:guix-name python->package-name)) (define (string->license str) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..767fc491bf 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda* (name #:key repo version) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 3809c3d074..3f559a9f31 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -250,13 +252,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -405,32 +409,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) + (lambda (node) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.26.2 --------------E1C8FF4A3A61D44C08CEAF24-- From debbugs-submit-bounces@debbugs.gnu.org Wed Apr 29 15:52:06 2020 Received: (at 38408) by debbugs.gnu.org; 29 Apr 2020 19:52:06 +0000 Received: from localhost ([127.0.0.1]:44756 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jTskO-0005TE-8h for submit@debbugs.gnu.org; Wed, 29 Apr 2020 15:52:06 -0400 Received: from mx1.riseup.net ([198.252.153.129]:45454) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jTskK-0005T4-R1 for 38408@debbugs.gnu.org; Wed, 29 Apr 2020 15:51:55 -0400 Received: from bell.riseup.net (unknown [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 49C8Kg3pDfzFfGN; Wed, 29 Apr 2020 12:51:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1588189912; bh=j0j07/Fjxsl64SuCzjWSp9Y0RSNwrBglr8k1n8VG6vM=; h=Subject:From:To:Cc:References:Date:In-Reply-To:From; b=T82jsLsWigSkJtqbb3gKzRhNS1y1ewTXfnR7jgYFdj923FNetoFu5sshlclWhxvCr BYBnip8JxHx7xt48AezNC9rOqHLGytzyHUaL+EM8Ka/rIOSntYAaT39pbPGz2/oDaZ mvwvKNeGLWrj+5IuHUUoAzjBw75895PrTkYXEK7E= X-Riseup-User-ID: 1B094DDDED1A159DFF58D5C8577D3546906D912B929A7529968BE2A6ED986C8E Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 49C8KP6qDxzJqTs; Wed, 29 Apr 2020 12:51:37 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix From: Martin Becze To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> <87lfn0myho.fsf@gnu.org> <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> Autocrypt: addr=mjbecze@riseup.net; keydata= mQENBE9w5AMBCADgJkbsy1TAb9x2MHupHGu+Rb7utyvsx/tdv2amgkm80PdzDWOAVJGvRX8g UQfnUUIUwXhicdd0mG5Xmf1S6YreV2qM2rYqO8rFk6cWyLK6901NpD+gXJgjKLipvjk+8370 l7yUJmoSDdNDK7kIhWOs6HYkMK5No/Bs4SbtY5PjF1tVmNbk5KzlyKUDmMclQB1gI0cmrJ2s doTuLz4IC90UZYhV9pq/MIGjlh4eY8aQR5Uj6/jXtrwneS9V3ouhB+R9uHtKqqyok5nNdPlC UvfA/bo/2er9UAmSkewLQOTKOfwj0Ei5IQ2eRLtO5LZLZi3K4m6FOB9s37gZ5K8tp/KtABEB AAG0G21hcnRpbiA8bWpiZWN6ZUByaXNldXAubmV0PokBTwQTAQIAOQIbIwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l0SRB/9GFqbQeOADWJe9ke5RAAvD5HVGQCPCAsp+h+krgdsaOUySVAoVjo29fRQVoqmF1KY2 iCw9WQGiiwD8aMCEH1W+o9QPxMYeWFFyhqErEsv/BQRWNbvS9xb5YUXcB9QY68WDP83v5he2 pL7DI7fWwAx6xAAw9rgEduABewULNCsTUJzd9UG6HILEY7DLl/addQjvtTaITfKPYrrLnHND fQlGtxgzsfbkxezO8gYLARQBxAWETjOYxpt8d9J36FNnQN8OcsuXjEgYWh7dsPtp+w3P8Yj9 5YrEu/9+eehSy9ath6vhRF9N+/gvmR5WAb5EB8w/hm11pjeX9tY8vK7vuTt9uQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEW OslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsE wBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2e MfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6f Znyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+ WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz 7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/ 3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jp QKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr 2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN 1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4f z2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu6 4goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1F KV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WY klm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd 9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tB E3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA 2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8Aap WeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWu ad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee 0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69Y rAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDey qz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDS vxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O 0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFF FIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx +/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67 LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9 lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32 bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/E J2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72 yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv 6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ /52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm2 9JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gck Rxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBc hIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZ JDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAA u6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAK CRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHx CsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdn MQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6T EW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3 RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV uQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9 HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8 IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWA g4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiY uQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEB AAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneF VhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ld tZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/ gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6br lmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV Message-ID: Date: Wed, 29 Apr 2020 14:51:33 -0500 MIME-Version: 1.0 In-Reply-To: <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> Content-Type: multipart/mixed; boundary="------------A2073DE6963BEC7B0FFEBF39" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------A2073DE6963BEC7B0FFEBF39 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit This patch has gotten stall again, with commits 5fbc753ab524809cd81e3e5c54b3d0acbe33792d and 5dfe02c60767a633c67f7f6fc9557b54b3c99b63\ here is an updated patch set. Also git pull work on this agian! not sure why, but prob something on my end. as always let me know if there is anything that needs to be fixed. thanks! On 4/17/20 9:57 AM, Martin Becze wrote: > Sounds good! > There seems to be a regression now. guix pull fails to build > extra-modules, it can't find the guile-semver module. Any clues on what > to look for to fix this? > > On 4/12/20 11:59 AM, Ludovic Courtès wrote: >> Hi Martin, >> >> Martin Becze skribis: >> >>> The previous email had the attached set (v13). Let me know if it got >>> lost and I need to send it again. >> >> I think it just needs some more review time, everything is good on your >> side! >> >> I’m sorry it takes this long. As far as I’m concerned, I’m focusing on >> getting the release out of the door currently… almost there! >> >> Thank you, >> Ludo’. >> > > > --------------A2073DE6963BEC7B0FFEBF39 Content-Type: text/x-patch; charset=UTF-8; name="v14-0006-guix-self-Adds-guile-semver-as-a-depenedency.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v14-0006-guix-self-Adds-guile-semver-as-a-depenedency.patch" >From 03cb901b537222121caf87eb62fefc1e066e4ef9 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Fri, 21 Feb 2020 10:41:44 -0500 Subject: [PATCH v14 6/6] guix: self: Adds guile-semver as a depenedency. * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. --- guix/self.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index 4682cd221c..37fc59c410 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ ("guile-git" (ref '(gnu packages guile) 'guile3.0-git)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile3.0-sqlite3)) ("guile-gcrypt" (ref '(gnu packages gnupg) 'guile3.0-gcrypt)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("gnutls" (ref '(gnu packages tls) 'guile3.0-gnutls)) ("zlib" (ref '(gnu packages compression) 'zlib)) ("lzlib" (ref '(gnu packages compression) 'lzlib)) @@ -711,6 +713,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -719,7 +724,7 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3)) + guile-ssh guile-sqlite3 guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.26.2 --------------A2073DE6963BEC7B0FFEBF39 Content-Type: text/x-patch; charset=UTF-8; name="v14-0005-import-crate-Parametrized-importing-of-dev-depen.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v14-0005-import-crate-Parametrized-importing-of-dev-depen.pa"; filename*1="tch" >From efce0190880ae04df2ba767b4709cfc4c71dadbc Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 3 Feb 2020 16:19:49 -0500 Subject: [PATCH v14 5/6] import: crate: Parametrized importing of dev dependencies. This changes the behavoir of the recusive crate importer so that it will include importing of development dependencies for the top level package but will not inculded the development dependencies for any other imported package. * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. (crate-recursive-import): Likewise. * guix/scripts/import/crate.scm (guix-import-crate): Likewise. * tests/crate.scm (cargo-recursive-import): Likewise. --- guix/import/crate.scm | 27 +++++++++++++++++++-------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index ffb74bd8cc..42a18faff3 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -152,7 +152,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license) + home-page synopsis description license build?) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." @@ -179,7 +179,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -204,11 +206,12 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version repo) +(define* (crate->guix-package crate-name #:key version include-dev-deps? repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -256,9 +259,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-dependencies dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-dependencies dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -268,11 +274,16 @@ latest version of CRATE-NAME." #:description (crate-description crate) #:license (and=> (crate-version-license version*) string->license)) - cargo-inputs)))) + (append cargo-inputs cargo-development-inputs))))) (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package (memoize crate->guix-package) + #:repo->guix-package (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name)) + (crate->guix-package* (memoize crate->guix-package))) + (apply crate->guix-package* + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 65d5ac3389..76bd3707df 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -462,8 +462,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.26.2 --------------A2073DE6963BEC7B0FFEBF39 Content-Type: text/x-patch; charset=UTF-8; name="v14-0004-import-utils-Trim-patch-version-from-names.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="v14-0004-import-utils-Trim-patch-version-from-names.patch" >From 6e9b04821dce30be6ae4b76c8ff36b2ae80c01c2 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:19:13 -0500 Subject: [PATCH v14 4/6] import: utils: Trim patch version from names. This remove the the patch version from input names. For example 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1' * guix/import/utils.scm (package->definition): Trim patch version from generated package names. * tests/crate.scm: (cargo>guix-package): Likewise. (cargo-recursive-import): Likewise. --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 44 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index a147d0d693..a97cfb1185 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -265,9 +265,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index beaa696be0..65d5ac3389 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -280,7 +280,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -296,7 +296,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -359,7 +359,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -378,7 +378,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -397,7 +397,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -414,13 +414,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" + (("rust-leaf-bob" ('unquote rust-leaf-bob-1.0.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -437,17 +437,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -464,14 +464,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.26.2 --------------A2073DE6963BEC7B0FFEBF39 Content-Type: text/x-patch; charset=UTF-8; name="v14-0003-import-crate-Memorize-crate-guix-package.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v14-0003-import-crate-Memorize-crate-guix-package.patch" >From ce235399e2e1f47eb8e76387de2b88850304f284 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Thu, 30 Jan 2020 11:17:00 -0500 Subject: [PATCH v14 3/6] import: crate: Memorize crate->guix-package. This adds memorization to procedures that involve network lookups. 'lookup-crate*' is used on every dependency of a package to get its version list. It is also used to lookup a packages metadata. 'crate-recursive-import' is also memorized since creating the same package twice will trigger a lookup on in its dependencies. * guix/import/crate.scm (lookup-crate*): New procedure. (crate->guix-package): Memorize package metadata lookups. (crate-recursive-import): Memorize package creation. --- guix/import/crate.scm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 6054246fa3..ffb74bd8cc 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -28,6 +28,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -111,6 +112,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define lookup-crate* (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -216,7 +219,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (lookup-crate* crate-name)) (define version-number (and crate @@ -240,7 +243,7 @@ latest version of CRATE-NAME." (define (sort-map-dependencies deps) (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (lookup-crate* name)) (req (crate-dependency-requirement dep)) (ver (find-version crate req))) (list name @@ -269,7 +272,7 @@ latest version of CRATE-NAME." (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package (memoize crate->guix-package) #:version version #:guix-name crate-name->package-name)) -- 2.26.2 --------------A2073DE6963BEC7B0FFEBF39 Content-Type: text/x-patch; charset=UTF-8; name="v14-0002-import-crate-Use-guile-semver-to-resolve-module-.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v14-0002-import-crate-Use-guile-semver-to-resolve-module-.pa"; filename*1="tch" >From 8d59f45d5a819b4da31706180ca7c84b5ce0512d Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 03:50:48 -0500 Subject: [PATCH v14 2/6] import: crate: Use guile-semver to resolve module versions. * guix/import/crate.scm (make-crate-sexp): Added '#:skip-build?' to build system args. Pass a VERSION argument to 'cargo-inputs'. Move 'package-definition' from scripts/import/crate.scm to here. (crate->guix-package): Use guile-semver to resolve the correct module versions. (crate-name->package-name): Reuse the procedure 'guix-name' instead of duplicating its logic. (module) Added guile-semver as a soft dependency. * guix/import/utils.scm (package-names->package-inputs): Implemented handling of (name version) pairs. * guix/scripts/import/crate.scm (guix-import-crate): Move 'package-definition' from here to guix/import/crate.scm. * tests/crate.scm: (recursuve-import) Added version data to the test. --- guix/import/crate.scm | 97 ++++++---- guix/import/utils.scm | 21 ++- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 330 +++++++++++++++++++--------------- 4 files changed, 266 insertions(+), 193 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index e3ec11d7f8..6054246fa3 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -38,6 +38,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -86,10 +87,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -143,16 +149,22 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) + home-page synopsis description license) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) + (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -164,9 +176,10 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs - cargo-development-inputs))) + cargo-development-inputs))) (home-page ,(match home-page (() "") (_ home-page))) @@ -177,7 +190,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -188,14 +201,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -205,22 +223,37 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate)))) + ;; finds the a version of a crate that fulfills the semver + (define (find-version crate range) + (find (lambda (version) + (semver-range-contains-string? + range + (crate-version-number version))) + (crate-versions crate))) + (define version* (and crate - (find (lambda (version) - (string=? (crate-version-number version) - version-number)) - (crate-versions crate)))) + (find-version crate version-number))) + + ;; sorts the dependencies and maps the dependencies to a list containing + ;; pairs of (name version) + (define (sort-map-dependencies deps) + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) + cargo-inputs)))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -255,7 +285,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; @@ -290,4 +320,3 @@ latest version of CRATE-NAME." (description "Updater for crates.io packages") (pred crate-package?) (latest latest-release))) - diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 3f559a9f31..a147d0d693 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -225,13 +225,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index 61a04f986b..beaa696be0 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,8 +37,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"foo\", \"num\": \"1.0.0\", @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", - \"kind\": \"normal\" + \"crate_id\": \"leaf-alice\", + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -68,8 +70,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"foo\", \"num\": \"1.0.0\", @@ -87,19 +89,23 @@ \"dependencies\": [ { \"crate_id\": \"intermediate-1\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -112,8 +118,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"intermediate-1\", \"num\": \"1.0.0\", @@ -131,15 +137,18 @@ \"dependencies\": [ { \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -152,8 +161,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"intermediate-2\", \"num\": \"1.0.0\", @@ -171,7 +180,8 @@ \"dependencies\": [ { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -184,8 +194,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"leaf-alice\", \"num\": \"1.0.0\", @@ -211,7 +221,7 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], + \"keywords\": [\"dummy\", \"test\"], \"categories\": [\"test\"] \"actual_versions\": [ { \"id\": \"leaf-bob\", @@ -253,34 +263,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -335,105 +359,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.26.2 --------------A2073DE6963BEC7B0FFEBF39 Content-Type: text/x-patch; charset=UTF-8; name="v14-0001-import-utils-recursive-import-accepts-an-optiona.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="v14-0001-import-utils-recursive-import-accepts-an-optiona.pa"; filename*1="tch" >From d0caf07961ae15799475d176705bd4adc81ab306 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH v14 1/6] import: utils: 'recursive-import' accepts an optional version parameter. This adds a key VERSION to 'recursive-import' and move the paramter REPO to a key. This also changes all the things that rely on 'recursive-import' * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. (package->definition): Added optional 'append-version?'. * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to a key. (cran-recursive-import): Likewise. * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. (elpa-recursive-import): Likewise. * guix/import/gem.scm (gem->guix-package): Likewise. (recursive-import): Likewise. * guix/import/opam.scm (opam-recurive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. * tests/elpa.scm: (eval-test-with-elpa) Likewise. * tests/import-utils.scm Likewise. --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 8 ++--- guix/import/pypi.scm | 8 ++--- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 74 insertions(+), 46 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index 53b930acd0..0c2a388c68 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -567,7 +568,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) version) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -585,8 +586,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 2d4487dba0..0e32a6508d 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) version) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -301,7 +302,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index bd5d5b3569..345d6f003c 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -122,7 +123,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((gem (rubygems-fetch package-name))) @@ -200,6 +201,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index ae7df8a8b5..81f178e6a9 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -250,7 +251,7 @@ path to the repository." (substring version 1) version))))) -(define* (opam->guix-package name #:key (repository (get-opam-repository))) +(define* (opam->guix-package name #:key (repository (get-opam-repository)) version) "Import OPAM package NAME from REPOSITORY (a directory name) or, if REPOSITORY is #f, from the official OPAM repository. Return a 'package' sexp or #f on failure." @@ -311,9 +312,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (opam->guix-package name)) + (recursive-import package-name + #:repo->guix-package opam->guix-package #:guix-name ocaml-name->guix-name)) (define (guix-name->opam-name name) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index f93fa8831f..3ec984b1f4 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2019 Maxim Cournoyer ;;; Copyright © 2020 Jakub Kądziołka ;;; Copyright © 2020 Lars-Dominik Braun +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -468,7 +469,7 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (define pypi->guix-package (memoize - (lambda* (package-name) + (lambda* (package-name #:key repo version) "Fetch the metadata for PACKAGE-NAME from pypi.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let* ((project (pypi-fetch package-name)) @@ -492,9 +493,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (project-info-license info))))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (pypi->guix-package name)) + (recursive-import package-name + #:repo->guix-package pypi->guix-package #:guix-name python->package-name)) (define (string->license str) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 14150201b5..767fc491bf 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda* (name #:key repo version) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 3809c3d074..3f559a9f31 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -250,13 +252,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -405,32 +409,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normilizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) + (lambda (node) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.26.2 --------------A2073DE6963BEC7B0FFEBF39-- From debbugs-submit-bounces@debbugs.gnu.org Fri May 08 15:58:02 2020 Received: (at 38408) by debbugs.gnu.org; 8 May 2020 19:58:02 +0000 Received: from localhost ([127.0.0.1]:46381 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jX98E-0003Qk-3t for submit@debbugs.gnu.org; Fri, 08 May 2020 15:58:02 -0400 Received: from mx1.riseup.net ([198.252.153.129]:59002) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jX986-0003QS-Kp for 38408@debbugs.gnu.org; Fri, 08 May 2020 15:58:00 -0400 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 49Jh2T47WGzFgQ9; Fri, 8 May 2020 12:57:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1588967873; bh=20NTKuG4QsKw3qEHFTltcbWwRCGZBud4vPy0DOnAwig=; h=Subject:From:To:Cc:References:Date:In-Reply-To:From; b=sE3rBWQC50rOTIpCjnn7Jb35BZ1o6XibE8Ow2+Ku36zk3M8S59tzxB2Uvrk1w4pk9 wBq9H6PcNA8q4YOD6ifSu1bIFe6IdSQIPXE7V3yWq3lj23dz9cPH/2CZG8t/VZDiwK EqzOxdNFWGPqsaR8/9t0slhlvX2jryoise1Xd9so= X-Riseup-User-ID: B35CB37AF79137A0EBEFB4D85D68BB5BBC4C9CCF308CDA96F03A80C9CAA2942B Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 49Jh2M6VcZzJmvv; Fri, 8 May 2020 12:57:46 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix From: Martin Becze To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> <87lfn0myho.fsf@gnu.org> <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> Autocrypt: addr=mjbecze@riseup.net; keydata= mQENBE9w5AMBCADgJkbsy1TAb9x2MHupHGu+Rb7utyvsx/tdv2amgkm80PdzDWOAVJGvRX8g UQfnUUIUwXhicdd0mG5Xmf1S6YreV2qM2rYqO8rFk6cWyLK6901NpD+gXJgjKLipvjk+8370 l7yUJmoSDdNDK7kIhWOs6HYkMK5No/Bs4SbtY5PjF1tVmNbk5KzlyKUDmMclQB1gI0cmrJ2s doTuLz4IC90UZYhV9pq/MIGjlh4eY8aQR5Uj6/jXtrwneS9V3ouhB+R9uHtKqqyok5nNdPlC UvfA/bo/2er9UAmSkewLQOTKOfwj0Ei5IQ2eRLtO5LZLZi3K4m6FOB9s37gZ5K8tp/KtABEB AAG0G21hcnRpbiA8bWpiZWN6ZUByaXNldXAubmV0PokBTwQTAQIAOQIbIwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l0SRB/9GFqbQeOADWJe9ke5RAAvD5HVGQCPCAsp+h+krgdsaOUySVAoVjo29fRQVoqmF1KY2 iCw9WQGiiwD8aMCEH1W+o9QPxMYeWFFyhqErEsv/BQRWNbvS9xb5YUXcB9QY68WDP83v5he2 pL7DI7fWwAx6xAAw9rgEduABewULNCsTUJzd9UG6HILEY7DLl/addQjvtTaITfKPYrrLnHND fQlGtxgzsfbkxezO8gYLARQBxAWETjOYxpt8d9J36FNnQN8OcsuXjEgYWh7dsPtp+w3P8Yj9 5YrEu/9+eehSy9ath6vhRF9N+/gvmR5WAb5EB8w/hm11pjeX9tY8vK7vuTt9uQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEW OslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsE wBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2e MfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6f Znyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+ WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz 7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/ 3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jp QKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr 2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN 1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4f z2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu6 4goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1F KV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WY klm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd 9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tB E3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA 2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8Aap WeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWu ad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee 0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69Y rAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDey qz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDS vxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O 0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFF FIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx +/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67 LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9 lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32 bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/E J2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72 yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv 6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ /52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm2 9JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gck Rxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBc hIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZ JDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAA u6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAK CRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHx CsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdn MQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6T EW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3 RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV uQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9 HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8 IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWA g4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiY uQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEB AAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneF VhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ld tZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/ gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6br lmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV Message-ID: Date: Fri, 8 May 2020 14:57:42 -0500 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------B4990423B7FD5761AD1D8E51" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This is a multi-part message in MIME format. --------------B4990423B7FD5761AD1D8E51 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Hi guix, this patch set is stale again. here is an update patch for the stale part. On 4/29/20 2:51 PM, Martin Becze wrote: > This patch has gotten stall again, with commits > 5fbc753ab524809cd81e3e5c54b3d0acbe33792d and > 5dfe02c60767a633c67f7f6fc9557b54b3c99b63\ > > here is an updated patch set. > > Also git pull work on this agian! not sure why, but prob something on my > end. > > as always let me know if there is anything that needs to be fixed. > > thanks! > > > On 4/17/20 9:57 AM, Martin Becze wrote: >> Sounds good! >> There seems to be a regression now. guix pull fails to build >> extra-modules, it can't find the guile-semver module. Any clues on what >> to look for to fix this? >> >> On 4/12/20 11:59 AM, Ludovic Courtès wrote: >>> Hi Martin, >>> >>> Martin Becze skribis: >>> >>>> The previous email had the attached set (v13). Let me know if it got >>>> lost and I need to send it again. >>> >>> I think it just needs some more review time, everything is good on your >>> side! >>> >>> I’m sorry it takes this long. As far as I’m concerned, I’m focusing on >>> getting the release out of the door currently… almost there! >>> >>> Thank you, >>> Ludo’. >>> >> >> >> --------------B4990423B7FD5761AD1D8E51 Content-Type: text/x-patch; charset=UTF-8; name="0001-guix-self-Adds-guile-semver-as-a-depenedency.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="0001-guix-self-Adds-guile-semver-as-a-depenedency.patch" >From 07c90c4046923eb77eb8942337fa677f34bb4d0c Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Fri, 21 Feb 2020 10:41:44 -0500 Subject: [PATCH] guix: self: Adds guile-semver as a depenedency. * guix/self.scm (compiled-guix) Added guile-semver as a depenedency. --- guix/self.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index a9568049b2..e93c164623 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ ("guile-git" (ref '(gnu packages guile) 'guile-git)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile-sqlite3)) ("guile-gcrypt" (ref '(gnu packages gnupg) 'guile-gcrypt)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("gnutls" (ref '(gnu packages tls) 'guile3.0-gnutls)) ("zlib" (ref '(gnu packages compression) 'zlib)) ("lzlib" (ref '(gnu packages compression) 'lzlib)) @@ -711,6 +713,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -719,7 +724,7 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3)) + guile-ssh guile-sqlite3 guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.26.2 --------------B4990423B7FD5761AD1D8E51-- From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 04 20:23:31 2020 Received: (at 38408) by debbugs.gnu.org; 5 Jul 2020 00:23:31 +0000 Received: from localhost ([127.0.0.1]:59858 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jrsRO-0004qq-Pk for submit@debbugs.gnu.org; Sat, 04 Jul 2020 20:23:31 -0400 Received: from pat.zlotemysli.pl ([37.59.186.212]:59660) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jrsRM-0004qh-Tg for 38408@debbugs.gnu.org; Sat, 04 Jul 2020 20:23:30 -0400 Received: (qmail 3788 invoked by uid 1009); 5 Jul 2020 02:23:27 +0200 Received: from 188.123.215.55 (kuba@kadziolka.net@188.123.215.55) by pat.zlotemysli.pl (envelope-from , uid 1002) with qmail-scanner-2.08st (clamdscan: 0.98.6/25862. spamassassin: 3.4.0. perlscan: 2.08st. Clear:RC:1(188.123.215.55):. Processed in 0.053477 secs); 05 Jul 2020 00:23:27 -0000 Received: from unknown (HELO gravity) (kuba@kadziolka.net@188.123.215.55) by pat.zlotemysli.pl with SMTP; 5 Jul 2020 02:23:26 +0200 Date: Sun, 5 Jul 2020 02:23:25 +0200 From: Jakub =?utf-8?B?S8SFZHppb8WCa2E=?= To: Martin Becze Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix Message-ID: <20200705002325.4yz3ur6fpvpr5ziy@gravity> References: <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> <87lfn0myho.fsf@gnu.org> <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="i5g4lyhomimgvyyn" Content-Disposition: inline In-Reply-To: X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Ludovic =?utf-8?Q?Court=C3=A8s?= , Efraim Flashner , jsoo1@asu.edu, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --i5g4lyhomimgvyyn Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Martin, On Wed, Apr 29, 2020 at 02:51:33PM -0500, Martin Becze wrote: > diff --git a/tests/crate.scm b/tests/crate.scm > index beaa696be0..65d5ac3389 100644 > --- a/tests/crate.scm > +++ b/tests/crate.scm > @@ -280,7 +280,7 @@ > (_ (error "Unexpected URL: " url))))) > =20 > (match (crate->guix-package "foo") > - ((define-public rust-foo-1.0.0 > + ((define-public rust-foo-1.0 > (package (name "rust-foo") > (version "1.0.0") > (source I was under the impression that, ideally, we'd only include the minor version when it's necessary for disambugating semver-incompatible packages, i. e. rust-foo@1.0.0 would be called rust-foo-1, but rust-bar@0.3.7 would be called rust-bar-0.3. Thoughts? Regards, Jakub K=C4=85dzio=C5=82ka --i5g4lyhomimgvyyn Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE5Xa/ss9usT31cTO54xWnWEYTFWQFAl8BHX0ACgkQ4xWnWEYT FWTblA//fRHVxpRTPRU2ZVFgAL64MvYo/hSq/6sCQvwVoMUTHEPleVYYvHpD6Tz8 6HER/6wOlN4KxypdYUExYdzL5LQvJjnsoiKeY4kSoG7ujH3dc3xodINcTzZOqb55 woK8kEa/f2fFCyU3U3BxvtmChSlQsmcP/exJjckwaetY2T8o9eYqiIavpX04Wxuv /IdcTnXuPQeTe49H005H47DlPtk8jjObglbxEroFc/3IJjdf2jloikzLM4xCW/sr Qhb5aUZpjAFRklhnxFMXVCUYiKB+RBETIbYTX/kMNWSG5z73+gWKR1/dKOJvOEcd nLdxRO6Hbmq3+QokzPENOAr6AGLDfkgFU08M0aPdToG3Gj2xrS3746v/McHdjAjK 7jGmWaNDSOABvg9zSUmu7pidsjiNSJRG9vnJLFPZRQ9J1qh29yfpXIOVXoQ9D7oL ZiG1dn3luWhUAEWzUvkfivBWttl7C3OX2UyQFuwdFMk9wAA6NRMBZdmYFo9qOhqo jsfS2DOQVbPMmA27AJiTiefRHPtGAHCuAf+5AHNNZNTQw6aaTpu5S57aLW1dEeBN Hq8uyRZBPDIzT5sitCQWaQ+Dutm7Sgjh4ijmm1qwxKJJu+J+bF94hr7jZgI2aq8w p+u2UFQIpelsQeQu+yuICG/68q24pESigtmhLVDPkD0QDUe9Fbk= =vu6v -----END PGP SIGNATURE----- --i5g4lyhomimgvyyn-- From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 18 05:45:11 2020 Received: (at submit) by debbugs.gnu.org; 18 Aug 2020 09:45:11 +0000 Received: from localhost ([127.0.0.1]:34027 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k7yAw-0002JD-54 for submit@debbugs.gnu.org; Tue, 18 Aug 2020 05:45:11 -0400 Received: from lists.gnu.org ([209.51.188.17]:47012) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k7yAu-0002Ib-1O for submit@debbugs.gnu.org; Tue, 18 Aug 2020 05:45:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35432) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k7yAt-0004g2-Pt for guix-patches@gnu.org; Tue, 18 Aug 2020 05:44:59 -0400 Received: from mx1.riseup.net ([198.252.153.129]:47252) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k7yAq-0003KV-B7 for guix-patches@gnu.org; Tue, 18 Aug 2020 05:44:59 -0400 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 4BW5c55gDFzFggx for ; Tue, 18 Aug 2020 02:44:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1597743893; bh=5XgNqbYcEvaU3Q53mCzrIFNl0rznF1tFAIINVKlljtc=; h=Subject:To:References:From:Date:In-Reply-To:From; b=mGp51QrIuMKUM7R+g7A/Jc/ne7CL07ilYtkXm57hT5pabTjgOZunvhVyO+FAmCJQI jPwYbMBOdlRkj39EHSwfqUAB2Q148SyxzaT4QWJ6GlKzN/Ee9LeYIRlHZpRR3REYOW v/6J4Vf/6XUSKKHmJjwSpD0NMVDj2k2PE7ZmCJVA= X-Riseup-User-ID: AF68FF609C59A1F6888BBD376AB45AC30DBD09FDED0C7EFE94BB6A60F1450836 Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id 4BW5c443C2z8tlQ for ; Tue, 18 Aug 2020 02:44:52 -0700 (PDT) Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix To: guix-patches@gnu.org References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> <87lfn0myho.fsf@gnu.org> <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> From: Martin Becze Autocrypt: addr=mjbecze@riseup.net; keydata= mQENBE9w5AMBCADgJkbsy1TAb9x2MHupHGu+Rb7utyvsx/tdv2amgkm80PdzDWOAVJGvRX8g UQfnUUIUwXhicdd0mG5Xmf1S6YreV2qM2rYqO8rFk6cWyLK6901NpD+gXJgjKLipvjk+8370 l7yUJmoSDdNDK7kIhWOs6HYkMK5No/Bs4SbtY5PjF1tVmNbk5KzlyKUDmMclQB1gI0cmrJ2s doTuLz4IC90UZYhV9pq/MIGjlh4eY8aQR5Uj6/jXtrwneS9V3ouhB+R9uHtKqqyok5nNdPlC UvfA/bo/2er9UAmSkewLQOTKOfwj0Ei5IQ2eRLtO5LZLZi3K4m6FOB9s37gZ5K8tp/KtABEB AAG0G21hcnRpbiA8bWpiZWN6ZUByaXNldXAubmV0PokBTwQTAQIAOQIbIwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l0SRB/9GFqbQeOADWJe9ke5RAAvD5HVGQCPCAsp+h+krgdsaOUySVAoVjo29fRQVoqmF1KY2 iCw9WQGiiwD8aMCEH1W+o9QPxMYeWFFyhqErEsv/BQRWNbvS9xb5YUXcB9QY68WDP83v5he2 pL7DI7fWwAx6xAAw9rgEduABewULNCsTUJzd9UG6HILEY7DLl/addQjvtTaITfKPYrrLnHND fQlGtxgzsfbkxezO8gYLARQBxAWETjOYxpt8d9J36FNnQN8OcsuXjEgYWh7dsPtp+w3P8Yj9 5YrEu/9+eehSy9ath6vhRF9N+/gvmR5WAb5EB8w/hm11pjeX9tY8vK7vuTt9uQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEW OslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsE wBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2e MfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6f Znyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+ WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz 7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/ 3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jp QKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr 2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN 1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4f z2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu6 4goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1F KV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WY klm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd 9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tB E3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA 2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8Aap WeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWu ad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee 0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69Y rAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDey qz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDS vxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O 0sP0pbX43gckRxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFF FIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx +/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67 LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9 lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32 bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/E J2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72 yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv 6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ /52H6c/CR7MVuQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm2 9JKWJ7GiAEr9HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gck Rxli01HouyL8IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBc hIuLk9IixsWAg4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZ JDQLIv7YdDiYuQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAA u6ebzwyvABEBAAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAK CRAyGpsLNjs9l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHx CsoqCMz+eneFVhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdn MQp6RWnin4ldtZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6T EW1qXs0cjMd/gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3 RFYqdxghW6brlmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV uQENBE9w5AMBCADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9 HOtHXDGJFbTc8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8 IbZouYAlyDsSk0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWA g4o5gWUQaoHoYPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiY uQWq9jQwuQNsfzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEB AAGJATYEGAECACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9 l6SuCAC1mgXQ4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneF VhzTLzdsmIjQKbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ld tZoD1gHrvi+qecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/ gKu6IUk6fFmX3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6br lmhRv28muUWNZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MVuQENBE9w5AMB CADE6N30hVEWOslgeMRX6Nu64goqIl0bWtDSvxs2jutimNm29JKWJ7GiAEr9HOtHXDGJFbTc 8OHhz1YoINsEwBoD1czOp+1FKV8i6HCL73+O0sP0pbX43gckRxli01HouyL8IbZouYAlyDsS k0o/VTPi1P2eMfNSXG77I8WYklm46hzv7KFFFIzHWF2bfLBchIuLk9IixsWAg4o5gWUQaoHo YPOzXv1m6h6fZnyy6gIs57Dd9Cwakxv7mZLx+/Yf9hnYAYRZJDQLIv7YdDiYuQWq9jQwuQNs fzYMI6NKgQC+WwOjCbksq9tBE3G4hldltS67LogTtLN6kMAAu6ebzwyvABEBAAGJATYEGAEC ACACGwwWIQTz7/81Or0tjbvA2rEyGpsLNjs9lwUCWQWzWQAKCRAyGpsLNjs9l6SuCAC1mgXQ 4+WvOGIhgeE/3QxuafVj8AapWeN54Lp5On32bkphwAVBFSHxCsoqCMz+eneFVhzTLzdsmIjQ Kbd1U2BZf5jpQKKC+WsNxfWuad2Q500bYO/EJ2kkgKoW8sdnMQp6RWnin4ldtZoD1gHrvi+q ecnLqVSt3zJr2CmI+eBzSDee0KJxXYx2ga72yrrH9UhYE+6TEW1qXs0cjMd/gKu6IUk6fFmX 3mzizUG6k4lN1WefLgRkS69YrAiRTtrpUvMv6BEeLBDlBzi3RFYqdxghW6brlmhRv28muUWN ZjlEbsKmDE4fz2JVN64/wDeyqz/XREkWNYtJ/52H6c/CR7MV Message-ID: <02124b1e-1b8a-9374-3e6e-59a01559207d@riseup.net> Date: Tue, 18 Aug 2020 04:44:29 -0500 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="7xuGDDExQBbJapEEySFP48bxCgLMkgLDz" Received-SPF: pass client-ip=198.252.153.129; envelope-from=mjbecze@riseup.net; helo=mx1.riseup.net X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/18 05:44:54 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.4 (-) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.1 (/) This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --7xuGDDExQBbJapEEySFP48bxCgLMkgLDz Content-Type: multipart/mixed; boundary="qShXWALEAtvGcp0EyHBjQhIUzZHBDgE44"; protected-headers="v1" From: Martin Becze To: guix-patches@gnu.org Message-ID: <02124b1e-1b8a-9374-3e6e-59a01559207d@riseup.net> Subject: Re: [bug#38408] [PATCH v9 3/8] Added Guile-Semver as a dependency to guix References: <20200217100345.GI1968@E5400> <87wo8l702y.fsf@gnu.org> <874kvld2bl.fsf@gnu.org> <87sgj4nwjw.fsf@gnu.org> <8453e3ce-bc5a-3bb3-1bfb-deaca7ca11d3@riseup.net> <6386cf3e-1156-8d09-a264-cacbb4935f03@riseup.net> <47ed3e36-0d9f-cd6f-a64b-e3f9c9d71537@riseup.net> <20200322201018.GB16716@jasmine.lan> <45972138-5bf8-821a-178a-c04e6446e076@riseup.net> <87mu86njj3.fsf@gnu.org> <5ae20de5-ddf8-22ab-2c40-d76715751962@riseup.net> <6eedb6bb-49ec-87ac-9a38-10d02a21726f@riseup.net> <87lfn0myho.fsf@gnu.org> <3a0949f6-0e01-0909-f3c8-311c4bb5cf7b@riseup.net> In-Reply-To: --qShXWALEAtvGcp0EyHBjQhIUzZHBDgE44 Content-Type: multipart/mixed; boundary="------------3532F8C7D8E076974CC77365" Content-Language: en-US This is a multi-part message in MIME format. --------------3532F8C7D8E076974CC77365 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Stale again! here is an updated patch. On 5/8/20 2:57 PM, Martin Becze wrote: > Hi guix, > this patch set is stale again. here is an update patch for the stale pa= rt. >=20 > On 4/29/20 2:51 PM, Martin Becze wrote: >> This patch has gotten stall again, with commits >> 5fbc753ab524809cd81e3e5c54b3d0acbe33792d and >> 5dfe02c60767a633c67f7f6fc9557b54b3c99b63\ >> >> here is an updated patch set. >> >> Also git pull work on this agian! not sure why, but prob something on = my >> end. >> >> as always let me know if there is anything that needs to be fixed. >> >> thanks! >> >> >> On 4/17/20 9:57 AM, Martin Becze wrote: >>> Sounds good! >>> There seems to be a regression now. guix pull fails to build >>> extra-modules, it can't find the guile-semver module. Any clues on wh= at >>> to look for to fix this? >>> >>> On 4/12/20 11:59 AM, Ludovic Court=C3=A8s wrote: >>>> Hi Martin, >>>> >>>> Martin Becze skribis: >>>> >>>>> The previous email had the attached set (v13). Let me know if it go= t >>>>> lost and I need to send it again. >>>> >>>> I think it just needs some more review time, everything is good on y= our >>>> side! >>>> >>>> I=E2=80=99m sorry it takes this long. As far as I=E2=80=99m concern= ed, I=E2=80=99m focusing on >>>> getting the release out of the door currently=E2=80=A6 almost there!= >>>> >>>> Thank you, >>>> Ludo=E2=80=99. >>>> >>> >>> >>> --------------3532F8C7D8E076974CC77365 Content-Type: text/x-patch; charset=UTF-8; name="0001-import-utils-recursive-import-accepts-an-optional-ve.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename*0="0001-import-utils-recursive-import-accepts-an-optional-ve.pa"; filename*1="tch" =46rom 178f37685340758c2abb488cd78fd5291e419010 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 4 Feb 2020 07:18:18 -0500 Subject: [PATCH 1/6] import: utils: 'recursive-import' accepts an optiona= l version parameter. This adds a key VERSION to 'recursive-import' and move the paramter REPO = to a key. This also changes all the things that rely on 'recursive-import' * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REP= O a key. (package->definition): Added optional 'append-version?'. * guix/import/cran.scm (cran->guix-package): Change the REPO parameter to= a key. (cran-recursive-import): Likewise. * guix/import/elpa.scm (elpa->guix-pakcage): Likewise. (elpa-recursive-import): Likewise. * guix/import/gem.scm (gem->guix-package): Likewise. (recursive-import): Likewise. * guix/import/opam.scm (opam-recurive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. * guix/scripts/import/cran.scm: (guix-import-cran) Likewise. * guix/scripts/import/elpa.scm: (guix-import-elpa) Likewise. * tests/elpa.scm: (eval-test-with-elpa) Likewise. * tests/import-utils.scm Likewise. --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 8 ++--- guix/import/pypi.scm | 8 ++--- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 59 ++++++++++++++++++++++-------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 74 insertions(+), 46 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index a1275b4822..d8240a6b2f 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright =C2=A9 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus <= rekado@elephly.net> ;;; Copyright =C2=A9 2015, 2016, 2017, 2019, 2020 Ludovic Court=C3=A8s <= ludo@gnu.org> ;;; Copyright =C2=A9 2017 Mathieu Othacehe +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -568,7 +569,7 @@ from the alist META, which was derived from the R pac= kage's DESCRIPTION file." =20 (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) version) "Fetch the metadata for PACKAGE-NAME from REPO and return the `pack= age' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -586,8 +587,9 @@ s-expression corresponding to that package, or #f on = failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) =20 -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) =20 diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 871b918f88..c4e8e84aba 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright =C2=A9 2015 Federico Beffa ;;; Copyright =C2=A9 2015, 2016, 2017, 2018, 2020 Ludovic Court=C3=A8s <= ludo@gnu.org> ;;; Copyright =C2=A9 2018 Oleg Pykhalov +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) =20 -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) version) "Fetch the package NAME from REPO and produce a Guix package S-express= ion." (match (fetch-elpa-package name repo) (#f #f) @@ -299,7 +300,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) =20 (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) =20 diff --git a/guix/import/gem.scm b/guix/import/gem.scm index a2d99ddbca..a48b2f86d9 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright =C2=A9 2016 Ben Woodcroft ;;; Copyright =C2=A9 2018 Oleg Pykhalov ;;; Copyright =C2=A9 2020 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -122,7 +123,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, = and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) =20 -(define* (gem->guix-package package-name #:optional (repo 'rubygems) ver= sion) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version)= "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the= `package' s-expression corresponding to that package, or #f on failure."= (let ((gem (rubygems-fetch package-name))) @@ -188,6 +189,7 @@ package on RubyGems." (latest latest-release))) =20 (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index 9cda3da006..33d310392b 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2018 Julien Lepiller +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -250,7 +251,7 @@ path to the repository." (substring version 1) version))))) =20 -(define* (opam->guix-package name #:key (repository (get-opam-repository= ))) +(define* (opam->guix-package name #:key (repository (get-opam-repository= )) version) "Import OPAM package NAME from REPOSITORY (a directory name) or, if REPOSITORY is #f, from the official OPAM repository. Return a 'package'= sexp or #f on failure." @@ -311,9 +312,8 @@ or #f on failure." dependencies)))))))) =20 (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (opam->guix-package name)) + (recursive-import package-name + #:repo->guix-package opam->guix-package #:guix-name ocaml-name->guix-name)) =20 (define (guix-name->opam-name name) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index a4a2489688..2a38b54f53 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -8,6 +8,7 @@ ;;; Copyright =C2=A9 2020 Jakub K=C4=85dzio=C5=82ka = ;;; Copyright =C2=A9 2020 Lars-Dominik Braun ;;; Copyright =C2=A9 2020 Arun Isaac +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -471,7 +472,7 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION= , and LICENSE." =20 (define pypi->guix-package (memoize - (lambda* (package-name) + (lambda* (package-name #:key repo version) "Fetch the metadata for PACKAGE-NAME from pypi.org, and return the `package' s-expression corresponding to that package, or #f on failure."= (let* ((project (pypi-fetch package-name)) @@ -495,9 +496,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION= , and LICENSE." (project-info-license info))))))))) =20 (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (pypi->guix-package name)) + (recursive-import package-name + #:repo->guix-package pypi->guix-package #:guix-name python->package-name)) =20 (define (string->license str) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index e04073d193..e98c37d2a3 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2017 Federico Beffa ;;; Copyright =C2=A9 2018 Ricardo Wurmus +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -108,8 +109,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-= name)))))) =20 (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda* (name #:key repo versi= on) (apply stackage->guix-package= (cons name args))) #:guix-name hackage-name->package-name)) =20 diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 0cfa1f8321..c66e7ca6bd 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -5,6 +5,7 @@ ;;; Copyright =C2=A9 2017, 2019, 2020 Ricardo Wurmus ;;; Copyright =C2=A9 2018 Oleg Pykhalov ;;; Copyright =C2=A9 2019 Robert Vollmert +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,6 +45,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri =20 flatten @@ -250,13 +252,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) =20 -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" versio= n) + version)) ,guix-package)))) =20 (define (build-system-modules) @@ -405,32 +409,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) =20 -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version re= po #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expre= ssion -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix pac= kage -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a= +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) =20 - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) =20 - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normilizied-deps (map (match-lambda + ((name version) (list name version))= + (name (list name #f))) dependencies)= )) + (make-node name version package normilizied-deps))) =20 (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) + (lambda (node) + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) + (node-dependencies node)))) (lambda (node) - (map lookup-node - (remove exists? - (node-dependencies node)))) - node-name))) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2014 Eric Bavier ;;; Copyright =C2=A9 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.= \n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran)= )) + #:repo (or (assoc-ref opts 'repo)= 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'c= ran)))) + #:repo (or (assoc-ref opts 'r= epo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~= a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2015 Federico Beffa ;;; Copyright =C2=A9 2018 Oleg Pykhalov +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an = ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))= ) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts = 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)= ))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-n= ame)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2015 Federico Beffa ;;; Copyright =C2=A9 2020 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2015, 2017 Ricardo Wurmus ;;; Copyright =C2=A9 2016 Ben Woodcroft +;;; Copyright =C2=A9 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) --=20 2.28.0 --------------3532F8C7D8E076974CC77365-- --qShXWALEAtvGcp0EyHBjQhIUzZHBDgE44-- --7xuGDDExQBbJapEEySFP48bxCgLMkgLDz Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE8+//NTq9LY27wNqxMhqbCzY7PZcFAl87ov4ACgkQMhqbCzY7 PZdPUggAkfvUfDnHZeKvLGCpjaW/nG+qzGYK3OQCjirkssjoOYxGMadkoNARVquq UiRIs1ajIPpEg/Z0Jho+fLbxp2xFYhuvYkGHWIAJY4WYg/FPEqcZf5WM/FT0xvUj 9h0BZozoRV7VGrDG3lFQAtnuDYmfi0P8lJjTEBfXguJKprXqpbIL2d0B5KtSzqZ5 edpYcnDdg0WWENnu/AqV1r9kHlslnBTeJzJVuLYJnsR5M6szQyqQ5NUT8zDuGs0w flm9efHGC8rPtmgbSEzETY4GdD42oBqI3opTEmMtCffalgiFFEFIDMXE70NwRpjt mQH64tilicErhbW/LBFPUkmrxcjZWw== =B5cW -----END PGP SIGNATURE----- --7xuGDDExQBbJapEEySFP48bxCgLMkgLDz-- From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 07 17:19:44 2020 Received: (at 38408) by debbugs.gnu.org; 7 Nov 2020 22:19:44 +0000 Received: from localhost ([127.0.0.1]:59379 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kbWYi-0002Jj-1A for submit@debbugs.gnu.org; Sat, 07 Nov 2020 17:19:44 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:53450) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kbWYg-0002Jb-9w for 38408@debbugs.gnu.org; Sat, 07 Nov 2020 17:19:42 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CTBWd0fWnz1qql9 for <38408@debbugs.gnu.org>; Sat, 7 Nov 2020 23:19:40 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CTBWc6GcYz1qwT3 for <38408@debbugs.gnu.org>; Sat, 7 Nov 2020 23:19:40 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id GFC-oAcoflbT for <38408@debbugs.gnu.org>; Sat, 7 Nov 2020 23:19:39 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-48-251.dynamic.mnet-online.de [188.174.48.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS for <38408@debbugs.gnu.org>; Sat, 7 Nov 2020 23:19:39 +0100 (CET) Received: from thisbe.goebel-consult.de (hermia.goebel-consult.de [192.168.110.7]) by hermia.goebel-consult.de (Postfix) with ESMTP id 483CC6013E for <38408@debbugs.gnu.org>; Sat, 7 Nov 2020 23:20:02 +0100 (CET) To: 38408@debbugs.gnu.org Subject: [PATCH 0/3] (WIP) Semantic version aware recusive importer for crates From: Hartmut Goebel Organization: crazy-compilers.com Message-ID: Date: Sat, 7 Nov 2020 23:19:37 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Ludo, this patch is awaiting your review since April. Maybe you could find some time to finish it, since it would ease importing and updating rust creates *a lot*. See https://lists.gnu.org/archive/html/guix-devel/2020-11/msg00168.html Many thanks. -- Regards Hartmut Goebel | Hartmut Goebel | h.goebel@crazy-compilers.com | | www.crazy-compilers.com | compilers which you thought are impossible | From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 07 17:35:39 2020 Received: (at 38408) by debbugs.gnu.org; 7 Nov 2020 22:35:40 +0000 Received: from localhost ([127.0.0.1]:59389 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kbWo7-0002iu-JQ for submit@debbugs.gnu.org; Sat, 07 Nov 2020 17:35:39 -0500 Received: from eggs.gnu.org ([209.51.188.92]:53222) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kbWo5-0002if-EI for 38408@debbugs.gnu.org; Sat, 07 Nov 2020 17:35:37 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:38314) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kbWnz-0003Be-ES; Sat, 07 Nov 2020 17:35:31 -0500 Received: from host-37-191-236-253.lynet.no ([37.191.236.253]:37262 helo=localhost) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1kbWny-0006z7-Vy; Sat, 07 Nov 2020 17:35:31 -0500 From: Marius Bakke To: Hartmut Goebel , 38408@debbugs.gnu.org Subject: Re: [bug#38408] [PATCH 0/3] (WIP) Semantic version aware recusive importer for crates In-Reply-To: References: Date: Sat, 07 Nov 2020 23:35:27 +0100 Message-ID: <87wnywg5hs.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) --=-=-= Content-Type: text/plain Hartmut Goebel writes: > Hi Ludo, > > this patch is awaiting your review since April. Maybe you could find > some time to finish it, since it would ease importing and updating rust > creates *a lot*. See > https://lists.gnu.org/archive/html/guix-devel/2020-11/msg00168.html I don't think Ludovic has exclusive review rights on this issue. That is, anyone is free to review and merge. If you need this feature, perhaps you could try it and report whether it works (or not) for you? --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFDBAEBCgAtFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAl+nIS8PHG1hcml1c0Bn bnUub3JnAAoJEKKgbfKjOlT6bqEIAMLbbfSrLYthORJ1fBaUzG3fsqHqpn0QhGrA 11euqDp7IJlg+nvGDb3t3jMWH4apuV5k11X3zVYHuCGOyOrfNQhHfBk3QffWWDGy XXhTFcx3tTvPrmwxICg0237qgp4pFXvpcWUkMmj1XqgbDHUr3eEEYCYeEyqPwV8y 5EqhzmyxM/lAnRoEYVXDpKMksv+26FIRGl07YKxYQ8XpbU0B5KZFm+pFtK1iirHF hi752h9SlcmC8BkuX/+mqxABD0Q5b169C0/sMCsa5E+zSD5ul0T8BWGoe61S1SJD iS5KakbWnnpbEl09iD7bQout7cBOKSFm7aV9EyPJErHVZbTC/oI= =jfHE -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 09 12:15:47 2020 Received: (at 38408) by debbugs.gnu.org; 9 Nov 2020 17:15:47 +0000 Received: from localhost ([127.0.0.1]:35505 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcAlf-000894-1x for submit@debbugs.gnu.org; Mon, 09 Nov 2020 12:15:47 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:50890) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcAld-00088w-Fp for 38408@debbugs.gnu.org; Mon, 09 Nov 2020 12:15:45 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CVHh01vXBz1qsb3; Mon, 9 Nov 2020 18:15:44 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CVHh0058Vz1qyX9; Mon, 9 Nov 2020 18:15:43 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id LU_cIGUl0V-7; Mon, 9 Nov 2020 18:15:43 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-48-59.dynamic.mnet-online.de [188.174.48.59]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Mon, 9 Nov 2020 18:15:43 +0100 (CET) Received: from lenashee.goebel-consult.de (lenashee.goebel-consult.de [192.168.110.2]) by hermia.goebel-consult.de (Postfix) with ESMTP id A7F8860272; Mon, 9 Nov 2020 18:16:12 +0100 (CET) Subject: Re: [bug#38408] [PATCH 0/3] (WIP) Semantic version aware recusive importer for crates To: Marius Bakke , 38408@debbugs.gnu.org References: <87wnywg5hs.fsf@gnu.org> From: Hartmut Goebel Organization: crazy-compilers.com Message-ID: Date: Mon, 9 Nov 2020 18:15:40 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.0 MIME-Version: 1.0 In-Reply-To: <87wnywg5hs.fsf@gnu.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Am 07.11.20 um 23:35 schrieb Marius Bakke: > I don't think Ludovic has exclusive review rights on this issue. That > is, anyone is free to review and merge. > > If you need this feature, perhaps you could try it and report whether it > works (or not) for you? This is a huge pile of comments and versions, patches by others, some already applied patches, etc. This is very hard to follow, one has to check 20 mails/article whether they contain a patch, same the path (giving it a filename), etc. This is why I'm asking those who already worked on this to finish the review. IMHO this shows the limitations of a mail-based patch workflow. Anyhow, I'll give it a try (steadying my optinion against mail-based software development) -- Regards Hartmut Goebel | Hartmut Goebel | h.goebel@crazy-compilers.com | | www.crazy-compilers.com | compilers which you thought are impossible | From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 09 12:27:56 2020 Received: (at 38408) by debbugs.gnu.org; 9 Nov 2020 17:27:56 +0000 Received: from localhost ([127.0.0.1]:35512 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcAxQ-0008Qd-4X for submit@debbugs.gnu.org; Mon, 09 Nov 2020 12:27:56 -0500 Received: from relay1-d.mail.gandi.net ([217.70.183.193]:21527) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcAxO-0008QQ-KO for 38408@debbugs.gnu.org; Mon, 09 Nov 2020 12:27:55 -0500 X-Originating-IP: 185.131.40.67 Received: from localhost (40-67.ipv4.commingeshautdebit.fr [185.131.40.67]) (Authenticated sender: admin@nicolasgoaziou.fr) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 302A324000A; Mon, 9 Nov 2020 17:27:47 +0000 (UTC) From: Nicolas Goaziou To: Hartmut Goebel Subject: Re: [bug#38408] [PATCH 0/3] (WIP) Semantic version aware recusive importer for crates References: <87wnywg5hs.fsf@gnu.org> Date: Mon, 09 Nov 2020 18:27:46 +0100 In-Reply-To: (Hartmut Goebel's message of "Mon, 9 Nov 2020 18:15:40 +0100") Message-ID: <877dquh23x.fsf@nicolasgoaziou.fr> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Marius Bakke X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hello, Hartmut Goebel writes: > Am 07.11.20 um 23:35 schrieb Marius Bakke: >> I don't think Ludovic has exclusive review rights on this issue. That >> is, anyone is free to review and merge. >> >> If you need this feature, perhaps you could try it and report whether it >> works (or not) for you? > > This is a huge pile of comments and versions, patches by others, some > already applied patches, etc. This is very hard to follow, one has to > check 20 mails/article whether they contain a patch, same the path > (giving it a filename), etc. This is why I'm asking those who already > worked on this to finish the review. IIUC, the base set is there: https://lists.gnu.org/archive/html/guix-patches/2020-04/msg01442.html then, two patches (the first and sixth) need to be replaced with the following ones: https://lists.gnu.org/archive/html/guix-patches/2020-05/msg00408.html and https://lists.gnu.org/archive/html/guix-patches/2020-08/msg00432.html HTH, -- Nicolas Goaziou From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 16:39:27 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 21:39:27 +0000 Received: from localhost ([127.0.0.1]:39196 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMN-0006xP-Cu for submit@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:27 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:53128) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbML-0006xH-D0 for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:25 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW1Tm0jyGz1rtMh; Tue, 10 Nov 2020 22:39:23 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW1Tl62BPz1r56y; Tue, 10 Nov 2020 22:39:23 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id VrGBF44u3hMp; Tue, 10 Nov 2020 22:39:22 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 22:39:22 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id 4A3CC60154; Tue, 10 Nov 2020 22:39:56 +0100 (CET) From: Hartmut Goebel To: guix-patches@gnu.org, 38408@debbugs.gnu.org Subject: [PATCH v16 0/6] New take on: Semantic version aware recursive importer for crates Date: Tue, 10 Nov 2020 22:39:19 +0100 Message-Id: X-Mailer: git-send-email 2.21.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This is a new attempt to get this stale patch done. Summary: * All remarks by Ludo have been handled so far. IMHO we are almost done with this series. * Major design decision open: Shall package variable names have sem semver version appended instead of major+minor? * Still some minor issues, which I'll comment on in the next messages. This series basically is the series Martin posted in https://lists.gnu.org/archive/html/guix-patches/2020-04/msg01442.html with two patches (the first and sixth) replaced by https://lists.gnu.org/archive/html/guix-patches/2020-05/msg00408.html and https://lists.gnu.org/archive/html/guix-patches/2020-08/msg00432.html I applied these on fdb77b362 (2020-08-09) and rebased it to master. I reviewed the commit messages, and in the code adjusted some formatting and fixed some typos. I also moved patch 6 to become the 2nd one, since guile-semver is required in the (now) 3rd patch. Martin Becze (6): import: utils: 'recursive-import' accepts an optional version parameter. guix: self: Add guile-semver as a depenedency. import: crate: Use guile-semver to resolve module versions. import: crate: Memorize crate->guix-package. import: utils: Trim patch version from names. import: crate: Parameterized importing of dev dependencies. guix/import/cran.scm | 8 +- guix/import/crate.scm | 112 ++++++++---- guix/import/elpa.scm | 6 +- guix/import/gem.scm | 6 +- guix/import/opam.scm | 8 +- guix/import/pypi.scm | 8 +- guix/import/stackage.scm | 5 +- guix/import/utils.scm | 79 +++++--- guix/scripts/import/cran.scm | 5 +- guix/scripts/import/crate.scm | 13 +- guix/scripts/import/elpa.scm | 4 +- guix/self.scm | 8 +- tests/crate.scm | 329 +++++++++++++++++++--------------- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +- 15 files changed, 362 insertions(+), 240 deletions(-) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 16:39:43 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 21:39:43 +0000 Received: from localhost ([127.0.0.1]:39203 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMc-0006y6-Us for submit@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:43 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:52406) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMb-0006xy-IW for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:41 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW1V50H8bz1qrfr; Tue, 10 Nov 2020 22:39:41 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW1V503xvz1r56y; Tue, 10 Nov 2020 22:39:40 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id yyVcVGV0HYCb; Tue, 10 Nov 2020 22:39:40 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 22:39:40 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id 146A660279; Tue, 10 Nov 2020 22:40:10 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v16 2/6] guix: self: Add guile-semver as a depenedency. Date: Tue, 10 Nov 2020 22:39:29 +0100 Message-Id: X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze * guix/self.scm (compiled-guix): Add guile-semver as a depenedency. --- guix/self.scm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index bbfd2f1b95..1a3f748bea 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -53,6 +54,7 @@ ("guile-json" (ref '(gnu packages guile) 'guile-json-4)) ("guile-ssh" (ref '(gnu packages ssh) 'guile-ssh)) ("guile-git" (ref '(gnu packages guile) 'guile-git)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile-sqlite3)) ("guile-zlib" (ref '(gnu packages guile) 'guile-zlib)) ("guile-lzlib" (ref '(gnu packages guile) 'guile-lzlib)) @@ -799,6 +801,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -807,7 +812,8 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3 guile-zlib guile-lzlib)) + guile-ssh guile-sqlite3 guile-zlib guile-lzlib + guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 16:39:55 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 21:39:55 +0000 Received: from localhost ([127.0.0.1]:39206 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMh-0006yN-6a for submit@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:55 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:55205) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMY-0006xu-P8 for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:45 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW1V20T9xz1qrfb; Tue, 10 Nov 2020 22:39:37 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW1V15zbhz1r56y; Tue, 10 Nov 2020 22:39:37 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id ktFGRbEogZL4; Tue, 10 Nov 2020 22:39:36 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 22:39:35 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id E10A660154; Tue, 10 Nov 2020 22:40:09 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v16 1/6] import: utils: 'recursive-import' accepts an optional version parameter. Date: Tue, 10 Nov 2020 22:39:28 +0100 Message-Id: <20f6ec30ee6caa18645bf82878e57a9ff2f53224.1605042644.git.h.goebel@crazy-compilers.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) From: Martin Becze This adds a key VERSION to 'recursive-import' and moves the parameter REPO to a key. This also changes all the places that rely on 'recursive-import'. * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. (package->definition): Add optional 'append-version?'. * guix/import/cran.scm (cran->guix-package, cran-recursive-import): Change the REPO parameter to a key. * guix/import/elpa.scm (elpa->guix-package, elpa-recursive-import): Likewise. * guix/import/gem.scm (gem->guix-package, recursive-import): Likewise. * guix/import/opam.scm (opam-recurive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. * guix/scripts/import/cran.scm (guix-import-cran): Likewise. * guix/scripts/import/elpa.scm (guix-import-elpa): Likewise. * tests/elpa.scm (eval-test-with-elpa): Likewise. * tests/import-utils.scm (recursive-import): Likewise. --- guix/import/cran.scm | 8 +++-- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 8 ++--- guix/import/pypi.scm | 8 ++--- guix/import/stackage.scm | 5 ++-- guix/import/utils.scm | 57 +++++++++++++++++++++++------------- guix/scripts/import/cran.scm | 5 ++-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 11 files changed, 73 insertions(+), 45 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index a1275b4822..d8240a6b2f 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -568,7 +569,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) version) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -586,8 +587,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 871b918f88..c4e8e84aba 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) version) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -299,7 +300,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index 3fe240f36a..1f6f94532e 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -122,7 +123,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((gem (rubygems-fetch package-name))) @@ -188,6 +189,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index 6d9eb0a092..867812124d 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -260,7 +261,7 @@ path to the repository." (substring version 1) version))))) -(define* (opam->guix-package name #:key (repository (get-opam-repository))) +(define* (opam->guix-package name #:key (repository (get-opam-repository)) version) "Import OPAM package NAME from REPOSITORY (a directory name) or, if REPOSITORY is #f, from the official OPAM repository. Return a 'package' sexp or #f on failure." @@ -322,9 +323,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (opam->guix-package name)) + (recursive-import package-name + #:repo->guix-package opam->guix-package #:guix-name ocaml-name->guix-name)) (define (guix-name->opam-name name) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index 15116e349d..bf4dc50138 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -8,6 +8,7 @@ ;;; Copyright © 2020 Jakub Kądziołka ;;; Copyright © 2020 Lars-Dominik Braun ;;; Copyright © 2020 Arun Isaac +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -471,7 +472,7 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (define pypi->guix-package (memoize - (lambda* (package-name) + (lambda* (package-name #:key repo version) "Fetch the metadata for PACKAGE-NAME from pypi.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let* ((project (pypi-fetch package-name)) @@ -495,9 +496,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (project-info-license info))))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (pypi->guix-package name)) + (recursive-import package-name + #:repo->guix-package pypi->guix-package #:guix-name python->package-name)) (define (string->license str) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 93cf214127..0a60adffc8 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -107,8 +108,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda* (name #:key repo version) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 145515c489..895fbb11a8 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert ;;; Copyright © 2020 Helio Machado <0x2b3bfa0+guix@googlemail.com> +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -45,6 +46,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -254,13 +256,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -409,32 +413,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normalizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normalizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) (lambda (node) - (map lookup-node - (remove exists? + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) (node-dependencies node)))) - node-name))) + (lambda (node) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 16:39:56 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 21:39:56 +0000 Received: from localhost ([127.0.0.1]:39210 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMp-0006yo-1k for submit@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:56 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:49211) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMg-0006yL-Fs for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:47 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW1V96qbyz1qrfg; Tue, 10 Nov 2020 22:39:45 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW1V96cMrz1r56y; Tue, 10 Nov 2020 22:39:45 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id uWuRnDzPEhdp; Tue, 10 Nov 2020 22:39:43 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 22:39:43 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id 4612860355; Tue, 10 Nov 2020 22:40:10 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v16 3/6] import: crate: Use guile-semver to resolve module versions. Date: Tue, 10 Nov 2020 22:39:30 +0100 Message-Id: X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze * guix/import/crate.scm: Add guile-semver as a soft dependency. (make-crate-sexp): Don't allow other keys. Add '#:skip-build?' to build system args. Pass a VERSION argument to 'cargo-inputs'. Move 'package-definition' from scripts/import/crate.scm to here. (crate->guix-package): Use guile-semver to resolve the correct module versions. Treat "build" dependencies as normal dependencies. (crate-name->package-name): Reuse the procedure 'guix-name' instead of duplicating its logic. * guix/import/utils.scm (package-names->package-inputs): Implement handling of (name version) pairs. * guix/scripts/import/crate.scm (guix-import-crate): Move 'package-definition' from here to guix/import/crate.scm. * tests/crate.scm: (recursive-import) Add version data to the test. --- guix/import/crate.scm | 96 ++++++---- guix/import/utils.scm | 21 ++- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 330 +++++++++++++++++++--------------- 4 files changed, 266 insertions(+), 192 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 8c2b76cab4..0802ecd315 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -37,6 +37,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -85,10 +86,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -142,16 +148,22 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) + home-page synopsis description license) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) + (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -163,7 +175,8 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) (home-page ,(match home-page @@ -176,7 +189,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -187,14 +200,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -204,22 +222,37 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate)))) + ;; finds the a version of a crate that fulfills the semver + (define (find-version crate range) + (find (lambda (version) + (semver-range-contains-string? + range + (crate-version-number version))) + (crate-versions crate))) + (define version* (and crate - (find (lambda (version) - (string=? (crate-version-number version) - version-number)) - (crate-versions crate)))) + (find-version crate version-number))) + + ;; sorts the dependencies and maps the dependencies to a list containing + ;; pairs of (name version) + (define (sort-map-dependencies deps) + (sort (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps) + (match-lambda* (((_ name) ...) + (apply string-ci (crate-version-license version*) string->license)) - (append cargo-inputs cargo-development-inputs))))) - -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) + cargo-inputs)))) + +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -254,7 +284,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 895fbb11a8..10eb030188 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -229,13 +229,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index 61a04f986b..beaa696be0 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,8 +37,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"foo\", \"num\": \"1.0.0\", @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", - \"kind\": \"normal\" + \"crate_id\": \"leaf-alice\", + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -68,8 +70,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"foo\", \"num\": \"1.0.0\", @@ -87,19 +89,23 @@ \"dependencies\": [ { \"crate_id\": \"intermediate-1\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -112,8 +118,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"intermediate-1\", \"num\": \"1.0.0\", @@ -131,15 +137,18 @@ \"dependencies\": [ { \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -152,8 +161,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"intermediate-2\", \"num\": \"1.0.0\", @@ -171,7 +180,8 @@ \"dependencies\": [ { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -184,8 +194,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"leaf-alice\", \"num\": \"1.0.0\", @@ -211,7 +221,7 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], + \"keywords\": [\"dummy\", \"test\"], \"categories\": [\"test\"] \"actual_versions\": [ { \"id\": \"leaf-bob\", @@ -253,34 +263,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -335,105 +359,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 16:39:56 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 21:39:56 +0000 Received: from localhost ([127.0.0.1]:39212 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMq-0006yw-31 for submit@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:56 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:44143) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMk-0006yV-1S for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:50 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW1VF0nBvz1rt3g; Tue, 10 Nov 2020 22:39:49 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW1VF0gVNz1r570; Tue, 10 Nov 2020 22:39:49 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id Nk-b6JSokzqV; Tue, 10 Nov 2020 22:39:48 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 22:39:48 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id 6E11760378; Tue, 10 Nov 2020 22:40:10 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v16 4/6] import: crate: Memorize crate->guix-package. Date: Tue, 10 Nov 2020 22:39:31 +0100 Message-Id: <69c3132b593e78efe8c4e1d18d4b283fffe27dba.1605042644.git.h.goebel@crazy-compilers.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze This adds memorization to procedures that involve network lookups. 'lookup-crate*' is used on every dependency of a package to get its version list. It is also used to lookup a package's metadata. 'crate-recursive-import' is also memorized since creating the same package twice will trigger a lookup on its dependencies. * guix/import/crate.scm (lookup-crate*): New procedure. (crate->guix-package): Memorize package metadata lookups. (crate-recursive-import): Memorize package creation. --- guix/import/crate.scm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 0802ecd315..4c36a32442 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -27,6 +27,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -110,6 +111,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define lookup-crate* (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -215,7 +218,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (lookup-crate* crate-name)) (define version-number (and crate @@ -239,7 +242,7 @@ latest version of CRATE-NAME." (define (sort-map-dependencies deps) (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (lookup-crate* name)) (req (crate-dependency-requirement dep)) (ver (find-version crate req))) (list name @@ -268,7 +271,7 @@ latest version of CRATE-NAME." (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package (memoize crate->guix-package) #:version version #:guix-name crate-name->package-name)) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 16:39:56 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 21:39:56 +0000 Received: from localhost ([127.0.0.1]:39214 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMq-0006z3-CE for submit@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:56 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:57039) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMn-0006yf-Hm for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:53 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW1VK05tSz1qs0h; Tue, 10 Nov 2020 22:39:53 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW1VJ74JPz1r570; Tue, 10 Nov 2020 22:39:52 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id 9oSvXEf1MEbu; Tue, 10 Nov 2020 22:39:51 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 22:39:51 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id 9724F60406; Tue, 10 Nov 2020 22:40:10 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v16 5/6] import: utils: Trim patch version from names. Date: Tue, 10 Nov 2020 22:39:32 +0100 Message-Id: <2ad891ae18822a86b60dbd4d148e4a8ab690a688.1605042644.git.h.goebel@crazy-compilers.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze This remove the patch version from generated package names. For example 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1'. * guix/import/utils.scm (package->definition): Trim patch version from generated package names. * tests/crate.scm: (cargo>guix-package, cargo-recursive-import): Likewise. --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 44 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 10eb030188..b74393e617 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -269,9 +269,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index beaa696be0..65d5ac3389 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -280,7 +280,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -296,7 +296,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -359,7 +359,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -378,7 +378,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -397,7 +397,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -414,13 +414,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" + (("rust-leaf-bob" ('unquote rust-leaf-bob-1.0.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -437,17 +437,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -464,14 +464,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 16:39:59 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 21:39:59 +0000 Received: from localhost ([127.0.0.1]:39217 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMs-0006zO-OH for submit@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:59 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:33378) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbMq-0006zA-W2 for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 16:39:57 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW1VN3Gqzz1rt3g; Tue, 10 Nov 2020 22:39:56 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW1VN37KWz1r570; Tue, 10 Nov 2020 22:39:56 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id tdLDXjwg9MOB; Tue, 10 Nov 2020 22:39:55 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 22:39:55 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id BF21D60440; Tue, 10 Nov 2020 22:40:10 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v16 6/6] import: crate: Parameterized importing of dev dependencies. Date: Tue, 10 Nov 2020 22:39:33 +0100 Message-Id: X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze The recursive crate importer will now include development dependencies only for the top level package, but not for any of the recursively imported packages. * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. (crate-recursive-import): Likewise. * guix/scripts/import/crate.scm (guix-import-crate): Likewise. * tests/crate.scm (cargo-recursive-import): Likewise. --- guix/import/crate.scm | 27 +++++++++++++++++++-------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 4c36a32442..bdfbc6833c 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -151,7 +151,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license) + home-page synopsis description license build?) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." @@ -178,7 +178,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -203,11 +205,12 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version repo) +(define* (crate->guix-package crate-name #:key version include-dev-deps? repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -255,9 +258,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-dependencies dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-dependencies dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -267,11 +273,16 @@ latest version of CRATE-NAME." #:description (crate-description crate) #:license (and=> (crate-version-license version*) string->license)) - cargo-inputs)))) + (append cargo-inputs cargo-development-inputs))))) (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package (memoize crate->guix-package) + #:repo->guix-package (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name)) + (crate->guix-package* (memoize crate->guix-package))) + (apply crate->guix-package* + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 65d5ac3389..76bd3707df 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -462,8 +462,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 17:13:12 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 22:13:12 +0000 Received: from localhost ([127.0.0.1]:39252 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbt2-0001Tq-58 for submit@debbugs.gnu.org; Tue, 10 Nov 2020 17:13:12 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:40944) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcbsz-0001Tf-QJ for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 17:13:11 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW2Dh3zgMz1rtN6; Tue, 10 Nov 2020 23:13:08 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW2Dh3mCDz1r572; Tue, 10 Nov 2020 23:13:08 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id 433xAyTqco4T; Tue, 10 Nov 2020 23:13:07 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 23:13:07 +0100 (CET) Received: from thisbe.goebel-consult.de (hermia.goebel-consult.de [192.168.110.7]) by hermia.goebel-consult.de (Postfix) with ESMTP id 6D34860154; Tue, 10 Nov 2020 23:13:41 +0100 (CET) Subject: Re: [PATCH v16 3/6] import: crate: Use guile-semver to resolve module versions. From: Hartmut Goebel To: 38408@debbugs.gnu.org References: Organization: crazy-compilers.com Message-ID: <9a14a3c5-dcab-98ce-8d81-d5c19b77cf93@crazy-compilers.com> Date: Tue, 10 Nov 2020 23:13:04 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Am 10.11.20 um 22:39 schrieb Hartmut Goebel: > From: Martin Becze > > * guix/import/crate.scm: Add guile-semver as a soft dependency. > […] Please add a brief change description for crate-recursive-import. > * guix/import/utils.scm (package-names->package-inputs): Implement > handling of (name version) pairs. > * guix/scripts/import/crate.scm (guix-import-crate): Move > 'package-definition' from here to guix/import/crate.scm. I could not spot this change. has this been reverted in one of the many version of this series? Also this file contains a change not described here. > -(define* (crate->guix-package crate-name #:optional version) > +(define* (crate->guix-package crate-name #:key version repo) > "Fetch the metadata for CRATE-NAME from crates.io, and return the > `package' s-expression corresponding to that package, or #f on failure. > When VERSION is specified, attempt to fetch that version; otherwise fetch the > latest version of CRATE-NAME." Does this still fetch the latest version? Or is it the latest version matching a semver range, or the latest non-beta version? > @@ -231,15 +264,12 @@ latest version of CRATE-NAME." > #:description (crate-description crate) > #:license (and=> (crate-version-license version*) > string->license)) > - (append cargo-inputs cargo-development-inputs))))) > - > -(define* (crate-recursive-import crate-name #:optional version) > - (recursive-import crate-name #f > - #:repo->guix-package > - (lambda (name repo) > - (let ((version (and (string=? name crate-name) > - version))) > - (crate->guix-package name version))) > + cargo-inputs)))) Is this change in the last line intended? Another patch of this series reverts this change. > @@ -131,15 +137,18 @@ > \"dependencies\": [ > { > \"crate_id\": \"intermediate-2\", > - \"kind\": \"normal\" > + \"kind\": \"normal\", > + \"req\": \"1.0.0\" > }, > { > \"crate_id\": \"leaf-alice\", > - \"kind\": \"normal\" > + \"kind\": \"normal\", > + \"req\": \"1.0.0\" > }, > { > \"crate_id\": \"leaf-bob\", > - \"kind\": \"normal\" > + \"kind\": \"normal\", > + \"req\": \"1.0.0\" > } > ] > }") All packages in this test have version 1.0.0 and the requirement is 1.0.0, too. So semver resolution is not actually tested by these packages. I suggest to add more available versions to some of the packages and actually use a different semver operators. To avoid confusion, maybe it makes sense to rename packages to get rid of the trailing number. E.g. "intermediate-1" could become "intermediate-A" Please also make sure, there is a test-case with some 0.x version, since crates.io documentations says [1]: "This compatibility convention is different from SemVer in the way it treats versions before 1.0.0. …" [1] https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#caret-requirements -- Regards Hartmut Goebel | Hartmut Goebel | h.goebel@crazy-compilers.com | | www.crazy-compilers.com | compilers which you thought are impossible | From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 17:21:42 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 22:21:42 +0000 Received: from localhost ([127.0.0.1]:39263 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcc1F-0001hE-Nw for submit@debbugs.gnu.org; Tue, 10 Nov 2020 17:21:42 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:58762) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcc1D-0001h6-Rg for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 17:21:40 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW2QW2jjFz1rtMh; Tue, 10 Nov 2020 23:21:39 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW2QW2Sqsz1r56P; Tue, 10 Nov 2020 23:21:39 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id JlzZXKT85NA4; Tue, 10 Nov 2020 23:21:38 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Tue, 10 Nov 2020 23:21:38 +0100 (CET) Received: from thisbe.goebel-consult.de (hermia.goebel-consult.de [192.168.110.7]) by hermia.goebel-consult.de (Postfix) with ESMTP id 59C3160154; Tue, 10 Nov 2020 23:22:12 +0100 (CET) Subject: Re: [PATCH v16 6/6] import: crate: Parameterized importing of dev dependencies. From: Hartmut Goebel To: Martin Becze References: Organization: crazy-compilers.com Message-ID: <40e4832b-7a88-4a3a-712b-7bc0c56fa448@crazy-compilers.com> Date: Tue, 10 Nov 2020 23:21:35 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Am 10.11.20 um 22:39 schrieb Hartmut Goebel: > @@ -255,9 +258,12 @@ latest version of CRATE-NAME." > (let* ((dependencies (crate-version-dependencies version*)) > (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) > (cargo-inputs (sort-map-dependencies dep-crates)) > - (cargo-development-inputs '())) > + (cargo-development-inputs (if include-dev-deps? > + (sort-map-dependencies dev-dep-crates) > + '()))) > (values > - (make-crate-sexp #:name crate-name > + (make-crate-sexp #:build? include-dev-deps? > + #:name crate-name I'm curious about this: The value of "include-dev-deps?" determines whether the the package will be have #:skip-build set #t or #f? If this is intended, it should be described in the doc-string and in the changelog. > --- a/guix/scripts/import/crate.scm > +++ b/guix/scripts/import/crate.scm > @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) > > (if (assoc-ref opts 'recursive) > (crate-recursive-import name #:version version) > - (let ((sexp (crate->guix-package name #:version version))) > + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) > (unless sexp > (leave (G_ "failed to download meta-data for package '~a'~%") > (if version > (string-append name "@" version) > name))) > - sexp))) > + (list sexp)))) This last line change looks like an error. Is it intended? -- Regards Hartmut Goebel | Hartmut Goebel | h.goebel@crazy-compilers.com | | www.crazy-compilers.com | compilers which you thought are impossible | From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 10 17:24:11 2020 Received: (at 38408) by debbugs.gnu.org; 10 Nov 2020 22:24:11 +0000 Received: from localhost ([127.0.0.1]:39269 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcc3f-0001lO-7S for submit@debbugs.gnu.org; Tue, 10 Nov 2020 17:24:11 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:59223) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcc3d-0001lH-Oo for 38408@debbugs.gnu.org; Tue, 10 Nov 2020 17:24:10 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CW2TP1LS6z1rtMh for <38408@debbugs.gnu.org>; Tue, 10 Nov 2020 23:24:09 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CW2TP1Cxbz1r56P for <38408@debbugs.gnu.org>; Tue, 10 Nov 2020 23:24:09 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id WEZ1B3cdCJRt for <38408@debbugs.gnu.org>; Tue, 10 Nov 2020 23:24:08 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-127.dynamic.mnet-online.de [188.174.61.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS for <38408@debbugs.gnu.org>; Tue, 10 Nov 2020 23:24:08 +0100 (CET) Received: from thisbe.goebel-consult.de (hermia.goebel-consult.de [192.168.110.7]) by hermia.goebel-consult.de (Postfix) with ESMTP id 96EB960154 for <38408@debbugs.gnu.org>; Tue, 10 Nov 2020 23:24:42 +0100 (CET) Subject: Re: [PATCH v16 0/6] New take on: Semantic version aware recursive importer for crates From: Hartmut Goebel To: 38408@debbugs.gnu.org References: Organization: crazy-compilers.com Message-ID: <6777a815-7a6f-c6cc-c49a-75b4585b5ea6@crazy-compilers.com> Date: Tue, 10 Nov 2020 23:24:05 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Am 10.11.20 um 22:39 schrieb Hartmut Goebel: > * Major design decision open: Shall package variable names have sem semver > version appended instead of major+minor? I propose to only append the semver version, e.g. "rust-aaa-1" instread of "rust-aaa-1.3". To finish this patch series, I suggest putting this change into another patch. -- Regards Hartmut Goebel | Hartmut Goebel | h.goebel@crazy-compilers.com | | www.crazy-compilers.com | compilers which you thought are impossible | From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 11 10:07:05 2020 Received: (at 38408) by debbugs.gnu.org; 11 Nov 2020 15:07:05 +0000 Received: from localhost ([127.0.0.1]:42568 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcriC-0000RJ-Ls for submit@debbugs.gnu.org; Wed, 11 Nov 2020 10:07:04 -0500 Received: from out4-smtp.messagingengine.com ([66.111.4.28]:38033) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kcri9-0000Qo-Lz for 38408@debbugs.gnu.org; Wed, 11 Nov 2020 10:07:03 -0500 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 8985D5C0432; Wed, 11 Nov 2020 10:06:56 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Wed, 11 Nov 2020 10:06:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=+GozZC7PNxzJu+zTAYL0YORtDITLCiUOWB1MzEuZvrw=; b=WgKN3hnK MZ9a15KV9E4WAjdO/qWkC2fs4IDA4r6L4i9RZiyQs+EsNbt4rmOPGryQhU+SDGRZ skdScZlFz5XZIEH18+NyyOO0gm1EQXb1EccuQECiRaKGCVPDK8dCp/66Dtf/Hn8s /byjlXD5FEX2Nv5T03Cina+iw/UC1ccpSGZ8yD7sKR3zpagsXZFy1s43SkxenYsP dO6qjlvRMcRxt8Tdcsko1bV9OBNaYrorqZeHiqxbKxisKR6ualnjOgFGTgf/33BS cHgBGUvi0pN8IBGDtGzIr9STSWr/JoRBfdclzFUGhDX/U9r9fRrdtPoj28V7GHyl DYaSEKGhnXOevQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedruddvtddgudduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufhffffkfgggtgfgsehtqhertddtreejnecuhfhrohhmpefvihhmohht hhihucfurghmphhlvgcuoehsrghmphhlvghtsehnghihrhhordgtohhmqeenucggtffrrg htthgvrhhnpeehtdekgeegjeevvdfhhefhhedufeejgeffvdeigfelveehvdetleetfedu vdeuueenucffohhmrghinheprhhushhtqdhlrghnghdrohhrghenucfkphepjeegrdduud eirddukeeirdeggeenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhl fhhrohhmpehsrghmphhlvghtsehnghihrhhordgtohhm X-ME-Proxy: Received: from mrblack (74-116-186-44.qc.dsl.ebox.net [74.116.186.44]) by mail.messagingengine.com (Postfix) with ESMTPA id AB8E63063088; Wed, 11 Nov 2020 10:06:55 -0500 (EST) From: Timothy Sample To: Hartmut Goebel Subject: Re: [bug#38408] [PATCH v16 3/6] import: crate: Use guile-semver to resolve module versions. References: <9a14a3c5-dcab-98ce-8d81-d5c19b77cf93@crazy-compilers.com> Date: Wed, 11 Nov 2020 10:06:55 -0500 Message-ID: <87y2j8q6eo.fsf@ngyro.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: 38408@debbugs.gnu.org, Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Hartmut, Thanks for working on this series! Hartmut Goebel writes: > Please also make sure, there is a test-case with some 0.x version, since > crates.io documentations says [1]: "This compatibility convention is > different from SemVer in the way it treats versions before 1.0.0. =E2=80= =A6" > > [1] > https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#ca= ret-requirements As the author of Guile-SemVer, I just wanted to mention that its support for caret ranges is well-tested and should work well for both NPM and Cargo. Caret ranges support the convention that version 0.x.z is compatible with 0.x.y, where y < z. The Semantic Versioning document does not require that compatibility, but I think it=E2=80=99s expected anyw= here Semantic Versioning is used. For the tests, I suggest having one test that demonstrates that the importer is relying on Semantic Versioning to resolve packages. After that, we can rely on the Guile-SemVer tests to make sure that the Semantic Versioning resolution will work even for weird edge cases. To be clear, I think the all-1.0.0 test is too simplistic. Maybe the test should provide packages A@1.2.5 and A@1.3.2, and have the requirement for package A be =E2=80=9C>=3D1.2.0 <1.3.0=E2=80=9D. It would then make su= re that A@1.2.5 is selected. That way, the test shows that the importer is actually doing some kind of resolution. You could use any range syntax, but I personally find the tildes and carets hard to understand without looking at the definition. -- Tim From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:07:14 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:07:14 +0000 Received: from localhost ([127.0.0.1]:57233 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqM-0002pC-8p for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:14 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:51826) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqI-0002p1-Oq for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:12 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdqK3mGGz1rwDW; Mon, 16 Nov 2020 20:07:09 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdqK26kjz1qqkX; Mon, 16 Nov 2020 20:07:09 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id wlWDapa_6NIp; Mon, 16 Nov 2020 20:07:08 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Mon, 16 Nov 2020 20:07:08 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id E988960052; Mon, 16 Nov 2020 20:08:04 +0100 (CET) From: Hartmut Goebel To: guix-patches@gnu.org, 38408@debbugs.gnu.org Subject: [PATCH v17 0/8] New take continued: Semantic version aware recursive Date: Mon, 16 Nov 2020 20:07:05 +0100 Message-Id: X-Mailer: git-send-email 2.21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This is another revision of the patch set. Major changes compared to v16 are: * When searching dependencies, prefer an existing package satisfying semver requirement over importing the highest version create. This saves adding a lot of new packages. As an example: When importing sequoia-openpgp@0.20.0 this only imports 19 crates now, compared to 96 using the former method. * Package names are not trimmed to the first no-zero part. * Test cases have been improved so packages have different versions. THis actually showed some bubs I solved (details see below). Notable bug-fixes: * Change selection of package version: use the highest version matching the required range instead of first one. * Sort dependencies by name (was version) Some details about the improved test cases * Change crate names to avoid possible confusion * Use different version (not 1.0.0 for all) * Add some versions to some of the crates to test selecting the version. * ids of create version entries are numbers. * Document crate versions and dependencies used in tests * Actually define some dependencies using caret semver. Hartmut Goebel (3): import: utils: Trim patch version from names. import: crate: Trim version for names after left-most non-zero part. import: crate: Use existing package satisfying semver requirement. Martin Becze (5): guix: self: Add guile-semver as a depenedency. import: utils: 'recursive-import' accepts an optional version parameter. import: crate: Use guile-semver to resolve module versions. import: crate: Memorize crate->guix-package. import: crate: Parameterized importing of dev dependencies. guix/import/cran.scm | 8 +- guix/import/crate.scm | 150 +++++++-- guix/import/elpa.scm | 6 +- guix/import/gem.scm | 6 +- guix/import/opam.scm | 8 +- guix/import/pypi.scm | 8 +- guix/import/stackage.scm | 5 +- guix/import/utils.scm | 84 +++-- guix/scripts/import/cran.scm | 5 +- guix/scripts/import/crate.scm | 13 +- guix/scripts/import/elpa.scm | 4 +- guix/self.scm | 8 +- tests/crate.scm | 581 +++++++++++++++++++++++----------- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +- 15 files changed, 608 insertions(+), 289 deletions(-) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:07:34 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:07:34 +0000 Received: from localhost ([127.0.0.1]:57239 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqg-0002pv-0x for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:34 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:60694) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqd-0002pn-W6 for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:33 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdql0yWHz1qs3l; Mon, 16 Nov 2020 20:07:30 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdqk6VRJz1qqkD; Mon, 16 Nov 2020 20:07:30 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id MypQoOscKymf; Mon, 16 Nov 2020 20:07:30 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Mon, 16 Nov 2020 20:07:30 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id B19DC60052; Mon, 16 Nov 2020 20:08:27 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v17 1/8] guix: self: Add guile-semver as a depenedency. Date: Mon, 16 Nov 2020 20:07:21 +0100 Message-Id: X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze * guix/self.scm (compiled-guix): Add guile-semver as a depenedency. --- guix/self.scm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/guix/self.scm b/guix/self.scm index bbfd2f1b95..1a3f748bea 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017, 2018, 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -53,6 +54,7 @@ ("guile-json" (ref '(gnu packages guile) 'guile-json-4)) ("guile-ssh" (ref '(gnu packages ssh) 'guile-ssh)) ("guile-git" (ref '(gnu packages guile) 'guile-git)) + ("guile-semver" (ref '(gnu packages guile-xyz) 'guile3.0-semver)) ("guile-sqlite3" (ref '(gnu packages guile) 'guile-sqlite3)) ("guile-zlib" (ref '(gnu packages guile) 'guile-zlib)) ("guile-lzlib" (ref '(gnu packages guile) 'guile-lzlib)) @@ -799,6 +801,9 @@ Info manual." (define guile-gcrypt (specification->package "guile-gcrypt")) + (define guile-semver + (specification->package "guile-semver")) + (define gnutls (specification->package "gnutls")) @@ -807,7 +812,8 @@ Info manual." (cons (list "x" package) (package-transitive-propagated-inputs package))) (list guile-gcrypt gnutls guile-git guile-json - guile-ssh guile-sqlite3 guile-zlib guile-lzlib)) + guile-ssh guile-sqlite3 guile-zlib guile-lzlib + guile-semver)) (((labels packages _ ...) ...) packages))) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:07:48 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:07:49 +0000 Received: from localhost ([127.0.0.1]:57242 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejql-0002qE-8X for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:48 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:55248) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqi-0002q4-A7 for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:37 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdqq3fjVz1rwDW; Mon, 16 Nov 2020 20:07:35 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdqq3SCxz1qqkD; Mon, 16 Nov 2020 20:07:35 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id iRBaeLz4ogJF; Mon, 16 Nov 2020 20:07:33 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Mon, 16 Nov 2020 20:07:33 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id D652360355; Mon, 16 Nov 2020 20:08:27 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v17 2/8] import: utils: 'recursive-import' accepts an optional version parameter. Date: Mon, 16 Nov 2020 20:07:22 +0100 Message-Id: X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) From: Martin Becze This adds a key VERSION to 'recursive-import' and moves the parameter REPO to a key. This also changes all the places that rely on 'recursive-import'. * guix/import/utils.scm (recursive-import): Add the VERSION key. Make REPO a key. (package->definition): Add optional 'append-version?'. * guix/scripts/import/crate.scm (guix-import-crate): Add the VERSION key. * guix/import/crate.scm (crate->guix-package): Add the VERSION key. (crate-recursive-import): Pass VERSION to recursive-import, remove now unnecessary code. * guix/import/cran.scm (cran->guix-package, cran-recursive-import): Change the REPO parameter to a key. * guix/import/elpa.scm (elpa->guix-package, elpa-recursive-import): Likewise. * guix/import/gem.scm (gem->guix-package, recursive-import): Likewise. * guix/import/opam.scm (opam-recurive-import): Likewise. * guix/import/pypi.scm (pypi-recursive-import): Likewise. * guix/import/stackage.scm (stackage-recursive-import): Likewise. * guix/scripts/import/cran.scm (guix-import-cran): Likewise. * guix/scripts/import/elpa.scm (guix-import-elpa): Likewise. * tests/elpa.scm (eval-test-with-elpa): Likewise. * tests/import-utils.scm (recursive-import): Likewise. Co-authored-by: Hartmut Goebel --- guix/import/cran.scm | 8 +++-- guix/import/crate.scm | 13 +++----- guix/import/elpa.scm | 6 ++-- guix/import/gem.scm | 6 ++-- guix/import/opam.scm | 8 ++--- guix/import/pypi.scm | 8 ++--- guix/import/stackage.scm | 5 +-- guix/import/utils.scm | 57 ++++++++++++++++++++++------------- guix/scripts/import/cran.scm | 5 +-- guix/scripts/import/crate.scm | 4 +-- guix/scripts/import/elpa.scm | 4 ++- tests/elpa.scm | 3 +- tests/import-utils.scm | 8 +++-- 13 files changed, 80 insertions(+), 55 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index a1275b4822..d8240a6b2f 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2015, 2016, 2017, 2019, 2020 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -568,7 +569,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (define cran->guix-package (memoize - (lambda* (package-name #:optional (repo 'cran)) + (lambda* (package-name #:key (repo 'cran) version) "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." (let ((description (fetch-description repo package-name))) @@ -586,8 +587,9 @@ s-expression corresponding to that package, or #f on failure." (cran->guix-package package-name 'cran)) (else (values #f '())))))))) -(define* (cran-recursive-import package-name #:optional (repo 'cran)) - (recursive-import package-name repo +(define* (cran-recursive-import package-name #:key (repo 'cran)) + (recursive-import package-name + #:repo repo #:repo->guix-package cran->guix-package #:guix-name cran-guix-name)) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 8c2b76cab4..47bfc16105 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -187,7 +187,7 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the @@ -233,13 +233,10 @@ latest version of CRATE-NAME." string->license)) (append cargo-inputs cargo-development-inputs))))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 871b918f88..c4e8e84aba 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ludovic Courtès ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -245,7 +246,7 @@ type ''." (license ,license)) dependencies-names))) -(define* (elpa->guix-package name #:optional (repo 'gnu)) +(define* (elpa->guix-package name #:key (repo 'gnu) version) "Fetch the package NAME from REPO and produce a Guix package S-expression." (match (fetch-elpa-package name repo) (#f #f) @@ -299,7 +300,8 @@ type ''." (define elpa-guix-name (cut guix-name "emacs-" <>)) (define* (elpa-recursive-import package-name #:optional (repo 'gnu)) - (recursive-import package-name repo + (recursive-import package-name + #:repo repo #:repo->guix-package elpa->guix-package #:guix-name elpa-guix-name)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index 3fe240f36a..1f6f94532e 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2016 Ben Woodcroft ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -122,7 +123,7 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." ((license) (license->symbol license)) (_ `(list ,@(map license->symbol licenses))))))) -(define* (gem->guix-package package-name #:optional (repo 'rubygems) version) +(define* (gem->guix-package package-name #:key (repo 'rubygems) version) "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let ((gem (rubygems-fetch package-name))) @@ -188,6 +189,7 @@ package on RubyGems." (latest latest-release))) (define* (gem-recursive-import package-name #:optional version) - (recursive-import package-name '() + (recursive-import package-name + #:repo '() #:repo->guix-package gem->guix-package #:guix-name ruby-package-name)) diff --git a/guix/import/opam.scm b/guix/import/opam.scm index 6d9eb0a092..867812124d 100644 --- a/guix/import/opam.scm +++ b/guix/import/opam.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -260,7 +261,7 @@ path to the repository." (substring version 1) version))))) -(define* (opam->guix-package name #:key (repository (get-opam-repository))) +(define* (opam->guix-package name #:key (repository (get-opam-repository)) version) "Import OPAM package NAME from REPOSITORY (a directory name) or, if REPOSITORY is #f, from the official OPAM repository. Return a 'package' sexp or #f on failure." @@ -322,9 +323,8 @@ or #f on failure." dependencies)))))))) (define (opam-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (opam->guix-package name)) + (recursive-import package-name + #:repo->guix-package opam->guix-package #:guix-name ocaml-name->guix-name)) (define (guix-name->opam-name name) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index 15116e349d..bf4dc50138 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -8,6 +8,7 @@ ;;; Copyright © 2020 Jakub Kądziołka ;;; Copyright © 2020 Lars-Dominik Braun ;;; Copyright © 2020 Arun Isaac +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -471,7 +472,7 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (define pypi->guix-package (memoize - (lambda* (package-name) + (lambda* (package-name #:key repo version) "Fetch the metadata for PACKAGE-NAME from pypi.org, and return the `package' s-expression corresponding to that package, or #f on failure." (let* ((project (pypi-fetch package-name)) @@ -495,9 +496,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." (project-info-license info))))))))) (define (pypi-recursive-import package-name) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) - (pypi->guix-package name)) + (recursive-import package-name + #:repo->guix-package pypi->guix-package #:guix-name python->package-name)) (define (string->license str) diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm index 93cf214127..0a60adffc8 100644 --- a/guix/import/stackage.scm +++ b/guix/import/stackage.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Federico Beffa ;;; Copyright © 2018 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -107,8 +108,8 @@ included in the Stackage LTS release." (leave-with-message "~a: Stackage package not found" package-name)))))) (define (stackage-recursive-import package-name . args) - (recursive-import package-name #f - #:repo->guix-package (lambda (name repo) + (recursive-import package-name + #:repo->guix-package (lambda* (name #:key repo version) (apply stackage->guix-package (cons name args))) #:guix-name hackage-name->package-name)) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 145515c489..895fbb11a8 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2019 Robert Vollmert ;;; Copyright © 2020 Helio Machado <0x2b3bfa0+guix@googlemail.com> +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -45,6 +46,7 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (factorize-uri flatten @@ -254,13 +256,15 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define (package->definition guix-package) +(define* (package->definition guix-package #:optional append-version?) (match guix-package - (('package ('name (? string? name)) _ ...) - `(define-public ,(string->symbol name) - ,guix-package)) - (('let anything ('package ('name (? string? name)) _ ...)) - `(define-public ,(string->symbol name) + ((or + ('package ('name name) ('version version) . rest) + ('let _ ('package ('name name) ('version version) . rest))) + + `(define-public ,(string->symbol (if append-version? + (string-append name "-" version) + version)) ,guix-package)))) (define (build-system-modules) @@ -409,32 +413,43 @@ obtain a node's uniquely identifying \"key\"." (cons head result) (set-insert (node-name head) visited)))))))) -(define* (recursive-import package-name repo - #:key repo->guix-package guix-name +(define* (recursive-import package-name + #:key repo->guix-package guix-name version repo #:allow-other-keys) "Return a list of package expressions for PACKAGE-NAME and all its dependencies, sorted in topological order. For each package, -call (REPO->GUIX-PACKAGE NAME REPO), which should return a package expression -and a list of dependencies; call (GUIX-NAME NAME) to obtain the Guix package -name corresponding to the upstream name." +call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a +package expression and a list of dependencies; call (GUIX-NAME NAME) to +obtain the Guix package name corresponding to the upstream name." (define-record-type - (make-node name package dependencies) + (make-node name version package dependencies) node? (name node-name) + (version node-version) (package node-package) (dependencies node-dependencies)) - (define (exists? name) - (not (null? (find-packages-by-name (guix-name name))))) + (define (exists? name version) + (not (null? (find-packages-by-name (guix-name name) version)))) - (define (lookup-node name) - (receive (package dependencies) (repo->guix-package name repo) - (make-node name package dependencies))) + (define (lookup-node name version) + (let* ((package dependencies (repo->guix-package name + #:version version + #:repo repo)) + (normalizied-deps (map (match-lambda + ((name version) (list name version)) + (name (list name #f))) dependencies))) + (make-node name version package normalizied-deps))) (map node-package - (topological-sort (list (lookup-node package-name)) + (topological-sort (list (lookup-node package-name version)) (lambda (node) - (map lookup-node - (remove exists? + (map (lambda (name-version) + (apply lookup-node name-version)) + (remove (lambda (name-version) + (apply exists? name-version)) (node-dependencies node)))) - node-name))) + (lambda (node) + (string-append + (node-name node) + (or (node-version node) "")))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index d6f371ef3a..bc266ad9da 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,10 +99,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) ;; Recursive import (map package->definition (cran-recursive-import package-name - (or (assoc-ref opts 'repo) 'cran))) + #:repo (or (assoc-ref opts 'repo) 'cran))) ;; Single import (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) + #:repo (or (assoc-ref opts 'repo) 'cran)))) (unless sexp (leave (G_ "failed to download description for package '~a'~%") package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..9c4286f8bd 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -100,8 +100,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) `(define-public ,(string->symbol name) ,pkg)) (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version)) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm index d270d2b4bc..07ac07a3d5 100644 --- a/guix/scripts/import/elpa.scm +++ b/guix/scripts/import/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2018 Oleg Pykhalov +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -102,7 +103,8 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n")) (_ #f)) (elpa-recursive-import package-name (or (assoc-ref opts 'repo) 'gnu))) - (let ((sexp (elpa->guix-package package-name (assoc-ref opts 'repo)))) + (let ((sexp (elpa->guix-package package-name + #:repo (assoc-ref opts 'repo)))) (unless sexp (leave (G_ "failed to download package '~a'~%") package-name)) sexp))) diff --git a/tests/elpa.scm b/tests/elpa.scm index b70539bda6..a008cf993c 100644 --- a/tests/elpa.scm +++ b/tests/elpa.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa ;;; Copyright © 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ (200 "This is the description.") (200 "fake tarball contents")) (parameterize ((current-http-proxy (%local-url))) - (match (elpa->guix-package pkg 'gnu/http) + (match (elpa->guix-package pkg #:repo 'gnu/http) (('package ('name "emacs-auctex") ('version "11.88.6") diff --git a/tests/import-utils.scm b/tests/import-utils.scm index 87dda3238f..2357ea5c40 100644 --- a/tests/import-utils.scm +++ b/tests/import-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2016 Ben Woodcroft +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -48,15 +49,16 @@ (package (name "foo") (inputs `(("bar" ,bar))))) - (recursive-import "foo" 'repo + (recursive-import "foo" + #:repo 'repo #:repo->guix-package (match-lambda* - (("foo" 'repo) + (("foo" #:version #f #:repo 'repo) (values '(package (name "foo") (inputs `(("bar" ,bar)))) '("bar"))) - (("bar" 'repo) + (("bar" #:version #f #:repo 'repo) (values '(package (name "bar")) '()))) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:07:50 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:07:50 +0000 Received: from localhost ([127.0.0.1]:57248 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqu-0002qc-Um for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:50 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:35585) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqn-0002qH-CR for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:42 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdqw6mBWz1qs3x; Mon, 16 Nov 2020 20:07:40 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdqw6XlYz1qqkD; Mon, 16 Nov 2020 20:07:40 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id wOgynv-k9qHL; Mon, 16 Nov 2020 20:07:38 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Mon, 16 Nov 2020 20:07:38 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id 16C44603C9; Mon, 16 Nov 2020 20:08:28 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v17 3/8] import: crate: Use guile-semver to resolve module versions. Date: Mon, 16 Nov 2020 20:07:23 +0100 Message-Id: X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze * guix/import/crate.scm: Add guile-semver as a soft dependency. (make-crate-sexp): Don't allow other keys. Add '#:skip-build?' to build system args. Pass a VERSION argument to 'cargo-inputs'. (crate->guix-package): Use guile-semver to resolve the correct module versions. Treat "build" dependencies as normal dependencies. (crate-name->package-name): Reuse the procedure 'guix-name' instead of duplicating its logic. * guix/import/utils.scm (package-names->package-inputs): Implement handling of (name version) pairs. * guix/scripts/import/crate.scm (guix-import-crate): Use crate-recursive-import instead of duplicate code. * tests/crate.scm (recursive-import): Change test packages versions to be distinguishable. Add version data to the test. Check created symbols, too. Co-authored-by: Hartmut Goebel --- guix/import/crate.scm | 91 +++++-- guix/import/utils.scm | 21 +- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 500 +++++++++++++++++++++------------- 4 files changed, 391 insertions(+), 232 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 47bfc16105..5498d1f0ff 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -37,6 +37,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -85,10 +86,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver semversemver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -142,16 +148,21 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) + home-page synopsis description license) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) + (list (crate-name->package-name name) version))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -163,7 +174,8 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) (home-page ,(match home-page @@ -176,7 +188,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -190,11 +202,17 @@ and LICENSE." (define* (crate->guix-package crate-name #:key version repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. -When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +When VERSION is specified, convert it into a semver range and attempt to fetch +the latest version matching this semver range; otherwise fetch the latest +version of CRATE-NAME." + + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -204,22 +222,45 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate)))) + ;; find the highest version of a crate that fulfills the semver + (define (find-crate-version crate range) + (let* ((semver-range (string->semver-range range)) + (versions + (sort + (filter (lambda (entry) + (semver-range-contains? semver-range (first entry))) + (map (lambda (ver) + (list (string->semver (crate-version-number ver)) + ver)) + (crate-versions crate))) + (match-lambda* (((semver _) ...) + (apply semverpackage-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 895fbb11a8..10eb030188 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -229,13 +229,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 9c4286f8bd..33dae56561 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,19 +95,14 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name #:version version)) + (crate-recursive-import name #:version version) (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index 61a04f986b..4465e12767 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -28,23 +29,67 @@ #:use-module (ice-9 match) #:use-module (srfi srfi-64)) + +;; crate versions and dependencies used here +;; foo-0.8.1 +;; foo-1.0.0 +;; foo-1.0.3 +;; leaf-alice 0.7.5 +;; +;; root-1.0.0 +;; root-1.0.4 +;; intermediate-a 1.0.42 +;; intermeidate-b ^1.0.0 +;; leaf-alice ^0.7 +;; leaf-bob ^3 +;; +;; intermediate-a-1.0.40 +;; intermediate-a-1.0.42 +;; intermediate-a-1.1.0-alpha.1 +;; intermediate-a 1.2.3 +;; leaf-alice 0.7.5 +;; leaf-bob ^3 +;; +;; intermediate-b-1.2.3 +;; leaf-bob 3.0.1 +;; +;; leaf-alice-0.7.3 +;; leaf-alice-0.7.5 +;; +;; leaf-bob-3.0.1 + + (define test-foo-crate "{ \"crate\": { - \"max_version\": \"1.0.0\", + \"max_version\": \"1.0.3\", \"name\": \"foo\", \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ - { \"id\": \"foo\", + { \"id\": 234210, + \"num\": \"0.8.1\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/foo/0.8.1/dependencies\" + } + }, + { \"id\": 234212, \"num\": \"1.0.0\", \"license\": \"MIT OR Apache-2.0\", \"links\": { \"dependencies\": \"/api/v1/crates/foo/1.0.0/dependencies\" } + }, + { \"id\": 234214, + \"num\": \"1.0.3\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/foo/1.0.3/dependencies\" + } } ] } @@ -54,8 +99,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", - \"kind\": \"normal\" + \"crate_id\": \"leaf-alice\", + \"kind\": \"normal\", + \"req\": \"0.7.5\" } ] }") @@ -63,20 +109,27 @@ (define test-root-crate "{ \"crate\": { - \"max_version\": \"1.0.0\", + \"max_version\": \"1.0.4\", \"name\": \"root\", \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ - { \"id\": \"foo\", + { \"id\": 234240, \"num\": \"1.0.0\", \"license\": \"MIT OR Apache-2.0\", \"links\": { \"dependencies\": \"/api/v1/crates/root/1.0.0/dependencies\" } + }, + { \"id\": 234242, + \"num\": \"1.0.4\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/root/1.0.4/dependencies\" + } } ] } @@ -86,92 +139,114 @@ "{ \"dependencies\": [ { - \"crate_id\": \"intermediate-1\", - \"kind\": \"normal\" + \"crate_id\": \"intermediate-a\", + \"kind\": \"normal\", + \"req\": \"1.0.42\" }, { - \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"crate_id\": \"intermediate-b\", + \"kind\": \"normal\", + \"req\": \"^1.0.0\" } { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"^0.7\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"^3\" } ] }") -(define test-intermediate-1-crate +(define test-intermediate-a-crate "{ \"crate\": { - \"max_version\": \"1.0.0\", - \"name\": \"intermediate-1\", + \"max_version\": \"1.1.0-alpha.1\", + \"name\": \"intermediate-a\", \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ - { \"id\": \"intermediate-1\", - \"num\": \"1.0.0\", + { \"id\": 234251, + \"num\": \"1.0.40\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/intermediate-a/1.0.40/dependencies\" + } + }, + { \"id\": 234250, + \"num\": \"1.0.42\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/intermediate-a/1.0.42/dependencies\" + } + }, + { \"id\": 234252, + \"num\": \"1.1.0-alpha.1\", \"license\": \"MIT OR Apache-2.0\", \"links\": { - \"dependencies\": \"/api/v1/crates/intermediate-1/1.0.0/dependencies\" + \"dependencies\": \"/api/v1/crates/intermediate-a/1.1.0-alpha.1/dependencies\" } } ] } }") -(define test-intermediate-1-dependencies +(define test-intermediate-a-dependencies "{ \"dependencies\": [ { - \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"crate_id\": \"intermediate-b\", + \"kind\": \"normal\", + \"req\": \"1.2.3\" }, { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"0.7.5\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"^3\" } ] }") -(define test-intermediate-2-crate +(define test-intermediate-b-crate "{ \"crate\": { - \"max_version\": \"1.0.0\", - \"name\": \"intermediate-2\", + \"max_version\": \"1.2.3\", + \"name\": \"intermediate-b\", \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ - { \"id\": \"intermediate-2\", - \"num\": \"1.0.0\", + { \"id\": 234260, + \"num\": \"1.2.3\", \"license\": \"MIT OR Apache-2.0\", \"links\": { - \"dependencies\": \"/api/v1/crates/intermediate-2/1.0.0/dependencies\" + \"dependencies\": \"/api/v1/crates/intermediate-b/1.2.3/dependencies\" } } ] } }") -(define test-intermediate-2-dependencies +(define test-intermediate-b-dependencies "{ \"dependencies\": [ { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"3.0.1\" } ] }") @@ -179,19 +254,26 @@ (define test-leaf-alice-crate "{ \"crate\": { - \"max_version\": \"1.0.0\", + \"max_version\": \"0.7.5\", \"name\": \"leaf-alice\", \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ - { \"id\": \"leaf-alice\", - \"num\": \"1.0.0\", + { \"id\": 234270, + \"num\": \"0.7.3\", \"license\": \"MIT OR Apache-2.0\", \"links\": { - \"dependencies\": \"/api/v1/crates/leaf-alice/1.0.0/dependencies\" + \"dependencies\": \"/api/v1/crates/leaf-alice/0.7.3/dependencies\" + } + }, + { \"id\": 234272, + \"num\": \"0.7.5\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/leaf-alice/0.7.5/dependencies\" } } ] @@ -206,19 +288,19 @@ (define test-leaf-bob-crate "{ \"crate\": { - \"max_version\": \"1.0.0\", + \"max_version\": \"3.0.1\", \"name\": \"leaf-bob\", \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], + \"keywords\": [\"dummy\", \"test\"], \"categories\": [\"test\"] \"actual_versions\": [ - { \"id\": \"leaf-bob\", - \"num\": \"1.0.0\", + { \"id\": 234280, + \"num\": \"3.0.1\", \"license\": \"MIT OR Apache-2.0\", \"links\": { - \"dependencies\": \"/api/v1/crates/leaf-bob/1.0.0/dependencies\" + \"dependencies\": \"/api/v1/crates/leaf-bob/3.0.1/dependencies\" } } ] @@ -251,36 +333,51 @@ (match url ("https://crates.io/api/v1/crates/foo" (open-input-string test-foo-crate)) - ("https://crates.io/api/v1/crates/foo/1.0.0/download" + ("https://crates.io/api/v1/crates/foo/1.0.3/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) - ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" + ("https://crates.io/api/v1/crates/foo/1.0.3/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public 'rust-foo-1.0.3 + (package (name "rust-foo") + (version "1.0.3") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice" + ('unquote 'rust-leaf-alice-0.7.5)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -289,151 +386,170 @@ (match url ("https://crates.io/api/v1/crates/root" (open-input-string test-root-crate)) - ("https://crates.io/api/v1/crates/root/1.0.0/download" + ("https://crates.io/api/v1/crates/root/1.0.4/download" (set! test-source-hash (bytevector->nix-base32-string (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) - ("https://crates.io/api/v1/crates/root/1.0.0/dependencies" + ("https://crates.io/api/v1/crates/root/1.0.4/dependencies" (open-input-string test-root-dependencies)) - ("https://crates.io/api/v1/crates/intermediate-1" - (open-input-string test-intermediate-1-crate)) - ("https://crates.io/api/v1/crates/intermediate-1/1.0.0/download" + ("https://crates.io/api/v1/crates/intermediate-a" + (open-input-string test-intermediate-a-crate)) + ("https://crates.io/api/v1/crates/intermediate-a/1.0.42/download" (set! test-source-hash (bytevector->nix-base32-string (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) - ("https://crates.io/api/v1/crates/intermediate-1/1.0.0/dependencies" - (open-input-string test-intermediate-1-dependencies)) - ("https://crates.io/api/v1/crates/intermediate-2" - (open-input-string test-intermediate-2-crate)) - ("https://crates.io/api/v1/crates/intermediate-2/1.0.0/download" + ("https://crates.io/api/v1/crates/intermediate-a/1.0.42/dependencies" + (open-input-string test-intermediate-a-dependencies)) + ("https://crates.io/api/v1/crates/intermediate-b" + (open-input-string test-intermediate-b-crate)) + ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/download" (set! test-source-hash (bytevector->nix-base32-string (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) - ("https://crates.io/api/v1/crates/intermediate-2/1.0.0/dependencies" - (open-input-string test-intermediate-2-dependencies)) + ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/dependencies" + (open-input-string test-intermediate-b-dependencies)) ("https://crates.io/api/v1/crates/leaf-alice" (open-input-string test-leaf-alice-crate)) - ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/download" (set! test-source-hash (bytevector->nix-base32-string (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) - ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/dependencies" (open-input-string test-leaf-alice-dependencies)) ("https://crates.io/api/v1/crates/leaf-bob" (open-input-string test-leaf-bob-crate)) - ("https://crates.io/api/v1/crates/leaf-bob/1.0.0/download" + ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/download" (set! test-source-hash (bytevector->nix-base32-string (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) - ("https://crates.io/api/v1/crates/leaf-bob/1.0.0/dependencies" + ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/dependencies" (open-input-string test-leaf-bob-dependencies)) (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") - ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + ;; rust-intermediate-b has no dependency on the rust-leaf-alice + ;; package, so this is a valid ordering + (((define-public 'rust-leaf-alice-0.7.5 + (package + (name "rust-leaf-alice") + (version "0.7.5") + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public 'rust-leaf-bob-3.0.1 + (package + (name "rust-leaf-bob") + (version "3.0.1") + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public 'rust-intermediate-b-1.2.3 + (package + (name "rust-intermediate-b") + (version "1.2.3") + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-b" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob" + ('unquote 'rust-leaf-bob-3.0.1)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public 'rust-intermediate-a-1.0.42 + (package + (name "rust-intermediate-a") + (version "1.0.42") + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-a" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-b" + ('unquote 'rust-intermediate-b-1.2.3)) + ("rust-leaf-alice" + ('unquote 'rust-leaf-alice-0.7.5)) + ("rust-leaf-bob" + ('unquote 'rust-leaf-bob-3.0.1)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public 'rust-root-1.0.4 + (package + (name "rust-root") + (version "1.0.4") + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-a" + ('unquote 'rust-intermediate-a-1.0.42)) + ("rust-intermediate-b" + ('unquote 'rust-intermediate-b-1.2.3)) + ("rust-leaf-alice" + ('unquote 'rust-leaf-alice-0.7.5)) + ("rust-leaf-bob" + ('unquote 'rust-leaf-bob-3.0.1)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:07:50 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:07:50 +0000 Received: from localhost ([127.0.0.1]:57250 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqw-0002qm-5m for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:50 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:41996) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqr-0002qS-VG for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:46 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdr13qxhz1rwDW; Mon, 16 Nov 2020 20:07:45 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdr13Yn7z1qqkD; Mon, 16 Nov 2020 20:07:45 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id WlBhByZuV2Kr; Mon, 16 Nov 2020 20:07:43 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Mon, 16 Nov 2020 20:07:43 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id 4A98D604C7; Mon, 16 Nov 2020 20:08:28 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v17 4/8] import: crate: Memorize crate->guix-package. Date: Mon, 16 Nov 2020 20:07:24 +0100 Message-Id: <31b17421ebdbd8b2e8037b1163a7c90835dea7e6.1605552418.git.h.goebel@crazy-compilers.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze This adds memorization to procedures that involve network lookups. 'lookup-crate*' is used on every dependency of a package to get its version list. It is also used to lookup a package's metadata. 'crate-recursive-import' is also memorized since creating the same package twice will trigger a lookup on its dependencies. * guix/import/crate.scm (lookup-crate*): New procedure. (crate->guix-package): Memorize package metadata lookups. (crate-recursive-import): Memorize package creation. --- guix/import/crate.scm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 5498d1f0ff..c830449555 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -27,6 +27,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -110,6 +111,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define lookup-crate* (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -215,7 +218,7 @@ version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (lookup-crate* crate-name)) (define version-number (and crate @@ -247,7 +250,7 @@ version of CRATE-NAME." (define (sort-map-dependencies deps) (sort (map (lambda (dep) (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate name)) + (crate (lookup-crate* name)) (req (crate-dependency-requirement dep)) (ver (find-crate-version crate req))) (list name @@ -276,7 +279,7 @@ version of CRATE-NAME." (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package (memoize crate->guix-package) #:version version #:guix-name crate-name->package-name)) -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:07:53 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:07:53 +0000 Received: from localhost ([127.0.0.1]:57255 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqy-0002rD-Oa for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:53 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:53236) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejqw-0002qy-US for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:51 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdr63hRBz1qs3l; Mon, 16 Nov 2020 20:07:50 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdr63SWZz1qqkX; Mon, 16 Nov 2020 20:07:50 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id 4BiOvC2Mfjtm; Mon, 16 Nov 2020 20:07:49 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Mon, 16 Nov 2020 20:07:49 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id 7CD86604CB; Mon, 16 Nov 2020 20:08:28 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v17 5/8] import: crate: Parameterized importing of dev dependencies. Date: Mon, 16 Nov 2020 20:07:25 +0100 Message-Id: <9f232ed0dad2b1e41c821f5c446ea2a323d6feae.1605552418.git.h.goebel@crazy-compilers.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) From: Martin Becze The recursive crate importer will now include development dependencies only for the top level package, but not for any of the recursively imported packages. Also #:skip-build will be false for the top-most package. * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. (crate-recursive-import): Likewise. * guix/scripts/import/crate.scm (guix-import-crate): Likewise. * tests/crate.scm (cargo-recursive-import): Likewise. --- guix/import/crate.scm | 25 ++++++++++++++++++------- guix/scripts/import/crate.scm | 2 +- tests/crate.scm | 3 +-- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index c830449555..9704b3087b 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -151,7 +151,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license) + home-page synopsis description license build?) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." @@ -177,7 +177,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -202,12 +204,13 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version repo) +(define* (crate->guix-package crate-name #:key version include-dev-deps? repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, convert it into a semver range and attempt to fetch the latest version matching this semver range; otherwise fetch the latest -version of CRATE-NAME." +version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this will also +look up the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -263,9 +266,12 @@ version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (sort-map-dependencies dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (sort-map-dependencies dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -279,7 +285,12 @@ version of CRATE-NAME." (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package (memoize crate->guix-package) + #:repo->guix-package (lambda* params + ;; download development dependencies only for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name)) + (crate->guix-package* (memoize crate->guix-package))) + (apply crate->guix-package* + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 33dae56561..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,7 +96,7 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index 4465e12767..b6cd577552 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -536,8 +536,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? #t - #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-a" ('unquote 'rust-intermediate-a-1.0.42)) ("rust-intermediate-b" -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:07:56 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:07:56 +0000 Received: from localhost ([127.0.0.1]:57258 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejr2-0002rY-5d for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:56 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:35167) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejr0-0002rR-Vy for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:55 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdrB3z4dz1qs3l for <38408@debbugs.gnu.org>; Mon, 16 Nov 2020 20:07:54 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdrB3tcZz1rYDf for <38408@debbugs.gnu.org>; Mon, 16 Nov 2020 20:07:54 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id A4y7C3GtLgX4 for <38408@debbugs.gnu.org>; Mon, 16 Nov 2020 20:07:53 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS for <38408@debbugs.gnu.org>; Mon, 16 Nov 2020 20:07:53 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id B044C604D4; Mon, 16 Nov 2020 20:08:28 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v17 6/8] import: utils: Trim patch version from names. Date: Mon, 16 Nov 2020 20:07:26 +0100 Message-Id: <80ceca7e7d470e9f1e59edc219c80bbfd9b9a4d0.1605552418.git.h.goebel@crazy-compilers.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This remove the patch version from generated package names. For example 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1'. * guix/import/utils.scm (package->definition): Trim patch version from generated package names. * tests/crate.scm: (cargo>guix-package, cargo-recursive-import): Likewise. --- guix/import/crate.scm | 3 ++- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 30 +++++++++++++++--------------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 9704b3087b..20efa131d5 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -159,7 +159,8 @@ and LICENSE." (map (match-lambda ((name version) - (list (crate-name->package-name name) version))) + (list (crate-name->package-name name) + (version-major+minor version)))) inputs)) (let* ((port (http-fetch (crate-uri name version))) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 10eb030188..b74393e617 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -269,9 +269,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index b6cd577552..3fbf6762c5 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -352,7 +352,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public 'rust-foo-1.0.3 + ((define-public 'rust-foo-1.0 (package (name "rust-foo") (version "1.0.3") (source @@ -369,7 +369,7 @@ (#:skip-build? #t #:cargo-inputs (("rust-leaf-alice" - ('unquote 'rust-leaf-alice-0.7.5)))))) + ('unquote 'rust-leaf-alice-0.7)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -433,7 +433,7 @@ (match (crate-recursive-import "root") ;; rust-intermediate-b has no dependency on the rust-leaf-alice ;; package, so this is a valid ordering - (((define-public 'rust-leaf-alice-0.7.5 + (((define-public 'rust-leaf-alice-0.7 (package (name "rust-leaf-alice") (version "0.7.5") @@ -452,7 +452,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public 'rust-leaf-bob-3.0.1 + (define-public 'rust-leaf-bob-3.0 (package (name "rust-leaf-bob") (version "3.0.1") @@ -471,7 +471,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public 'rust-intermediate-b-1.2.3 + (define-public 'rust-intermediate-b-1.2 (package (name "rust-intermediate-b") (version "1.2.3") @@ -489,12 +489,12 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs (("rust-leaf-bob" - ('unquote 'rust-leaf-bob-3.0.1)))))) + ('unquote 'rust-leaf-bob-3.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public 'rust-intermediate-a-1.0.42 + (define-public 'rust-intermediate-a-1.0 (package (name "rust-intermediate-a") (version "1.0.42") @@ -512,16 +512,16 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs (("rust-intermediate-b" - ('unquote 'rust-intermediate-b-1.2.3)) + ('unquote 'rust-intermediate-b-1.2)) ("rust-leaf-alice" - ('unquote 'rust-leaf-alice-0.7.5)) + ('unquote 'rust-leaf-alice-0.7)) ("rust-leaf-bob" - ('unquote 'rust-leaf-bob-3.0.1)))))) + ('unquote 'rust-leaf-bob-3.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public 'rust-root-1.0.4 + (define-public 'rust-root-1.0 (package (name "rust-root") (version "1.0.4") @@ -538,13 +538,13 @@ (arguments ('quasiquote (#:cargo-inputs (("rust-intermediate-a" - ('unquote 'rust-intermediate-a-1.0.42)) + ('unquote 'rust-intermediate-a-1.0)) ("rust-intermediate-b" - ('unquote 'rust-intermediate-b-1.2.3)) + ('unquote 'rust-intermediate-b-1.2)) ("rust-leaf-alice" - ('unquote 'rust-leaf-alice-0.7.5)) + ('unquote 'rust-leaf-alice-0.7)) ("rust-leaf-bob" - ('unquote 'rust-leaf-bob-3.0.1)))))) + ('unquote 'rust-leaf-bob-3.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:08:00 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:08:00 +0000 Received: from localhost ([127.0.0.1]:57261 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejr6-0002rp-G4 for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:08:00 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:57527) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejr4-0002rh-Hb for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:07:59 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdrG0rDTz1qs3l for <38408@debbugs.gnu.org>; Mon, 16 Nov 2020 20:07:58 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdrG0lwGz1qqkX for <38408@debbugs.gnu.org>; Mon, 16 Nov 2020 20:07:58 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id SVQJn9IQWF2K for <38408@debbugs.gnu.org>; Mon, 16 Nov 2020 20:07:56 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS for <38408@debbugs.gnu.org>; Mon, 16 Nov 2020 20:07:56 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id D34E4604D9; Mon, 16 Nov 2020 20:08:28 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org Subject: [PATCH v17 7/8] import: crate: Trim version for names after left-most non-zero part. Date: Mon, 16 Nov 2020 20:07:27 +0100 Message-Id: <2e2f414b859139f6f41d7106b3fbcd6ae5d17649.1605552418.git.h.goebel@crazy-compilers.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This complies to how versions are matched for caret requirements in crates: An update is allowed if the new version number does not modify the left-most non-zero digit in the major, minor, patch grouping. * guix/import/crate.scm (version->semver-prefix): New function. (make-crate-sexp)[format-inputs]: Use it. (make-crate-sexp): Use it to pass shorter version to package->definition. * guix/import/utils.scm (package->definition): Change optional parameter APPEND-VERSION? into APPEND-VERSION?/STRING. If it is a string, append its value to name. * tests/crate.scm: Adjust tests accordingly. --- guix/import/crate.scm | 10 ++++++++-- guix/import/utils.scm | 13 +++++++++---- tests/crate.scm | 25 ++++++++++++------------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 20efa131d5..b133529ba7 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -150,6 +150,12 @@ record or #f if it was not found." ((args ...) `((arguments (,'quasiquote ,args)))))) +(define (version->semver-prefix version) + "Return the version up to and including the first non-zero part" + (first + (map match:substring + (list-matches "^(0+\\.){,2}[0-9]+" version)))) + (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs home-page synopsis description license build?) "Return the `package' s-expression for a rust package with the given NAME, @@ -160,7 +166,7 @@ and LICENSE." (match-lambda ((name version) (list (crate-name->package-name name) - (version-major+minor version)))) + (version->semver-prefix version)))) inputs)) (let* ((port (http-fetch (crate-uri name version))) @@ -194,7 +200,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - (package->definition pkg #t))) + (package->definition pkg (version->semver-prefix version)))) (define (string->license string) (filter-map (lambda (license) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index b74393e617..7de95349cd 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -263,16 +263,21 @@ package definition." ((package-inputs ...) `((native-inputs (,'quasiquote ,package-inputs)))))) -(define* (package->definition guix-package #:optional append-version?) +(define* (package->definition guix-package #:optional append-version?/string) + "If APPEND-VERSION?/STRING is #t, append the package's major+minor +version. If APPEND-VERSION?/string is a string, append this string." (match guix-package ((or ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) `(define-public ,(string->symbol - (if append-version? - (string-append name "-" (version-major+minor version)) - version)) + (cond + ((string? append-version?/string) + (string-append name "-" append-version?/string)) + ((= append-version?/string #t) + (string-append name "-" (version-major+minor version))) + ((#t) version))) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index 3fbf6762c5..1506daeadd 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -352,7 +352,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public 'rust-foo-1.0 + ((define-public 'rust-foo-1 (package (name "rust-foo") (version "1.0.3") (source @@ -368,8 +368,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice" - ('unquote 'rust-leaf-alice-0.7)))))) + (("rust-leaf-alice" ('unquote 'rust-leaf-alice-0.7)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -452,7 +451,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public 'rust-leaf-bob-3.0 + (define-public 'rust-leaf-bob-3 (package (name "rust-leaf-bob") (version "3.0.1") @@ -471,7 +470,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public 'rust-intermediate-b-1.2 + (define-public 'rust-intermediate-b-1 (package (name "rust-intermediate-b") (version "1.2.3") @@ -489,12 +488,12 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs (("rust-leaf-bob" - ('unquote 'rust-leaf-bob-3.0)))))) + ('unquote rust-leaf-bob-3)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public 'rust-intermediate-a-1.0 + (define-public 'rust-intermediate-a-1 (package (name "rust-intermediate-a") (version "1.0.42") @@ -512,16 +511,16 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs (("rust-intermediate-b" - ('unquote 'rust-intermediate-b-1.2)) + ('unquote rust-intermediate-b-1)) ("rust-leaf-alice" ('unquote 'rust-leaf-alice-0.7)) ("rust-leaf-bob" - ('unquote 'rust-leaf-bob-3.0)))))) + ('unquote rust-leaf-bob-3)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public 'rust-root-1.0 + (define-public 'rust-root-1 (package (name "rust-root") (version "1.0.4") @@ -538,13 +537,13 @@ (arguments ('quasiquote (#:cargo-inputs (("rust-intermediate-a" - ('unquote 'rust-intermediate-a-1.0)) + ('unquote rust-intermediate-a-1)) ("rust-intermediate-b" - ('unquote 'rust-intermediate-b-1.2)) + ('unquote rust-intermediate-b-1)) ("rust-leaf-alice" ('unquote 'rust-leaf-alice-0.7)) ("rust-leaf-bob" - ('unquote 'rust-leaf-bob-3.0)))))) + ('unquote rust-leaf-bob-3)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:08:05 2020 Received: (at 38408) by debbugs.gnu.org; 16 Nov 2020 19:08:05 +0000 Received: from localhost ([127.0.0.1]:57272 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejrA-0002t8-Se for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:08:05 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:40235) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kejr9-0002sQ-1r for 38408@debbugs.gnu.org; Mon, 16 Nov 2020 14:08:03 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZdrL3d8wz1qs3l; Mon, 16 Nov 2020 20:08:02 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZdrL3M4Xz1qqkX; Mon, 16 Nov 2020 20:08:02 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id NPa1t-ZMq-AK; Mon, 16 Nov 2020 20:08:00 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Mon, 16 Nov 2020 20:08:00 +0100 (CET) Received: from thisbe.fritz.box (thisbe.fritz.box [192.168.110.24]) by hermia.goebel-consult.de (Postfix) with ESMTP id F189060505; Mon, 16 Nov 2020 20:08:28 +0100 (CET) From: Hartmut Goebel To: 38408@debbugs.gnu.org, guix-patches@gnu.org Subject: [PATCH v17 8/8] import: crate: Use existing package satisfying semver requirement. Date: Mon, 16 Nov 2020 20:07:28 +0100 Message-Id: <7a551f3ffbd32779fdc46f0e39198ba55c2cefbe.1605552418.git.h.goebel@crazy-compilers.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) If a package satisfying the dependency's semver requirement already exists, use it. Prior to this change the highest version matching the semver requirement was used (and imported in case it was not defined as package already). When resolving a dependency (now done in `sort-map-dependencies`), first search for a package matching the semver requirement and only if this fails reach out for a crate. * guix/import/crate.scm (crate->guix-package)[find-package-version]: New function. [dependency-name+version]: New function. [sort-map-dependencies]: Use it instead of lambda function. * tests/crate.scm (test-doctool-crate, test-doctool-dependencies): New variables. ("self-test …", "cargo-recursive-import-hoors-existing-packages"): New tests. --- guix/import/crate.scm | 37 ++++++++++++++----- tests/crate.scm | 83 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 8 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index b133529ba7..3bc261b04e 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -32,6 +32,7 @@ #:use-module (guix packages) #:use-module (guix upstream) #:use-module (guix utils) + #:use-module (gnu packages) #:use-module (ice-9 match) #:use-module (ice-9 regex) #:use-module (json) @@ -92,7 +93,7 @@ (requirement crate-dependency-requirement "req")) ;string (module-autoload! (current-module) - '(semver) '(string->semver semversemver semver->string semversemver-range semver-range-contains?)) @@ -235,6 +236,21 @@ look up the development dependencs for the given crate." (or version (crate-latest-version crate)))) + ;; find the highest existing package that fulfills the semver + (define (find-package-version name range) + (let* ((semver-range (string->semver-range range)) + (versions + (sort + (filter (lambda (version) + (semver-range-contains? semver-range version)) + (map (lambda (pkg) + (string->semver (package-version pkg))) + (find-packages-by-name + (crate-name->package-name name)))) + semverstring (last versions))))) + ;; find the highest version of a crate that fulfills the semver (define (find-crate-version crate range) (let* ((semver-range (string->semver-range range)) @@ -251,6 +267,17 @@ look up the development dependencs for the given crate." (and (not (null-list? versions)) (second (last versions))))) + (define (dependency-name+version dep) + (let* ((name (crate-dependency-id dep)) + (req (crate-dependency-requirement dep)) + (existing-version (find-package-version name req))) + (if existing-version + (list name existing-version) + (let* ((crate (lookup-crate* name)) + (ver (find-crate-version crate req))) + (list name + (crate-version-number ver)))))) + (define version* (and crate (find-crate-version crate version-number))) @@ -258,13 +285,7 @@ look up the development dependencs for the given crate." ;; sort and map the dependencies to a list containing ;; pairs of (name version) (define (sort-map-dependencies deps) - (sort (map (lambda (dep) - (let* ((name (crate-dependency-id dep)) - (crate (lookup-crate* name)) - (req (crate-dependency-requirement dep)) - (ver (find-crate-version crate req))) - (list name - (crate-version-number ver)))) + (sort (map dependency-name+version deps) (match-lambda* (((name _) ...) (apply string-cilicense "MIT/Apache-2.0")) + + +(define test-doctool-crate + "{ + \"crate\": { + \"max_version\": \"2.2.2\", + \"name\": \"leaf-bob\", + \"description\": \"summary\", + \"homepage\": \"http://example.com\", + \"repository\": \"http://example.com\", + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"] + \"actual_versions\": [ + { \"id\": 234280, + \"num\": \"2.2.2\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/doctool/2.2.2/dependencies\" + } + } + ] + } +}") + +;; FIXME: This test depends on some existing packages +(define test-doctool-dependencies + "{ + \"dependencies\": [ + { + \"crate_id\": \"docopt\", + \"kind\": \"normal\", + \"req\": \"^0.8.1\" + } + ] +}") + + +(test-assert "self-test: rust-docopt 0.8.x is gone, please adjust the test case" + (not (null? (find-packages-by-name "rust-docopt" "0.8")))) + +(test-assert "cargo-recursive-import-hoors-existing-packages" + (mock ((guix http-client) http-fetch + (lambda (url . rest) + (match url + ("https://crates.io/api/v1/crates/doctool" + (open-input-string test-doctool-crate)) + ("https://crates.io/api/v1/crates/doctool/2.2.2/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/doctool/2.2.2/dependencies" + (open-input-string test-doctool-dependencies)) + (_ (error "Unexpected URL: " url))))) + (match (crate-recursive-import "doctool") + (((define-public 'rust-doctool-2 + (package + (name "rust-doctool") + (version "2.2.2") + (source + (origin + (method url-fetch) + (uri (crate-uri "doctool" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:cargo-inputs + (("rust-docopt" + ('unquote 'rust-docopt-0.8)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) + #t) + (x + (pk 'fail x #f))))) + (test-end "crate") -- 2.21.3 From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 16 14:19:53 2020 Received: (at control) by debbugs.gnu.org; 16 Nov 2020 19:19:53 +0000 Received: from localhost ([127.0.0.1]:57338 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kek2b-0003Ew-HN for submit@debbugs.gnu.org; Mon, 16 Nov 2020 14:19:53 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:50441) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kek2Z-0003En-7l for control@debbugs.gnu.org; Mon, 16 Nov 2020 14:19:51 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CZf5x4Pb5z1qt4G for ; Mon, 16 Nov 2020 20:19:49 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CZf5x4K94z1rYDh for ; Mon, 16 Nov 2020 20:19:49 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id mtwg-SgyImOR for ; Mon, 16 Nov 2020 20:19:49 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-59-253.dynamic.mnet-online.de [188.174.59.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS for ; Mon, 16 Nov 2020 20:19:49 +0100 (CET) Received: from thisbe.goebel-consult.de (hermia.goebel-consult.de [192.168.110.7]) by hermia.goebel-consult.de (Postfix) with ESMTP id F28DA60052 for ; Mon, 16 Nov 2020 20:20:45 +0100 (CET) Subject: Re: bug#44694: Acknowledgement ([PATCH v17 0/8] New take continued: Semantic version aware recursive) To: control@debbugs.gnu.org References: From: Hartmut Goebel Organization: crazy-compilers.com Message-ID: <9c6bea84-9e79-43a4-cddd-9f804ba91fde@crazy-compilers.com> Date: Mon, 16 Nov 2020 20:19:46 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: de-DE X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) merge 44694 38408 From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 17 16:43:49 2020 Received: (at 38408) by debbugs.gnu.org; 17 Nov 2020 21:43:50 +0000 Received: from localhost ([127.0.0.1]:33154 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kf8lQ-0000wF-1s for submit@debbugs.gnu.org; Tue, 17 Nov 2020 16:43:49 -0500 Received: from mx1.riseup.net ([198.252.153.129]:59882) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kf8lK-0000w3-T6 for 38408@debbugs.gnu.org; Tue, 17 Nov 2020 16:43:46 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 4CbKFR6rPTzFfLK; Tue, 17 Nov 2020 13:43:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1605649420; bh=lXG2Kp6wK23cPIwKS3zGsQUaj4ZDCnIC71M2JpkCqmM=; h=Subject:To:References:From:Date:In-Reply-To:From; b=TyRD82P7bpalu6OI3jsfGFVfCIIQnUUiKo/TQrWiZOHSP1bEXto/cKHp+nlcbQi6z zcV4YGNrW9jf7gfYeDBroVMWfKaQi5xc2eXsKGofvVQYvZhnih4B1/xDgcfDE4gQcO Kdy+8uh5SbwyQIjl9KpIxL4nm4TndcXThuZnx4L4= X-Riseup-User-ID: 97D7FBFFF0E65E1F134EC7AA87136F05A13EEEDDE59046E9E9E4471A260C992A Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 4CbKFK0BKPzJqNN; Tue, 17 Nov 2020 13:43:27 -0800 (PST) Subject: Re: [PATCH v16 3/6] import: crate: Use guile-semver to resolve module versions. To: Hartmut Goebel , 38408@debbugs.gnu.org References: <9a14a3c5-dcab-98ce-8d81-d5c19b77cf93@crazy-compilers.com> From: Martin Becze Message-ID: <9a7b9c3e-8553-d2d5-6b8a-2ad62b0132c7@riseup.net> Date: Tue, 17 Nov 2020 15:43:20 -0600 MIME-Version: 1.0 In-Reply-To: <9a14a3c5-dcab-98ce-8d81-d5c19b77cf93@crazy-compilers.com> Content-Type: multipart/mixed; boundary="------------B7B7717CDA64257586E9201C" Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) This is a multi-part message in MIME format. --------------B7B7717CDA64257586E9201C Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 11/10/20 4:13 PM, Hartmut Goebel wrote: > Please add a brief change description for crate-recursive-import. Done > > I could not spot this change. has this been reverted in one of the many > version of this series? I added a better description in the attached commit. > Does this still fetch the latest version? Or is it the latest version > matching a semver range, or the latest non-beta version? The latest version including beta versions > Is this change in the last line intended? Another patch of this series > reverts this change. No, nice catch. Changing this creates conflicts so I will update the patch set. > Does this still fetch the latest version? Or is it the latest version > matching a semver range, or the latest non-beta version? I will add more advance tests in a separate commit at the end. Attached is the updated patch set. I believe it address everything brought up but please let me know if there is anything else. Thanks a lot for looking at this. --------------B7B7717CDA64257586E9201C Content-Type: text/x-patch; charset=UTF-8; name="0007-test-Update-tests-to-cover-semver.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0007-test-Update-tests-to-cover-semver.patch" >From 321779758ffe448217adcae38b700851149f8210 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Mon, 16 Nov 2020 01:13:00 -0600 Subject: [PATCH 7/7] test: Update tests to cover semver. * tests/crate.scm (cargo-recursive-import): Update the tests to so that the recusive import tests cover using semver. --- tests/crate.scm | 147 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 102 insertions(+), 45 deletions(-) diff --git a/tests/crate.scm b/tests/crate.scm index 68481d9932..3c0fb26fcd 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -88,14 +88,14 @@ "{ \"dependencies\": [ { - \"crate_id\": \"intermediate-1\", + \"crate_id\": \"intermediate-a\", \"kind\": \"normal\", - \"req\": \"1.0.0\" + \"req\": \"^1.0.0\" }, { - \"crate_id\": \"intermediate-2\", + \"crate_id\": \"intermediate-b\", \"kind\": \"normal\", - \"req\": \"1.0.0\" + \"req\": \"*.0.0\" } { \"crate_id\": \"leaf-alice\", @@ -110,33 +110,46 @@ ] }") -(define test-intermediate-1-crate +(define test-intermediate-a-crate "{ \"crate\": { - \"max_version\": \"1.0.0\", - \"name\": \"intermediate-1\", + \"max_version\": \"1.0.1\", + \"name\": \"intermediate-a\", \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", \"keywords\": [\"dummy\", \"test\"], \"categories\": [\"test\"], \"actual_versions\": [ - { \"id\": \"intermediate-1\", + { \"id\": \"intermediate-a\", + \"num\": \"2.0.0\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/intermediate-a/1.0.1/dependencies\" + } + } + { \"id\": \"intermediate-a\", + \"num\": \"1.0.1\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/intermediate-a/1.0.1/dependencies\" + } + },{ \"id\": \"intermediate-a\", \"num\": \"1.0.0\", \"license\": \"MIT OR Apache-2.0\", \"links\": { - \"dependencies\": \"/api/v1/crates/intermediate-1/1.0.0/dependencies\" + \"dependencies\": \"/api/v1/crates/intermediate-a/1.0.1/dependencies\" } } ] } }") -(define test-intermediate-1-dependencies +(define test-intermediate-a-dependencies "{ \"dependencies\": [ { - \"crate_id\": \"intermediate-2\", + \"crate_id\": \"intermediate-b\", \"kind\": \"normal\", \"req\": \"1.0.0\" }, @@ -153,29 +166,36 @@ ] }") -(define test-intermediate-2-crate +(define test-intermediate-b-crate "{ \"crate\": { \"max_version\": \"1.0.0\", - \"name\": \"intermediate-2\", + \"name\": \"intermediate-b\", \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", \"keywords\": [\"dummy\", \"test\"], \"categories\": [\"test\"], \"actual_versions\": [ - { \"id\": \"intermediate-2\", + { \"id\": \"intermediate-b\", + \"num\": \"2.0.0\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/intermediate-b/2.0.0/dependencies\" + } + }, + { \"id\": \"intermediate-b\", \"num\": \"1.0.0\", \"license\": \"MIT OR Apache-2.0\", \"links\": { - \"dependencies\": \"/api/v1/crates/intermediate-2/1.0.0/dependencies\" + \"dependencies\": \"/api/v1/crates/intermediate-b/1.0.0/dependencies\" } } ] } }") -(define test-intermediate-2-dependencies +(define test-intermediate-b-dependencies "{ \"dependencies\": [ { @@ -230,6 +250,13 @@ \"links\": { \"dependencies\": \"/api/v1/crates/leaf-bob/1.0.0/dependencies\" } + }, + { \"id\": \"leaf-bob\", + \"num\": \"0.1.0\", + \"license\": \"MIT OR Apache-2.0\", + \"links\": { + \"dependencies\": \"/api/v1/crates/leaf-bob/0.1.0/dependencies\" + } } ] } @@ -320,24 +347,31 @@ (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/root/1.0.0/dependencies" (open-input-string test-root-dependencies)) - ("https://crates.io/api/v1/crates/intermediate-1" - (open-input-string test-intermediate-1-crate)) - ("https://crates.io/api/v1/crates/intermediate-1/1.0.0/download" + ("https://crates.io/api/v1/crates/intermediate-a" + (open-input-string test-intermediate-a-crate)) + ("https://crates.io/api/v1/crates/intermediate-a/1.0.1/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/intermediate-a/1.0.1/dependencies" + (open-input-string test-intermediate-a-dependencies)) + ("https://crates.io/api/v1/crates/intermediate-b" + (open-input-string test-intermediate-b-crate)) + ("https://crates.io/api/v1/crates/intermediate-b/1.0.0/download" (set! test-source-hash (bytevector->nix-base32-string (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) - ("https://crates.io/api/v1/crates/intermediate-1/1.0.0/dependencies" - (open-input-string test-intermediate-1-dependencies)) - ("https://crates.io/api/v1/crates/intermediate-2" - (open-input-string test-intermediate-2-crate)) - ("https://crates.io/api/v1/crates/intermediate-2/1.0.0/download" + ("https://crates.io/api/v1/crates/intermediate-b/2.0.0/download" (set! test-source-hash (bytevector->nix-base32-string (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) - ("https://crates.io/api/v1/crates/intermediate-2/1.0.0/dependencies" - (open-input-string test-intermediate-2-dependencies)) + ("https://crates.io/api/v1/crates/intermediate-b/1.0.0/dependencies" + (open-input-string test-intermediate-b-dependencies)) + ("https://crates.io/api/v1/crates/intermediate-b/2.0.0/dependencies" + (open-input-string test-intermediate-b-dependencies)) ("https://crates.io/api/v1/crates/leaf-alice" (open-input-string test-leaf-alice-crate)) ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" @@ -358,11 +392,34 @@ (open-input-string test-leaf-bob-dependencies)) (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") - ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0 + ;; rust-intermediate-B has no dependency on the rust-leaf-alice package, so this is a valid ordering + (((define-public rust-intermediate-b-2.0 + (package + (name "rust-intermediate-b") + (version "2.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-b" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") - (version (? string? ver)) + (version "1.0.0") (source (origin (method url-fetch) @@ -381,7 +438,7 @@ (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") - (version (? string? ver)) + (version "1.0.0") (source (origin (method url-fetch) @@ -397,14 +454,14 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0 + (define-public rust-intermediate-b-1.0 (package - (name "rust-intermediate-2") - (version (? string? ver)) + (name "rust-intermediate-b") + (version "1.0.0") (source (origin (method url-fetch) - (uri (crate-uri "intermediate-2" version)) + (uri (crate-uri "intermediate-b" version)) (file-name (string-append name "-" version ".tar.gz")) (sha256 @@ -420,14 +477,14 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0 + (define-public rust-intermediate-a-1.0 (package - (name "rust-intermediate-1") - (version (? string? ver)) + (name "rust-intermediate-a") + (version "1.0.1") (source (origin (method url-fetch) - (uri (crate-uri "intermediate-1" version)) + (uri (crate-uri "intermediate-a" version)) (file-name (string-append name "-" version ".tar.gz")) (sha256 @@ -437,8 +494,8 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2" - ,rust-intermediate-2-1.0) + (("rust-intermediate-b" + ,rust-intermediate-b-1.0) ("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)) ("rust-leaf-bob" @@ -450,7 +507,7 @@ (define-public rust-root-1.0 (package (name "rust-root") - (version (? string? ver)) + (version "1.0.0") (source (origin (method url-fetch) @@ -463,10 +520,10 @@ (build-system cargo-build-system) (arguments ('quasiquote (#:cargo-inputs - (("rust-intermediate-1" - ('unquote rust-intermediate-1-1.0)) - ("rust-intermediate-2" - ('unquote rust-intermediate-2-1.0)) + (("rust-intermediate-a" + ('unquote rust-intermediate-a-1.0)) + ("rust-intermediate-b" + ('unquote rust-intermediate-b-2.0)) ("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)) ("rust-leaf-bob" -- 2.29.2 --------------B7B7717CDA64257586E9201C Content-Type: text/x-patch; charset=UTF-8; name="0006-import-crate-Parameterized-importing-of-dev-dependen.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0006-import-crate-Parameterized-importing-of-dev-dependen.pa"; filename*1="tch" >From e0e09fb443cf89f77409271fd9114adfaccaa95b Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 10 Nov 2020 22:39:33 +0100 Subject: [PATCH 6/7] import: crate: Parameterized importing of dev dependencies. The recursive crate importer will now include development dependencies only for the top level package, but not for any of the recursively imported packages. * guix/import/crate.scm (make-crate-sexp): Add the key BUILD?. (crate->guix-package): Add the key INCLUDE-DEV-DEPS?. (crate-recursive-import): Likewise. * guix/scripts/import/crate.scm (guix-import-crate): Likewise. * tests/crate.scm (cargo-recursive-import): Likewise. --- guix/import/crate.scm | 25 ++++++++++++++++++------- guix/scripts/import/crate.scm | 4 ++-- tests/crate.scm | 3 +-- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 0a88e30e8f..236420f144 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -151,7 +151,7 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license) + home-page synopsis description license build?) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." @@ -178,7 +178,9 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append '(#:skip-build? #t) + ,@(maybe-arguments (append (if build? + '() + '(#:skip-build? #t)) (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) @@ -203,11 +205,12 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:key version repo) +(define* (crate->guix-package crate-name #:key version include-dev-deps? repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the -latest version of CRATE-NAME." +latest version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this +will also lookup the development dependencs for the given crate." (define (semver-range-contains-string? range version) (semver-range-contains? (string->semver-range range) @@ -252,9 +255,12 @@ latest version of CRATE-NAME." (let* ((dependencies (crate-version-dependencies version*)) (dep-crates dev-dep-crates (partition normal-dependency? dependencies)) (cargo-inputs (map-dependencies dep-crates)) - (cargo-development-inputs '())) + (cargo-development-inputs (if include-dev-deps? + (map-dependencies dev-dep-crates) + '()))) (values - (make-crate-sexp #:name crate-name + (make-crate-sexp #:build? include-dev-deps? + #:name crate-name #:version (crate-version-number version*) #:cargo-inputs cargo-inputs #:cargo-development-inputs cargo-development-inputs @@ -268,7 +274,12 @@ latest version of CRATE-NAME." (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package (memoize crate->guix-package) + #:repo->guix-package (lambda* params + ;; only download the development dependencies for the top level package + (let ((include-dev-deps? (equal? (car params) crate-name)) + (crate->guix-package* (memoize crate->guix-package))) + (apply crate->guix-package* + (append params `(#:include-dev-deps? ,include-dev-deps?))))) #:version version #:guix-name crate-name->package-name)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index 552628cfc7..9252c52dfa 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -96,13 +96,13 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (if (assoc-ref opts 'recursive) (crate-recursive-import name #:version version) - (let ((sexp (crate->guix-package name #:version version))) + (let ((sexp (crate->guix-package name #:version version #:include-dev-deps? #t))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version (string-append name "@" version) name))) - sexp))) + (list sexp)))) (() (leave (G_ "too few arguments~%"))) ((many ...) diff --git a/tests/crate.scm b/tests/crate.scm index b14e4f8225..68481d9932 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -462,8 +462,7 @@ (? string? hash))))) (build-system cargo-build-system) (arguments - ('quasiquote (#:skip-build? - #t #:cargo-inputs + ('quasiquote (#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1-1.0)) ("rust-intermediate-2" -- 2.29.2 --------------B7B7717CDA64257586E9201C Content-Type: text/x-patch; charset=UTF-8; name="0005-import-utils-Trim-patch-version-from-names.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0005-import-utils-Trim-patch-version-from-names.patch" >From be381204b46449a7db14d0217f656f86af976fb3 Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 10 Nov 2020 22:39:32 +0100 Subject: [PATCH 5/7] import: utils: Trim patch version from names. This remove the patch version from generated package names. For example 'rust-my-crate-1.1.2' now becomes 'rust-my-crate-1.1'. * guix/import/utils.scm (package->definition): Trim patch version from generated package names. * tests/crate.scm: (cargo>guix-package, cargo-recursive-import): Likewise. --- guix/import/utils.scm | 7 ++++--- tests/crate.scm | 46 +++++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 66445f006f..d78a6d3fae 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -269,9 +269,10 @@ package definition." ('package ('name name) ('version version) . rest) ('let _ ('package ('name name) ('version version) . rest))) - `(define-public ,(string->symbol (if append-version? - (string-append name "-" version) - version)) + `(define-public ,(string->symbol + (if append-version? + (string-append name "-" (version-major+minor version)) + version)) ,guix-package)))) (define (build-system-modules) diff --git a/tests/crate.scm b/tests/crate.scm index beaa696be0..b14e4f8225 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -280,7 +280,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate->guix-package "foo") - ((define-public rust-foo-1.0.0 + ((define-public rust-foo-1.0 (package (name "rust-foo") (version "1.0.0") (source @@ -296,7 +296,7 @@ ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (("rust-leaf-alice" ('unquote rust-leaf-alice-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") @@ -359,7 +359,7 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - (((define-public rust-leaf-alice-1.0.0 + (((define-public rust-leaf-alice-1.0 (package (name "rust-leaf-alice") (version (? string? ver)) @@ -378,7 +378,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-leaf-bob-1.0.0 + (define-public rust-leaf-bob-1.0 (package (name "rust-leaf-bob") (version (? string? ver)) @@ -397,7 +397,7 @@ (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-2-1.0.0 + (define-public rust-intermediate-2-1.0 (package (name "rust-intermediate-2") (version (? string? ver)) @@ -414,13 +414,13 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-intermediate-1-1.0.0 + (define-public rust-intermediate-1-1.0 (package (name "rust-intermediate-1") (version (? string? ver)) @@ -437,17 +437,17 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-2-1.0.0" - ,rust-intermediate-2-1.0.0) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-2" + ,rust-intermediate-2-1.0) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") (license (list license:expat license:asl2.0)))) - (define-public rust-root-1.0.0 + (define-public rust-root-1.0 (package (name "rust-root") (version (? string? ver)) @@ -464,14 +464,14 @@ (arguments ('quasiquote (#:skip-build? #t #:cargo-inputs - (("rust-intermediate-1-1.0.0" - ('unquote rust-intermediate-1-1.0.0)) - ("rust-intermediate-2-1.0.0" - ('unquote rust-intermediate-2-1.0.0)) - ("rust-leaf-alice-1.0.0" - ('unquote rust-leaf-alice-1.0.0)) - ("rust-leaf-bob-1.0.0" - ('unquote rust-leaf-bob-1.0.0)))))) + (("rust-intermediate-1" + ('unquote rust-intermediate-1-1.0)) + ("rust-intermediate-2" + ('unquote rust-intermediate-2-1.0)) + ("rust-leaf-alice" + ('unquote rust-leaf-alice-1.0)) + ("rust-leaf-bob" + ('unquote rust-leaf-bob-1.0)))))) (home-page "http://example.com") (synopsis "summary") (description "summary") -- 2.29.2 --------------B7B7717CDA64257586E9201C Content-Type: text/x-patch; charset=UTF-8; name="0004-import-crate-Memorize-crate-guix-package.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0004-import-crate-Memorize-crate-guix-package.patch" >From 26b97a51cf592a64b10accd4f332dbc8d20844af Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 10 Nov 2020 22:39:31 +0100 Subject: [PATCH 4/7] import: crate: Memorize crate->guix-package. This adds memorization to procedures that involve network lookups. 'lookup-crate*' is used on every dependency of a package to get its version list. It is also used to lookup a package's metadata. 'crate-recursive-import' is also memorized since creating the same package twice will trigger a lookup on its dependencies. * guix/import/crate.scm (lookup-crate*): New procedure. (crate->guix-package): Memorize package metadata lookups. (crate-recursive-import): Memorize package creation. --- guix/import/crate.scm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 9c93a80fbd..0a88e30e8f 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -27,6 +27,7 @@ #:use-module (guix import json) #:use-module (guix import utils) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix monads) #:use-module (guix packages) #:use-module (guix upstream) @@ -110,6 +111,8 @@ record or #f if it was not found." (json->crate `(,@alist ("actual_versions" . ,versions)))))))) +(define lookup-crate* (memoize lookup-crate)) + (define (crate-version-dependencies version) "Return the list of records of VERSION, a ." @@ -215,7 +218,7 @@ latest version of CRATE-NAME." (eq? (crate-dependency-kind dependency) 'normal))) (define crate - (lookup-crate crate-name)) + (lookup-crate* crate-name)) (define version-number (and crate @@ -265,7 +268,7 @@ latest version of CRATE-NAME." (define* (crate-recursive-import crate-name #:key version) (recursive-import crate-name - #:repo->guix-package crate->guix-package + #:repo->guix-package (memoize crate->guix-package) #:version version #:guix-name crate-name->package-name)) -- 2.29.2 --------------B7B7717CDA64257586E9201C Content-Type: text/x-patch; charset=UTF-8; name="0003-import-crate-Use-guile-semver-to-resolve-module-vers.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename*0="0003-import-crate-Use-guile-semver-to-resolve-module-vers.pa"; filename*1="tch" >From 10a2c699f28daa29f434fbd4fa0e67fbbac4224b Mon Sep 17 00:00:00 2001 From: Martin Becze Date: Tue, 10 Nov 2020 22:39:30 +0100 Subject: [PATCH 3/7] import: crate: Use guile-semver to resolve module versions. * guix/import/crate.scm: Add guile-semver as a soft dependency. (make-crate-sexp): Don't allow other keys. Add '#:skip-build?' to build system args. Pass a VERSION argument to 'cargo-inputs'. Move 'package-definition' from scripts/import/crate.scm to here. (crate->guix-package): Use guile-semver to resolve the correct module versions. Treat "build" dependencies as normal dependencies. Add key "repo" and make "name" a key. (crate-name->package-name): Reuse the procedure 'guix-name' instead of duplicating its logic. (crate-recursive-import): Use (crate->guix-package) directly since it now takes the correct arguments. * guix/import/utils.scm (package-names->package-inputs): Implement handling of (name version) pairs. * guix/scripts/import/crate.scm (guix-import-crate): Remove the public definitions since the are now returned by (crate-recursive-import). * tests/crate.scm: (recursive-import) Add version data to the test. --- guix/import/crate.scm | 89 +++++---- guix/import/utils.scm | 21 ++- guix/scripts/import/crate.scm | 11 +- tests/crate.scm | 330 +++++++++++++++++++--------------- 4 files changed, 261 insertions(+), 190 deletions(-) diff --git a/guix/import/crate.scm b/guix/import/crate.scm index 8c2b76cab4..9c93a80fbd 100644 --- a/guix/import/crate.scm +++ b/guix/import/crate.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -37,6 +37,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-71) #:export (crate->guix-package guix-package->crate-name string->license @@ -85,10 +86,15 @@ crate-dependency? json->crate-dependency (id crate-dependency-id "crate_id") ;string - (kind crate-dependency-kind "kind" ;'normal | 'dev + (kind crate-dependency-kind "kind" ;'normal | 'dev | 'build string->symbol) (requirement crate-dependency-requirement "req")) ;string +(module-autoload! (current-module) + '(semver) '(string->semver)) +(module-autoload! (current-module) + '(semver ranges) '(string->semver-range semver-range-contains?)) + (define (lookup-crate name) "Look up NAME on https://crates.io and return the corresopnding record or #f if it was not found." @@ -142,16 +148,22 @@ record or #f if it was not found." `((arguments (,'quasiquote ,args)))))) (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs - home-page synopsis description license - #:allow-other-keys) + home-page synopsis description license) "Return the `package' s-expression for a rust package with the given NAME, VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (define (format-inputs inputs) + (map + (match-lambda + ((name version) + (list (crate-name->package-name name) + (version-major+minor version)))) + inputs)) + (let* ((port (http-fetch (crate-uri name version))) (guix-name (crate-name->package-name name)) - (cargo-inputs (map crate-name->package-name cargo-inputs)) - (cargo-development-inputs (map crate-name->package-name - cargo-development-inputs)) + (cargo-inputs (format-inputs cargo-inputs)) + (cargo-development-inputs (format-inputs cargo-development-inputs)) (pkg `(package (name ,guix-name) (version ,version) @@ -163,7 +175,8 @@ and LICENSE." (base32 ,(bytevector->nix-base32-string (port-sha256 port)))))) (build-system cargo-build-system) - ,@(maybe-arguments (append (maybe-cargo-inputs cargo-inputs) + ,@(maybe-arguments (append '(#:skip-build? #t) + (maybe-cargo-inputs cargo-inputs) (maybe-cargo-development-inputs cargo-development-inputs))) (home-page ,(match home-page @@ -176,7 +189,7 @@ and LICENSE." ((license) license) (_ `(list ,@license))))))) (close-port port) - pkg)) + (package->definition pkg #t))) (define (string->license string) (filter-map (lambda (license) @@ -187,14 +200,19 @@ and LICENSE." 'unknown-license!))) (string-split string (string->char-set " /")))) -(define* (crate->guix-package crate-name #:optional version) +(define* (crate->guix-package crate-name #:key version repo) "Fetch the metadata for CRATE-NAME from crates.io, and return the `package' s-expression corresponding to that package, or #f on failure. When VERSION is specified, attempt to fetch that version; otherwise fetch the latest version of CRATE-NAME." + (define (semver-range-contains-string? range version) + (semver-range-contains? (string->semver-range range) + (string->semver version))) + (define (normal-dependency? dependency) - (eq? (crate-dependency-kind dependency) 'normal)) + (or (eq? (crate-dependency-kind dependency) 'build) + (eq? (crate-dependency-kind dependency) 'normal))) (define crate (lookup-crate crate-name)) @@ -204,22 +222,34 @@ latest version of CRATE-NAME." (or version (crate-latest-version crate)))) + ;; finds the a version of a crate that fulfills the semver + (define (find-version crate range) + (find (lambda (version) + (semver-range-contains-string? + range + (crate-version-number version))) + (crate-versions crate))) + (define version* (and crate - (find (lambda (version) - (string=? (crate-version-number version) - version-number)) - (crate-versions crate)))) + (find-version crate version-number))) + + ;; maps the dependencies to a list containing pairs of (name version) + (define (map-dependencies deps) + (map (lambda (dep) + (let* ((name (crate-dependency-id dep)) + (crate (lookup-crate* name)) + (req (crate-dependency-requirement dep)) + (ver (find-version crate req))) + (list name + (crate-version-number ver)))) + deps)) (and crate version* - (let* ((dependencies (crate-version-dependencies version*)) - (dep-crates (filter normal-dependency? dependencies)) - (dev-dep-crates (remove normal-dependency? dependencies)) - (cargo-inputs (sort (map crate-dependency-id dep-crates) - string-cilicense)) (append cargo-inputs cargo-development-inputs))))) -(define* (crate-recursive-import crate-name #:optional version) - (recursive-import crate-name #f - #:repo->guix-package - (lambda (name repo) - (let ((version (and (string=? name crate-name) - version))) - (crate->guix-package name version))) +(define* (crate-recursive-import crate-name #:key version) + (recursive-import crate-name + #:repo->guix-package crate->guix-package + #:version version #:guix-name crate-name->package-name)) (define (guix-package->crate-name package) @@ -254,7 +281,7 @@ latest version of CRATE-NAME." ((name _ ...) name)))) (define (crate-name->package-name name) - (string-append "rust-" (string-join (string-split name #\_) "-"))) + (guix-name "rust-" name)) ;;; diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 9213eca8a0..66445f006f 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -229,13 +229,20 @@ into a proper sentence and by using two spaces between sentences." cleaned 'pre ". " 'post))) (define* (package-names->package-inputs names #:optional (output #f)) - "Given a list of PACKAGE-NAMES, and an optional OUTPUT, tries to generate a -quoted list of inputs, as suitable to use in an 'inputs' field of a package -definition." - (map (lambda (input) - (cons* input (list 'unquote (string->symbol input)) - (or (and output (list output)) - '()))) + "Given a list of PACKAGE-NAMES or (PACKAGE-NAME VERSION) pairs, and an +optional OUTPUT, tries to generate a quoted list of inputs, as suitable to +use in an 'inputs' field of a package definition." + (define (make-input input version) + (cons* input (list 'unquote (string->symbol + (if version + (string-append input "-" version) + input))) + (or (and output (list output)) + '()))) + + (map (match-lambda + ((input version) (make-input input version)) + (input (make-input input #f))) names)) (define* (maybe-inputs package-names #:optional (output #f)) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm index d834518c18..552628cfc7 100644 --- a/guix/scripts/import/crate.scm +++ b/guix/scripts/import/crate.scm @@ -2,7 +2,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven -;;; Copyright © 2019 Martin Becze +;;; Copyright © 2019, 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -95,13 +95,8 @@ Import and convert the crate.io package for PACKAGE-NAME.\n")) (package-name->name+version spec)) (if (assoc-ref opts 'recursive) - (map (match-lambda - ((and ('package ('name name) . rest) pkg) - `(define-public ,(string->symbol name) - ,pkg)) - (_ #f)) - (crate-recursive-import name version)) - (let ((sexp (crate->guix-package name version))) + (crate-recursive-import name #:version version) + (let ((sexp (crate->guix-package name #:version version))) (unless sexp (leave (G_ "failed to download meta-data for package '~a'~%") (if version diff --git a/tests/crate.scm b/tests/crate.scm index 61a04f986b..beaa696be0 100644 --- a/tests/crate.scm +++ b/tests/crate.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 David Thompson ;;; Copyright © 2016 David Craven ;;; Copyright © 2019, 2020 Ludovic Courtès +;;; Copyright © 2020 Martin Becze ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,8 +37,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"foo\", \"num\": \"1.0.0\", @@ -54,8 +55,9 @@ "{ \"dependencies\": [ { - \"crate_id\": \"bar\", - \"kind\": \"normal\" + \"crate_id\": \"leaf-alice\", + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -68,8 +70,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"foo\", \"num\": \"1.0.0\", @@ -87,19 +89,23 @@ \"dependencies\": [ { \"crate_id\": \"intermediate-1\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -112,8 +118,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"intermediate-1\", \"num\": \"1.0.0\", @@ -131,15 +137,18 @@ \"dependencies\": [ { \"crate_id\": \"intermediate-2\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-alice\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" }, { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -152,8 +161,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"intermediate-2\", \"num\": \"1.0.0\", @@ -171,7 +180,8 @@ \"dependencies\": [ { \"crate_id\": \"leaf-bob\", - \"kind\": \"normal\" + \"kind\": \"normal\", + \"req\": \"1.0.0\" } ] }") @@ -184,8 +194,8 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], - \"categories\": [\"test\"] + \"keywords\": [\"dummy\", \"test\"], + \"categories\": [\"test\"], \"actual_versions\": [ { \"id\": \"leaf-alice\", \"num\": \"1.0.0\", @@ -211,7 +221,7 @@ \"description\": \"summary\", \"homepage\": \"http://example.com\", \"repository\": \"http://example.com\", - \"keywords\": [\"dummy\" \"test\"], + \"keywords\": [\"dummy\", \"test\"], \"categories\": [\"test\"] \"actual_versions\": [ { \"id\": \"leaf-bob\", @@ -253,34 +263,48 @@ (open-input-string test-foo-crate)) ("https://crates.io/api/v1/crates/foo/1.0.0/download" (set! test-source-hash - (bytevector->nix-base32-string - (sha256 (string->bytevector "empty file\n" "utf-8")))) + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) (open-input-string "empty file\n")) ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" (open-input-string test-foo-dependencies)) + ("https://crates.io/api/v1/crates/leaf-alice" + (open-input-string test-leaf-alice-crate)) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/leaf-alice/1.0.0/dependencies" + (open-input-string test-leaf-alice-dependencies)) (_ (error "Unexpected URL: " url))))) - (match (crate->guix-package "foo") - (('package - ('name "rust-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri ('crate-uri "foo" 'version)) - ('file-name ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-bar" ('unquote rust-bar)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - (string=? test-source-hash hash)) - (x - (pk 'fail x #f))))) + + (match (crate->guix-package "foo") + ((define-public rust-foo-1.0.0 + (package (name "rust-foo") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (crate-uri "foo" 'version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system 'cargo-build-system) + (arguments + ('quasiquote + (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-alice-1.0.0" ('unquote rust-leaf-alice-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) (test-assert "cargo-recursive-import" ;; Replace network resources with sample data. @@ -335,105 +359,123 @@ (_ (error "Unexpected URL: " url))))) (match (crate-recursive-import "root") ;; rust-intermediate-2 has no dependency on the rust-leaf-alice package, so this is a valid ordering - ((('package - ('name "rust-leaf-alice") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-alice" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-leaf-bob") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "leaf-bob" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-2") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-2" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-intermediate-1") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "intermediate-1" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0))) - ('package - ('name "rust-root") - ('version (? string? ver)) - ('source - ('origin - ('method 'url-fetch) - ('uri ('crate-uri "root" 'version)) - ('file-name - ('string-append 'name "-" 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'cargo-build-system) - ('arguments - ('quasiquote - ('#:cargo-inputs (("rust-intermediate-1" ('unquote rust-intermediate-1)) - ("rust-intermediate-2" ('unquote rust-intermediate-2)) - ("rust-leaf-alice" ('unquote rust-leaf-alice)) - ("rust-leaf-bob" ('unquote rust-leaf-bob)))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license ('list 'license:expat 'license:asl2.0)))) + (((define-public rust-leaf-alice-1.0.0 + (package + (name "rust-leaf-alice") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-alice" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-leaf-bob-1.0.0 + (package + (name "rust-leaf-bob") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "leaf-bob" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments ('quasiquote (#:skip-build? #t))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-2-1.0.0 + (package + (name "rust-intermediate-2") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-2" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-intermediate-1-1.0.0 + (package + (name "rust-intermediate-1") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "intermediate-1" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? #t + #:cargo-inputs + (("rust-intermediate-2-1.0.0" + ,rust-intermediate-2-1.0.0) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0)))) + (define-public rust-root-1.0.0 + (package + (name "rust-root") + (version (? string? ver)) + (source + (origin + (method url-fetch) + (uri (crate-uri "root" version)) + (file-name + (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + (? string? hash))))) + (build-system cargo-build-system) + (arguments + ('quasiquote (#:skip-build? + #t #:cargo-inputs + (("rust-intermediate-1-1.0.0" + ('unquote rust-intermediate-1-1.0.0)) + ("rust-intermediate-2-1.0.0" + ('unquote rust-intermediate-2-1.0.0)) + ("rust-leaf-alice-1.0.0" + ('unquote rust-leaf-alice-1.0.0)) + ("rust-leaf-bob-1.0.0" + ('unquote rust-leaf-bob-1.0.0)))))) + (home-page "http://example.com") + (synopsis "summary") + (description "summary") + (license (list license:expat license:asl2.0))))) #t) (x (pk 'fail x #f))))) -- 2.29.2 --------------B7B7717CDA64257586E9201C-- From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 17 16:51:46 2020 Received: (at 38408) by debbugs.gnu.org; 17 Nov 2020 21:51:46 +0000 Received: from localhost ([127.0.0.1]:33197 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kf8t8-0003G3-Me for submit@debbugs.gnu.org; Tue, 17 Nov 2020 16:51:46 -0500 Received: from mx1.riseup.net ([198.252.153.129]:35608) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kf8t6-0003Fs-HX for 38408@debbugs.gnu.org; Tue, 17 Nov 2020 16:51:45 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 4CbKQj6Z9BzFdwm; Tue, 17 Nov 2020 13:51:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1605649901; bh=NutzVUrK4gAXeMg9iYEacQfocVYk+OX1QQlT+BTTI1I=; h=Subject:From:To:References:Date:In-Reply-To:From; b=nF3ZMxhGMqJRByFHkwV/RI2+X0EteddgIpyRqCMDbpCcq5n4UZyRFmvHJw0NNfJg3 Ezqcux3RZcFLRA3PzKZMS8vUYMRxUgCse1/Zn2A6IwkIwYj8cSWrQovL/lLGGR/3po xKvATsNcU/GO5TKPEii69EYohCOE4PI+F0ZxgVaY= X-Riseup-User-ID: BDEB6756EDF7F04560E4D3397CF0788F6B49223ACF1104C826E3CE494B0A2AAF Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 4CbKQh4F5MzJn5S; Tue, 17 Nov 2020 13:51:38 -0800 (PST) Subject: Re: [PATCH v16 3/6] import: crate: Use guile-semver to resolve module versions. From: Martin Becze To: Hartmut Goebel , 38408@debbugs.gnu.org References: <9a14a3c5-dcab-98ce-8d81-d5c19b77cf93@crazy-compilers.com> <9a7b9c3e-8553-d2d5-6b8a-2ad62b0132c7@riseup.net> Message-ID: <3f9e33f3-a21b-8d9a-fdc2-7ec4ed016999@riseup.net> Date: Tue, 17 Nov 2020 15:51:36 -0600 MIME-Version: 1.0 In-Reply-To: <9a7b9c3e-8553-d2d5-6b8a-2ad62b0132c7@riseup.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hartmut, I just saw you v17 I think that is probably better then what I have attached. On 11/17/20 3:43 PM, Martin Becze wrote: > > > On 11/10/20 4:13 PM, Hartmut Goebel wrote: >> Please add a brief change description for crate-recursive-import. > > Done > >> > >> I could not spot this change. has this been reverted in one of the many > >> version of this series? > > > I added a better description in the attached commit. > >> Does this still fetch the latest version? Or is it the latest version > >> matching a semver range, or the latest non-beta version? > > > The latest version including beta versions > >> Is this change in the last line intended? Another patch of this series > >> reverts this change. > > No, nice catch. Changing this creates conflicts so I will update the > patch set. > >> Does this still fetch the latest version? Or is it the latest version > >> matching a semver range, or the latest non-beta version? > > > I will add more advance tests in a separate commit at the end. > > Attached is the updated patch set. I believe it address everything > brought up but please let me know if there is anything else. Thanks a > lot for looking at this. From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 17 16:54:22 2020 Received: (at 38408) by debbugs.gnu.org; 17 Nov 2020 21:54:22 +0000 Received: from localhost ([127.0.0.1]:33201 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kf8ve-0003K1-38 for submit@debbugs.gnu.org; Tue, 17 Nov 2020 16:54:22 -0500 Received: from mx1.riseup.net ([198.252.153.129]:36716) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kf8vc-0003Js-NX for 38408@debbugs.gnu.org; Tue, 17 Nov 2020 16:54:21 -0500 Received: from bell.riseup.net (bell-pn.riseup.net [10.0.1.178]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 4CbKTm0Xp7zDsZh; Tue, 17 Nov 2020 13:54:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1605650060; bh=e3wprluFipbxgOlw6HSXEVof65WUWPmnav5UXTDwg1s=; h=Subject:To:References:From:Date:In-Reply-To:From; b=slcL1NbGuAPPgm7GXcXKlwgPJegl2FeFdRNaIrzlj8YJtyG6hW+AIUgC1iElzoK7i Zw9SjBoVaofnD5iTWzHe9EHfQraw8JCUSUjHvP8zUR2l3ZyiPQoaplanLBZmc6r06G EsGx8V0B/7kD9XRfnBwN9J3UQGE+UokFDpqaKJ8A= X-Riseup-User-ID: E7B1D3E788FB887D5042367F7823852A0D26FD89EC0D51FA454F81C65FD19567 Received: from [127.0.0.1] (localhost [127.0.0.1]) by bell.riseup.net (Postfix) with ESMTPSA id 4CbKTk6b67zJpxB; Tue, 17 Nov 2020 13:54:18 -0800 (PST) Subject: Re: [bug#38408] [PATCH v17 0/8] New take continued: Semantic version aware recursive To: Hartmut Goebel , 38408@debbugs.gnu.org References: From: Martin Becze Message-ID: <151d428b-b14d-897b-c7d6-aa7adfade883@riseup.net> Date: Tue, 17 Nov 2020 15:54:14 -0600 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Very impressive savings! On 11/16/20 1:07 PM, Hartmut Goebel wrote: > This saves adding a lot of new packages. As an example: When importing > sequoia-openpgp@0.20.0 this only imports 19 crates now, compared to 96 > using the former method. From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 18 02:56:58 2020 Received: (at 38408) by debbugs.gnu.org; 18 Nov 2020 07:56:58 +0000 Received: from localhost ([127.0.0.1]:33885 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kfIKo-0003lc-AL for submit@debbugs.gnu.org; Wed, 18 Nov 2020 02:56:58 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:40369) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kfIKl-0003lT-9P for 38408@debbugs.gnu.org; Wed, 18 Nov 2020 02:56:56 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CbZs161xhz1qs1D; Wed, 18 Nov 2020 08:56:53 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CbZs14Crvz1spXv; Wed, 18 Nov 2020 08:56:53 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id m96c50zbX0Of; Wed, 18 Nov 2020 08:56:52 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-61-233.dynamic.mnet-online.de [188.174.61.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Wed, 18 Nov 2020 08:56:52 +0100 (CET) Received: from lenashee.goebel-consult.de (lenashee.goebel-consult.de [192.168.110.2]) by hermia.goebel-consult.de (Postfix) with ESMTP id 4B9BD60122; Wed, 18 Nov 2020 08:57:55 +0100 (CET) Subject: Re: [PATCH v16 3/6] import: crate: Use guile-semver to resolve module versions. To: Martin Becze , 38408@debbugs.gnu.org References: <9a14a3c5-dcab-98ce-8d81-d5c19b77cf93@crazy-compilers.com> <9a7b9c3e-8553-d2d5-6b8a-2ad62b0132c7@riseup.net> <3f9e33f3-a21b-8d9a-fdc2-7ec4ed016999@riseup.net> From: Hartmut Goebel Organization: crazy-compilers.com Message-ID: <7389598f-870b-8d5d-307b-985e14aeaed1@crazy-compilers.com> Date: Wed, 18 Nov 2020 08:56:49 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.2 MIME-Version: 1.0 In-Reply-To: <3f9e33f3-a21b-8d9a-fdc2-7ec4ed016999@riseup.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Martin, looks like we did similar work in parallel. Sorry for that. I'm a bit impatient on this topic so I continued working on this as I did not hear anything from you. > Hartmut, I just saw you v17 I think that is probably better then what > I have attached. Anyhow, I'll check your patches (will take some time) and eventually merge with v17. Anyhow (again): Without your previous work, I would not have been able to make my changes. Standing on the shoulders of a Giant ;-) -- Regards Hartmut Goebel | Hartmut Goebel | h.goebel@crazy-compilers.com | | www.crazy-compilers.com | compilers which you thought are impossible | From debbugs-submit-bounces@debbugs.gnu.org Wed Dec 02 16:13:50 2020 Received: (at 38408-close) by debbugs.gnu.org; 2 Dec 2020 21:13:50 +0000 Received: from localhost ([127.0.0.1]:37558 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kkZRe-0004FH-Gt for submit@debbugs.gnu.org; Wed, 02 Dec 2020 16:13:50 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:47498) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kkZRc-0004F9-Jx for 38408-close@debbugs.gnu.org; Wed, 02 Dec 2020 16:13:49 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CmWt26wF7z1rtyg; Wed, 2 Dec 2020 22:13:46 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CmWt26X4qz1qsWc; Wed, 2 Dec 2020 22:13:46 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id jUz78Adgn-2q; Wed, 2 Dec 2020 22:13:46 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-55-73.dynamic.mnet-online.de [188.174.55.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS; Wed, 2 Dec 2020 22:13:46 +0100 (CET) Received: from thisbe.goebel-consult.de (hermia.goebel-consult.de [192.168.110.7]) by hermia.goebel-consult.de (Postfix) with ESMTP id 8392A60013; Wed, 2 Dec 2020 22:13:47 +0100 (CET) Subject: Re: [PATCH v17 0/8] New take continued: Semantic version aware recursive From: Hartmut Goebel To: guix-patches@gnu.org, 38408-close@debbugs.gnu.org References: Organization: crazy-compilers.com Message-ID: Date: Wed, 2 Dec 2020 22:13:43 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408-close Cc: Martin Becze X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Finally pished as 054e308f5d85ca96327861a577d69c6e18fdc9dc Thanks for everybody contributing. -- Regards Hartmut Goebel | Hartmut Goebel | h.goebel@crazy-compilers.com | | www.crazy-compilers.com | compilers which you thought are impossible | From debbugs-submit-bounces@debbugs.gnu.org Wed Dec 02 16:48:36 2020 Received: (at 38408) by debbugs.gnu.org; 2 Dec 2020 21:48:36 +0000 Received: from localhost ([127.0.0.1]:37591 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kkZzI-000555-9x for submit@debbugs.gnu.org; Wed, 02 Dec 2020 16:48:36 -0500 Received: from wout4-smtp.messagingengine.com ([64.147.123.20]:57271) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kkZzF-00054s-Tf for 38408@debbugs.gnu.org; Wed, 02 Dec 2020 16:48:34 -0500 Received: from compute6.internal (compute6.nyi.internal [10.202.2.46]) by mailout.west.internal (Postfix) with ESMTP id 8F53ED20; Wed, 2 Dec 2020 16:48:27 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute6.internal (MEProxy); Wed, 02 Dec 2020 16:48:27 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=famulari.name; h=date:from:to:subject:message-id:references:mime-version :content-type:in-reply-to; s=mesmtp; bh=kAvmm2oE+H8Pg3XRYv1Gl7C6 wZJ8CBGK7rIwN4z6jyo=; b=t5ZUi70hEpvOgXtPti1zHj+cQbzwXyHVNX9gO7Di VnKbqNsa3fGAoAW88c/zz7im4MyMEYxG5LsYHPFzNr46NzVdpHf/RZW8HbCFDXZa JyNNc+lcgd816+VtrowphrJYE6JzlnZ4289e1L+mYziTf73/1YT9JeuBi4GqjMq5 KoU= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=kAvmm2 oE+H8Pg3XRYv1Gl7C6wZJ8CBGK7rIwN4z6jyo=; b=OrrgUZtqx12X1YZdu5Cc8G tlYONH7zM+M2/OyT/aqKUSgTM3qXieL7BUqaiH2KbkA8g3x47J7pDLijDV8GcygZ 5wN1rh9DnoVMHuNvqQgDMCGXA5JFhWmFF07WB/VMWo53AWGww68KnzczcWkgZEXj sMNO/Y/T8I/rLV662W3FLZJnJXmyv6U/JJXRH72mrlXlT1q5bzzP/8sqfcq3vPxd ei2IbG1oJsvdmDPh863NcsFXyAW1ElUyn6wAE2WPj32KYEmscO0MBhPHp6OUU3eJ JesP7CPifWPkVX/oatew9b2rw9ufbAfvUDY6jJDsdjLtJrdcMg6wk5s2Jf8m/Lkg == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrudeigedgudehgecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecunecujfgurhepfffhvffukfhfgggtuggjsehttd ertddttddvnecuhfhrohhmpefnvghoucfhrghmuhhlrghrihcuoehlvghosehfrghmuhhl rghrihdrnhgrmhgvqeenucggtffrrghtthgvrhhnpeeukeektdffvddtudegjeegtdevhf eufeeivdejiedtieegtdevjedvjeehffevgfenucfkphepjeefrddugedurdduvdejrddu geeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheplh gvohesfhgrmhhulhgrrhhirdhnrghmvg X-ME-Proxy: Received: from localhost (c-73-141-127-146.hsd1.pa.comcast.net [73.141.127.146]) by mail.messagingengine.com (Postfix) with ESMTPA id 90D1E24005C; Wed, 2 Dec 2020 16:48:26 -0500 (EST) Date: Wed, 2 Dec 2020 16:48:24 -0500 From: Leo Famulari To: 38408@debbugs.gnu.org, h.goebel@crazy-compilers.com, mjbecze@riseup.net Subject: Re: bug#38408: [PATCH v17 0/8] New take continued: Semantic version aware recursive Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 38408 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) On Wed, Dec 02, 2020 at 10:13:43PM +0100, Hartmut Goebel wrote: > Finally pished as 054e308f5d85ca96327861a577d69c6e18fdc9dc > > Thanks for everybody contributing. Wonderful! Thanks for picking up the work Hartmut, and thank you to Martin for writing the bulk of it. This work will make it possible to bring Rust into Guix in an easy and maintainable way, which is crucial for the future of free software. From debbugs-submit-bounces@debbugs.gnu.org Sat Dec 12 06:02:14 2020 Received: (at control) by debbugs.gnu.org; 12 Dec 2020 11:02:15 +0000 Received: from localhost ([127.0.0.1]:44012 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ko2fG-0006MX-Kw for submit@debbugs.gnu.org; Sat, 12 Dec 2020 06:02:14 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:42308) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ko2fE-0006ML-Pz for control@debbugs.gnu.org; Sat, 12 Dec 2020 06:02:14 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CtPql2TrVz1rynt for ; Sat, 12 Dec 2020 12:02:11 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CtPql0Hzyz1qql4 for ; Sat, 12 Dec 2020 12:02:11 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id 8CIEhySRHEwg for ; Sat, 12 Dec 2020 12:02:10 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-55-61.dynamic.mnet-online.de [188.174.55.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS for ; Sat, 12 Dec 2020 12:02:10 +0100 (CET) Received: from lenashee.goebel-consult.de (lenashee.goebel-consult.de [192.168.110.2]) by hermia.goebel-consult.de (Postfix) with ESMTP id D41BF6018A for ; Sat, 12 Dec 2020 12:08:13 +0100 (CET) To: debbugs control From: Hartmut Goebel Organization: crazy-compilers.com Message-ID: Date: Sat, 12 Dec 2020 12:02:07 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: de-DE X-Spam-Score: 1.3 (+) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: merge 38408 44560 close 38408 44560 Content analysis details: (1.3 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/, low trust [212.18.0.10 listed in list.dnswl.org] 0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [212.18.0.10 listed in wl.mailspike.net] 0.0 SPF_NONE SPF: sender does not publish an SPF Record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 1.8 MISSING_SUBJECT Missing Subject: header 0.2 NO_SUBJECT Extra score for no subject 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.3 (/) merge 38408 44560 close 38408 44560 From debbugs-submit-bounces@debbugs.gnu.org Sat Dec 12 06:08:49 2020 Received: (at control) by debbugs.gnu.org; 12 Dec 2020 11:08:49 +0000 Received: from localhost ([127.0.0.1]:44024 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ko2ld-0006YP-Hw for submit@debbugs.gnu.org; Sat, 12 Dec 2020 06:08:49 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:37728) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ko2lc-0006YG-Cb for control@debbugs.gnu.org; Sat, 12 Dec 2020 06:08:48 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4CtPzM6hX5z1s0tN for ; Sat, 12 Dec 2020 12:08:47 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4CtPzM6Y6vz1t82H for ; Sat, 12 Dec 2020 12:08:47 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id BJMf0XIuOmb9 for ; Sat, 12 Dec 2020 12:08:47 +0100 (CET) Received: from hermia.goebel-consult.de (ppp-188-174-55-61.dynamic.mnet-online.de [188.174.55.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPS for ; Sat, 12 Dec 2020 12:08:47 +0100 (CET) Received: from lenashee.goebel-consult.de (lenashee.goebel-consult.de [192.168.110.2]) by hermia.goebel-consult.de (Postfix) with ESMTP id 495916018A for ; Sat, 12 Dec 2020 12:14:51 +0100 (CET) From: Hartmut Goebel To: debbugs control Organization: crazy-compilers.com Message-ID: <51eb127c-dbc7-2430-a77d-272dac09c9ea@crazy-compilers.com> Date: Sat, 12 Dec 2020 12:08:44 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: de-DE X-Spam-Score: 1.3 (+) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: close 44560 merge 38408 44560 Content analysis details: (1.3 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/, low trust [212.18.0.10 listed in list.dnswl.org] 0.0 SPF_NONE SPF: sender does not publish an SPF Record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [212.18.0.10 listed in wl.mailspike.net] 1.8 MISSING_SUBJECT Missing Subject: header 0.2 NO_SUBJECT Extra score for no subject 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.3 (/) close 44560 merge 38408 44560 From unknown Wed Jun 18 23:14:16 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sat, 09 Jan 2021 12:24:04 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator