From debbugs-submit-bounces@debbugs.gnu.org Wed Jun 06 13:24:03 2018 Received: (at submit) by debbugs.gnu.org; 6 Jun 2018 17:24:03 +0000 Received: from localhost ([127.0.0.1]:36998 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fQcAB-0000e6-9R for submit@debbugs.gnu.org; Wed, 06 Jun 2018 13:24:03 -0400 Received: from eggs.gnu.org ([208.118.235.92]:53671) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fQcA9-0000ds-Qk for submit@debbugs.gnu.org; Wed, 06 Jun 2018 13:23:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fQcA2-0003kV-RE for submit@debbugs.gnu.org; Wed, 06 Jun 2018 13:23:52 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:59571) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fQcA2-0003kH-Ke for submit@debbugs.gnu.org; Wed, 06 Jun 2018 13:23:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44641) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fQcA0-0008RB-6c for guix-patches@gnu.org; Wed, 06 Jun 2018 13:23:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fQc9w-0003hx-Up for guix-patches@gnu.org; Wed, 06 Jun 2018 13:23:48 -0400 Received: from lepiller.eu ([2a00:5884:8208::1]:45400) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fQc9w-0003gm-Il for guix-patches@gnu.org; Wed, 06 Jun 2018 13:23:44 -0400 Received: from localhost (static-176-182-42-79.ncc.abo.bbox.fr [176.182.42.79]) by lepiller.eu (OpenSMTPD) with ESMTPSA id df85d462 (TLSv1.2:ECDHE-RSA-CHACHA20-POLY1305:256:NO) for ; Wed, 6 Jun 2018 17:26:01 +0000 (UTC) Date: Wed, 6 Jun 2018 19:23:29 +0200 From: Julien Lepiller To: guix-patches@gnu.org Subject: [PATCH] Add an opam importer Message-ID: <20180606192329.255ade5e@lepiller.eu> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="MP_/c35U6Y2/5VPNz1SUccZpKqU" X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) 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: -1.0 (-) --MP_/c35U6Y2/5VPNz1SUccZpKqU Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, this patch adds an importer for ocaml packages from the opam repository. --MP_/c35U6Y2/5VPNz1SUccZpKqU Content-Type: text/x-patch Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename=0001-guix-Add-opam-importer.patch =46rom 04268bfc1a64c2c69f25977d76af8af34f7e0024 Mon Sep 17 00:00:00 2001 From: Julien Lepiller Date: Wed, 6 Jun 2018 19:14:39 +0200 Subject: [PATCH] guix: Add opam importer. * guix/scripts/import.scm (importers): Add opam. * guix/scripts/import/opam.scm: New file. * guix/import/opam.scm: New file. * Makefile.am: Add them. --- Makefile.am | 2 + guix/import/opam.scm | 210 +++++++++++++++++++++++++++++++++++ guix/scripts/import.scm | 2 +- guix/scripts/import/opam.scm | 92 +++++++++++++++ 4 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 guix/import/opam.scm create mode 100644 guix/scripts/import/opam.scm diff --git a/Makefile.am b/Makefile.am index 7898a3648..6bf077d1b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -230,11 +230,13 @@ MODULES +=3D \ guix/import/github.scm \ guix/import/gnome.scm \ guix/import/json.scm \ + guix/import/opam.scm \ guix/import/pypi.scm \ guix/import/stackage.scm \ guix/scripts/import/crate.scm \ guix/scripts/import/gem.scm \ guix/scripts/import/json.scm \ + guix/scripts/import/opam.scm \ guix/scripts/import/pypi.scm \ guix/scripts/import/stackage.scm \ guix/scripts/weather.scm diff --git a/guix/import/opam.scm b/guix/import/opam.scm new file mode 100644 index 000000000..92bcef292 --- /dev/null +++ b/guix/import/opam.scm @@ -0,0 +1,210 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2014 David Thompson +;;; Copyright =C2=A9 2015 Cyril Roelandt +;;; Copyright =C2=A9 2015, 2016, 2017 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2017 Mathieu Othacehe +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (guix import opam) + #:use-module (ice-9 binary-ports) + #:use-module (ice-9 match) + #:use-module (ice-9 pretty-print) + #:use-module (ice-9 regex) + #:use-module ((ice-9 rdelim) #:select (read-line)) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (srfi srfi-34) + #:use-module (srfi srfi-35) + #:use-module (rnrs bytevectors) + #:use-module (web uri) + #:use-module (guix http-client) + #:use-module (guix ui) + #:use-module (guix utils) + #:use-module ((guix build utils) + #:select ((package-name->name+version + . hyphen-package-name->name+version))) + #:use-module (guix import utils) + #:use-module ((guix download) #:prefix download:) + #:use-module (guix import json) + #:use-module (guix packages) + #:use-module (guix upstream) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix build-system python) + #:export (opam-urls + urls->htable + opam->guix-package + %opam-updater)) + +(define (opam-urls) + "Fetch the urls.txt file from the opam repository and returns the list of +URLs it contains." + (let ((port (http-fetch/cached (string->uri "https://opam.ocaml.org/urls= .txt")))) + (let loop ((result '())) + (let ((line (read-line port))) + (if (eof-object? line) + (begin + (close port) + result) + (loop (cons line result))))))) + +(define (htable-update htable line) + "Parse @var{line} to get the name and version of the package and adds th= em +to the hashtable." + (let* ((line (string-split line #\ )) + (url (car line))) + (unless (equal? url "repo") + (let ((sp (string-split url #\/))) + (when (equal? (car sp) "packages") + (let* ((versionstr (car (cdr (cdr sp)))) + (name1 (car (cdr sp))) + (name2 (car (string-split versionstr #\.))) + (version (string-join (cdr (string-split versionstr #\.))= "."))) + (when (equal? name1 name2) + (let ((curr (hash-ref htable name1 '()))) + (hash-set! htable name1 (cons version curr)))))))))) + +(define (urls->htable urls) + "Transform urls.txt in a hashtable whose keys are package names and valu= es +the list of available versions." + (let ((htable (make-hash-table))) + (let loop ((urls urls)) + (if (eq? (length urls) 0) + htable + (begin + (htable-update htable (car urls)) + (loop (cdr urls))))))) + +(define (latest-version versions) + "Find the most recent version from a list of versions." + (let loop ((versions (cdr versions)) (m (car versions))) + (if (eq? (length versions) 0) + m + (loop (cdr versions) (if (version>? m (car versions)) m (car version= s)))))) + +(define (fetch-url uri) + "Fetch and parse the url file. Return the URL the package can be downlo= aded +from." + (let ((port (http-fetch uri))) + (let loop ((result #f)) + (let ((line (read-line port))) + (if (eof-object? line) + (begin + (close port) + result) + (let* ((line (string-split line #\ )) + (key (car line))) + (if (equal? key "archive:") + (loop (string-trim-both (car (cdr line)) #\")) + (loop result)))))))) + +(define (fetch-metadata uri) + "Fetch and parse the opam file. Return an association list containing t= he +homepage, the license and the list of inputs." + (let ((port (http-fetch uri))) + (let loop ((result '()) (deps? #f)) + (let ((line (read-line port))) + (if (eof-object? line) + (begin + (close port) + result) + (let* ((line (string-split line #\ )) + (key (car line)) + (deps? (if deps? (not (equal? key "]")) (equal? key "depe= nds:"))) + (val (string-trim-both (string-join (cdr line) "") #\"))) + (cond + ((equal? key "homepage:") + (loop (cons `("homepage" . ,val) result) deps?)) + ((equal? key "license:") + (loop (cons `("license" . ,val) result) deps?)) + ((and deps? (not (equal? val "["))) + (let ((curr (assoc-ref result "inputs")) + (new (string-trim-both (car (string-split val #\{)) (= list->char-set '(#\] #\[ #\"))))) + (loop (cons `("inputs" . ,(cons new (if curr curr '()))) = result) + (if (string-contains val "]") #f deps?)))) + (else (loop result deps?))))))))) + +(define (string->license str) + (cond + ((equal? str "MIT") '(license:expat)) + ((equal? str "GPL2") '(license:gpl2)) + ((equal? str "LGPLv2") '(license:lgpl2)) + (else `()))) + +(define (deps->inputs deps) + "Transform the list of dependencies in a list of inputs. Filter out any= thing +that looks like a native-input." + (if (eq? deps #f) + '() + (let ((inputs + (map (lambda (input) + (list input (list 'unquote (string->symbol input)))) + (map (lambda (input) + (cond + ((equal? input "ocamlfind") "ocaml-findlib") + ((string-prefix? "ocaml" input) input) + (else (string-append "ocaml-" input)))) + (filter (lambda (input) (not (string-prefix? "conf-" input= ))) deps))))) + (if (eq? (length inputs) 0) #f inputs)))) + +(define (deps->native-inputs deps) + "Transform the list of dependencies in a list of native-inputs. Filter = out +anything that doesn't look like a native-input." + (if (eq? deps #f) + '() + (let ((inputs + (map (lambda (input) + (list input (list 'unquote (string->symbol input)))) + (map (lambda (input) (substring input 5)) + (filter (lambda (input) (string-prefix? "conf-" input)) de= ps))))) + (if (eq? (length inputs) 0) #f inputs)))) + +(define (opam->guix-package name) + (let* ((htable (urls->htable (opam-urls))) + (versions (hash-ref htable name))) + (unless (eq? versions #f) + (let* ((version (latest-version versions)) + (package-url (string-append "https://opam.ocaml.org/packages/= " name + "/" name "." version "/")) + (url-url (string-append package-url "url")) + (opam-url (string-append package-url "opam")) + (source-url (fetch-url url-url)) + (metadata (fetch-metadata opam-url)) + (deps (assoc-ref metadata "inputs")) + (native-inputs (deps->native-inputs deps)) + (inputs (deps->inputs deps))) + (call-with-temporary-output-file + (lambda (temp port) + (and (url-fetch source-url temp) + `(package + (name ,name) + (version ,version) + (source + (origin + (method url-fetch) + (uri ,source-url) + (sha256 (base32 ,(guix-hash-url temp))))) + (build-system ocaml-build-system) + ,@(if (eq? (length inputs) 0) + '() + `((inputs ,(list 'quasiquote inputs)))) + ,@(if (eq? (length native-inputs) 0) + '() + `((native-inputs ,(list 'quasiquote native-inputs)= ))) + (home-page ,(assoc-ref metadata "homepage")) + (synopsis "") + (description "") + (license ,@(string->license (assoc-ref metadata "licen= se"))))))))))) diff --git a/guix/scripts/import.scm b/guix/scripts/import.scm index 67bc7a755..bc03179e5 100644 --- a/guix/scripts/import.scm +++ b/guix/scripts/import.scm @@ -74,7 +74,7 @@ rather than \\n." ;;; =20 (define importers '("gnu" "nix" "pypi" "cpan" "hackage" "stackage" "elpa" = "gem" - "cran" "crate" "texlive" "json")) + "cran" "crate" "texlive" "json" "opam")) =20 (define (resolve-importer name) (let ((module (resolve-interface diff --git a/guix/scripts/import/opam.scm b/guix/scripts/import/opam.scm new file mode 100644 index 000000000..ab8bbcb5b --- /dev/null +++ b/guix/scripts/import/opam.scm @@ -0,0 +1,92 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2014 David Thompson +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (guix scripts import opam) + #:use-module (guix ui) + #:use-module (guix utils) + #:use-module (guix scripts) + #:use-module (guix import opam) + #:use-module (guix scripts import) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-11) + #:use-module (srfi srfi-37) + #:use-module (ice-9 match) + #:use-module (ice-9 format) + #:export (guix-import-opam)) + +=0C +;;; +;;; Command-line options. +;;; + +(define %default-options + '()) + +(define (show-help) + (display (G_ "Usage: guix import opam PACKAGE-NAME +Import and convert the opam package for PACKAGE-NAME.\n")) + (display (G_ " + -h, --help display this help and exit")) + (display (G_ " + -V, --version display version information and exit")) + (newline) + (show-bug-report-information)) + +(define %options + ;; Specification of the command-line options. + (cons* (option '(#\h "help") #f #f + (lambda args + (show-help) + (exit 0))) + (option '(#\V "version") #f #f + (lambda args + (show-version-and-exit "guix import opam"))) + %standard-import-options)) + +=0C +;;; +;;; Entry point. +;;; + +(define (guix-import-opam . args) + (define (parse-options) + ;; Return the alist of option values. + (args-fold* args %options + (lambda (opt name arg result) + (leave (G_ "~A: unrecognized option~%") name)) + (lambda (arg result) + (alist-cons 'argument arg result)) + %default-options)) + + (let* ((opts (parse-options)) + (args (filter-map (match-lambda + (('argument . value) + value) + (_ #f)) + (reverse opts)))) + (match args + ((package-name) + (let ((sexp (opam->guix-package package-name))) + (unless sexp + (leave (G_ "failed to download meta-data for package '~a'~%") + package-name)) + sexp)) + (() + (leave (G_ "too few arguments~%"))) + ((many ...) + (leave (G_ "too many arguments~%")))))) --=20 2.17.1 --MP_/c35U6Y2/5VPNz1SUccZpKqU-- From debbugs-submit-bounces@debbugs.gnu.org Wed Jun 06 13:38:06 2018 Received: (at submit) by debbugs.gnu.org; 6 Jun 2018 17:38:06 +0000 Received: from localhost ([127.0.0.1]:37009 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fQcNp-0000z8-JN for submit@debbugs.gnu.org; Wed, 06 Jun 2018 13:38:06 -0400 Received: from eggs.gnu.org ([208.118.235.92]:56497) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fQcNl-0000yd-Qr for submit@debbugs.gnu.org; Wed, 06 Jun 2018 13:38:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fQcNe-0003c8-FE for submit@debbugs.gnu.org; Wed, 06 Jun 2018 13:37:56 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:39680) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fQcNe-0003by-AD for submit@debbugs.gnu.org; Wed, 06 Jun 2018 13:37:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47468) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fQcNb-00083U-SL for guix-patches@gnu.org; Wed, 06 Jun 2018 13:37:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fQcNX-0003Yc-IW for guix-patches@gnu.org; Wed, 06 Jun 2018 13:37:51 -0400 Received: from lepiller.eu ([2a00:5884:8208::1]:45402) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fQcNX-0003XQ-7J for guix-patches@gnu.org; Wed, 06 Jun 2018 13:37:47 -0400 Received: from localhost (static-176-182-42-79.ncc.abo.bbox.fr [176.182.42.79]) by lepiller.eu (OpenSMTPD) with ESMTPSA id 03ccc4ed (TLSv1.2:ECDHE-RSA-CHACHA20-POLY1305:256:NO) for ; Wed, 6 Jun 2018 17:40:04 +0000 (UTC) Date: Wed, 6 Jun 2018 19:37:40 +0200 From: Julien Lepiller To: guix-patches@gnu.org Subject: Re: [bug#31736] [PATCH] Add an opam importer Message-ID: <20180606193740.44bef2ea@lepiller.eu> In-Reply-To: <20180606192329.255ade5e@lepiller.eu> References: <20180606192329.255ade5e@lepiller.eu> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="MP_/6nCm7G/c9d=U6g=LpsmRvjI" X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) 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: -6.0 (------) --MP_/6nCm7G/c9d=U6g=LpsmRvjI Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Le Wed, 6 Jun 2018 19:23:29 +0200, Julien Lepiller a =C3=A9crit : > Hi, this patch adds an importer for ocaml packages from the opam > repository. Whoops, the copyright lines and part of the code was wrong. This version should be better :) --MP_/6nCm7G/c9d=U6g=LpsmRvjI Content-Type: text/x-patch Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename=0001-guix-Add-opam-importer.patch =46rom a5250186722305961f0a5d77cb8f7f36cdae0da0 Mon Sep 17 00:00:00 2001 From: Julien Lepiller Date: Wed, 6 Jun 2018 19:14:39 +0200 Subject: [PATCH] guix: Add opam importer. * guix/scripts/import.scm (importers): Add opam. * guix/scripts/import/opam.scm: New file. * guix/import/opam.scm: New file. * Makefile.am: Add them. --- Makefile.am | 2 + guix/import/opam.scm | 188 +++++++++++++++++++++++++++++++++++ guix/scripts/import.scm | 2 +- guix/scripts/import/opam.scm | 92 +++++++++++++++++ 4 files changed, 283 insertions(+), 1 deletion(-) create mode 100644 guix/import/opam.scm create mode 100644 guix/scripts/import/opam.scm diff --git a/Makefile.am b/Makefile.am index 7898a3648..6bf077d1b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -230,11 +230,13 @@ MODULES +=3D \ guix/import/github.scm \ guix/import/gnome.scm \ guix/import/json.scm \ + guix/import/opam.scm \ guix/import/pypi.scm \ guix/import/stackage.scm \ guix/scripts/import/crate.scm \ guix/scripts/import/gem.scm \ guix/scripts/import/json.scm \ + guix/scripts/import/opam.scm \ guix/scripts/import/pypi.scm \ guix/scripts/import/stackage.scm \ guix/scripts/weather.scm diff --git a/guix/import/opam.scm b/guix/import/opam.scm new file mode 100644 index 000000000..608f8b449 --- /dev/null +++ b/guix/import/opam.scm @@ -0,0 +1,188 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2018 Julien Lepiller +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (guix import opam) + #:use-module (ice-9 match) + #:use-module ((ice-9 rdelim) #:select (read-line)) + #:use-module (srfi srfi-1) + #:use-module (web uri) + #:use-module (guix http-client) + #:use-module (guix utils) + #:use-module (guix import utils) + #:use-module ((guix licenses) #:prefix license:) + #:export (opam->guix-package)) + +(define (opam-urls) + "Fetch the urls.txt file from the opam repository and returns the list of +URLs it contains." + (let ((port (http-fetch/cached (string->uri "https://opam.ocaml.org/urls= .txt")))) + (let loop ((result '())) + (let ((line (read-line port))) + (if (eof-object? line) + (begin + (close port) + result) + (loop (cons line result))))))) + +(define (htable-update htable line) + "Parse @var{line} to get the name and version of the package and adds th= em +to the hashtable." + (let* ((line (string-split line #\ )) + (url (car line))) + (unless (equal? url "repo") + (let ((sp (string-split url #\/))) + (when (equal? (car sp) "packages") + (let* ((versionstr (car (cdr (cdr sp)))) + (name1 (car (cdr sp))) + (name2 (car (string-split versionstr #\.))) + (version (string-join (cdr (string-split versionstr #\.))= "."))) + (when (equal? name1 name2) + (let ((curr (hash-ref htable name1 '()))) + (hash-set! htable name1 (cons version curr)))))))))) + +(define (urls->htable urls) + "Transform urls.txt in a hashtable whose keys are package names and valu= es +the list of available versions." + (let ((htable (make-hash-table))) + (let loop ((urls urls)) + (if (eq? (length urls) 0) + htable + (begin + (htable-update htable (car urls)) + (loop (cdr urls))))))) + +(define (latest-version versions) + "Find the most recent version from a list of versions." + (let loop ((versions (cdr versions)) (m (car versions))) + (if (eq? (length versions) 0) + m + (loop (cdr versions) (if (version>? m (car versions)) m (car version= s)))))) + +(define (fetch-url uri) + "Fetch and parse the url file. Return the URL the package can be downlo= aded +from." + (let ((port (http-fetch uri))) + (let loop ((result #f)) + (let ((line (read-line port))) + (if (eof-object? line) + (begin + (close port) + result) + (let* ((line (string-split line #\ )) + (key (car line))) + (if (equal? key "archive:") + (loop (string-trim-both (car (cdr line)) #\")) + (loop result)))))))) + +(define (fetch-metadata uri) + "Fetch and parse the opam file. Return an association list containing t= he +homepage, the license and the list of inputs." + (let ((port (http-fetch uri))) + (let loop ((result '()) (deps? #f)) + (let ((line (read-line port))) + (if (eof-object? line) + (begin + (close port) + result) + (let* ((line (string-split line #\ )) + (key (car line)) + (deps? (if deps? (not (equal? key "]")) (equal? key "depe= nds:"))) + (val (string-trim-both (string-join (cdr line) "") #\"))) + (cond + ((equal? key "homepage:") + (loop (cons `("homepage" . ,val) result) deps?)) + ((equal? key "license:") + (loop (cons `("license" . ,val) result) deps?)) + ((and deps? (not (equal? val "["))) + (let ((curr (assoc-ref result "inputs")) + (new (string-trim-both (car (string-split val #\{)) (= list->char-set '(#\] #\[ #\"))))) + (loop (cons `("inputs" . ,(cons new (if curr curr '()))) = result) + (if (string-contains val "]") #f deps?)))) + (else (loop result deps?))))))))) + +(define (string->license str) + (cond + ((equal? str "MIT") '(license:expat)) + ((equal? str "GPL2") '(license:gpl2)) + ((equal? str "LGPLv2") '(license:lgpl2)) + (else `()))) + +(define (deps->inputs deps) + "Transform the list of dependencies in a list of inputs. Filter out any= thing +that looks like a native-input." + (if (eq? deps #f) + '() + (let ((inputs + (map (lambda (input) + (list input (list 'unquote (string->symbol input)))) + (map (lambda (input) + (cond + ((equal? input "ocamlfind") "ocaml-findlib") + ((string-prefix? "ocaml" input) input) + (else (string-append "ocaml-" input)))) + (filter (lambda (input) (not (string-prefix? "conf-" input= ))) deps))))) + (if (eq? (length inputs) 0) '() inputs)))) + +(define (deps->native-inputs deps) + "Transform the list of dependencies in a list of native-inputs. Filter = out +anything that doesn't look like a native-input." + (if (eq? deps #f) + '() + (let ((inputs + (map (lambda (input) + (list input (list 'unquote (string->symbol input)))) + (map (lambda (input) (substring input 5)) + (filter (lambda (input) (string-prefix? "conf-" input)) de= ps))))) + (if (eq? (length inputs) 0) '() inputs)))) + +(define (opam->guix-package name) + (let* ((htable (urls->htable (opam-urls))) + (versions (hash-ref htable name))) + (unless (eq? versions #f) + (let* ((version (latest-version versions)) + (package-url (string-append "https://opam.ocaml.org/packages/= " name + "/" name "." version "/")) + (url-url (string-append package-url "url")) + (opam-url (string-append package-url "opam")) + (source-url (fetch-url url-url)) + (metadata (fetch-metadata opam-url)) + (deps (assoc-ref metadata "inputs")) + (native-inputs (deps->native-inputs deps)) + (inputs (deps->inputs deps))) + (call-with-temporary-output-file + (lambda (temp port) + (and (url-fetch source-url temp) + `(package + (name ,name) + (version ,version) + (source + (origin + (method url-fetch) + (uri ,source-url) + (sha256 (base32 ,(guix-hash-url temp))))) + (build-system ocaml-build-system) + ,@(if (eq? (length inputs) 0) + '() + `((inputs ,(list 'quasiquote inputs)))) + ,@(if (eq? (length native-inputs) 0) + '() + `((native-inputs ,(list 'quasiquote native-inputs)= ))) + (home-page ,(assoc-ref metadata "homepage")) + (synopsis "") + (description "") + (license ,@(string->license (assoc-ref metadata "licen= se"))))))))))) diff --git a/guix/scripts/import.scm b/guix/scripts/import.scm index 67bc7a755..bc03179e5 100644 --- a/guix/scripts/import.scm +++ b/guix/scripts/import.scm @@ -74,7 +74,7 @@ rather than \\n." ;;; =20 (define importers '("gnu" "nix" "pypi" "cpan" "hackage" "stackage" "elpa" = "gem" - "cran" "crate" "texlive" "json")) + "cran" "crate" "texlive" "json" "opam")) =20 (define (resolve-importer name) (let ((module (resolve-interface diff --git a/guix/scripts/import/opam.scm b/guix/scripts/import/opam.scm new file mode 100644 index 000000000..b54987874 --- /dev/null +++ b/guix/scripts/import/opam.scm @@ -0,0 +1,92 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2018 Julien Lepiller +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (guix scripts import opam) + #:use-module (guix ui) + #:use-module (guix utils) + #:use-module (guix scripts) + #:use-module (guix import opam) + #:use-module (guix scripts import) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-11) + #:use-module (srfi srfi-37) + #:use-module (ice-9 match) + #:use-module (ice-9 format) + #:export (guix-import-opam)) + +=0C +;;; +;;; Command-line options. +;;; + +(define %default-options + '()) + +(define (show-help) + (display (G_ "Usage: guix import opam PACKAGE-NAME +Import and convert the opam package for PACKAGE-NAME.\n")) + (display (G_ " + -h, --help display this help and exit")) + (display (G_ " + -V, --version display version information and exit")) + (newline) + (show-bug-report-information)) + +(define %options + ;; Specification of the command-line options. + (cons* (option '(#\h "help") #f #f + (lambda args + (show-help) + (exit 0))) + (option '(#\V "version") #f #f + (lambda args + (show-version-and-exit "guix import opam"))) + %standard-import-options)) + +=0C +;;; +;;; Entry point. +;;; + +(define (guix-import-opam . args) + (define (parse-options) + ;; Return the alist of option values. + (args-fold* args %options + (lambda (opt name arg result) + (leave (G_ "~A: unrecognized option~%") name)) + (lambda (arg result) + (alist-cons 'argument arg result)) + %default-options)) + + (let* ((opts (parse-options)) + (args (filter-map (match-lambda + (('argument . value) + value) + (_ #f)) + (reverse opts)))) + (match args + ((package-name) + (let ((sexp (opam->guix-package package-name))) + (unless sexp + (leave (G_ "failed to download meta-data for package '~a'~%") + package-name)) + sexp)) + (() + (leave (G_ "too few arguments~%"))) + ((many ...) + (leave (G_ "too many arguments~%")))))) --=20 2.17.1 --MP_/6nCm7G/c9d=U6g=LpsmRvjI-- From debbugs-submit-bounces@debbugs.gnu.org Sun Jun 10 17:28:37 2018 Received: (at 31736) by debbugs.gnu.org; 10 Jun 2018 21:28:37 +0000 Received: from localhost ([127.0.0.1]:42589 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fS7t6-00051f-RQ for submit@debbugs.gnu.org; Sun, 10 Jun 2018 17:28:37 -0400 Received: from eggs.gnu.org ([208.118.235.92]:59215) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fS7t4-00051Q-Mm for 31736@debbugs.gnu.org; Sun, 10 Jun 2018 17:28:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fS7sy-00047K-6w for 31736@debbugs.gnu.org; Sun, 10 Jun 2018 17:28:29 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:35517) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fS7sy-00047D-30; Sun, 10 Jun 2018 17:28:28 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=55432 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1fS7sx-0007k9-HI; Sun, 10 Jun 2018 17:28:27 -0400 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Julien Lepiller Subject: Re: [bug#31736] [PATCH] Add an opam importer References: <20180606192329.255ade5e@lepiller.eu> <20180606193740.44bef2ea@lepiller.eu> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 22 Prairial an 226 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, 10 Jun 2018 23:28:26 +0200 In-Reply-To: <20180606193740.44bef2ea@lepiller.eu> (Julien Lepiller's message of "Wed, 6 Jun 2018 19:37:40 +0200") Message-ID: <871sdecow5.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (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-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 31736 Cc: 31736@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: -6.0 (------) Salut Julien! Julien Lepiller skribis: > From a5250186722305961f0a5d77cb8f7f36cdae0da0 Mon Sep 17 00:00:00 2001 > From: Julien Lepiller > Date: Wed, 6 Jun 2018 19:14:39 +0200 > Subject: [PATCH] guix: Add opam importer. > > * guix/scripts/import.scm (importers): Add opam. > * guix/scripts/import/opam.scm: New file. > * guix/import/opam.scm: New file. > * Makefile.am: Add them. Very nice! I hope that=E2=80=99ll help create bridges with more fellow OCa= ml hackers. :-) I have some comments, mostly about style: > +(define (htable-update htable line) > + "Parse @var{line} to get the name and version of the package and adds = them > +to the hashtable." > + (let* ((line (string-split line #\ )) > + (url (car line))) > + (unless (equal? url "repo") > + (let ((sp (string-split url #\/))) > + (when (equal? (car sp) "packages") > + (let* ((versionstr (car (cdr (cdr sp)))) > + (name1 (car (cdr sp))) > + (name2 (car (string-split versionstr #\.))) > + (version (string-join (cdr (string-split versionstr #\.= )) "."))) > + (when (equal? name1 name2) > + (let ((curr (hash-ref htable name1 '()))) > + (hash-set! htable name1 (cons version curr)))))))))) There are a couple of things that don=E2=80=99t fully match the coding style (see = ): try to use full names for identifiers, favor a functional style (here maybe you could use a vhash=C2=B9 instead of a hash table), and, last but n= ot least, use =E2=80=98match=E2=80=99 instead of =E2=80=98car=E2=80=99 and =E2= =80=98cdr=E2=80=99. :-) =C2=B9 https://www.gnu.org/software/guile/manual/html_node/VHashes.html > +(define (fetch-url uri) > + "Fetch and parse the url file. Return the URL the package can be down= loaded > +from." Maybe =E2=80=98fetch-url-list=E2=80=99 or =E2=80=98fetch-package-urls=E2=80= =99? > +(define (fetch-metadata uri) > + "Fetch and parse the opam file. Return an association list containing= the > +homepage, the license and the list of inputs." Maybe =E2=80=98fetch-package-metadata=E2=80=99 to clarify that it=E2=80=99s= per-package? > +(define (deps->inputs deps) > + "Transform the list of dependencies in a list of inputs. Filter out a= nything > +that looks like a native-input." So that would be =E2=80=98dependencies->inputs=E2=80=99. :-) > + (if (eq? deps #f) Rather: (if (not dependencies) =E2=80=A6) > + (let ((inputs > + (map (lambda (input) > + (list input (list 'unquote (string->symbol input)))) > + (map (lambda (input) > + (cond > + ((equal? input "ocamlfind") "ocaml-findlib") > + ((string-prefix? "ocaml" input) input) > + (else (string-append "ocaml-" input)))) > + (filter (lambda (input) (not (string-prefix? "conf-" inp= ut))) deps))))) The indentation is misleading: the 2nd argument to =E2=80=98map=E2=80=99 sh= ould be aligned with the 1st. Perhaps you can use =E2=80=98filter-map=E2=80=99 here? > + (if (eq? (length inputs) 0) '() inputs)))) (eq? (length inputs) 0) =E2=86=92 (null? inputs) Note that =E2=80=98null?=E2=80=99 is constant-time whereas =E2=80=98length= =E2=80=99 is O(n). Could you add: =E2=80=A2 A few lines in guix.texi, under =E2=80=9CInvoking guix import= =E2=80=9D; =E2=80=A2 Tests in tests/opam.scm (you can take a look at tests/cpan.scm, tests/elpa.scm, etc. for inspiration.) Thank you! Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 07 17:56:18 2018 Received: (at 31736) by debbugs.gnu.org; 7 Jul 2018 21:56:18 +0000 Received: from localhost ([127.0.0.1]:50504 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fbvBd-0007gS-2p for submit@debbugs.gnu.org; Sat, 07 Jul 2018 17:56:18 -0400 Received: from lepiller.eu ([89.234.186.109]:37722) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fbvBa-0007gJ-Un for 31736@debbugs.gnu.org; Sat, 07 Jul 2018 17:56:12 -0400 Received: from webmail.lepiller.eu (static-176-182-42-79.ncc.abo.bbox.fr [176.182.42.79]) by lepiller.eu (OpenSMTPD) with ESMTPSA id d9a8ab96 (TLSv1.2:ECDHE-RSA-CHACHA20-POLY1305:256:NO) for <31736@debbugs.gnu.org>; Sat, 7 Jul 2018 21:56:54 +0000 (UTC) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_bc7298499576b2f110ec057703550b90" Date: Sat, 07 Jul 2018 23:56:08 +0200 From: Julien Lepiller To: 31736@debbugs.gnu.org Subject: Re: [bug#31736] [PATCH] Add an opam importer In-Reply-To: <871sdecow5.fsf@gnu.org> References: <20180606192329.255ade5e@lepiller.eu> <20180606193740.44bef2ea@lepiller.eu> <871sdecow5.fsf@gnu.org> Message-ID: <84c7511b174300afe05f4a2f7ca8bad6@lepiller.eu> X-Sender: julien@lepiller.eu User-Agent: Roundcube Webmail/1.3.6 X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 31736 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 (-) --=_bc7298499576b2f110ec057703550b90 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Le 2018-06-10 23:28, ludo@gnu.org a écrit : > Salut Julien! > > Julien Lepiller skribis: > >> From a5250186722305961f0a5d77cb8f7f36cdae0da0 Mon Sep 17 00:00:00 2001 >> From: Julien Lepiller >> Date: Wed, 6 Jun 2018 19:14:39 +0200 >> Subject: [PATCH] guix: Add opam importer. >> >> * guix/scripts/import.scm (importers): Add opam. >> * guix/scripts/import/opam.scm: New file. >> * guix/import/opam.scm: New file. >> * Makefile.am: Add them. > > Very nice! I hope that’ll help create bridges with more fellow OCaml > hackers. :-) > > I have some comments, mostly about style: > >> +(define (htable-update htable line) >> + "Parse @var{line} to get the name and version of the package and >> adds them >> +to the hashtable." >> + (let* ((line (string-split line #\ )) >> + (url (car line))) >> + (unless (equal? url "repo") >> + (let ((sp (string-split url #\/))) >> + (when (equal? (car sp) "packages") >> + (let* ((versionstr (car (cdr (cdr sp)))) >> + (name1 (car (cdr sp))) >> + (name2 (car (string-split versionstr #\.))) >> + (version (string-join (cdr (string-split versionstr >> #\.)) "."))) >> + (when (equal? name1 name2) >> + (let ((curr (hash-ref htable name1 '()))) >> + (hash-set! htable name1 (cons version curr)))))))))) > > There are a couple of things that don’t fully match the coding style > (see > ): > try to use full names for identifiers, favor a functional style (here > maybe you could use a vhash¹ instead of a hash table), and, last but > not > least, use ‘match’ instead of ‘car’ and ‘cdr’. :-) > > ¹ https://www.gnu.org/software/guile/manual/html_node/VHashes.html > >> +(define (fetch-url uri) >> + "Fetch and parse the url file. Return the URL the package can be >> downloaded >> +from." > > Maybe ‘fetch-url-list’ or ‘fetch-package-urls’? > >> +(define (fetch-metadata uri) >> + "Fetch and parse the opam file. Return an association list >> containing the >> +homepage, the license and the list of inputs." > > Maybe ‘fetch-package-metadata’ to clarify that it’s per-package? > >> +(define (deps->inputs deps) >> + "Transform the list of dependencies in a list of inputs. Filter >> out anything >> +that looks like a native-input." > > So that would be ‘dependencies->inputs’. :-) > >> + (if (eq? deps #f) > > Rather: (if (not dependencies) …) > >> + (let ((inputs >> + (map (lambda (input) >> + (list input (list 'unquote (string->symbol >> input)))) >> + (map (lambda (input) >> + (cond >> + ((equal? input "ocamlfind") "ocaml-findlib") >> + ((string-prefix? "ocaml" input) input) >> + (else (string-append "ocaml-" input)))) >> + (filter (lambda (input) (not (string-prefix? "conf-" >> input))) deps))))) > > The indentation is misleading: the 2nd argument to ‘map’ should be > aligned with the 1st. > > Perhaps you can use ‘filter-map’ here? > >> + (if (eq? (length inputs) 0) '() inputs)))) > > (eq? (length inputs) 0) → (null? inputs) > > Note that ‘null?’ is constant-time whereas ‘length’ is O(n). > > Could you add: > > • A few lines in guix.texi, under “Invoking guix import”; > > • Tests in tests/opam.scm (you can take a look at tests/cpan.scm, > tests/elpa.scm, etc. for inspiration.) > > Thank you! > > Ludo’. Here is a new version. What do you think? --=_bc7298499576b2f110ec057703550b90 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0001-guix-Add-opam-importer.patch Content-Disposition: attachment; filename=0001-guix-Add-opam-importer.patch; size=19045 RnJvbSBiM2ZkNzVhODA0YTQyNjRjYjA4MzU4NDU5MWEzZTU4OTg4NmQ5NmM4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKdWxpZW4gTGVwaWxsZXIgPGp1bGllbkBsZXBpbGxlci5ldT4K RGF0ZTogV2VkLCA2IEp1biAyMDE4IDE5OjE0OjM5ICswMjAwClN1YmplY3Q6IFtQQVRDSF0gZ3Vp eDogQWRkIG9wYW0gaW1wb3J0ZXIuCgoqIGd1aXgvc2NyaXB0cy9pbXBvcnQuc2NtIChpbXBvcnRl cnMpOiBBZGQgb3BhbS4KKiBndWl4L3NjcmlwdHMvaW1wb3J0L29wYW0uc2NtOiBOZXcgZmlsZS4K KiBndWl4L2ltcG9ydC9vcGFtLnNjbTogTmV3IGZpbGUuCiogdGVzdHMvb3BhbS5zY206IE5ldyBm aWxlLgoqIE1ha2VmaWxlLmFtOiBBZGQgdGhlbS4KKiBkb2MvZ3VpeC50ZXhpIChJbnZva2luZyBn dWl4IGltcG9ydCk6IERvY3VtZW50IGl0LgotLS0KIE1ha2VmaWxlLmFtICAgICAgICAgICAgICAg ICAgfCAgIDMgKwogZG9jL2d1aXgudGV4aSAgICAgICAgICAgICAgICB8ICAgNiArKwogZ3VpeC9p bXBvcnQvb3BhbS5zY20gICAgICAgICB8IDE5MyArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKwogZ3VpeC9zY3JpcHRzL2ltcG9ydC5zY20gICAgICB8ICAgMiArLQogZ3VpeC9zY3Jp cHRzL2ltcG9ydC9vcGFtLnNjbSB8ICA5MiArKysrKysrKysrKysrKysrKwogdGVzdHMvb3BhbS5z Y20gICAgICAgICAgICAgICB8IDExOCArKysrKysrKysrKysrKysrKysrKysKIDYgZmlsZXMgY2hh bmdlZCwgNDEzIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBndWl4L2ltcG9ydC9vcGFtLnNjbQogY3JlYXRlIG1vZGUgMTAwNjQ0IGd1aXgvc2NyaXB0cy9p bXBvcnQvb3BhbS5zY20KIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9vcGFtLnNjbQoKZGlmZiAt LWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KaW5kZXggNWRjMDRkZTM1Li42MThkMTY1 M2UgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmFtCisrKyBiL01ha2VmaWxlLmFtCkBAIC0yMzEsMTEg KzIzMSwxMyBAQCBNT0RVTEVTICs9CQkJCQlcCiAgIGd1aXgvaW1wb3J0L2dpdGh1Yi5zY20gICAJ CQlcCiAgIGd1aXgvaW1wb3J0L2dub21lLnNjbQkJCQlcCiAgIGd1aXgvaW1wb3J0L2pzb24uc2Nt CQkJCVwKKyAgZ3VpeC9pbXBvcnQvb3BhbS5zY20JCQkJXAogICBndWl4L2ltcG9ydC9weXBpLnNj bQkJCQlcCiAgIGd1aXgvaW1wb3J0L3N0YWNrYWdlLnNjbQkJCVwKICAgZ3VpeC9zY3JpcHRzL2lt cG9ydC9jcmF0ZS5zY20JCQlcCiAgIGd1aXgvc2NyaXB0cy9pbXBvcnQvZ2VtLnNjbQkJCVwKICAg Z3VpeC9zY3JpcHRzL2ltcG9ydC9qc29uLnNjbSAgCQlcCisgIGd1aXgvc2NyaXB0cy9pbXBvcnQv b3BhbS5zY20JCQlcCiAgIGd1aXgvc2NyaXB0cy9pbXBvcnQvcHlwaS5zY20JCQlcCiAgIGd1aXgv c2NyaXB0cy9pbXBvcnQvc3RhY2thZ2Uuc2NtCQlcCiAgIGd1aXgvc2NyaXB0cy93ZWF0aGVyLnNj bQpAQCAtMzgyLDYgKzM4NCw3IEBAIGlmIEhBVkVfR1VJTEVfSlNPTgogCiBTQ01fVEVTVFMgKz0g CQkJCQlcCiAgIHRlc3RzL3B5cGkuc2NtCQkJCVwKKyAgdGVzdHMvb3BhbS5zY20JCQkJXAogICB0 ZXN0cy9jcGFuLnNjbQkJCQlcCiAgIHRlc3RzL2dlbS5zY20JCQkJCVwKICAgdGVzdHMvY3JhdGUu c2NtCmRpZmYgLS1naXQgYS9kb2MvZ3VpeC50ZXhpIGIvZG9jL2d1aXgudGV4aQppbmRleCBhZWFj NWFhYTguLjUwOWFiYTUzOSAxMDA2NDQKLS0tIGEvZG9jL2d1aXgudGV4aQorKysgYi9kb2MvZ3Vp eC50ZXhpCkBAIC02NjUxLDYgKzY2NTEsMTIgQEAgaW4gR3VpeC4KIEBjaW5kZXggY3JhdGUKIElt cG9ydCBtZXRhZGF0YSBmcm9tIHRoZSBjcmF0ZXMuaW8gUnVzdCBwYWNrYWdlIHJlcG9zaXRvcnkK IEB1cmVme2h0dHBzOi8vY3JhdGVzLmlvLCBjcmF0ZXMuaW99LgorCitAaXRlbSBvcGFtCitAY2lu ZGV4IG9wYW0KK0BjaW5kZXggb2NhbWwKK0ltcG9ydCBtZXRhZGF0YSBmcm9tIHRoZSBAdXJlZnto dHRwczovL29wYW0ub2NhbWwub3JnLywgT3BhbX0gcGFja2FnZQorcmVwb3NpdG9yeSB1c2VkIGJ5 IHRoZSBPQ2FtbCBjb21tdW5pdHkuCiBAZW5kIHRhYmxlCiAKIFRoZSBzdHJ1Y3R1cmUgb2YgdGhl IEBjb21tYW5ke2d1aXggaW1wb3J0fSBjb2RlIGlzIG1vZHVsYXIuICBJdCB3b3VsZCBiZQpkaWZm IC0tZ2l0IGEvZ3VpeC9pbXBvcnQvb3BhbS5zY20gYi9ndWl4L2ltcG9ydC9vcGFtLnNjbQpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAuLmYyNTJiZGMzMQotLS0gL2Rldi9udWxs CisrKyBiL2d1aXgvaW1wb3J0L29wYW0uc2NtCkBAIC0wLDAgKzEsMTkzIEBACis7OzsgR05VIEd1 aXggLS0tIEZ1bmN0aW9uYWwgcGFja2FnZSBtYW5hZ2VtZW50IGZvciBHTlUKKzs7OyBDb3B5cmln aHQgwqkgMjAxOCBKdWxpZW4gTGVwaWxsZXIgPGp1bGllbkBsZXBpbGxlci5ldT4KKzs7OworOzs7 IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBHdWl4LgorOzs7Cis7OzsgR05VIEd1aXggaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorOzs7 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5Cis7OzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Cis7OzsgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorOzs7Cis7OzsgR05VIEd1aXggaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Cis7OzsgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOzs7IE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzs7OyBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOzs7Cis7OzsgWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKzs7 OyBhbG9uZyB3aXRoIEdOVSBHdWl4LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9s aWNlbnNlcy8+LgorCisoZGVmaW5lLW1vZHVsZSAoZ3VpeCBpbXBvcnQgb3BhbSkKKyAgIzp1c2Ut bW9kdWxlIChpY2UtOSBtYXRjaCkKKyAgIzp1c2UtbW9kdWxlIChpY2UtOSB2bGlzdCkKKyAgIzp1 c2UtbW9kdWxlICgoaWNlLTkgcmRlbGltKSAjOnNlbGVjdCAocmVhZC1saW5lKSkKKyAgIzp1c2Ut bW9kdWxlIChzcmZpIHNyZmktMSkKKyAgIzp1c2UtbW9kdWxlICh3ZWIgdXJpKQorICAjOnVzZS1t b2R1bGUgKGd1aXggaHR0cC1jbGllbnQpCisgICM6dXNlLW1vZHVsZSAoZ3VpeCB1dGlscykKKyAg Izp1c2UtbW9kdWxlIChndWl4IGltcG9ydCB1dGlscykKKyAgIzp1c2UtbW9kdWxlICgoZ3VpeCBs aWNlbnNlcykgIzpwcmVmaXggbGljZW5zZTopCisgICM6ZXhwb3J0IChvcGFtLT5ndWl4LXBhY2th Z2UpKQorCisoZGVmaW5lIChvcGFtLXVybHMpCisgICJGZXRjaCB0aGUgdXJscy50eHQgZmlsZSBm cm9tIHRoZSBvcGFtIHJlcG9zaXRvcnkgYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YKK1VSTHMgaXQg Y29udGFpbnMuIgorICAobGV0ICgocG9ydCAoaHR0cC1mZXRjaC9jYWNoZWQgKHN0cmluZy0+dXJp ICJodHRwczovL29wYW0ub2NhbWwub3JnL3VybHMudHh0IikpKSkKKyAgICAobGV0IGxvb3AgKChy ZXN1bHQgJygpKSkKKyAgICAgIChsZXQgKChsaW5lIChyZWFkLWxpbmUgcG9ydCkpKQorICAgICAg ICAoaWYgKGVvZi1vYmplY3Q/IGxpbmUpCisgICAgICAgICAgKGJlZ2luCisgICAgICAgICAgICAo Y2xvc2UgcG9ydCkKKyAgICAgICAgICAgIHJlc3VsdCkKKyAgICAgICAgICAobG9vcCAoY29ucyBs aW5lIHJlc3VsdCkpKSkpKSkKKworKGRlZmluZSAodmhhc2gtcmVmIGhhc2h0YWJsZSBrZXkgZGVm YXVsdCkKKyAgKG1hdGNoICh2aGFzaC1hc3NvYyBrZXkgaGFzaHRhYmxlKQorICAgICgjZiBkZWZh dWx0KQorICAgICgoXyAuIHgpIHgpKSkKKworKGRlZmluZSAoaGFzaHRhYmxlLXVwZGF0ZSBoYXNo dGFibGUgbGluZSkKKyAgIlBhcnNlIEB2YXJ7bGluZX0gdG8gZ2V0IHRoZSBuYW1lIGFuZCB2ZXJz aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBhZGRzIHRoZW0KK3RvIHRoZSBoYXNodGFibGUuIgorICAo bGV0KiAoKGxpbmUgKHN0cmluZy1zcGxpdCBsaW5lICNcICkpKQorICAgIChtYXRjaCBsaW5lCisg ICAgICAoKHVybCBmb28gLi4uKQorICAgICAgIChpZiAoZXF1YWw/IHVybCAicmVwbyIpCisgICAg ICAgICBoYXNodGFibGUKKyAgICAgICAgIChtYXRjaCAoc3RyaW5nLXNwbGl0IHVybCAjXC8pCisg ICAgICAgICAgICgodHlwZSBuYW1lMSB2ZXJzaW9uc3RyIGZvbyAuLi4pCisgICAgICAgICAgICAo aWYgKGVxdWFsPyB0eXBlICJwYWNrYWdlcyIpCisgICAgICAgICAgICAgIChtYXRjaCAoc3RyaW5n LXNwbGl0IHZlcnNpb25zdHIgI1wuKQorICAgICAgICAgICAgICAgICgobmFtZTIgdmVyc2lvbnMg Li4uKQorICAgICAgICAgICAgICAgICAobGV0ICgodmVyc2lvbiAoc3RyaW5nLWpvaW4gdmVyc2lv bnMgIi4iKSkpCisgICAgICAgICAgICAgICAgICAgKGlmIChlcXVhbD8gbmFtZTEgbmFtZTIpCisg ICAgICAgICAgICAgICAgICAgICAobGV0ICgoY3VyciAodmhhc2gtcmVmIGhhc2h0YWJsZSBuYW1l MSAnKCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgKHZoYXNoLWNvbnMgbmFtZTEgKGNvbnMg dmVyc2lvbiBjdXJyKSBoYXNodGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxl KSkpCisgICAgICAgICAgICAgICAgKF8gaGFzaHRhYmxlKSkKKyAgICAgICAgICAgICAgaGFzaHRh YmxlKSkKKyAgICAgICAgICAgKF8gaGFzaHRhYmxlKSkpKQorICAgICAgKF8gaGFzaHRhYmxlKSkp KQorCisoZGVmaW5lICh1cmxzLT5oYXNodGFibGUgdXJscykKKyAgIlRyYW5zZm9ybSB1cmxzLnR4 dCBpbiBhIGhhc2h0YWJsZSB3aG9zZSBrZXlzIGFyZSBwYWNrYWdlIG5hbWVzIGFuZCB2YWx1ZXMK K3RoZSBsaXN0IG9mIGF2YWlsYWJsZSB2ZXJzaW9ucy4iCisgIChsZXQgKChoYXNodGFibGUgdmxp c3QtbnVsbCkpCisgICAgKGxldCBsb29wICgodXJscyB1cmxzKSAoaGFzaHRhYmxlIGhhc2h0YWJs ZSkpCisgICAgICAobWF0Y2ggdXJscworICAgICAgICAoKCkgaGFzaHRhYmxlKQorICAgICAgICAo KHVybCByZXN0IC4uLikgKGxvb3AgcmVzdCAoaGFzaHRhYmxlLXVwZGF0ZSBoYXNodGFibGUgdXJs KSkpKSkpKQorCisoZGVmaW5lIChsYXRlc3QtdmVyc2lvbiB2ZXJzaW9ucykKKyAgIkZpbmQgdGhl IG1vc3QgcmVjZW50IHZlcnNpb24gZnJvbSBhIGxpc3Qgb2YgdmVyc2lvbnMuIgorICAobWF0Y2gg dmVyc2lvbnMKKyAgICAoKGZpcnN0IHJlc3QgLi4uKQorICAgICAobGV0IGxvb3AgKCh2ZXJzaW9u cyByZXN0KSAobSBmaXJzdCkpCisgICAgICAgKG1hdGNoIHZlcnNpb25zCisgICAgICAgICAoKCkg bSkKKyAgICAgICAgICgoZmlyc3QgcmVzdCAuLi4pCisgICAgICAgICAgKGxvb3AgcmVzdCAoaWYg KHZlcnNpb24+PyBtIGZpcnN0KSBtIGZpcnN0KSkpKSkpKSkKKworKGRlZmluZSAoZmV0Y2gtcGFj a2FnZS11cmwgdXJpKQorICAiRmV0Y2ggYW5kIHBhcnNlIHRoZSB1cmwgZmlsZS4gIFJldHVybiB0 aGUgVVJMIHRoZSBwYWNrYWdlIGNhbiBiZSBkb3dubG9hZGVkCitmcm9tLiIKKyAgKGxldCAoKHBv cnQgKGh0dHAtZmV0Y2ggdXJpKSkpCisgICAgKGxldCBsb29wICgocmVzdWx0ICNmKSkKKyAgICAg IChsZXQgKChsaW5lIChyZWFkLWxpbmUgcG9ydCkpKQorICAgICAgICAoaWYgKGVvZi1vYmplY3Q/ IGxpbmUpCisgICAgICAgICAgKGJlZ2luCisgICAgICAgICAgICAoY2xvc2UgcG9ydCkKKyAgICAg ICAgICAgIHJlc3VsdCkKKyAgICAgICAgICAobGV0KiAoKGxpbmUgKHN0cmluZy1zcGxpdCBsaW5l ICNcICkpKQorICAgICAgICAgICAgKG1hdGNoIGxpbmUKKyAgICAgICAgICAgICAgKChrZXkgdmFs dWUgcmVzdCAuLi4pCisgICAgICAgICAgICAgICAoaWYgKG1lbWJlciBrZXkgJygiYXJjaGl2ZToi ICJodHRwOiIpKQorICAgICAgICAgICAgICAgICAobG9vcCAoc3RyaW5nLXRyaW0tYm90aCB2YWx1 ZSAjXCIpKQorICAgICAgICAgICAgICAgICAobG9vcCByZXN1bHQpKSkpKSkpKSkpCisKKyhkZWZp bmUgKGZldGNoLXBhY2thZ2UtbWV0YWRhdGEgdXJpKQorICAiRmV0Y2ggYW5kIHBhcnNlIHRoZSBv cGFtIGZpbGUuICBSZXR1cm4gYW4gYXNzb2NpYXRpb24gbGlzdCBjb250YWluaW5nIHRoZQoraG9t ZXBhZ2UsIHRoZSBsaWNlbnNlIGFuZCB0aGUgbGlzdCBvZiBpbnB1dHMuIgorICAobGV0ICgocG9y dCAoaHR0cC1mZXRjaCB1cmkpKSkKKyAgICAobGV0IGxvb3AgKChyZXN1bHQgJygpKSAoZGVwZW5k ZW5jaWVzPyAjZikpCisgICAgICAobGV0ICgobGluZSAocmVhZC1saW5lIHBvcnQpKSkKKyAgICAg ICAgKGlmIChlb2Ytb2JqZWN0PyBsaW5lKQorICAgICAgICAgIChiZWdpbgorICAgICAgICAgICAg KGNsb3NlIHBvcnQpCisgICAgICAgICAgICByZXN1bHQpCisgICAgICAgICAgKGxldCogKChsaW5l IChzdHJpbmctc3BsaXQgbGluZSAjXCApKSkKKyAgICAgICAgICAgIChtYXRjaCBsaW5lCisgICAg ICAgICAgICAgICAoKGtleSB2YWx1ZSAuLi4pCisgICAgICAgICAgICAgICAgKGxldCAoKGRlcGVu ZGVuY2llcz8KKyAgICAgICAgICAgICAgICAgICAgICAgIChpZiBkZXBlbmRlbmNpZXM/CisgICAg ICAgICAgICAgICAgICAgICAgICAgIChub3QgKGVxdWFsPyBrZXkgIl0iKSkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgKGVxdWFsPyBrZXkgImRlcGVuZHM6IikpKQorICAgICAgICAgICAgICAg ICAgICAgICh2YWwgKHN0cmluZy10cmltLWJvdGggKHN0cmluZy1qb2luIHZhbHVlICIiKSAjXCIp KSkKKyAgICAgICAgICAgICAgICAgIChjb25kCisgICAgICAgICAgICAgICAgICAgICgoZXF1YWw/ IGtleSAiaG9tZXBhZ2U6IikKKyAgICAgICAgICAgICAgICAgICAgIChsb29wIChjb25zIGAoImhv bWVwYWdlIiAuICx2YWwpIHJlc3VsdCkgZGVwZW5kZW5jaWVzPykpCisgICAgICAgICAgICAgICAg ICAgICgoZXF1YWw/IGtleSAibGljZW5zZToiKQorICAgICAgICAgICAgICAgICAgICAgKGxvb3Ag KGNvbnMgYCgibGljZW5zZSIgLiAsdmFsKSByZXN1bHQpIGRlcGVuZGVuY2llcz8pKQorICAgICAg ICAgICAgICAgICAgICAoKGFuZCBkZXBlbmRlbmNpZXM/IChub3QgKGVxdWFsPyB2YWwgIlsiKSkp CisgICAgICAgICAgICAgICAgICAgICAobWF0Y2ggKHN0cmluZy1zcGxpdCB2YWwgI1x7KQorICAg ICAgICAgICAgICAgICAgICAgICAoKHZhbCByZXN0IC4uLikKKyAgICAgICAgICAgICAgICAgICAg ICAgIChsZXQgKChjdXJyIChhc3NvYy1yZWYgcmVzdWx0ICJpbnB1dHMiKSkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChuZXcgKHN0cmluZy10cmltLWJvdGgKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB2YWwgKGxpc3QtPmNoYXItc2V0ICcoI1xdICNcWyAjXCIp KSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCAoY29ucyBgKCJpbnB1dHMiIC4g LChjb25zIG5ldyAoaWYgY3VyciBjdXJyICcoKSkpKSByZXN1bHQpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChpZiAoc3RyaW5nLWNvbnRhaW5zIHZhbCAiXSIpICNmIGRlcGVuZGVu Y2llcz8pKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgKGVsc2UgKGxvb3AgcmVzdWx0IGRlcGVu ZGVuY2llcz8pKSkpKSkpKSkpKSkKKworKGRlZmluZSAoc3RyaW5nLT5saWNlbnNlIHN0cikKKyAg KGNvbmQKKyAgICAoKGVxdWFsPyBzdHIgIk1JVCIpICcobGljZW5zZTpleHBhdCkpCisgICAgKChl cXVhbD8gc3RyICJHUEwyIikgJyhsaWNlbnNlOmdwbDIpKQorICAgICgoZXF1YWw/IHN0ciAiTEdQ THYyIikgJyhsaWNlbnNlOmxncGwyKSkKKyAgICAoZWxzZSBgKCkpKSkKKworKGRlZmluZSAob2Nh bWwtbmFtZS0+Z3VpeC1uYW1lIG5hbWUpCisgIChjb25kCisgICAgKChlcXVhbD8gbmFtZSAib2Nh bWxmaW5kIikgIm9jYW1sLWZpbmRsaWIiKQorICAgICgoc3RyaW5nLXByZWZpeD8gIm9jYW1sIiBu YW1lKSBuYW1lKQorICAgICgoc3RyaW5nLXByZWZpeD8gImNvbmYtIiBuYW1lKSAoc3Vic3RyaW5n IG5hbWUgNSkpCisgICAgKGVsc2UgKHN0cmluZy1hcHBlbmQgIm9jYW1sLSIgbmFtZSkpKSkKKwor KGRlZmluZSAoZGVwZW5kZW5jaWVzLT5pbnB1dHMgZGVwZW5kZW5jaWVzKQorICAiVHJhbnNmb3Jt IHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBpbiBhIGxpc3Qgb2YgaW5wdXRzLiIKKyAgKGlmIChu b3QgZGVwZW5kZW5jaWVzKQorICAgICcoKQorICAgIChtYXAgKGxhbWJkYSAoaW5wdXQpCisgICAg ICAgICAgIChsaXN0IGlucHV0IChsaXN0ICd1bnF1b3RlIChzdHJpbmctPnN5bWJvbCBpbnB1dCkp KSkKKyAgICAgICAgIChtYXAgb2NhbWwtbmFtZS0+Z3VpeC1uYW1lIGRlcGVuZGVuY2llcykpKSkK KworKGRlZmluZSAob3BhbS0+Z3VpeC1wYWNrYWdlIG5hbWUpCisgIChsZXQqICgoaGFzaHRhYmxl ICh1cmxzLT5oYXNodGFibGUgKG9wYW0tdXJscykpKQorICAgICAgICAgKHZlcnNpb25zICh2aGFz aC1yZWYgaGFzaHRhYmxlIG5hbWUgI2YpKSkKKyAgICAodW5sZXNzIChlcT8gdmVyc2lvbnMgI2Yp CisgICAgICAobGV0KiAoKHZlcnNpb24gKGxhdGVzdC12ZXJzaW9uIHZlcnNpb25zKSkKKyAgICAg ICAgICAgICAocGFja2FnZS11cmwgKHN0cmluZy1hcHBlbmQgImh0dHBzOi8vb3BhbS5vY2FtbC5v cmcvcGFja2FnZXMvIiBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICIvIiBuYW1lICIuIiB2ZXJzaW9uICIvIikpCisgICAgICAgICAgICAgKHVybC11cmwgKHN0 cmluZy1hcHBlbmQgcGFja2FnZS11cmwgInVybCIpKQorICAgICAgICAgICAgIChvcGFtLXVybCAo c3RyaW5nLWFwcGVuZCBwYWNrYWdlLXVybCAib3BhbSIpKQorICAgICAgICAgICAgIChzb3VyY2Ut dXJsIChmZXRjaC1wYWNrYWdlLXVybCB1cmwtdXJsKSkKKyAgICAgICAgICAgICAobWV0YWRhdGEg KGZldGNoLXBhY2thZ2UtbWV0YWRhdGEgb3BhbS11cmwpKQorICAgICAgICAgICAgIChkZXBlbmRl bmNpZXMgKGFzc29jLXJlZiBtZXRhZGF0YSAiaW5wdXRzIikpCisgICAgICAgICAgICAgKGlucHV0 cyAoZGVwZW5kZW5jaWVzLT5pbnB1dHMgZGVwZW5kZW5jaWVzKSkpCisgICAgICAgIChjYWxsLXdp dGgtdGVtcG9yYXJ5LW91dHB1dC1maWxlCisgICAgICAgICAgKGxhbWJkYSAodGVtcCBwb3J0KQor ICAgICAgICAgICAgKGFuZCAodXJsLWZldGNoIHNvdXJjZS11cmwgdGVtcCkKKyAgICAgICAgICAg ICAgICAgYChwYWNrYWdlCisgICAgICAgICAgICAgICAgICAgIChuYW1lICwob2NhbWwtbmFtZS0+ Z3VpeC1uYW1lIG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiAsdmVyc2lvbikK KyAgICAgICAgICAgICAgICAgICAgKHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgIChvcmln aW4KKyAgICAgICAgICAgICAgICAgICAgICAgIChtZXRob2QgdXJsLWZldGNoKQorICAgICAgICAg ICAgICAgICAgICAgICAgKHVyaSAsc291cmNlLXVybCkKKyAgICAgICAgICAgICAgICAgICAgICAg IChzaGEyNTYgKGJhc2UzMiAsKGd1aXgtaGFzaC11cmwgdGVtcCkpKSkpCisgICAgICAgICAgICAg ICAgICAgIChidWlsZC1zeXN0ZW0gb2NhbWwtYnVpbGQtc3lzdGVtKQorICAgICAgICAgICAgICAg ICAgICAsQChpZiAobnVsbD8gaW5wdXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgJygpCisg ICAgICAgICAgICAgICAgICAgICAgICBgKChpbnB1dHMgLChsaXN0ICdxdWFzaXF1b3RlIGlucHV0 cykpKSkKKyAgICAgICAgICAgICAgICAgICAgKGhvbWUtcGFnZSAsKGFzc29jLXJlZiBtZXRhZGF0 YSAiaG9tZXBhZ2UiKSkKKyAgICAgICAgICAgICAgICAgICAgKHN5bm9wc2lzICIiKQorICAgICAg ICAgICAgICAgICAgICAoZGVzY3JpcHRpb24gIiIpCisgICAgICAgICAgICAgICAgICAgIChsaWNl bnNlICxAKHN0cmluZy0+bGljZW5zZSAoYXNzb2MtcmVmIG1ldGFkYXRhICJsaWNlbnNlIikpKSkp KSkpKSkpCmRpZmYgLS1naXQgYS9ndWl4L3NjcmlwdHMvaW1wb3J0LnNjbSBiL2d1aXgvc2NyaXB0 cy9pbXBvcnQuc2NtCmluZGV4IDY3YmM3YTc1NS4uYmMwMzE3OWU1IDEwMDY0NAotLS0gYS9ndWl4 L3NjcmlwdHMvaW1wb3J0LnNjbQorKysgYi9ndWl4L3NjcmlwdHMvaW1wb3J0LnNjbQpAQCAtNzQs NyArNzQsNyBAQCByYXRoZXIgdGhhbiBcXG4uIgogOzs7CiAKIChkZWZpbmUgaW1wb3J0ZXJzICco ImdudSIgIm5peCIgInB5cGkiICJjcGFuIiAiaGFja2FnZSIgInN0YWNrYWdlIiAiZWxwYSIgImdl bSIKLSAgICAgICAgICAgICAgICAgICAgImNyYW4iICJjcmF0ZSIgInRleGxpdmUiICJqc29uIikp CisgICAgICAgICAgICAgICAgICAgICJjcmFuIiAiY3JhdGUiICJ0ZXhsaXZlIiAianNvbiIgIm9w YW0iKSkKIAogKGRlZmluZSAocmVzb2x2ZS1pbXBvcnRlciBuYW1lKQogICAobGV0ICgobW9kdWxl IChyZXNvbHZlLWludGVyZmFjZQpkaWZmIC0tZ2l0IGEvZ3VpeC9zY3JpcHRzL2ltcG9ydC9vcGFt LnNjbSBiL2d1aXgvc2NyaXB0cy9pbXBvcnQvb3BhbS5zY20KbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwLi5iNTQ5ODc4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9ndWl4L3Njcmlw dHMvaW1wb3J0L29wYW0uc2NtCkBAIC0wLDAgKzEsOTIgQEAKKzs7OyBHTlUgR3VpeCAtLS0gRnVu Y3Rpb25hbCBwYWNrYWdlIG1hbmFnZW1lbnQgZm9yIEdOVQorOzs7IENvcHlyaWdodCDCqSAyMDE4 IEp1bGllbiBMZXBpbGxlciA8anVsaWVuQGxlcGlsbGVyLmV1PgorOzs7Cis7OzsgVGhpcyBmaWxl IGlzIHBhcnQgb2YgR05VIEd1aXguCis7OzsKKzs7OyBHTlUgR3VpeCBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cis7OzsgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK Kzs7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRo ZSBMaWNlbnNlLCBvciAoYXQKKzs7OyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7 OzsKKzs7OyBHTlUgR3VpeCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLCBidXQKKzs7OyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorOzs7IEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7OzsKKzs7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorOzs7IGFsb25nIHdp dGggR05VIEd1aXguICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4u CisKKyhkZWZpbmUtbW9kdWxlIChndWl4IHNjcmlwdHMgaW1wb3J0IG9wYW0pCisgICM6dXNlLW1v ZHVsZSAoZ3VpeCB1aSkKKyAgIzp1c2UtbW9kdWxlIChndWl4IHV0aWxzKQorICAjOnVzZS1tb2R1 bGUgKGd1aXggc2NyaXB0cykKKyAgIzp1c2UtbW9kdWxlIChndWl4IGltcG9ydCBvcGFtKQorICAj OnVzZS1tb2R1bGUgKGd1aXggc2NyaXB0cyBpbXBvcnQpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBz cmZpLTEpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTExKQorICAjOnVzZS1tb2R1bGUgKHNy Zmkgc3JmaS0zNykKKyAgIzp1c2UtbW9kdWxlIChpY2UtOSBtYXRjaCkKKyAgIzp1c2UtbW9kdWxl IChpY2UtOSBmb3JtYXQpCisgICM6ZXhwb3J0IChndWl4LWltcG9ydC1vcGFtKSkKKworDAorOzs7 Cis7OzsgQ29tbWFuZC1saW5lIG9wdGlvbnMuCis7OzsKKworKGRlZmluZSAlZGVmYXVsdC1vcHRp b25zCisgICcoKSkKKworKGRlZmluZSAoc2hvdy1oZWxwKQorICAoZGlzcGxheSAoR18gIlVzYWdl OiBndWl4IGltcG9ydCBvcGFtIFBBQ0tBR0UtTkFNRQorSW1wb3J0IGFuZCBjb252ZXJ0IHRoZSBv cGFtIHBhY2thZ2UgZm9yIFBBQ0tBR0UtTkFNRS5cbiIpKQorICAoZGlzcGxheSAoR18gIgorICAt aCwgLS1oZWxwICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0IikpCisgIChk aXNwbGF5IChHXyAiCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGlu Zm9ybWF0aW9uIGFuZCBleGl0IikpCisgIChuZXdsaW5lKQorICAoc2hvdy1idWctcmVwb3J0LWlu Zm9ybWF0aW9uKSkKKworKGRlZmluZSAlb3B0aW9ucworICA7OyBTcGVjaWZpY2F0aW9uIG9mIHRo ZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKyAgKGNvbnMqIChvcHRpb24gJygjXGggImhlbHAiKSAj ZiAjZgorICAgICAgICAgICAgICAgICAobGFtYmRhIGFyZ3MKKyAgICAgICAgICAgICAgICAgICAo c2hvdy1oZWxwKQorICAgICAgICAgICAgICAgICAgIChleGl0IDApKSkKKyAgICAgICAgIChvcHRp b24gJygjXFYgInZlcnNpb24iKSAjZiAjZgorICAgICAgICAgICAgICAgICAobGFtYmRhIGFyZ3MK KyAgICAgICAgICAgICAgICAgICAoc2hvdy12ZXJzaW9uLWFuZC1leGl0ICJndWl4IGltcG9ydCBv cGFtIikpKQorICAgICAgICAgJXN0YW5kYXJkLWltcG9ydC1vcHRpb25zKSkKKworDAorOzs7Cis7 OzsgRW50cnkgcG9pbnQuCis7OzsKKworKGRlZmluZSAoZ3VpeC1pbXBvcnQtb3BhbSAuIGFyZ3Mp CisgIChkZWZpbmUgKHBhcnNlLW9wdGlvbnMpCisgICAgOzsgUmV0dXJuIHRoZSBhbGlzdCBvZiBv cHRpb24gdmFsdWVzLgorICAgIChhcmdzLWZvbGQqIGFyZ3MgJW9wdGlvbnMKKyAgICAgICAgICAg ICAgICAobGFtYmRhIChvcHQgbmFtZSBhcmcgcmVzdWx0KQorICAgICAgICAgICAgICAgICAgKGxl YXZlIChHXyAifkE6IHVucmVjb2duaXplZCBvcHRpb25+JSIpIG5hbWUpKQorICAgICAgICAgICAg ICAgIChsYW1iZGEgKGFyZyByZXN1bHQpCisgICAgICAgICAgICAgICAgICAoYWxpc3QtY29ucyAn YXJndW1lbnQgYXJnIHJlc3VsdCkpCisgICAgICAgICAgICAgICAgJWRlZmF1bHQtb3B0aW9ucykp CisKKyAgKGxldCogKChvcHRzIChwYXJzZS1vcHRpb25zKSkKKyAgICAgICAgIChhcmdzIChmaWx0 ZXItbWFwIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCdhcmd1 bWVudCAuIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoXyAjZikpCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAocmV2ZXJzZSBvcHRzKSkpKQorICAgIChtYXRjaCBhcmdzCisgICAgICAoKHBhY2thZ2UtbmFt ZSkKKyAgICAgICAobGV0ICgoc2V4cCAob3BhbS0+Z3VpeC1wYWNrYWdlIHBhY2thZ2UtbmFtZSkp KQorICAgICAgICAgKHVubGVzcyBzZXhwCisgICAgICAgICAgIChsZWF2ZSAoR18gImZhaWxlZCB0 byBkb3dubG9hZCBtZXRhLWRhdGEgZm9yIHBhY2thZ2UgJ35hJ34lIikKKyAgICAgICAgICAgICAg ICAgIHBhY2thZ2UtbmFtZSkpCisgICAgICAgICBzZXhwKSkKKyAgICAgICgoKQorICAgICAgIChs ZWF2ZSAoR18gInRvbyBmZXcgYXJndW1lbnRzfiUiKSkpCisgICAgICAoKG1hbnkgLi4uKQorICAg ICAgIChsZWF2ZSAoR18gInRvbyBtYW55IGFyZ3VtZW50c34lIikpKSkpKQpkaWZmIC0tZ2l0IGEv dGVzdHMvb3BhbS5zY20gYi90ZXN0cy9vcGFtLnNjbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAuLjI2ODMyMTc0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29wYW0uc2Nt CkBAIC0wLDAgKzEsMTE4IEBACis7OzsgR05VIEd1aXggLS0tIEZ1bmN0aW9uYWwgcGFja2FnZSBt YW5hZ2VtZW50IGZvciBHTlUKKzs7OyBDb3B5cmlnaHQgwqkgMjAxOCBKdWxpZW4gTGVwaWxsZXIg PGp1bGllbkBsZXBpbGxlci5ldT4KKzs7OworOzs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBH dWl4LgorOzs7Cis7OzsgR05VIEd1aXggaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorOzs7IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7OzsgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0 Cis7OzsgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOzs7Cis7OzsgR05VIEd1aXgg aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Cis7 OzsgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgorOzs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUKKzs7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorOzs7Cis7OzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKzs7OyBhbG9uZyB3aXRoIEdOVSBHdWl4LiAgSWYg bm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisoZGVmaW5lLW1vZHVs ZSAodGVzdC1vcGFtKQorICAjOnVzZS1tb2R1bGUgKGd1aXggaW1wb3J0IG9wYW0pCisgICM6dXNl LW1vZHVsZSAoZ3VpeCBiYXNlMzIpCisgICM6dXNlLW1vZHVsZSAoZ3VpeCBoYXNoKQorICAjOnVz ZS1tb2R1bGUgKGd1aXggdGVzdHMpCisgICM6dXNlLW1vZHVsZSAoKGd1aXggYnVpbGQgdXRpbHMp ICM6c2VsZWN0IChkZWxldGUtZmlsZS1yZWN1cnNpdmVseSBta2Rpci1wIHdoaWNoKSkKKyAgIzp1 c2UtbW9kdWxlIChzcmZpIHNyZmktNjQpCisgICM6dXNlLW1vZHVsZSAod2ViIHVyaSkKKyAgIzp1 c2UtbW9kdWxlIChpY2UtOSBtYXRjaCkpCisKKyhkZWZpbmUgdGVzdC11cmwtZmlsZQorICAiaHR0 cDogXCJodHRwczovL2V4YW1wbGUub3JnL2Zvby0xLjAuMC50YXIuZ3pcIgorY2hlY2tzdW06IFwi YWM4OTIwZjM5YTgxMDBiOTQ4MjA2NTliYzJjMjA4MTdcIiIpCisKKyhkZWZpbmUgdGVzdC1zb3Vy Y2UtaGFzaAorICAiIikKKworKGRlZmluZSB0ZXN0LXVybHMKKyAgInJlcG8gYWM4OTIwZjM5YTgx MDBiOTQ4MjA2NTliYzJjMjA4MTcgMG82NDQKK3BhY2thZ2VzL2Zvby9mb28uMS4wLjAvdXJsIGFj ODkyMGYzOWE4MTAwYjk0ODIwNjU5YmMyYzIwODE3IDBvNjQ0CitwYWNrYWdlcy9mb28vZm9vLjEu MC4wL29wYW0gYWM4OTIwZjM5YTgxMDBiOTQ4MjA2NTliYzJjMjA4MTcgMG82NDQKK3BhY2thZ2Vz L2Zvby9mb28uMS4wLjAvZGVzY3IgYWM4OTIwZjM5YTgxMDBiOTQ4MjA2NTliYzJjMjA4MTcgMG82 NDQiKQorCisoZGVmaW5lIHRlc3Qtb3BhbS1maWxlCisib3BhbS12ZXJzaW9uOiAxLjIKK21haW50 YWluZXI6IFwiQWxpY2UgRG9lXCIKK2F1dGhvcnM6IFwiQWxpY2UgRG9lLCBKb2huIERvZVwiCito b21lcGFnZTogXCJodHRwczovL2V4YW1wbGUub3JnL1wiCitidWctcmVwb3J0czogXCJodHRwczov L2V4YW1wbGUub3JnL2J1Z3NcIgorbGljZW5zZTogXCJNSVRcIgorZGV2LXJlcG86IFwiaHR0cHM6 Ly9leGFtcGxlLm9yZy9naXRcIgorYnVpbGQ6IFsKKyAgXCJvY2FtbFwiIFwicGtnL3BrZy5tbFwi IFwiYnVpbGRcIiBcIi0tcGlubmVkXCIgXCIle3Bpbm5lZH0lXCIKK10KK2J1aWxkLXRlc3Q6IFsK KyAgXCJvY2FtbFwiIFwicGtnL3BrZy5tbFwiIFwiYnVpbGRcIiBcIi0tcGlubmVkXCIgXCIle3Bp bm5lZH0lXCIgXCItLXRlc3RzXCIgXCJ0cnVlXCIKK10KK2RlcGVuZHM6IFsKKyAgXCJhbGNvdGVz dFwiIHt0ZXN0ICYgPj0gXCIwLjcuMlwifQorICBcIm9jYW1sYnVpbGRcIiB7YnVpbGQgJiA+PSBc IjAuOS4yXCJ9CitdIikKKworKHRlc3QtYmVnaW4gIm9wYW0iKQorCisodGVzdC1hc3NlcnQgIm9w YW0tPmd1aXgtcGFja2FnZSIKKyAgOzsgUmVwbGFjZSBuZXR3b3JrIHJlc291cmNlcyB3aXRoIHNh bXBsZSBkYXRhLgorICAgIChtb2NrICgoZ3VpeCBpbXBvcnQgdXRpbHMpIHVybC1mZXRjaAorICAg ICAgICAgICAobGFtYmRhICh1cmwgZmlsZS1uYW1lKQorICAgICAgICAgICAgIChtYXRjaCB1cmwK KyAgICAgICAgICAgICAgICgiaHR0cHM6Ly9leGFtcGxlLm9yZy9mb28tMS4wLjAudGFyLmd6Igor ICAgICAgICAgICAgICAgIChiZWdpbgorICAgICAgICAgICAgICAgICAgKG1rZGlyLXAgImZvby0x LjAuMCIpCisgICAgICAgICAgICAgICAgICAoc3lzdGVtKiAidGFyIiAiY3p2ZiIgZmlsZS1uYW1l ICJmb28tMS4wLjAvIikKKyAgICAgICAgICAgICAgICAgIChkZWxldGUtZmlsZS1yZWN1cnNpdmVs eSAiZm9vLTEuMC4wIikKKyAgICAgICAgICAgICAgICAgIChzZXQhIHRlc3Qtc291cmNlLWhhc2gK KyAgICAgICAgICAgICAgICAgICAgKGNhbGwtd2l0aC1pbnB1dC1maWxlIGZpbGUtbmFtZSBwb3J0 LXNoYTI1NikpKSkKKyAgICAgICAgICAgICAgIChfIChlcnJvciAiVW5leHBlY3RlZCBVUkw6ICIg dXJsKSkpKSkKKyAgICAgICAgICAobW9jayAoKGd1aXggaHR0cC1jbGllbnQpIGh0dHAtZmV0Y2gv Y2FjaGVkCisgICAgICAgICAgICAgICAgIChsYW1iZGEgKHVybCAuIHJlc3QpCisgICAgICAgICAg ICAgICAgICAgKG1hdGNoICh1cmktPnN0cmluZyB1cmwpCisgICAgICAgICAgICAgICAgICAgICAo Imh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvdXJscy50eHQiCisgICAgICAgICAgICAgICAgICAgICAg KHZhbHVlcyAob3Blbi1pbnB1dC1zdHJpbmcgdGVzdC11cmxzKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKHN0cmluZy1sZW5ndGggdGVzdC11cmxzKSkpCisgICAgICAgICAgICAgICAg ICAgICAoXyAoZXJyb3IgIlVuZXhwZWN0ZWQgVVJMOiAiIHVybCkpKSkpCisgICAgICAgICAgICAg ICAgKG1vY2sgKChndWl4IGh0dHAtY2xpZW50KSBodHRwLWZldGNoCisgICAgICAgICAgICAgICAg ICAgICAgIChsYW1iZGEgKHVybCAuIHJlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1h dGNoIHVybAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJodHRwczovL29wYW0ub2NhbWwu b3JnL3BhY2thZ2VzL2Zvby9mb28uMS4wLjAvdXJsIgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICh2YWx1ZXMgKG9wZW4taW5wdXQtc3RyaW5nIHRlc3QtdXJsLWZpbGUpCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWxlbmd0aCB0ZXN0LXVybC1maWxlKSkp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoImh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvcGFj a2FnZXMvZm9vL2Zvby4xLjAuMC9vcGFtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2 YWx1ZXMgKG9wZW4taW5wdXQtc3RyaW5nIHRlc3Qtb3BhbS1maWxlKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1sZW5ndGggdGVzdC1vcGFtLWZpbGUpKSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgIChfIChlcnJvciAiVW5leHBlY3RlZCBVUkw6ICIgdXJs KSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAobWF0Y2ggKG9wYW0tPmd1aXgtcGFja2FnZSAi Zm9vIikKKyAgICAgICAgICAgICAgICAgICAgICAgICgoJ3BhY2thZ2UKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICgnbmFtZSAib2NhbWwtZm9vIikKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICgndmVyc2lvbiAiMS4wLjAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdzb3Vy Y2UgKCdvcmlnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdtZXRo b2QgJ3VybC1mZXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd1 cmkgImh0dHBzOi8vZXhhbXBsZS5vcmcvZm9vLTEuMC4wLnRhci5neiIpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICgnc2hhMjU2CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICg/IHN0cmluZz8gaGFzaCkpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAoJ2J1aWxkLXN5c3RlbSAnb2NhbWwtYnVpbGQtc3lzdGVtKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgKCdpbnB1dHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3F1YXNpcXVv dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgib2NhbWxidWlsZCIgKCd1bnF1b3Rl ICdvY2FtbGJ1aWxkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgib2NhbWwtYWxj b3Rlc3QiICgndW5xdW90ZSAnb2NhbWwtYWxjb3Rlc3QpKSkpKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgKCdob21lLXBhZ2UgImh0dHBzOi8vZXhhbXBsZS5vcmcvIikKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICgnc3lub3BzaXMgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAoJ2Rlc2NyaXB0aW9uICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdsaWNlbnNl ICdsaWNlbnNlOmV4cGF0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nPT8gKGJ5 dGV2ZWN0b3ItPm5peC1iYXNlMzItc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB0ZXN0LXNvdXJjZS1oYXNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBoYXNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICh4CisgICAgICAgICAgICAgICAg ICAgICAgICAgKHBrICdmYWlsIHggI2YpKSkpKSkpCisKKyh0ZXN0LWVuZCAib3BhbSIpCi0tIAoy LjE4LjAKCg== --=_bc7298499576b2f110ec057703550b90-- From debbugs-submit-bounces@debbugs.gnu.org Mon Jul 09 08:44:33 2018 Received: (at 31736) by debbugs.gnu.org; 9 Jul 2018 12:44:33 +0000 Received: from localhost ([127.0.0.1]:51818 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fcVWq-00037T-QO for submit@debbugs.gnu.org; Mon, 09 Jul 2018 08:44:33 -0400 Received: from eggs.gnu.org ([208.118.235.92]:37426) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fcVWo-00037F-GQ for 31736@debbugs.gnu.org; Mon, 09 Jul 2018 08:44:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fcVWg-0005iI-CK for 31736@debbugs.gnu.org; Mon, 09 Jul 2018 08:44:25 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:53839) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fcVWg-0005iD-7Y; Mon, 09 Jul 2018 08:44:22 -0400 Received: from [193.50.110.150] (port=58598 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1fcVWf-0002Ca-Qa; Mon, 09 Jul 2018 08:44:22 -0400 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Julien Lepiller Subject: Re: [bug#31736] [PATCH] Add an opam importer References: <20180606192329.255ade5e@lepiller.eu> <20180606193740.44bef2ea@lepiller.eu> <871sdecow5.fsf@gnu.org> <84c7511b174300afe05f4a2f7ca8bad6@lepiller.eu> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 21 Messidor an 226 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, 09 Jul 2018 14:44:20 +0200 In-Reply-To: <84c7511b174300afe05f4a2f7ca8bad6@lepiller.eu> (Julien Lepiller's message of "Sat, 07 Jul 2018 23:56:08 +0200") Message-ID: <874lh8h93v.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (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-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 31736 Cc: 31736@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: -6.0 (------) Hello Julien, Julien Lepiller skribis: > Here is a new version. What do you think? I think it looks great. :-) > From b3fd75a804a4264cb083584591a3e589886d96c8 Mon Sep 17 00:00:00 2001 > From: Julien Lepiller > Date: Wed, 6 Jun 2018 19:14:39 +0200 > Subject: [PATCH] guix: Add opam importer. > > * guix/scripts/import.scm (importers): Add opam. > * guix/scripts/import/opam.scm: New file. > * guix/import/opam.scm: New file. > * tests/opam.scm: New file. > * Makefile.am: Add them. > * doc/guix.texi (Invoking guix import): Document it. [...] > +@item opam > +@cindex opam > +@cindex ocaml > +Import metadata from the @uref{https://opam.ocaml.org/, Opam} package > +repository used by the OCaml community. Nitpick: the proper spelling is =E2=80=9COPAM=E2=80=9D and =E2=80=9COCaml= =E2=80=9D, so I think you need to fix these above (in the concept index as well.) Otherwise LGTM! As a next step, you can add an OPAM updater, which will hopefully take you no more than a few lines of code (see the bottom of cpam.scm, for example.) :-) Thank you! Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Tue Jul 10 07:48:07 2018 Received: (at 31736-done) by debbugs.gnu.org; 10 Jul 2018 11:48:07 +0000 Received: from localhost ([127.0.0.1]:53094 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fcr7m-00059N-O6 for submit@debbugs.gnu.org; Tue, 10 Jul 2018 07:48:07 -0400 Received: from lepiller.eu ([89.234.186.109]:37724) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fcr7k-00059D-UU for 31736-done@debbugs.gnu.org; Tue, 10 Jul 2018 07:48:05 -0400 Received: from localhost (2001:660:4701:6001:29ab:4c37:b90b:1fb4 [IPv6:2001:660:4701:6001:29ab:4c37:b90b:1fb4]) by lepiller.eu (OpenSMTPD) with ESMTPSA id b22ed3b4 (TLSv1.2:ECDHE-RSA-CHACHA20-POLY1305:256:NO) for <31736-done@debbugs.gnu.org>; Tue, 10 Jul 2018 11:48:52 +0000 (UTC) Date: Tue, 10 Jul 2018 13:47:58 +0200 From: Julien Lepiller To: 31736-done@debbugs.gnu.org Subject: Re: [bug#31736] [PATCH] Add an opam importer Message-ID: <20180710134758.5daf1ebc@lepiller.eu> In-Reply-To: <874lh8h93v.fsf@gnu.org> References: <20180606192329.255ade5e@lepiller.eu> <20180606193740.44bef2ea@lepiller.eu> <871sdecow5.fsf@gnu.org> <84c7511b174300afe05f4a2f7ca8bad6@lepiller.eu> <874lh8h93v.fsf@gnu.org> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-unknown-linux-gnu) 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: 31736-done 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 (-) Le Mon, 09 Jul 2018 14:44:20 +0200, ludo@gnu.org (Ludovic Court=C3=A8s) a =C3=A9crit : > Hello Julien, >=20 > Julien Lepiller skribis: >=20 > > Here is a new version. What do you think? =20 >=20 > I think it looks great. :-) >=20 > > From b3fd75a804a4264cb083584591a3e589886d96c8 Mon Sep 17 00:00:00 > > 2001 From: Julien Lepiller > > Date: Wed, 6 Jun 2018 19:14:39 +0200 > > Subject: [PATCH] guix: Add opam importer. > > > > * guix/scripts/import.scm (importers): Add opam. > > * guix/scripts/import/opam.scm: New file. > > * guix/import/opam.scm: New file. > > * tests/opam.scm: New file. > > * Makefile.am: Add them. > > * doc/guix.texi (Invoking guix import): Document it. =20 >=20 > [...] >=20 > > +@item opam > > +@cindex opam > > +@cindex ocaml > > +Import metadata from the @uref{https://opam.ocaml.org/, Opam} > > package +repository used by the OCaml community. =20 >=20 > Nitpick: the proper spelling is =E2=80=9COPAM=E2=80=9D and =E2=80=9COCaml= =E2=80=9D, so I think you > need to fix these above (in the concept index as well.) >=20 > Otherwise LGTM! >=20 > As a next step, you can add an OPAM updater, which will hopefully take > you no more than a few lines of code (see the bottom of cpam.scm, for > example.) >=20 > :-) >=20 > Thank you! >=20 > Ludo=E2=80=99. Pushed as b24443bff9f9f3f36353eea2ef35e6dc3745a417 From unknown Sun Jun 22 17:18:34 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Wed, 08 Aug 2018 11:24:06 +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