From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1 ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id sEhbGifCNGHqBgEAgWs5BA (envelope-from ) for ; Sun, 05 Sep 2021 15:12:07 +0200 Received: from aspmx1.migadu.com ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1 with LMTPS id 2CEsFifCNGEBVAAAbx9fmQ (envelope-from ) for ; Sun, 05 Sep 2021 13:12:07 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 245DA2331E for ; Sun, 5 Sep 2021 15:12:07 +0200 (CEST) Received: from localhost ([::1]:39558 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMrwM-0002Qq-AZ for larch@yhetil.org; Sun, 05 Sep 2021 09:12:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39152) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMrwI-0002Qh-KV for guix-patches@gnu.org; Sun, 05 Sep 2021 09:12:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:37883) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mMrwI-0000Xy-9p for guix-patches@gnu.org; Sun, 05 Sep 2021 09:12:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mMrwI-0000j2-58 for guix-patches@gnu.org; Sun, 05 Sep 2021 09:12:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#50359] [PATCH] import: Add 'generic-git' updater. Resent-From: Xinglu Chen Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 05 Sep 2021 13:12:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 50359 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Sarah Morgensen Cc: 50359@debbugs.gnu.org Received: via spool by 50359-submit@debbugs.gnu.org id=B50359.16308474922751 (code B ref 50359); Sun, 05 Sep 2021 13:12:02 +0000 Received: (at 50359) by debbugs.gnu.org; 5 Sep 2021 13:11:32 +0000 Received: from localhost ([127.0.0.1]:49429 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mMrvm-0000hQ-VS for submit@debbugs.gnu.org; Sun, 05 Sep 2021 09:11:32 -0400 Received: from h87-96-130-155.cust.a3fiber.se ([87.96.130.155]:37500 helo=mail.yoctocell.xyz) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mMrvk-0000h8-4q for 50359@debbugs.gnu.org; Sun, 05 Sep 2021 09:11:30 -0400 From: Xinglu Chen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yoctocell.xyz; s=mail; t=1630847480; bh=symRydbRMAn9xIMs0ijSQ604qu2+5ZzJH8i12xOxy80=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=OExsn8Dfdto3EQ8A6pj+ET1SXwFNisN2wE0oHoxKzKMS3bzhC2e4Llu6C6J7+S7aY HIIQUuQsIF0r1RhfdGVP99bwJBdDUo7TCRHSRCHD69qaNrXkhGY9vpvi8UREGTU5f3 3Q3ogLDRRVn8stXY5FTbeBVckGsQ6PE7trg9My3k= In-Reply-To: <86k0jvkh5v.fsf@mgsn.dev> References: <86k0jvkh5v.fsf@mgsn.dev> Date: Sun, 05 Sep 2021 15:11:18 +0200 Message-ID: <87eea3416x.fsf@yoctocell.xyz> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: -4.00 Authentication-Results: aspmx1.migadu.com; none X-Migadu-Queue-Id: 245DA2331E X-Spam-Score: -4.00 X-Migadu-Scanner: scn1.migadu.com X-TUID: 3sigKVcN5ExB --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Some more comments after some testing On Sat, Sep 04 2021, Sarah Morgensen wrote: > Hello, > > Thanks for the patch! Glad to see this idea becoming more polished. > > Xinglu Chen writes: > >> * guix/import/git.scm: New file. >> * doc/guix.texi (Invoking guix refresh): Document it. >> * Makefile.am (MODULES): Register it. >> --- >> This patch adds a new =E2=80=98generic-git=E2=80=99 updater which can ch= eck for new tags >> for package hosted on Git repos. However, it cannot download Git repos >> and update the package definitions, i.e. =E2=80=98guix refresh -u=E2=80= =99. There is a >> pending patch that would add this feature though[1]. >> >> =E2=80=98guix refresh -L=E2=80=99 now reports >> >> Available updaters: >> [=E2=80=A6] >> 94.5% of the packages are covered by these updaters. >> >> We are getting close to 100% :-) > > Wow, that is close! > >> >> See it in action! >> >> $ ./pre-inst-env guix refresh harmonist scdoc gmnisrv >> gnu/packages/web.scm:7931:4: warning: no tags were found for package `gm= nisrv' >> gnu/packages/web.scm:7931:4: warning: 'generic-git' updater failed to de= termine available releases for gmnisrv >> gnu/packages/man.scm:339:12: scdoc would be upgraded from 1.10.1 to 1.11= .1 >> gnu/packages/games.scm:9433:2: warning: failed to fetch Git repository f= or package `harmonist' >> gnu/packages/games.scm:9433:2: warning: 'generic-git' updater failed to = determine available releases for harmonist > > FWIW, harmonist and a few other packages fail to work because they use > an old git protocol which is not supported by libgit2. > > [...] >> + >> +@itemize >> +@item @code{tag-prefix}: a regular expression for matching a prefix of >> +the tag name. >> + >> +@item @code{tag-suffix}: a regular expression for matching a suffix of >> +the tag name. >> + >> +@item @code{tag-version-delimiter}: a string used as the delimiter in >> +the tag name for separating the numbers of the version. >> +@end itemize >> + >> +@lisp >> +(package >> + (name "foo") >> + ;; ... >> + (properties >> + '((tag-prefix . "^release0-") >> + (tag-suffix . "[a-z]?$") >> + (tag-version-delimiter . ":")))) >> +@end lisp > ^ extra whitespace > > I do like the selection of (prefix, suffix, delimiter), though I think > there are only one or two packages which use a different delimiter. > > [...] >> +;;; Errors & warnings >> + >> +(define-condition-type &git-tag-error &error >> + git-tag-error? >> + (kind git-tag-error-kind)) >> + >> +(define (git-tag-error kind) >> + (raise (condition (&message (message (format "bad `~a' property"))) >> + (&git-tag-error >> + (kind kind))))) > > When I trigger this error, I get: > --8<---------------cut here---------------start------------->8--- > In ice-9/exceptions.scm: > 406:15 6 (latest-git-release _) > In ice-9/boot-9.scm: > 1752:10 5 (with-exception-handler _ _ #:unwind? _ # _) > In guix/import/git.scm: > 59:39 4 (get-version _ _ #:prefix _ #:suffix _ #:delim _) > In unknown file: > 3 (simple-format #f "bad `~a' property") > In ice-9/boot-9.scm: > 1685:16 2 (raise-exception _ #:continuable? _) > 1683:16 1 (raise-exception _ #:continuable? _) > 1685:16 0 (raise-exception _ #:continuable? _) > > ice-9/boot-9.scm:1685:16: In procedure raise-exception: > In procedure simple-format: FORMAT: Missing argument for ~a > --8<---------------cut here---------------end--------------->8--- > >> + >> +(define (git-tag-warning package c) >> + (warning (package-location package) >> + (G_ "~a for package `~a'~%") >> + (condition-message c) >> + (package-name package))) >> + >> +(define-condition-type &git-no-tags-error &error >> + git-no-tags-error?) >> + >> +(define (git-no-tags-error) >> + (raise (condition (&message (message "no tags were found")) >> + (&git-no-tags-error)))) >> + >> +(define (git-no-tags-warning package c) >> + (warning (package-location package) >> + (G_ "~a for package `~a'~%") >> + (condition-message c) >> + (package-name package))) >> + >> +(define (git-fetch-warning package) >> + (warning (package-location package) >> + (G_ "failed to fetch Git repository for package `~a'~%") >> + (package-name package))) >> + >> + >> +;;; Helper functions >> + >> +(define (string-split* str delim) >> + "Like `string-split', but DELIM is a string instead of a >> +char-set." >> + (filter (lambda (str) (not (equal? str ""))) >> + (string-split str (string->char-set delim)))) > > (string-split* "1:2.3" ":.") -> ("1" "2" "3") > (string-split* "1a2b3" "ab") -> ("1" "2" "3") > > Is this what you intended? The documentation above makes it sound like > the whole string serves as the delimiter. > >> + >> +(define* (get-version package tag #:key prefix suffix delim) > > PACKAGE is not used by this procedure. > >> + (define delim* (if delim delim ".")) >> + (define prefix-regexp "^[^0-9]*") >> + (define suffix-regexp (string-append "[^0-9" (regexp-quote delim*) "]= *$")) > > With a delimiter of '.', this would say the suffix of '1.2.3.prerelease' > is 'prerelease', not '.prerelease'. Is this correct? (I would be > tempted to just remove delim* from this.) > >> + (define delim-regexp (string-append "^[0-9]+" (regexp-quote delim*) "= [0-9]+")) > > This fails to account for versions which use non-numerics, such as (all > taken from the package-version field of packages using git-fetch and > which use this version as the tag): > > 1.0.0-beta.0 > 0.0.9.4f > 4.4-git.1 > 5.2.0-alpha > 0.2.0-alpha-199-g3e7a475 > 20200701.154658.b0d6223 > 12-068oasis4 > 4.0.0.dev8 > 0.32-14-gcdfe14e > 2.8-fix-2 > > There are about 50-60 packages like this. > > I'm not sure how much effort should be spent including them, and for > some of them I'm not sure what our ideal behavior *is*. Even if we > could reliably detect them, should "alpha" or "dev" packages be returned > by the updater? > > Upon investigation, there is a deeper problem: version-compare thinks > "5.2.0" is a lower version than "5.2.0-alpha", and that "4.0.0" is lower > than "4.0.0.dev8". > > scheme@(guile-user)> (version-compare "5.1.9" "5.2.0") > $5 =3D < > scheme@(guile-user)> (version-compare "5.2.0" "5.2.0-alpha") > $6 =3D < > scheme@(guile-user)> (version-compare "4.0.0" "4.0.0.dev8") > $7 =3D < > >> + >> + (define no-prefix >> + (let ((match (string-match (or prefix prefix-regexp) tag))) >> + (if match >> + (regexp-substitute #f match 'post) >> + (git-tag-error 'tag-prefix)))) >> + >> + (define no-suffix >> + (let ((match (string-match (or suffix suffix-regexp) no-prefix))) >> + (if match >> + (regexp-substitute #f match 'pre) >> + (git-tag-error 'tag-suffix)))) >> + >> + (define no-delims >> + (if (string-match delim-regexp no-suffix) >> + (string-split* no-suffix delim*) >> + (git-tag-error 'tag-version-delimiter))) > > This throws an error if the version doesn't have any delimiter. > > Actually, it throws an error in a lot of other cases too, often saying > the 'tag-version-delimiter is wrong when it's something else. Consider > the tags from the "openjpeg" package, sorted by 'sort-tags': > > arelease > opj0-97 > start > v2.1.1 > v2.1.2 > v2.2.0 > v2.3.0 > v2.3.1 > v2.4.0 > version.1.0 > version.1.1 > version.1.2 > version.1.3 > version.1.4 > version.1.5 > version.1.5.1 > version.1.5.2 > version.2.0 > version.2.0.1 > version.2.1 > wg1n6848 > > At first, 'get-version' throws an error because "wg1n6848" doesn't have > a delimiter. But even disregarding that, it would return "version.2.1" > -> "2.1" as the latest version. > > Probably we should process all tags with 'get-version' (simply skipping > any that don't parse) and use that to sort the tags. If none parse with > 'get-version' we could use the "no tags" error or have a separate error > for "there were tags but we couldn't process them". > > And this lets us just do something like (untested): > > (define* (get-version tag #:key prefix suffix delim) > (define delim-rx (regexp-quote (or delim "."))) > (define prefix-rx (or prefix "[^[:digit:]]*")) > (define suffix-rx (or suffix ".*")) > (define version-char-rx > (string-append "[^" delim-rx "[:punct:]]")) > > (define tag-rx > (string-append "^" prefix "(" version-char-rx "+(" > delim-rx version-char-rx ")*)" suffix-rx "$")) This wouldn=E2=80=99t match anything if the version is just a plain number, e.g., 1 or 09. > > (and=3D> (string-match tag-rx tag) > (cut match-substring <> 1))) With this, something like =E2=80=9C1.4.0rc1-450-g2725ef99d=E2=80=9D will re= sult in =E2=80=9C1.4.0=E2=80=9D being returned, which is incorrect. Changing (cut match:substring <> 1) to just =E2=80=98match:substring=E2=80=99 would solve= the issue, but then pre-release tags, which we usually don=E2=80=99t want, would also= get matched. Not sure what the best option would be in this case. > Though at this point, 'tag-rx' should probably be constructed and > compiled outside the loop. > >> + >> + (string-join no-delims ".")) >> + >> +(define (sort-tags tags) >> + "Sort TAGS, a list if Git tags, such that the latest tag is the last = element." >> + (sort tags (lambda (a b) >> + (eq? (version-compare a b) '<)))) >> + >> + >> +;;; Updater >> + >> +(define (get-remote url git-uri) >> + "Given a URL and GIT-URI, a record, return the ``orig= in'' remote." >> + (let* ((checkout (update-cached-checkout url >> + #:recursive? >> + (git-reference-recursive? gi= t-uri))) >> + (repository (repository-open checkout))) >> + (remote-lookup repository "origin"))) > > We surely don't want 'update-cached-checkout' since that fetches the > whole repo history! I've attached a patch below (based on top of this > one) which brings the total time-per-package to under 1s. I moved it to > (guix git) to make use of 'with-libgit2' which ensures we use system > certificates. > > Apologies for such a long reply. I hope it was helpful :) > > -- > Sarah > > From 0b0973034711e15b52702c0aec0c653dfd41928c Mon Sep 17 00:00:00 2001 > Message-Id: <0b0973034711e15b52702c0aec0c653dfd41928c.1630800771.git.iska= rian@mgsn.dev> > From: Sarah Morgensen > Date: Fri, 3 Sep 2021 22:40:02 -0700 > Subject: [PATCH] git: Add 'ls-remote-refs'. > > --- > guix/git.scm | 33 +++++++++++++++++++++++++++++++ > guix/import/git.scm | 47 ++++++++++----------------------------------- > 2 files changed, 43 insertions(+), 37 deletions(-) > > diff --git a/guix/git.scm b/guix/git.scm > index 9c6f326c36..b784fd6d20 100644 > --- a/guix/git.scm > +++ b/guix/git.scm > @@ -56,6 +56,8 @@ > commit-difference > commit-relation >=20=20 > + ls-remote-refs > + > git-checkout > git-checkout? > git-checkout-url > @@ -556,6 +558,37 @@ objects: 'ancestor (meaning that OLD is an ancestor = of NEW), 'descendant, or > (if (set-contains? oldest new) > 'descendant > 'unrelated)))))) > + > +;; > +;;; Remote operations. > +;;; > + > +(define* (ls-remote-refs url #:key tags?) > + "Return the list of references advertised at Git repository URL. If T= AGS? > +is true, limit to only refs/tags." > + (define (ref? ref) > + ;; Like `git ls-remote --refs', only show actual references. > + (and (string-prefix? "refs/" ref) > + (not (string-suffix? "^{}" ref)))) > + > + (define (tag? ref) > + (string-prefix? "refs/tags/" ref)) > + > + (define (include? ref) > + (and ref? > + (or (not tags?) (tag? ref)))) > + > + (with-libgit2 > + (with-temporary-directory > + (lambda (cache-directory) > + (let* ((repository (repository-init cache-directory)) > + ;; Create an in-memory remote so we don't touch disk. > + (remote (remote-create-anonymous repository url))) > + (remote-connect remote) > + (remote-disconnect remote) > + (repository-close! repository) > + > + (filter include? (map remote-head-name (remote-ls remote)))))))) > For some reason it seems to include refs that do and don=E2=80=99t end with =E2=80=9C^{}=E2=80=9D =2D-8<---------------cut here---------------start------------->8--- scheme@(guile-user)> (ls-remote-refs "https://github.com/clementine-player/= Clementine" #:tags? #t) $6 =3D ("refs/tags/0.1" "refs/tags/0.1^{}" "refs/tags/0.2" "refs/tags/0.2^{= }" "refs/tags/0.3" "refs/tags/0.3^{}" "refs/tags/0.3.1" "refs/tags/0.3.1^{}= " "refs/tags/0.3.2" "refs/tags/0.3.2^{}" "refs/tags/0.3rc1" "refs/tags/0.3r= c1^{}" "refs/tags/0.4" "refs/tags/0.4^{}" "refs/tags/0.4.1" "refs/tags/0.4.= 1^{}" "refs/tags/0.4.2" "refs/tags/0.4.2^{}" "refs/tags/0.4rc1" "refs/tags/= 0.4rc1^{}" "refs/tags/0.5" "refs/tags/0.5^{}" "refs/tags/0.5.1" "refs/tags/= 0.5.1^{}" "refs/tags/0.5.2" "refs/tags/0.5.2^{}" "refs/tags/0.5.3" "refs/ta= gs/0.5.3^{}" "refs/tags/0.5rc1" "refs/tags/0.5rc1^{}" "refs/tags/0.6" "refs= /tags/0.6^{}" "refs/tags/0.6rc1" "refs/tags/0.6rc1^{}" "refs/tags/0.7" "ref= s/tags/0.7^{}" "refs/tags/0.7.1" "refs/tags/0.7.1^{}" "refs/tags/0.7.2" "re= fs/tags/0.7.2^{}" "refs/tags/0.7.3" "refs/tags/0.7.3^{}" "refs/tags/0.7rc1"= "refs/tags/0.7rc1^{}" "refs/tags/1.0" "refs/tags/1.0^{}" "refs/tags/1.0.1"= "refs/tags/1.0.1^{}" "refs/tags/1.0rc1" "refs/tags/1.0rc1^{}" "refs/tags/1= .1" "refs/tags/1.1^{}" "refs/tags/1.1.1" "refs/tags/1.1.1^{}" "refs/tags/1.= 2" "refs/tags/1.2^{}" "refs/tags/1.2.1" "refs/tags/1.2.1^{}" "refs/tags/1.2= .2" "refs/tags/1.2.2^{}" "refs/tags/1.2.3" "refs/tags/1.2.3^{}" "refs/tags/= 1.3" "refs/tags/1.3.1" "refs/tags/1.3rc1" "refs/tags/1.4.0rc1" "refs/tags/1= .4.0rc1^{}" "refs/tags/1.4.0rc1-153-g06ba55549" "refs/tags/1.4.0rc1-156-gca= 6f42fae" "refs/tags/1.4.0rc1-157-g176b1d6c7" "refs/tags/1.4.0rc1-163-gef302= 1dff" "refs/tags/1.4.0rc1-167-gb0c92ae78" "refs/tags/1.4.0rc1-168-g6285c11b= c" "refs/tags/1.4.0rc1-169-g934fd336d" "refs/tags/1.4.0rc1-170-g509c65ced" = "refs/tags/1.4.0rc1-171-g0ecb77335" "refs/tags/1.4.0rc1-172-gb007e54b3" "re= fs/tags/1.4.0rc1-174-gcb64d9705" "refs/tags/1.4.0rc1-176-g7e7d271b3" "refs/= tags/1.4.0rc1-177-g096203ac8" "refs/tags/1.4.0rc1-188-g83fc376b0" "refs/tag= s/1.4.0rc1-189-g58569d9d0" "refs/tags/1.4.0rc1-194-gbaea2d488" "refs/tags/1= .4.0rc1-198-g6a5cb0712" "refs/tags/1.4.0rc1-200-g18497dcb6" "refs/tags/1.4.= 0rc1-201-gf46241e75" "refs/tags/1.4.0rc1-202-g833f8256c" "refs/tags/1.4.0rc= 1-203-gbc1674700" "refs/tags/1.4.0rc1-204-g912589439" "refs/tags/1.4.0rc1-2= 06-g8f56fbb83" "refs/tags/1.4.0rc1-207-g879dfa3d7" "refs/tags/1.4.0rc1-211-= g949c20abd" "refs/tags/1.4.0rc1-230-gc934fef63" "refs/tags/1.4.0rc1-231-g60= a46d193" "refs/tags/1.4.0rc1-234-g0271f43cc" "refs/tags/1.4.0rc1-235-g92b16= 0d2a" "refs/tags/1.4.0rc1-236-g13ee11f81" "refs/tags/1.4.0rc1-237-g54f200d9= b" "refs/tags/1.4.0rc1-239-gfa067bf5c" "refs/tags/1.4.0rc1-241-ge7c5c76ea" = "refs/tags/1.4.0rc1-242-gcf1067e74" "refs/tags/1.4.0rc1-243-g5612c9cb5" "re= fs/tags/1.4.0rc1-244-g84099f249" "refs/tags/1.4.0rc1-245-g0555cf5a3" "refs/= tags/1.4.0rc1-246-gf90babefa" "refs/tags/1.4.0rc1-247-g1a73918f9" "refs/tag= s/1.4.0rc1-248-ged0078b8d" "refs/tags/1.4.0rc1-250-ga63a37a7a" "refs/tags/1= .4.0rc1-251-g6f5fe724b" "refs/tags/1.4.0rc1-252-gc8d56776a" "refs/tags/1.4.= 0rc1-253-g00f9597d3" "refs/tags/1.4.0rc1-254-gbf3d3db23" "refs/tags/1.4.0rc= 1-257-g236cfa7ad" "refs/tags/1.4.0rc1-258-g84fc00d55" "refs/tags/1.4.0rc1-2= 61-g48ae27b4a" "refs/tags/1.4.0rc1-262-g536f34526" "refs/tags/1.4.0rc1-263-= g4c9241db1" "refs/tags/1.4.0rc1-264-g22537a450" "refs/tags/1.4.0rc1-265-g22= cfade4a" "refs/tags/1.4.0rc1-268-gc299c198d" "refs/tags/1.4.0rc1-269-gcf8d2= 004b" "refs/tags/1.4.0rc1-270-g6900197a8" "refs/tags/1.4.0rc1-271-g56ed6d4f= 7" "refs/tags/1.4.0rc1-272-gedb8c3b4e" "refs/tags/1.4.0rc1-274-g1ef5ec259" = "refs/tags/1.4.0rc1-275-g0d25a1b39" "refs/tags/1.4.0rc1-276-g8c25c443c" "re= fs/tags/1.4.0rc1-279-g76a24a0a2" "refs/tags/1.4.0rc1-280-gcf279e6f4" "refs/= tags/1.4.0rc1-282-gad882cc99" "refs/tags/1.4.0rc1-283-g0fcb1df20" "refs/tag= s/1.4.0rc1-284-g7d28e8700" "refs/tags/1.4.0rc1-285-gebf9ebf08" "refs/tags/1= .4.0rc1-289-g834b1d451" "refs/tags/1.4.0rc1-290-g3bfaf3ff3" "refs/tags/1.4.= 0rc1-291-gc75fa0077" "refs/tags/1.4.0rc1-292-gdd9ed2334" "refs/tags/1.4.0rc= 1-293-g1f7607b1d" "refs/tags/1.4.0rc1-294-g987fe047c" "refs/tags/1.4.0rc1-2= 95-gee72793b5" "refs/tags/1.4.0rc1-296-g68d375c43" "refs/tags/1.4.0rc1-310-= gd131c66f0" "refs/tags/1.4.0rc1-315-g16843da41" "refs/tags/1.4.0rc1-318-g44= af6f9d5" "refs/tags/1.4.0rc1-319-gd3e327022" "refs/tags/1.4.0rc1-320-g3a4d7= f3a3" "refs/tags/1.4.0rc1-321-g2d280734a" "refs/tags/1.4.0rc1-322-g6821f6d7= b" "refs/tags/1.4.0rc1-323-g29aad2ae3" "refs/tags/1.4.0rc1-324-g06855ea6c" = "refs/tags/1.4.0rc1-325-g598f84007" "refs/tags/1.4.0rc1-326-gd0bf92f06" "re= fs/tags/1.4.0rc1-327-g7b3a0f397" "refs/tags/1.4.0rc1-328-ge9b62fa34" "refs/= tags/1.4.0rc1-329-gf7bece3b8" "refs/tags/1.4.0rc1-332-g62d2f0de9" "refs/tag= s/1.4.0rc1-340-g2172732b1" "refs/tags/1.4.0rc1-341-g54f7637ad" "refs/tags/1= .4.0rc1-342-g2bac3626c" "refs/tags/1.4.0rc1-343-gb49afcc5b" "refs/tags/1.4.= 0rc1-344-gad354276b" "refs/tags/1.4.0rc1-345-g9e8d4434a" "refs/tags/1.4.0rc= 1-346-g4e3e9c8d1" "refs/tags/1.4.0rc1-347-gfc4cb6fc7" "refs/tags/1.4.0rc1-3= 48-gcac606186" "refs/tags/1.4.0rc1-349-g16d09ace0" "refs/tags/1.4.0rc1-350-= geefb96bdc" "refs/tags/1.4.0rc1-351-g1daf43f91" "refs/tags/1.4.0rc1-352-gaa= ee0b701" "refs/tags/1.4.0rc1-353-gae4948ce3" "refs/tags/1.4.0rc1-354-gd970b= 7400" "refs/tags/1.4.0rc1-355-gc856a6617" "refs/tags/1.4.0rc1-356-gd417aed2= 9" "refs/tags/1.4.0rc1-357-geec7641ef" "refs/tags/1.4.0rc1-358-gc536dc88e" = "refs/tags/1.4.0rc1-360-gb2044a5be" "refs/tags/1.4.0rc1-361-gf17e29f41" "re= fs/tags/1.4.0rc1-362-g7b3e2dfd8" "refs/tags/1.4.0rc1-363-gf60c42224" "refs/= tags/1.4.0rc1-364-gc4d22d441" "refs/tags/1.4.0rc1-365-g41b1ba8ff" "refs/tag= s/1.4.0rc1-366-g20f49c445" "refs/tags/1.4.0rc1-368-g1a0b288a8" "refs/tags/1= .4.0rc1-369-gf5c904b26" "refs/tags/1.4.0rc1-370-gcca48b1eb" "refs/tags/1.4.= 0rc1-371-gdf262c5c7" "refs/tags/1.4.0rc1-372-g01f072764" "refs/tags/1.4.0rc= 1-373-gba8fc09a6" "refs/tags/1.4.0rc1-374-g91bad31f6" "refs/tags/1.4.0rc1-3= 77-gccba649f6" "refs/tags/1.4.0rc1-378-ga3a51ae11" "refs/tags/1.4.0rc1-379-= gcfcd0a956" "refs/tags/1.4.0rc1-380-gd7966c828" "refs/tags/1.4.0rc1-384-g41= 513527c" "refs/tags/1.4.0rc1-386-gbbb6a773f" "refs/tags/1.4.0rc1-387-g627dd= c398" "refs/tags/1.4.0rc1-388-g6a6ef729e" "refs/tags/1.4.0rc1-389-g51c600a5= 3" "refs/tags/1.4.0rc1-390-gaf4810a58" "refs/tags/1.4.0rc1-391-g863a66824" = "refs/tags/1.4.0rc1-392-g9f8093a22" "refs/tags/1.4.0rc1-393-gc999fc70e" "re= fs/tags/1.4.0rc1-394-g870969ef4" "refs/tags/1.4.0rc1-395-gfaab7fa6c" "refs/= tags/1.4.0rc1-396-g549544517" "refs/tags/1.4.0rc1-397-g616ccc6fd" "refs/tag= s/1.4.0rc1-398-g0393d865c" "refs/tags/1.4.0rc1-399-ga012e7e27" "refs/tags/1= .4.0rc1-400-g87cd3d2ab" "refs/tags/1.4.0rc1-401-gdc2c1e111" "refs/tags/1.4.= 0rc1-402-g63a73a4a5" "refs/tags/1.4.0rc1-403-g2b99d32be" "refs/tags/1.4.0rc= 1-406-g409c6b89d" "refs/tags/1.4.0rc1-407-g3efa68f07" "refs/tags/1.4.0rc1-4= 08-g8f863bc96" "refs/tags/1.4.0rc1-409-g8201c1035" "refs/tags/1.4.0rc1-410-= g479f1d4de" "refs/tags/1.4.0rc1-413-g25d3fca07" "refs/tags/1.4.0rc1-414-g8c= 774e388" "refs/tags/1.4.0rc1-416-g7b9430982" "refs/tags/1.4.0rc1-417-gf7796= 52aa" "refs/tags/1.4.0rc1-418-gb3aed042e" "refs/tags/1.4.0rc1-420-g596cd9b0= a" "refs/tags/1.4.0rc1-421-ge1e559732" "refs/tags/1.4.0rc1-422-gace5234e6" = "refs/tags/1.4.0rc1-423-g2dd424a19" "refs/tags/1.4.0rc1-425-g4f5bf1cc6" "re= fs/tags/1.4.0rc1-426-g72e2e62eb" "refs/tags/1.4.0rc1-427-gcf842a8c5" "refs/= tags/1.4.0rc1-428-g81a3c0f83" "refs/tags/1.4.0rc1-429-gf1678fd33" "refs/tag= s/1.4.0rc1-430-g7854aefdd" "refs/tags/1.4.0rc1-431-ga9e193234" "refs/tags/1= .4.0rc1-432-g447e91a68" "refs/tags/1.4.0rc1-433-g76c87146d" "refs/tags/1.4.= 0rc1-434-ga7a32b08b" "refs/tags/1.4.0rc1-436-g8c2ab8fa0" "refs/tags/1.4.0rc= 1-438-gcb88954a3" "refs/tags/1.4.0rc1-439-g79ca9147e" "refs/tags/1.4.0rc1-4= 40-g7ba322b10" "refs/tags/1.4.0rc1-441-gb9a844263" "refs/tags/1.4.0rc1-442-= g78d4c4f3f" "refs/tags/1.4.0rc1-444-g8d11e9ffa" "refs/tags/1.4.0rc1-446-g18= eef830a" "refs/tags/1.4.0rc1-447-g8db8b1e78" "refs/tags/1.4.0rc1-448-g816fd= 88d4" "refs/tags/1.4.0rc1-449-g50ee78613" "refs/tags/1.4.0rc1-450-g2725ef99= d" "refs/tags/1.4.0rc1-451-g66ea25bca" "refs/tags/1.4.0rc1-453-g281da0532" = "refs/tags/1.4.0rc1-454-g57a6fe4f2" "refs/tags/1.4.0rc1-456-geb7a9bfa4" "re= fs/tags/1.4.0rc1-457-g8f3772b59" "refs/tags/1.4.0rc1-459-ge84f87f62" "refs/= tags/1.4.0rc1-461-gf7b6708e4" "refs/tags/1.4.0rc1-462-gfffc50c79" "refs/tag= s/1.4.0rc1-463-gf7ed4a309" "refs/tags/1.4.0rc1-464-gcde0343a6" "refs/tags/1= .4.0rc1-465-gb69dd2d90" "refs/tags/1.4.0rc1-466-gd9a48b90b" "refs/tags/1.4.= 0rc1-467-gd93bd9ca2" "refs/tags/1.4.0rc1-468-g1a3828e2c" "refs/tags/1.4.0rc= 1-469-gb40d9ed44" "refs/tags/1.4.0rc1-471-gb989a674a" "refs/tags/1.4.0rc1-4= 72-g4e8a12f37" "refs/tags/1.4.0rc1-473-gbce55d0ef" "refs/tags/1.4.0rc1-477-= g576731767" "refs/tags/1.4.0rc1-480-g05f513ab6" "refs/tags/1.4.0rc1-481-g2b= 988ed7b" "refs/tags/1.4.0rc1-482-g0c099ab6f" "refs/tags/1.4.0rc1-483-gc7f5c= 0f40" "refs/tags/1.4.0rc1-484-g2d8a56b7c" "refs/tags/1.4.0rc1-486-gf92690c1= 4" "refs/tags/1.4.0rc1-487-g15474ada3" "refs/tags/1.4.0rc1-488-g7bb0c59f2" = "refs/tags/1.4.0rc1-489-g6314c8cb2" "refs/tags/1.4.0rc1-491-g651eee13e" "re= fs/tags/1.4.0rc1-494-gdfb953a78" "refs/tags/1.4.0rc1-495-g10bf5dc17" "refs/= tags/1.4.0rc1-496-gcef1d7e74" "refs/tags/1.4.0rc1-497-g3bd15aea0" "refs/tag= s/1.4.0rc1-498-g681e7bea5" "refs/tags/1.4.0rc1-502-gaf75ebbd6" "refs/tags/1= .4.0rc1-509-g89e9b20df" "refs/tags/1.4.0rc1-510-g3f34b332c" "refs/tags/1.4.= 0rc1-512-g8b2f7f08a" "refs/tags/1.4.0rc1-514-g05e450c3c" "refs/tags/1.4.0rc= 1-515-g1154c0f54" "refs/tags/1.4.0rc1-516-g8b566b2a7" "refs/tags/1.4.0rc1-5= 18-g3244cf083" "refs/tags/1.4.0rc1-519-gd1e9ee9f9" "refs/tags/1.4.0rc1-520-= gc394d7d2d" "refs/tags/1.4.0rc1-521-gb68b12010" "refs/tags/1.4.0rc1-522-gfd= b3f7ac3" "refs/tags/1.4.0rc1-525-gc12294c5e" "refs/tags/1.4.0rc1-526-g88189= 8f84" "refs/tags/1.4.0rc1-527-g438e8ca61" "refs/tags/1.4.0rc1-528-g86d782cb= 6" "refs/tags/1.4.0rc1-531-g641279072" "refs/tags/1.4.0rc1-533-gf4e70face" = "refs/tags/1.4.0rc1-534-gd13410c91" "refs/tags/1.4.0rc1-536-g4edf77082" "re= fs/tags/1.4.0rc1-537-gada6752ea" "refs/tags/1.4.0rc1-538-g15fdad3d5" "refs/= tags/1.4.0rc1-540-g4f86e0b2b" "refs/tags/1.4.0rc1-541-ge077df22d" "refs/tag= s/1.4.0rc1-542-g8a7120e1e" "refs/tags/1.4.0rc1-544-g3b8519fda" "refs/tags/1= .4.0rc1-545-g2d6bb4abd" "refs/tags/1.4.0rc1-548-g354f6a23e" "refs/tags/1.4.= 0rc1-549-ge8875faf8" "refs/tags/1.4.0rc1-550-g72c1f91c0" "refs/tags/1.4.0rc= 1-551-g144bdc249" "refs/tags/1.4.0rc1-552-gdb55c541b" "refs/tags/1.4.0rc1-5= 53-ga86558f9a" "refs/tags/1.4.0rc1-554-g2d34588b8" "refs/tags/1.4.0rc1-555-= g32944a15d" "refs/tags/1.4.0rc1-556-g3440f90a6" "refs/tags/1.4.0rc1-557-g00= 9642d12" "refs/tags/1.4.0rc1-558-g47f7b307f" "refs/tags/1.4.0rc1-559-ge7364= 263b" "refs/tags/1.4.0rc1-560-g7303f72ee" "refs/tags/1.4.0rc1-562-g99ee1394= a" "refs/tags/1.4.0rc1-563-g163ebe71d" "refs/tags/1.4.0rc1-564-g429d8ee0f" = "refs/tags/1.4.0rc1-565-g6b21079fd" "refs/tags/1.4.0rc1-566-gf04657e7e" "re= fs/tags/1.4.0rc1-567-g280a514eb" "refs/tags/1.4.0rc1-568-gc51d2f954" "refs/= tags/1.4.0rc1-569-gf17b79a10" "refs/tags/1.4.0rc1-570-g73c0af197" "refs/tag= s/1.4.0rc1-571-g5f75bde39" "refs/tags/1.4.0rc1-572-g59f6d95b8" "refs/tags/1= .4.0rc1-573-g8258c78c0" "refs/tags/1.4.0rc1-574-gb2ed9499f" "refs/tags/1.4.= 0rc1-575-g94f4f65a6" "refs/tags/1.4.0rc1-576-g7e48b78c1" "refs/tags/1.4.0rc= 1-577-gfc83e4127" "refs/tags/1.4.0rc1-578-gd59ed1e70" "refs/tags/1.4.0rc1-5= 79-g8fddc816a" "refs/tags/1.4.0rc1-585-g8c1bdc1a4" "refs/tags/1.4.0rc1-586-= g20647e8a9" "refs/tags/1.4.0rc1-587-g708385c71" "refs/tags/1.4.0rc1-588-g9a= 337a9ef" "refs/tags/1.4.0rc1-589-gf48888a43" "refs/tags/1.4.0rc1-591-g579d8= 6904" "refs/tags/1.4.0rc1-593-g783213f9c" "refs/tags/1.4.0rc1-594-gf5d3079d= b" "refs/tags/1.4.0rc1-596-g590bcf1c7" "refs/tags/1.4.0rc1-597-g83157100c" = "refs/tags/1.4.0rc1-598-gd16d9ba28" "refs/tags/1.4.0rc1-600-g3f614464e" "re= fs/tags/1.4.0rc1-601-ga7468dcd4" "refs/tags/1.4.0rc1-602-g89155ace7" "refs/= tags/1.4.0rc1-603-g75de59703" "refs/tags/1.4.0rc1-604-g1309c76be" "refs/tag= s/1.4.0rc1-613-ge756f2d68" "refs/tags/1.4.0rc1-614-g89831f8dc" "refs/tags/1= .4.0rc1-617-g776bd3b02" "refs/tags/1.4.0rc1-618-gf071075e8" "refs/tags/1.4.= 0rc1-619-gd71eba97f" "refs/tags/1.4.0rc1-620-g684c9d232" "refs/tags/1.4.0rc= 1-621-g2132e99fb" "refs/tags/1.4.0rc1-622-gf7369d2c4" "refs/tags/1.4.0rc1-6= 23-gf67475375" "refs/tags/1.4.0rc1-624-g72cfdf25a" "refs/tags/1.4.0rc1-626-= g058fe6f4b" "refs/tags/1.4.0rc1-627-g0dbefa306" "refs/tags/1.4.0rc1-628-gb0= 9ab3ff3" "refs/tags/1.4.0rc1-629-g612767c87" "refs/tags/1.4.0rc1-631-g4e4fc= cc07" "refs/tags/1.4.0rc1-633-g3a00403ad" "refs/tags/1.4.0rc1-634-g4aa4f4fc= e" "refs/tags/1.4.0rc1-635-g418a36693" "refs/tags/1.4.0rc1-636-g2bf8f1388" = "refs/tags/1.4.0rc1-637-gffdaeba09" "refs/tags/1.4.0rc1-638-gc3c77aef1" "re= fs/tags/1.4.0rc1-639-g11bd0db03" "refs/tags/1.4.0rc1-657-g57b5911f1" "refs/= tags/1.4.0rc1-658-g6240fd3d0" "refs/tags/1.4.0rc1-659-g54be35f52" "refs/tag= s/1.4.0rc1-660-ge46503d0c" "refs/tags/1.4.0rc1-661-g62cb889a3" "refs/tags/1= .4.0rc1-662-g5ab81fd8b" "refs/tags/1.4.0rc1-663-gf9854e564" "refs/tags/1.4.= 0rc1-664-g1db1e3231" "refs/tags/1.4.0rc1-665-g67a947f11" "refs/tags/1.4.0rc= 1-666-g4a83f8c81" "refs/tags/1.4.0rc1-668-gf35a640ce" "refs/tags/1.4.0rc1-6= 69-g67aa15418" "refs/tags/1.4.0rc1-670-g8c660e278" "refs/tags/1.4.0rc1-671-= g25b537cf2" "refs/tags/1.4.0rc1-672-ga5fd484a6" "refs/tags/1.4.0rc1-673-gdb= 8de64ab" "refs/tags/1.4.0rc1-674-g7cb5f5c80" "refs/tags/1.4.0rc1-675-ga5e84= bbe9" "refs/tags/1.4.0rc1-676-g6b2918ee9" "refs/tags/1.4.0rc1-677-g4acfdae7= 4" "refs/tags/1.4.0rc1-678-g2902a8786" "refs/tags/1.4.0rc1-679-gb3b769f0e" = "refs/tags/1.4.0rc1-680-g4d3474840" "refs/tags/1.4.0rc1-681-g598e660ae" "re= fs/tags/1.4.0rc1-682-g0c1b6a2a4" "refs/tags/1.4.0rc1-683-g320a1b81c" "refs/= tags/1.4.0rc1-684-g1d1d3b157" "refs/tags/1.4.0rc1-685-gf379ad84d" "refs/tag= s/1.4.0rc1-686-gdaa2f25e3" "refs/tags/1.4.0rc1-687-g1e39ce29a" "refs/tags/1= .4.0rc1-688-g98dd3e48a" "refs/tags/1.4.0rc1-689-g6982b4781" "refs/tags/1.4.= 0rc1-690-gc0c903767" "refs/tags/1.4.0rc1-691-gdbe15e5e9" "refs/tags/1.4.0rc= 1-692-g224c475b5" "refs/tags/1.4.0rc1-693-gac3a0d33f" "refs/tags/1.4.0rc1-6= 94-g102317e5c" "refs/tags/1.4.0rc1-695-ge2d6759d5" "refs/tags/1.4.0rc1-696-= gbf424ce98" "refs/tags/1.4.0rc1-697-gcddc08e14" "refs/tags/1.4.0rc1-698-gb5= 5e54388" "refs/tags/1.4.0rc1-699-g327d5fdac" "refs/tags/1.4.0rc1-700-g03e13= c69e" "refs/tags/1.4.0rc1-701-g8682d4de4" "refs/tags/1.4.0rc1-702-g922afe50= 6" "refs/tags/1.4.0rc1-708-gc8c110efa" "refs/tags/1.4.0rc1-709-g628ff6582" = "refs/tags/1.4.0rc1-710-g7eb62b626" "refs/tags/1.4.0rc1-711-g3b7d5880f" "re= fs/tags/1.4.0rc1-712-g769d8bbe6" "refs/tags/1.4.0rc1-713-gc58335c6c" "refs/= tags/1.4.0rc1-715-ge556a59ae" "refs/tags/1.4.0rc1-716-g2cca75d93") scheme@(guile-user)> =2D-8<---------------cut here---------------end--------------->8--- --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQJJBAEBCAAzFiEEAVhh4yyK5+SEykIzrPUJmaL7XHkFAmE0wfcVHHB1YmxpY0B5 b2N0b2NlbGwueHl6AAoJEKz1CZmi+1x5v8QP/1CC/R9sAsolZ2UOQ6I8R4RXOTqx 2eGD9CyQGvD+xxliaP+cWzom/ti8vjGf8EEQfSIZ4F5db3z1VdbfU8XmMg1lwhXx /pdH5tjCjASrWioMKMZh7ZI4VMjZmSTCtvkGqsIiYdZ1xP11bJyIqDCxzib1Ue61 irN2Yh9UEQzyrW5a+TQrUkEWAY35ayNusiJHA0ANml6k7SyM6Y3CSTCfr0zk9EK+ UEiGuTpdUnezR/1czsxl/CvCepVmS9Xm6Ys1BO8v1DzXAtKGzxne4n5QuTUEL2Lo 5yFkIEtiFo1ccu6kbh59KsmOsljVtBZOuWNsEnM5d2ybKVyD350n2XoEOztv+VUQ vZjpqbuDXt17MovXQGmNU6mS0r176X9KlXPN227uR7rZc9CyiTfcAvttrTMJ8pFG FNJwhbuAzX271hrOHkLgAbj03Q6B1J5kyTMnfsD0jct4NDypsKZnw5CGltRyGCSZ d9R52wyeiNIJv4nwxrfe3a4Oi1tIkJI81nqOM674Z1v0lGqUIk0yC63d/A+whngs 0cOs/qCiZDF+xxFF/3ptXKSsJyKSBu2cLZbp7aUhOj1Oqj40zE2Itf2qz6wgpXc0 wovuyEPjLb6SF3z9Fz1YwPusgm99zWyrM4/XMMZ6UWMQAd3jkCL8CBYm7pavbFsr QnYIhfSYyoo7stod =mfA0 -----END PGP SIGNATURE----- --=-=-=--