From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id izA6GzwBOWGVbgEAgWs5BA (envelope-from ) for ; Wed, 08 Sep 2021 20:30:20 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id KHO8FjwBOWFaFQAAB5/wlQ (envelope-from ) for ; Wed, 08 Sep 2021 18:30:20 +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 EE2241E40C for ; Wed, 8 Sep 2021 20:30:18 +0200 (CEST) Received: from localhost ([::1]:36190 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mO2Kw-0008AM-3H for larch@yhetil.org; Wed, 08 Sep 2021 14:30:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46282) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mO2Kg-0008A4-It for guix-patches@gnu.org; Wed, 08 Sep 2021 14:30:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:50238) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mO2Kg-00020n-B5 for guix-patches@gnu.org; Wed, 08 Sep 2021 14:30:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mO2Kg-0005qH-38 for guix-patches@gnu.org; Wed, 08 Sep 2021 14:30: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: Wed, 08 Sep 2021 18:30:01 +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.163112574622357 (code B ref 50359); Wed, 08 Sep 2021 18:30:01 +0000 Received: (at 50359) by debbugs.gnu.org; 8 Sep 2021 18:29:06 +0000 Received: from localhost ([127.0.0.1]:33546 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mO2Jl-0005oW-RI for submit@debbugs.gnu.org; Wed, 08 Sep 2021 14:29:06 -0400 Received: from h87-96-130-155.cust.a3fiber.se ([87.96.130.155]:55900 helo=mail.yoctocell.xyz) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mO2Ji-0005ny-Su for 50359@debbugs.gnu.org; Wed, 08 Sep 2021 14:29:04 -0400 From: Xinglu Chen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yoctocell.xyz; s=mail; t=1631125733; bh=2HyG349cNWVnzUPqUcYxl3f8KOxWIJNaD9SmLCyD2nY=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=jIpMh18dY+n2zCAWKPgSQqXNpv8mVairlZv2VcMCXstWNpQ6LxAU5GIHsQI7zXH1v y4btlj+tlIa4DEW4xwVl+0bCpXVwuAUSGzfcp/g25KCzaaremz4tSWwLIrbARhDjul iKdQ5COm1M6x2xHdiiDF7rTSoQ5DPVUF5HDehpL0= In-Reply-To: <87wnnsyzal.fsf@yoctocell.xyz> References: <86k0jvkh5v.fsf@mgsn.dev> <87h7ez48d3.fsf@yoctocell.xyz> <86y28ai7ns.fsf@mgsn.dev> <87y28928vh.fsf@yoctocell.xyz> <86pmtli4hn.fsf@mgsn.dev> <87wnnsyzal.fsf@yoctocell.xyz> Date: Wed, 08 Sep 2021 20:28:38 +0200 Message-ID: <87mtomzzu1.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 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1631125819; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:in-reply-to:in-reply-to:references:references: list-id:list-help:list-unsubscribe:list-subscribe:list-post: dkim-signature; bh=ISkl0p/Ko0L7znpcxTQwUahIEdaq/pxnExcYTqWEtl8=; b=UkzhY1zdxlh/mMt++vUFRX5Cw1vHu84JOgSZ7q9EcgOQ6b/ExP8g9y8tQ3DZi14mSfC9MZ 211p03lzrI/TqKuJwXunL7ctg7+A/dhv2Fxto7yLYdDsUvAqzA/w0e6v+wsSrhUIOprUcQ HThQZ4vIRwn0/8BeNtv8l0bdpFsd4MzHTs1AxNVn3EH92gDLDmlm4lDtZFfM0+IsARAu4v eWpsn+TR5hd/ppv0Ud4egaL7a6JG8GxgRHvpjjs7Y8qDWji5n06ly0abwPV4Tb0HU1+mDi pvdfMu7vrQN3J3bszTZD8HNQ+A6Uv5inxloo0MLbXqcGyPHoHpZ7VtmrDtXfSA== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1631125819; a=rsa-sha256; cv=none; b=n3jK1AqcKtdacSD37wktE+pJOqA4wZ0UmtmppdF4TTeYdRxCC1+eRpd/gdGQmCP2TMI3HY 7bX2rhcrY9l5RXAqMyFod54OoJg5mZRz7t27vahWyFqkfYJjyjtLVM0JGlTQz/7N50F9a/ Vt+QTCAeK1V0S2CKitsr6Bb1MOT6+MDHQWGKf8u5twAtz9/WHHdUHmowHD68SuTKOjzyXt BANSdD3W0YX9f5Zk39xlMNRPPczXul1/CwCzT4ev1krUXT7rjLni+fgZATPavebnpQfLsx 9x0Me7I4JxLhpFOfgOppKxokFRGwaCvPKUxSVM8iUbUW5odoFua/Cg7UG/y5QA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=yoctocell.xyz header.s=mail header.b=jIpMh18d; dmarc=fail reason="SPF not aligned (relaxed)" header.from=yoctocell.xyz (policy=none); spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Migadu-Spam-Score: -3.41 Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=yoctocell.xyz header.s=mail header.b=jIpMh18d; dmarc=fail reason="SPF not aligned (relaxed)" header.from=yoctocell.xyz (policy=none); spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Migadu-Queue-Id: EE2241E40C X-Spam-Score: -3.41 X-Migadu-Scanner: scn1.migadu.com X-TUID: a/1xLY3AR7kO --==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On Tue, Sep 07 2021, Xinglu Chen wrote: > On Mon, Sep 06 2021, Sarah Morgensen wrote: > >> Hi, >> >> Xinglu Chen writes: >> >>> Any trick you used to find all of there weird version numbers? :-) >> >> This monstrosity: >> >> rg -U -B4 --pcre2 '(?!\(let.*(\n.*){0,1})\(version "([^\n"]*[^0-9\.][^= "\n]*)".*(\n.*){0,10}commit.*version' gnu/packages >> >> and to show just the versions: >> >> rg -Uor '$2' --pcre2 --no-filename --no-line-number=20 > > Wow! I will try that and see for myself! :-) > >>>> IMO, just get rid of the delimiter. If we wanted to be *that* flexibl= e, >>>> we could make it so they provide a tag->version proc instead of (prefi= x, >>>> suffix, delimiter). >>> >>> a =E2=80=98tag->version=E2=80=99 procedure would probably make things a= bit too >>> complicated for the people writing package definitions. For example, >>> having a delimiter would make it easy to match a tag like >>> =E2=80=9C2021-01-01-release=E2=80=9D >>> >>> Delimiter is =E2=80=9C.=E2=80=9D (sorry if this hurts your eyes ;-)) >>> >>> scheme@(guile-user)> (match:substring (string-match "^[^0-9]*([^\\.[:pu= nct:]]+(\\.[^\\.[:punct:]]+)*).*$" "2021-01-01-release") 1) >>> $28 =3D "2021" >>> >>> Delimiter is =E2=80=9C-=E2=80=9D >>> >>> scheme@(guile-user)> (match:substring (string-match "^[^0-9]*([^-[:punc= t:]]+(-[^-[:punct:]]+)*).*$" "2021-01-01-release") 1) >>> $29 =3D "2021-01-01-release" >>> >>> And then, setting the suffix to =E2=80=9C-release=E2=80=9D would match = just the version >>> part. >> >> Right. I missed that. >> >> In that vein, should we keep the dashes in "2021-01-01" or convert them >> to periods? > > Having periods would be more consistent, then could have a > =E2=80=98date->version=E2=80=99 procedure that replaces the hyphens with = dots and have > > (git-reference > (url "https://git.example.org") > (commit (date->version version))) > >> What about when a tag has underscores? > > Hmm, not sure about that, below is a list of packages I could find which = had > underscores as delimiters > > gnu/packages/graphics.scm > 239: (commit "DIRECTFB_1_7_7"))) > gnu/packages/gstreamer.scm > 326: (commit "ESOUND_0_2_41"))) > gnu/packages/java.scm > 13925: (commit "jboss-transaction-api_1.2_spec-1.1.1= .Final"))) > > They all seem to use periods in the =E2=80=98version=E2=80=99 field, thou= gh, so I would > say that the underscroes, should also be converted to periods. > >> What if a repo has tags in both formats? Then "3.0.1" would be >> considered older than "2011-01-01". > > That=E2=80=99s tricky, there isn=E2=80=99t really a way to know how old = =E2=80=9C3.0.1=E2=80=9D is, > without looking at the metadata of the tag. Maybe this is one of those > corner cases which can=E2=80=99t really automatically determine the latest > release. Should we have a =E2=80=98no-refresh?=E2=80=99 property to tell= the refresh to > not try to update the package? > >> Maybe we should just add an extra bit to detect a date format and only >> consider it when there's no "proper versions"? > > That could be a good idea! > >> Aaaand I fell down a rabbit hole after that :) I've attached a patch >> with what I've done. It still has lots of issues--it requires the tag >> to contain at least one version delimiter, it requires the first >> character of the version to be a number... it might not even be better >> than before I touched it, and even so the added complexity might not be >> worth it. But if you'd like to take it for a spin, I've attached it (it >> applies straight on master). > > Great! I will try it out and see how it compares to my current WIP > version. > > Not having characters in the first version number probably isn=E2=80=99t = such a > big deal, most version that contain characters end with a character. > E.g., =E2=80=9C1.2.3a=E2=80=9D is not to uncommon, but =E2=80=9Ca1.2.3=E2= =80=9D is rarely seen. I made some changes, to the patch and ran =E2=80=98guix refresh -t generic-= git | grep "^gnu/packages.*no valid=E2=80=99; I also modified the =E2=80=98github= =E2=80=99 updater so that it wouldn=E2=80=99t be used. =20=20 (define %github-updater (upstream-updater (name 'github) (description "Updater for GitHub packages") (pred (const #f)) ;this right here (latest latest-release))) Attached is a file with all the packages that didn=E2=80=99t have any valid tags, and with a short description of perharps why no valid tags were found. Something I noticed was the a lot of Julia package use a version scheme like this: (version "1.2.3+0") The "+0" is included in the version field and acts like a =E2=80=9Crevision= =E2=80=9D; I am not familiar with the Julia ecosystem, and I am not sure how we should handle this situation. The updated patch is also attached. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=no-valid-tags Content-Transfer-Encoding: base64 Ozs7IEN1c3RvbSBwcmVmaXggb3Igc3VmZml4IChzaG91bGQgYmUgc29sdmFibGUgYnkgdXMpCjs7 IGttc2Nvbi0gcHJlZml4CmdudS9wYWNrYWdlcy90ZXJtaW5hbHMuc2NtOjI4MToxNDogd2Fybmlu Zzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Iga21zY29uCgo7OyB2MS4yLTxudW0+CmdudS9wYWNr YWdlcy9zdGF0aXN0aWNzLnNjbTo1NzAxOjU6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQg Zm9yIHItY29sb3JvdXQKCjs7IDxDSEFSPjxudW0+CmdudS9wYWNrYWdlcy9zZGwuc2NtOjY2Mjox NDogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Igc2RsMi1jcwoKOzsgdGVzdC0gcHJl Zml4CmdudS9wYWNrYWdlcy9xdC5zY206MTE4Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91 bmQgZm9yIHFpdGUKCjs7ICJ2IiBwcmVmaXgsICItc3RhYmxlIiBzdWZmaXgKZ251L3BhY2thZ2Vz L29wZW5jb2cuc2NtOjc2OjE0OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBhdG9t c3BhY2UKZ251L3BhY2thZ2VzL29wZW5jb2cuc2NtOjQ0OjE0OiB3YXJuaW5nOiBubyB2YWxpZCB0 YWdzIGZvdW5kIGZvciBjb2d1dGlsCgo7OyArPG51bT4gc3VmZml4CmdudS9wYWNrYWdlcy9vY2Ft bC5zY206NjAzOjEyOiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBvY2FtbC1tY2Nz Cgo7OyAidmVyc2lvbi0iIHByZWZpeApnbnUvcGFja2FnZXMvbWluZXRlc3Quc2NtOjYwMDo1OiB3 YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBtaW5ldGVzdC11bmlmaWVkLWludmVudG9y eQoKOzsgIm1hdmVuLXJlc291cmNlcy1wbHVnaW4tIiBwcmVmaXgKZ251L3BhY2thZ2VzL21hdmVu LnNjbToyOTgwOjEyOiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBtYXZlbi1yZXNv dXJjZXMtcGx1Z2luCgo7OyAidHhyLSIgcHJlZml4CmdudS9wYWNrYWdlcy9saXNwLnNjbTo5MTI6 NTogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgdHhyCgo7OyByZWxlYXNlLSBwcmVm aXgKZ251L3BhY2thZ2VzL2FsZ2VicmEuc2NtOjE0MjA6MTI6IHdhcm5pbmc6IG5vIHZhbGlkIHRh Z3MgZm91bmQgZm9yIG00cmkKZ251L3BhY2thZ2VzL2FsZ2VicmEuc2NtOjE1MTA6MTI6IHdhcm5p bmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIG00cmllCgo7OyBscmNhbGMtIHByZWZpeApnbnUv cGFja2FnZXMvYWxnZWJyYS5zY206MTU2NjoxMjogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3Vu ZCBmb3IgbHJjYWxjCgo7OyAzLjMuMDYtMSwgLTxudW0+IHN1ZmZpeApnbnUvcGFja2FnZXMvYWRt aW4uc2NtOjQwNDY6Mjogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgaW54aQpnbnUv cGFja2FnZXMvYWRtaW4uc2NtOjM5Nzc6Nzogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBm b3IgaW54aS1taW5pbWFsCgo7OyAtcmVsZWFzZS1EQVRFK1NPTUUtUkFORE9NLU5VTUJFUlMsIHJl ZnMvdGFncy8yLjAuMTgwLXJlbGVhc2UtMjAyMTAzMTUyMzE3MDcKZ251L3BhY2thZ2VzL2Jpb2lu Zm9ybWF0aWNzLnNjbToxMTE4OToxMjogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Ig YmlvYmFtYmFtMgpnbnUvcGFja2FnZXMvYmlvaW5mb3JtYXRpY3Muc2NtOjExMTQ5OjEyOiB3YXJu aW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBsaWJtYXVzMgoKOzsgIitnaXQ8ZGF0ZT4iIHN1 ZmZpeApnbnUvcGFja2FnZXMvZ25vbWUuc2NtOjExODc4OjEyOiB3YXJuaW5nOiBubyB2YWxpZCB0 YWdzIGZvdW5kIGZvciBmZWVkYmFja2QKCjs7ICJmZXN0LXRlc3QtIiBwcmVmaXgKZ251L3BhY2th Z2VzL2phdmEuc2NtOjEwOTAwOjEyOiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBq YXZhLWZlc3QtdGVzdAoKOzsgIi1zdGFibGUiIHN1ZmZpeApnbnUvcGFja2FnZXMvZ2FtZS1kZXZl bG9wbWVudC5zY206MTcyMjoxMjogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgZ29k b3QKCjs7ICJ2IiBwcmVmaXgsICItZGViaWFuIiBzdWZmaXgKZ251L3BhY2thZ2VzL2dzdHJlYW1l ci5zY206OTU6NTogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Igb3Blbm5pMgoKCjs7 ICs8bnVtPiBzdWZmaXgsIGJ1dCB0aGlzIGlzIHBhcnQgb2YgdGhlIGB2ZXJzaW9uJyBmaWVsZCBh cyB3ZWxsLCBub3QKOzsgc3VyZSB3aGF0IHRvIGRvIGFib3V0IHRoaXMKOzsKOzsgKHZlcnNpb24g IjEuNS4wKzAiKQpnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbTozNjY6Njogd2FybmluZzogbm8g dmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEtZnJpYmlkaS1qbGwKZ251L3BhY2thZ2VzL2p1bGlh LWpsbC5zY206MjUyMDo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS14 b3JnLXh0cmFucy1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MTgxMjo2OiB3YXJuaW5n OiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS14b3JnLWxpYngxMS1qbGwKZ251L3BhY2th Z2VzL2p1bGlhLWpsbC5zY206MTE0OTo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZv ciBqdWxpYS1saWJ2b3JiaXMtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjE0OTE6Njog d2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEtcXQ1YmFzZS1qbGwKZ251L3Bh Y2thZ2VzL2p1bGlhLWpsbC5zY206MTQxNTo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5k IGZvciBqdWxpYS1wY3JlLWpsbApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToxOTY0OjY6IHdh cm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLXhvcmctbGlieGRtY3AtamxsCmdu dS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjE1ODE6Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBm b3VuZCBmb3IganVsaWEtd2F5bGFuZC1wcm90b2NvbHMtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1q bGwuc2NtOjY5NDo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS1sYW1l LWpsbApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToyMjYxOjY6IHdhcm5pbmc6IG5vIHZhbGlk IHRhZ3MgZm91bmQgZm9yIGp1bGlhLXhvcmcteGNiLXV0aWwtamxsCmdudS9wYWNrYWdlcy9qdWxp YS1qbGwuc2NtOjE2MTg6Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEt eDI2NC1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MTkyNjo2OiB3YXJuaW5nOiBubyB2 YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS14b3JnLWxpYnhjdXJzb3ItamxsCmdudS9wYWNrYWdl cy9qdWxpYS1qbGwuc2NtOjkyMDo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBq dWxpYS1saWJncGctZXJyb3ItamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjg4Mjo2OiB3 YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS1saWJnbHZuZC1qbGwKZ251L3Bh Y2thZ2VzL2p1bGlhLWpsbC5zY206NDg2OjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQg Zm9yIGp1bGlhLWdsaWItamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjE4NTA6Njogd2Fy bmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEteG9yZy1saWJ4YXUtamxsCmdudS9w YWNrYWdlcy9qdWxpYS1qbGwuc2NtOjEwNjo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5k IGZvciBqdWxpYS1jYWlyby1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MjU1Njo2OiB3 YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS14c2x0LWpsbApnbnUvcGFja2Fn ZXMvanVsaWEtamxsLnNjbToyMjk4OjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9y IGp1bGlhLXhvcmcteGNiLXV0aWwtaW1hZ2UtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2Nt OjI0MDk6Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEteG9yZy14Y2It dXRpbC13bS1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206NjU3OjY6IHdhcm5pbmc6IG5v IHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLWpwZWd0dXJiby1qbGwKZ251L3BhY2thZ2VzL2p1 bGlhLWpsbC5zY206MjA3NDo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxp YS14b3JnLWxpYnhpLWpsbApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToxMTg3OjY6IHdhcm5p bmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLWx6by1qbGwKZ251L3BhY2thZ2VzL2p1 bGlhLWpsbC5zY206MjAwMDo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxp YS14b3JnLWxpYnhleHQtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjg0Mzo2OiB3YXJu aW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS1saWJnY3J5cHQtamxsCmdudS9wYWNr YWdlcy9qdWxpYS1qbGwuc2NtOjczMDo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZv ciBqdWxpYS1saWJhc3MtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjE1NDI6Njogd2Fy bmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEtd2F5bGFuZC1qbGwKZ251L3BhY2th Z2VzL2p1bGlhLWpsbC5zY206MTExMTo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZv ciBqdWxpYS1saWJ1dWlkLWpsbApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToxMDcyOjY6IHdh cm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLWxpYnRpZmYtamxsCmdudS9wYWNr YWdlcy9qdWxpYS1qbGwuc2NtOjIyMjQ6Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBm b3IganVsaWEteG9yZy1saWJ4cmVuZGVyLWpsbApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbTo5 NTg6Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEtbGliaWNvbnYtamxs CmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjk5Njo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdz IGZvdW5kIGZvciBqdWxpYS1saWJtb3VudC1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206 MTAzNTo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS1saWJwbmctamxs CmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjc3MDo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdz IGZvdW5kIGZvciBqdWxpYS1saWJmZGstYWFjLWpsbApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNj bToxNzM1OjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLXhtbDItamxs CmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjgwNjo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdz IGZvdW5kIGZvciBqdWxpYS1saWJmZmktamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjE4 ODY6Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEteG9yZy1saWJ4Y2It amxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjI0NDY6Njogd2FybmluZzogbm8gdmFsaWQg dGFncyBmb3VuZCBmb3IganVsaWEteG9yZy14a2Jjb21wLWpsbApnbnUvcGFja2FnZXMvanVsaWEt amxsLnNjbToxNjU5OjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLXgy NjUtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjI0ODM6Njogd2FybmluZzogbm8gdmFs aWQgdGFncyBmb3VuZCBmb3IganVsaWEteG9yZy14a2V5Ym9hcmQtY29uZmlnLWpsbApnbnUvcGFj a2FnZXMvanVsaWEtamxsLnNjbTo0NDM6Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBm b3IganVsaWEtZ2xmdy1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MjExMjo2OiB3YXJu aW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS14b3JnLWxpYnhpbmVyYW1hLWpsbApn bnUvcGFja2FnZXMvanVsaWEtamxsLnNjbTo2Njo1OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZv dW5kIGZvciBqdWxpYS1iemlwMi1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206NTY5OjY6 IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLWltYWdlbWFnaWNrLWpsbApn bnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToxMjYzOjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3Mg Zm91bmQgZm9yIGp1bGlhLW9nZy1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MjMyOjY6 IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLWZmbXBlZy1qbGwKZ251L3Bh Y2thZ2VzL2p1bGlhLWpsbC5zY206MTY5NTo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5k IGZvciBqdWxpYS14a2Jjb21tb24tamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjI1OTk6 Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEtemxpYi1qbGwKZ251L3Bh Y2thZ2VzL2p1bGlhLWpsbC5zY206MjMzNTo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5k IGZvciBqdWxpYS14b3JnLXhjYi11dGlsLWtleXN5bXMtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1q bGwuc2NtOjUzMDo1OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS1ndW1i by1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MjE4Njo2OiB3YXJuaW5nOiBubyB2YWxp ZCB0YWdzIGZvdW5kIGZvciBqdWxpYS14b3JnLWxpYnhyYW5kci1qbGwKZ251L3BhY2thZ2VzL2p1 bGlhLWpsbC5zY206MTk0OjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlh LWV4cGF0LWpsbApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToxMzAwOjc6IHdhcm5pbmc6IG5v IHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLW9wZW5zcGVjZnVuLWpsbApnbnUvcGFja2FnZXMv anVsaWEtamxsLnNjbTozMjQ6NTogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVs aWEtZnJlZXR5cGUyLWpsbApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToxMzQzOjY6IHdhcm5p bmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLW9wZW5zc2wtamxsCmdudS9wYWNrYWdl cy9qdWxpYS1qbGwuc2NtOjEyMjU6NTogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Ig anVsaWEtbWJlZHRscy1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MTUyOjU6IHdhcm5p bmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlhLWNvbXBpbGVyc3VwcG9ydGxpYnJhcmll cy1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MjAzNzo2OiB3YXJuaW5nOiBubyB2YWxp ZCB0YWdzIGZvdW5kIGZvciBqdWxpYS14b3JnLWxpYnhmaXhlcy1qbGwKZ251L3BhY2thZ2VzL2p1 bGlhLWpsbC5zY206MjgxOjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGp1bGlh LWZvbnRjb25maWctamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjE3NzU6Njogd2Fybmlu Zzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEteG9yZy1saWJwdGhyZWFkLXN0dWJzLWps bApnbnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToxMzc5OjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRh Z3MgZm91bmQgZm9yIGp1bGlhLW9wdXMtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjQw Mjo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS1nZXR0ZXh0LWpsbApn bnUvcGFja2FnZXMvanVsaWEtamxsLnNjbToxNDUzOjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3Mg Zm91bmQgZm9yIGp1bGlhLXBpeG1hbi1qbGwKZ251L3BhY2thZ2VzL2p1bGlhLWpsbC5zY206MjM3 Mjo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxpYS14b3JnLXhjYi11dGls LXJlbmRlcnV0aWwtamxsCmdudS9wYWNrYWdlcy9qdWxpYS1qbGwuc2NtOjI2Mzc6Njogd2Fybmlu Zzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IganVsaWEtenN0ZC1qbGwKZ251L3BhY2thZ2VzL2p1 bGlhLWpsbC5zY206MjE0OTo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBqdWxp YS14b3JnLWxpYnhrYmZpbGUtamxsCgoMCjs7OyBvbmx5IHByZS1yZWxlYXNlcwpnbnUvcGFja2Fn ZXMvbGludXguc2NtOjEzMDY6Nzogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgcnRs ODgxMmF1LWFpcmNyYWNrLW5nLWxpbnV4LW1vZHVsZQpnbnUvcGFja2FnZXMvdmltLnNjbTo1OTY6 Nzogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgdmltLXNvbGFyaXplZApnbnUvcGFj a2FnZXMvbXVzaWMuc2NtOjIxMzM6MTI6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9y IHBvd2VydGFiZWRpdG9yCmdudS9wYWNrYWdlcy9tdXNpYy5zY206NDQ2MzoxNDogd2FybmluZzog bm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgcmtybHYyCmdudS9wYWNrYWdlcy9sdWEuc2NtOjI0ODox Mjogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgbHVhNS4xLXNvY2tldApnbnUvcGFj a2FnZXMvbHVhLnNjbToyNDg6MTI6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGx1 YTUuMi1zb2NrZXQKZ251L3BhY2thZ2VzL2d1aWxlLXh5ei5zY206Mzg2MzoxMjogd2FybmluZzog bm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgZ3VpbGUtYWMtZC1idXMKZ251L3BhY2thZ2VzL2dvbGFu Zy5zY206NDEzNjo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBnby1naXRodWIt Y29tLWJ0Y3N1aXRlLWJ0Y2QtYnRjZWMKZ251L3BhY2thZ2VzL2dhbWVzLnNjbTo3Mjc0OjU6IHdh cm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNvbG9ib3QKCjs7IF9iZXRhPG51bT4gc3Vm Zml4LCByZWZzL3RhZ3MvdjAuMV9iZXRhMgpnbnUvcGFja2FnZXMvY29tcHRvbi5zY206NTA6Nzog d2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgY29tcHRvbgoKOzsgYWxtb3N0IGFsbCB0 YWdzIGFyZSBwcmUtcmVsZWFzZXMKOzsgcmVmcy90YWdzLzAuMC40LTE1Mi1hbHBoYQo7OyByZWZz L3RhZ3MvMC4wLjQtMTUyLWFscGhhXnt9Cjs7IHJlZnMvdGFncy8wLjAuNC0xNzItYWxwaGEKOzsg cmVmcy90YWdzLzAuMC40LTE3Mi1hbHBoYV57fQo7OyByZWZzL3RhZ3MvMC4xLjAtYWxwaGEKOzsg cmVmcy90YWdzLzAuMS4wLWFscGhhXnt9Cjs7IHJlZnMvdGFncy8wLjEuMS1hbHBoYQo7OyByZWZz L3RhZ3MvMC4xLjEtYWxwaGFee30KOzsgcmVmcy90YWdzLzAuMS4yLWFscGhhCjs7IHJlZnMvdGFn cy8wLjEuMi1hbHBoYV57fQo7OyByZWZzL3RhZ3MvMC4yLjAtYWxwaGEKOzsgcmVmcy90YWdzLzAu Mi4wLWFscGhhXnt9Cjs7IHJlZnMvdGFncy9wcmUtZXh0ZW5zaW9uCjs7IHJlZnMvdGFncy92MC4w LjItYWxwaGEKOzsgcmVmcy90YWdzL3YwLjAuMy1hbHBoYQo7OyByZWZzL3RhZ3MvdjAuMC40LWFs cGhhCjs7IHJlZnMvdGFncy92MC4wLjQtYWxwaGFee30KOzsgcmVmcy90YWdzL3YwLjEuMC1hbHBo YQo7OyByZWZzL3RhZ3MvdjAuMS4wLWFscGhhXnt9Cjs7IHJlZnMvdGFncy92MC4xLjItY2FuZGlk YXRlCjs7IHJlZnMvdGFncy92MC4xLjItY2FuZGlkYXRlXnt9CmdudS9wYWNrYWdlcy9ndWlsZS14 eXouc2NtOjM0ODg6MTI6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIG5vbWFkCgoM Cjs7OyBubyBkZWxpbWl0ZXIgb3IganVzdCBvbmUgdmVyc2lvbiBudW1iZXIKZ251L3BhY2thZ2Vz L21haWwuc2NtOjU4Nzo1OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBuZW9tdXR0 CmdudS9wYWNrYWdlcy9zeW5jLnNjbTo1MTg6MTI6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91 bmQgZm9yIGNhc3luYwpnbnUvcGFja2FnZXMvcHVsc2VhdWRpby5zY206MzE1OjEyOiB3YXJuaW5n OiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBwb255bWl4CmdudS9wYWNrYWdlcy9uZXR3b3JraW5n LnNjbToxMjY2OjEyOiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBpcHV0aWxzCmdu dS9wYWNrYWdlcy9tdXNpYy5zY206Njg4NDoxMjogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3Vu ZCBmb3IgYTJqbWlkaWQKZ251L3BhY2thZ2VzL2VtdWxhdG9ycy5zY206NTY3OjU6IHdhcm5pbmc6 IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGhpZ2FuCmdudS9wYWNrYWdlcy9lbWFjcy14eXouc2Nt OjExNDg5OjU6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGVtYWNzLWx1YS1tb2Rl CmdudS9wYWNrYWdlcy9kaWZmb3Njb3BlLnNjbTo3NjoxMjogd2FybmluZzogbm8gdmFsaWQgdGFn cyBmb3VuZCBmb3IgZGlmZm9zY29wZQpnbnUvcGFja2FnZXMvY3Vwcy5zY206Njc6MTQ6IHdhcm5p bmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGJybGFzZXIKZ251L3BhY2thZ2VzL2NvZGUuc2Nt OjU3NToxMjogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Iga2NvdgpnbnUvcGFja2Fn ZXMvZ25vbWUteHl6LnNjbToxODU6NTogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Ig cGFwaXJ1cy1pY29uLXRoZW1lCmdudS9wYWNrYWdlcy9nbm9tZS14eXouc2NtOjM2NzoxMjogd2Fy bmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgZ25vbWUtc2hlbGwtZXh0ZW5zaW9uLWdzY29u bmVjdApnbnUvcGFja2FnZXMvZ25vbWUteHl6LnNjbToyODk6NTogd2FybmluZzogbm8gdmFsaWQg dGFncyBmb3VuZCBmb3IgZ25vbWUtc2hlbGwtZXh0ZW5zaW9uLXRvcGljb25zLXJlZHV4CmdudS9w YWNrYWdlcy9nb2xhbmcuc2NtOjExMTY6NTogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBm b3IgZ28tZ2l0aHViLWNvbS1vcC1nby1sb2dnaW5nCmdudS9wYWNrYWdlcy9qYXZhLnNjbToxMDU3 OToxMjogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgamF2YS1qYXZheC1pbmplY3QK Z251L3BhY2thZ2VzL21haWwuc2NtOjE0MTU6MTI6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91 bmQgZm9yIG5vdG11Y2gtYWRkcmxvb2t1cC1jCgoKCgoKCgwKOzs7IChNb3N0IGxpa2VseSkgbm90 IHNvbHZhYmxlIGJ5IHVzCjs7IG9ubHkgb25lIHRhZyAiaW5pdGlhbC1jb21taXQiCmdudS9wYWNr YWdlcy9idWlsZC10b29scy5zY206MjA4OjE0OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5k IGZvciBnbgoKOzsgPz8/IHRoZSB3ZWlyZGVzdCB2ZXJzaW9uIHNjaGVtZT8/Pwo7OyByZWZzL3Rh Z3MvYnpyLXJldm5vLTc4OTQKOzsgcmVmcy90YWdzL21vc2VzLTMuMi4xMy0xNS1Ob3YtMjAxMgo7 OyByZWZzL3RhZ3MvbW92ZWQtdG8tdXJlLWJhc2VkLXIybAo7OyByZWZzL3RhZ3Mvb2Jzb2xldGUt QysrLVBMTgo7OyByZWZzL3RhZ3Mvb2Jzb2xldGUtUHl0aG9uLVBMTgo7OyByZWZzL3RhZ3Mvb2xk LWVtYm9kaW1lbnRfOC1ub3YtMjAxNQo7OyByZWZzL3RhZ3Mvb2xkLW9wZW5wc2ktSmluaHVhLUNo dWEtMjAxMQo7OyByZWZzL3RhZ3Mvb2xkLXBhdHRlcm4tbWluZXItMTEtSnVuLTIwMTkKOzsgcmVm cy90YWdzL3YwLjEuNC1zdGFibGUKZ251L3BhY2thZ2VzL29wZW5jb2cuc2NtOjIwOToxNDogd2Fy bmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Igb3BlbmNvZwoKOzsgInF1aWNrbGlzcC0iIHBy ZWZpeCwgZGF0ZSBpbnN0ZWFkIG9mIHZlcnNpb24gbnVtYmVyCmdudS9wYWNrYWdlcy9saXNwLXh5 ei5zY206MzcwMzo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBzYmNsLXBvcnRh YmxlLXRocmVhZHMKCjs7IG5vIHZlcnNpb24gbnVtYmVyIGluIHRhZwpnbnUvcGFja2FnZXMvZ3Vp bGUteHl6LnNjbTozMjgzOjc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGd1aWxl LXNyZmktMTgwCmdudS9wYWNrYWdlcy9nb2xhbmcuc2NtOjYxOTM6MTQ6IHdhcm5pbmc6IG5vIHZh bGlkIHRhZ3MgZm91bmQgZm9yIGdvLWdpdGh1Yi1jb20tZ29sYW5nLWZyZWV0eXBlCmdudS9wYWNr YWdlcy9tZXNzYWdpbmcuc2NtOjE0OTU6MTQ6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQg Zm9yIGxpYnRveGNvcmUKZ251L3BhY2thZ2VzL25ldHdvcmtpbmcuc2NtOjM4MTQ6NTogd2Fybmlu Zzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgdmRlMgpnbnUvcGFja2FnZXMvbGlzcC14eXouc2Nt OjE1ODkyOjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLWJvZGdlLWJsb2Jz LXN1cHBvcnQKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTozMTIwOjc6IHdhcm5pbmc6IG5vIHZh bGlkIHRhZ3MgZm91bmQgZm9yIGNsLWNmZmktYy1yZWYKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNj bTo1OTc5Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIHNiY2wtaWVlZS1mbG9h dHMKZ251L3BhY2thZ2VzL2VuZ2luZWVyaW5nLnNjbTo4MTQ6MTQ6IHdhcm5pbmc6IG5vIHZhbGlk IHRhZ3MgZm91bmQgZm9yIGxpYmZpdmUKZ251L3BhY2thZ2VzL2NwcC5zY206MjIxOjE0OiB3YXJu aW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciByY3QKCjs7ICJnby53ZWVrbHkuIiBwcmVmaXgs IGRhdGUgaW5zdGVhZCBvZiB2ZXJzaW9uCmdudS9wYWNrYWdlcy9nb2xhbmcuc2NtOjM5MDU6Nzog d2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgZ28tZ2l0aHViLWNvbS1taWNoaXdlbmQt Z29sYW5nLXByZXR0eQoKOzsgd2VpcmQgdmVyc2lvbiBzY2hlbWUKOzsgcmVmcy90YWdzL1YzCjs7 IHJlZnMvdGFncy92ZXJzaW9uXzEKOzsgcmVmcy90YWdzL3d5aGFzaF9hbHBoYQo7OyByZWZzL3Rh Z3Mvd3loYXNoX2ZpbmFsCjs7IHJlZnMvdGFncy93eWhhc2hfdjQKOzsgcmVmcy90YWdzL3d5aGFz aF92NQpnbnUvcGFja2FnZXMvZGlnZXN0LnNjbTozNjoxMjogd2FybmluZzogbm8gdmFsaWQgdGFn cyBmb3VuZCBmb3Igd3loYXNoCgoKCgo7OzsgY291bGRuJ3QgYmUgYm90aGVyZWQgdG8gY2hlY2su Li4KZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTo2NTA4OjI6IHdhcm5pbmc6IG5vIHZhbGlkIHRh Z3MgZm91bmQgZm9yIGNsLXRyaXZpYQpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjEyMjE0Ojc6 IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLW1jY2xpbQpnbnUvcGFja2FnZXMv bGlzcC14eXouc2NtOjEzNjMzOjc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNs LWNsYXctdXRpbHMKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTozMTk1Ojc6IHdhcm5pbmc6IG5v IHZhbGlkIHRhZ3MgZm91bmQgZm9yIHNiY2wtcGFyZW5zY3JpcHQKZ251L3BhY2thZ2VzL2xpc3At eHl6LnNjbTo2NDY2Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLXRyaXZp YS50cml2aWFsCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206NjUwODoyOiB3YXJuaW5nOiBubyB2 YWxpZCB0YWdzIGZvdW5kIGZvciBlY2wtdHJpdmlhCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206 MTM1NjY6NTogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgY2wtY2xhdy1zdXBwb3J0 CmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206OTMyNjo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdz IGZvdW5kIGZvciBjbC1qcGVnCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206MTM1NjY6NTogd2Fy bmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Igc2JjbC1jbGF3LXN1cHBvcnQKZ251L3BhY2th Z2VzL2xpc3AteHl6LnNjbToxODM5NDo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZv ciBjbC10YWlscmVjCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206MTM5OjY6IHdhcm5pbmc6IG5v IHZhbGlkIHRhZ3MgZm91bmQgZm9yIHNiY2wtYm9kZ2UtdXRpbGl0aWVzCmdudS9wYWNrYWdlcy9s aXNwLXh5ei5zY206MTU4NjA6Njogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgZWNs LWJvZGdlLW1hdGgKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbToxMzU2Njo1OiB3YXJuaW5nOiBu byB2YWxpZCB0YWdzIGZvdW5kIGZvciBlY2wtY2xhdy1zdXBwb3J0CmdudS9wYWNrYWdlcy9saXNw LXh5ei5zY206MTc4Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLWJvZGdl LXF1ZXVlCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206NjUwODoyOiB3YXJuaW5nOiBubyB2YWxp ZCB0YWdzIGZvdW5kIGZvciBzYmNsLXRyaXZpYQpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjY4 MDc6Nzogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Igc2JjbC1zLXN5c2RlcHMKZ251 L3BhY2thZ2VzL2xpc3AteHl6LnNjbTo2NDY2Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91 bmQgZm9yIGVjbC10cml2aWEudHJpdmlhbApnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjUxOTo3 OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBjbC1maWFzY28KZ251L3BhY2thZ2Vz L2xpc3AteHl6LnNjbTo2ODA3Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGVj bC1zLXN5c2RlcHMKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTo4OTI5Ojc6IHdhcm5pbmc6IG5v IHZhbGlkIHRhZ3MgZm91bmQgZm9yIGVjbC1jbC1hc3luYwpnbnUvcGFja2FnZXMvbGlzcC14eXou c2NtOjMxOTU6Nzogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3IgY2wtcGFyZW5zY3Jp cHQKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTo5MzI2Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRh Z3MgZm91bmQgZm9yIGVjbC1jbC1qcGVnCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206NTE5Ojc6 IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGVjbC1maWFzY28KZ251L3BhY2thZ2Vz L2xpc3AteHl6LnNjbTozNzAzOjc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGVj bC1wb3J0YWJsZS10aHJlYWRzCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206MTIyMTQ6Nzogd2Fy bmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Igc2JjbC1tY2NsaW0KZ251L3BhY2thZ2VzL2xp c3AteHl6LnNjbTo4NjI4Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLW1p c2MtZXh0ZW5zaW9ucwpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjEzNjMzOjc6IHdhcm5pbmc6 IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGVjbC1jbGF3LXV0aWxzCmdudS9wYWNrYWdlcy9saXNw LXh5ei5zY206NTk3OTo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBjbC1pZWVl LWZsb2F0cwpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjE1ODkyOjY6IHdhcm5pbmc6IG5vIHZh bGlkIHRhZ3MgZm91bmQgZm9yIGVjbC1ib2RnZS1ibG9icy1zdXBwb3J0CmdudS9wYWNrYWdlcy9s aXNwLXh5ei5zY206MzEyMDo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBlY2wt Y2ZmaS1jLXJlZgpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjU5Nzk6Nzogd2FybmluZzogbm8g dmFsaWQgdGFncyBmb3VuZCBmb3IgZWNsLWllZWUtZmxvYXRzCmdudS9wYWNrYWdlcy9saXNwLXh5 ei5zY206MTM5OjY6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLWJvZGdlLXV0 aWxpdGllcwpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjE3ODo3OiB3YXJuaW5nOiBubyB2YWxp ZCB0YWdzIGZvdW5kIGZvciBlY2wtYm9kZ2UtcXVldWUKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNj bTo5MzI2Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIHNiY2wtY2wtanBlZwpn bnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjUxOTo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZv dW5kIGZvciBzYmNsLWZpYXNjbwpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjE1ODkyOjY6IHdh cm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIHNiY2wtYm9kZ2UtYmxvYnMtc3VwcG9ydApn bnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjEzOTo2OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZv dW5kIGZvciBlY2wtYm9kZ2UtdXRpbGl0aWVzCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206MzE5 NTo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBlY2wtcGFyZW5zY3JpcHQKZ251 L3BhY2thZ2VzL2xpc3AteHl6LnNjbTozMTIwOjc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91 bmQgZm9yIHNiY2wtY2ZmaS1jLXJlZgpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjE3ODo3OiB3 YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBzYmNsLWJvZGdlLXF1ZXVlCmdudS9wYWNr YWdlcy9saXNwLXh5ei5zY206ODYyODo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZv ciBlY2wtbWlzYy1leHRlbnNpb25zCmdudS9wYWNrYWdlcy9saXNwLXh5ei5zY206MTU4NjA6Njog d2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBmb3Igc2JjbC1ib2RnZS1tYXRoCmdudS9wYWNr YWdlcy9saXNwLXh5ei5zY206ODYyODo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZv ciBzYmNsLW1pc2MtZXh0ZW5zaW9ucwpnbnUvcGFja2FnZXMvbGlzcC14eXouc2NtOjE1ODYwOjY6 IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLWJvZGdlLW1hdGgKZ251L3BhY2th Z2VzL2xpc3AteHl6LnNjbToxMzYzMzo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZv ciBzYmNsLWNsYXctdXRpbHMKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTo2NDY2Ojc6IHdhcm5p bmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIHNiY2wtdHJpdmlhLnRyaXZpYWwKZ251L3BhY2th Z2VzL2xpc3AteHl6LnNjbToxODM5NDo3OiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZvdW5kIGZv ciBzYmNsLXRhaWxyZWMKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbToxODM5NDo3OiB3YXJuaW5n OiBubyB2YWxpZCB0YWdzIGZvdW5kIGZvciBlY2wtdGFpbHJlYwpnbnUvcGFja2FnZXMvbGlzcC14 eXouc2NtOjEyMjE0Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGVjbC1tY2Ns aW0KZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTo4OTI5Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRh Z3MgZm91bmQgZm9yIHNiY2wtY2wtYXN5bmMKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTo2ODA3 Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLXMtc3lzZGVwcwpnbnUvcGFj a2FnZXMvbGlzcC14eXouc2NtOjg5Mjk6Nzogd2FybmluZzogbm8gdmFsaWQgdGFncyBmb3VuZCBm b3IgY2wtYXN5bmMKZ251L3BhY2thZ2VzL2xpc3AteHl6LnNjbTozNzAzOjc6IHdhcm5pbmc6IG5v IHZhbGlkIHRhZ3MgZm91bmQgZm9yIGNsLXBvcnRhYmxlLXRocmVhZHMKZ251L3BhY2thZ2VzL2xp bnV4LnNjbToxMzA2Ojc6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIHJ0bDg4MTJh dS1haXJjcmFjay1uZy1saW51eC1tb2R1bGUKZ251L3BhY2thZ2VzL2xpbnV4LnNjbTo2Mjg0OjU6 IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIG1jZWxvZwpnbnUvcGFja2FnZXMva29k aS5zY206NDcwOjI6IHdhcm5pbmc6IG5vIHZhbGlkIHRhZ3MgZm91bmQgZm9yIGtvZGktd2F5bGFu ZApnbnUvcGFja2FnZXMva29kaS5zY206Mjc1OjEyOiB3YXJuaW5nOiBubyB2YWxpZCB0YWdzIGZv dW5kIGZvciBrb2RpCg== --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-import-Add-generic-git-updater.patch Content-Transfer-Encoding: quoted-printable From=20f924dbb835425f6b9a5796918125592870391405 Mon Sep 17 00:00:00 2001 Message-Id: From: Xinglu Chen Date: Fri, 3 Sep 2021 17:50:56 +0200 Subject: [PATCH] import: Add 'generic-git' updater. * guix/import/git.scm: New file. * doc/guix.texi (Invoking guix refresh): Document it. * Makefile.am (MODULES): Register it. * guix/git.scm (ls-remote-refs): New procedure. Co-authored-by: Sarah Morgensen =2D-- Makefile.am | 1 + doc/guix.texi | 27 ++++++ guix/git.scm | 33 +++++++ guix/import/git.scm | 217 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 278 insertions(+) create mode 100644 guix/import/git.scm diff --git a/Makefile.am b/Makefile.am index 3c79760734..c4d3a456b1 100644 =2D-- a/Makefile.am +++ b/Makefile.am @@ -254,6 +254,7 @@ MODULES =3D \ guix/import/egg.scm \ guix/import/elpa.scm \ guix/import/gem.scm \ + guix/import/git.scm \ guix/import/github.scm \ guix/import/gnome.scm \ guix/import/gnu.scm \ diff --git a/doc/guix.texi b/doc/guix.texi index 36a0c7f5ec..26afb1607a 100644 =2D-- a/doc/guix.texi +++ b/doc/guix.texi @@ -11920,6 +11920,33 @@ the updater for @uref{https://launchpad.net, Launc= hpad} packages. @item generic-html a generic updater that crawls the HTML page where the source tarball of the package is hosted, when applicable. +@item generic-git +a generic updater for packages hosted on Git repositories. It tries to +be smart about parsing Git tag names, but if it is not able to parse the +tag name and compare tags correctly, users can define the following +properties for a package. + +@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=20=20=20=20=20=20 + @end table =20 For instance, the following command only checks for updates of Emacs diff --git a/guix/git.scm b/guix/git.scm index 9c6f326c36..c5d0d2da8e 100644 =2D-- a/guix/git.scm +++ b/guix/git.scm @@ -56,6 +56,8 @@ commit-difference commit-relation =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 TAG= S? +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? ref) + (or (not tags?) (tag? ref)))) + + (with-libgit2 + (call-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)))))))) =20 ;;; diff --git a/guix/import/git.scm b/guix/import/git.scm new file mode 100644 index 0000000000..52c98de197 =2D-- /dev/null +++ b/guix/import/git.scm @@ -0,0 +1,217 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2021 Xinglu Chen +;;; Copyright =C2=A9 2021 Sarah Morgensen +;;; +;;; 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 git) + #:use-module (guix build utils) + #:use-module (guix diagnostics) + #:use-module (guix git) + #:use-module (guix git-download) + #:use-module (guix i18n) + #:use-module (guix packages) + #:use-module (guix upstream) + #:use-module (guix utils) + #:use-module (ice-9 format) + #:use-module (ice-9 match) + #:use-module (ice-9 rdelim) + #:use-module (ice-9 regex) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (srfi srfi-34) + #:use-module (srfi srfi-35) + #:export (%generic-git-updater)) + +;;; Commentary: +;;; +;;; This module provides a generic package updater for packages hosted on = Git +;;; repositories. +;;; +;;; It tries to be smart about tag names, but if it is not automatically a= ble +;;; to parse the tag names correctly, users can set the `tag-prefix', +;;; `tag-suffix' and `tag-version-delimiter' properties of the package to = make +;;; the updater parse the Git tag name correctly. +;;; +;;; Code: + +;;; Errors & warnings + +(define-condition-type &git-no-valid-tags-error &error + git-no-valid-tags-error?) + +(define (git-no-valid-tags-error) + (raise (condition (&message (message "no valid tags found")) + (&git-no-valid-tags-error)))) + +(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)))) + + +;;; Updater + +(define %pre-release-words + '("alpha" "beta" "rc" "dev" "test")) + +(define* (get-version-mapping tags #:key prefix suffix delim pre-releases?) + (define (guess-delim) + (let ((total (length tags)) + (dots (reduce + 0 (map (cut string-count <> #\.) tags))) + (dashes (reduce + 0 (map (cut string-count <> #\-) tags))) + (underscores (reduce + 0 (map (cut string-count <> #\_) tags)))) + (display (format #t "total: ~d, dots: ~d, dashes ~d, underscores ~d~= %" + total dots dashes underscores)) + (cond + ((>=3D dots (* total 0.35)) ".") + ((>=3D dashes (* total 0.8)) "-") + ((>=3D underscores (* total 0.8)) "_") + (else "")))) + + (define delim-rx (regexp-quote (or delim (guess-delim)))) + (define suffix-rx + (string-append + (or suffix + (if pre-releases? + (string-append ".*(" (string-join %pre-release-words "|") ").= *") + "")) + "$")) +=20=20 + (define prefix-rx (string-append "^" (or prefix "[^[:digit:]]*"))) + (pk delim-rx) + + (define tag-rx + (string-append "([[:digit:]][^" delim-rx "[:punct:]]*" + "(" delim-rx "[^[:punct:]" delim-rx "]+)" + ;; If there is are no delimiters, it could mean that t= he + ;; version just contains one number (e.g., "2"), thus,= use + ;; "*" instead of "+" to match zero or more numbers. + (if (string=3D? delim-rx "") "*" "+") + ")" suffix-rx)) + + (define (get-version tag) + (let ((tag-match (regexp-exec (make-regexp tag-rx) tag))) + (pk tag) + (pk tag-match) + (pk tag-rx) + (and tag-match + (regexp-exec (make-regexp prefix-rx) (match:prefix tag-match)) + (regexp-substitute/global + #f delim-rx (match:substring tag-match) + ;; Don't insert "." if there aren't any delimiters in the first + ;; place. + 'pre (if (string=3D? delim-rx "") "" ".") 'post)))) + + (define (entry (string-length "refs/tags/")) + (ls-remote-refs url #:tags? #t))) + (versions->tags + (get-version-mapping (if pre-releases? + tags + (filter (negate pre-release?) tags)) + #:prefix prefix + #:suffix suffix + #:delim delim + #:pre-releases? pre-releases?))) + (display versions->tags) + (newline) + (cond + ((null? tags) + (git-no-tags-error)) + ((null? versions->tags) + (git-no-valid-tags-error)) + (else + (match (last versions->tags) + ((version . tag) + (values version tag))))))) + +(define (latest-git-tag-version package tag-prefix tag-suffix + tag-version-delimiter refresh-pre-releases= ?) + "Given a PACKAGE, the TAG-PREFIX, TAG-SUFFIX, TAG-VERSION-DELIMITER, and +REFRESH-PRE-RELEASES? properties of PACKAGE, returns the latest version of +PACKAGE." + (guard (c ((or (git-no-tags-error? c) (git-no-valid-tags-error? c)) + (warning (or (package-field-location package 'source) + (package-location package)) + (G_ "~a for ~a~%") + (condition-message c) + (package-name package)) + #f) + ((eq? (exception-kind c) 'git-error) + (warning (or (package-field-location package 'source) + (package-location package)) + (G_ "failed to fetch Git repository for ~a~%") + (package-name package)) + #f)) + (let* ((source (package-source package)) + (url (git-reference-url (origin-uri source)))) + ;;(format #t "~a~%" (package-name package)) + (get-latest-tag url #:prefix tag-prefix #:suffix tag-suffix + #:delim tag-version-delimiter + #:pre-releases? refresh-pre-releases?)))) + +(define (git-package? package) + "Whether the origin of PACKAGE is a Git repostiory." + (match (package-source package) + ((? origin? origin) + (and (eq? (origin-method origin) git-fetch) + (git-reference? (origin-uri origin)))) + (_ #f))) + +(define (latest-git-release package) + "Return the latest release of PACKAGE." + (let* ((name (package-name package)) + (properties (package-properties package)) + (tag-prefix (assq-ref properties 'tag-prefix)) + (tag-suffix (assq-ref properties 'tag-suffix)) + (tag-version-delimiter (assq-ref properties 'tag-version-delimite= r)) + (refresh-pre-releases? (assq-ref properties 'refresh-pre-releases= ?)) + (old-version (package-version package)) + (url (git-reference-url (origin-uri (package-source package)))) + (new-version (latest-git-tag-version package + tag-prefix + tag-suffix + tag-version-delimiter + refresh-pre-releases?))) + + (if new-version + (upstream-source + (package name) + (version new-version) + (urls (list url))) + ;; No new release or no tags available. + #f))) + +(define %generic-git-updater + (upstream-updater + (name 'generic-git) + (description "Updater for packages hosted on Git repositories") + (pred git-package?) + (latest latest-git-release))) =2D-=20 2.33.0 --=-=-=-- --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQJJBAEBCAAzFiEEAVhh4yyK5+SEykIzrPUJmaL7XHkFAmE5ANcVHHB1YmxpY0B5 b2N0b2NlbGwueHl6AAoJEKz1CZmi+1x5QjoP/A7+M+zpmxPhDcR69CHICY0j850j eljZ0arJ38IiGAonrsQDd7uGsSoFqFfwN5sks/J1HlpAUiYpkYIJ+TX9f5NzIEoR FKdKO+IDScFsoesBnp1JYg4YvUYq0JgktZaBEAL1a6LsLlRqJ7lVgE0oWXbpcuKh uKW3c50/QFglL91avSfLU/BPc1fSGrLF12f8+pE/yD5WivpUH5+/xv+apk2xiLzD +/c6KVGsVvA5CvMl2IEQ9riui0SKbnhw48HGRrMArvxbh/zAlN7gaYTOuRmwlOoR pM00dlNTZn3yJFu9TzaY05yhD2FFsNmZVH9FBfmy6h1AqJhjL92JuqiQnUfaPGVM oek6NE/JT7TRAVWEhbh0ks5m4pBppYyxDKseK/A3EF/ZqeYe+QQSQajS3W0zhDOc dtbeqrHuxgawrvTyT3PdzA7T3BCJRgtseISwie4a5sziZb8fxTORE3qHx3CTN+0f 50UiiLmC+FBdak4LpZnCnzwQsct2bFrFH1kvDLuze1OJ9OpK5xd9UWfXXHLRbSv0 bAwxO350RKPIg6+e2Bfw3NP+zmUUNyMVp/KkqVRxZ78lp4r6F/xkW4n64u4zZezR Oe9M4OWiVg+byX7DPybbJybeafNXIq/PWW46hZ4vrD5dgub2Iow7Ctzt9t16aiAr ywZ5GSLN7s5M/Hgc =xwBb -----END PGP SIGNATURE----- --==-=-=--