From mboxrd@z Thu Jan 1 00:00:00 1970 From: Leo Famulari Subject: bug#22752: 01/01: import: gem: Add updater. Date: Sun, 21 Feb 2016 00:55:05 -0500 Message-ID: <20160221055505.GB26827@jasmine> References: <20160220105236.17956.75431@vcs.savannah.gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:49884) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXN01-0002f2-EA for bug-guix@gnu.org; Sun, 21 Feb 2016 00:56:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aXMzy-0006m2-5P for bug-guix@gnu.org; Sun, 21 Feb 2016 00:56:05 -0500 Received: from debbugs.gnu.org ([208.118.235.43]:38604) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXMzy-0006ly-1g for bug-guix@gnu.org; Sun, 21 Feb 2016 00:56:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84) (envelope-from ) id 1aXMzx-0005nb-Ql for bug-guix@gnu.org; Sun, 21 Feb 2016 00:56:01 -0500 Sender: "Debbugs-submit" Resent-Message-ID: Received: from eggs.gnu.org ([2001:4830:134:3::10]:49800) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXMzC-0002X0-60 for bug-guix@gnu.org; Sun, 21 Feb 2016 00:55:15 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aXMz8-0006ix-RW for bug-guix@gnu.org; Sun, 21 Feb 2016 00:55:14 -0500 Received: from out4-smtp.messagingengine.com ([66.111.4.28]:45583) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXMz8-0006it-NQ for bug-guix@gnu.org; Sun, 21 Feb 2016 00:55:10 -0500 Received: from localhost (c-69-249-5-231.hsd1.pa.comcast.net [69.249.5.231]) by mail.messagingengine.com (Postfix) with ESMTPA id B2FACC0001A for ; Sun, 21 Feb 2016 00:55:09 -0500 (EST) Content-Disposition: inline In-Reply-To: List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org To: 22752@debbugs.gnu.org On Sat, Feb 20, 2016 at 10:53:05AM +0000, Ben Woodcroft wrote: > benwoodcroft pushed a commit to branch master > in repository guix. > > commit fbc5b815cce85a6af75226ab16acf243fd7d22ce > Author: Ben Woodcroft > Date: Fri Jan 1 16:56:07 2016 +1000 > > import: gem: Add updater. Since this commit, I can no longer use guix refresh. For example: $ ./pre-inst-env guix refresh --help guix: refresh: command not found Try `guix --help' for more information. $ file guix/scripts/refresh.go guix/scripts/refresh.go: Guile Object, little endian, 64bit, bytecode v2.0 > > * guix/import/gem.scm (guix-package->gem-name, > gem-package?, latest-release): New procedures. > (%gem-updater): New variable. > (rubygems-fetch): Wrap body in > 'call-with-output-file' and 'with-error-to-port'. > * guix/scripts/refresh.scm (%updaters): Add %GEM-UPDATER. > * doc/guix.texi (Invoking guix refresh): Mention RubyGems. > --- > doc/guix.texi | 2 + > guix/import/gem.scm | 63 +++++++++++++++++++++++++++++++++++++++++++-- > guix/scripts/refresh.scm | 5 +++- > 3 files changed, 66 insertions(+), 4 deletions(-) > > diff --git a/doc/guix.texi b/doc/guix.texi > index c5a7de7..b991cc1 100644 > --- a/doc/guix.texi > +++ b/doc/guix.texi > @@ -4571,6 +4571,8 @@ the updater for @uref{http://cran.r-project.org/, CRAN} packages; > the updater for @uref{http://www.bioconductor.org/, Bioconductor} R packages; > @item pypi > the updater for @uref{https://pypi.python.org, PyPI} packages. > +@item gem > +the updater for @uref{https://rubygems.org, RubyGems} packages. > @end table > > For instance, the following command only checks for updates of Emacs > diff --git a/guix/import/gem.scm b/guix/import/gem.scm > index 4b2a253..b46622f 100644 > --- a/guix/import/gem.scm > +++ b/guix/import/gem.scm > @@ -1,5 +1,6 @@ > ;;; GNU Guix --- Functional package management for GNU > ;;; Copyright © 2015 David Thompson > +;;; Copryight © 2016 Ben Woodcroft > ;;; > ;;; This file is part of GNU Guix. > ;;; > @@ -19,21 +20,33 @@ > (define-module (guix import gem) > #:use-module (ice-9 match) > #:use-module (ice-9 pretty-print) > + #:use-module (srfi srfi-1) > #:use-module (rnrs bytevectors) > #:use-module (json) > #:use-module (web uri) > + #:use-module ((guix download) #:prefix download:) > #:use-module (guix import utils) > #:use-module (guix import json) > #:use-module (guix packages) > + #:use-module (guix upstream) > #:use-module (guix licenses) > #:use-module (guix base32) > - #:export (gem->guix-package)) > + #:use-module (guix build-system ruby) > + #:use-module (gnu packages) > + #:export (gem->guix-package > + %gem-updater)) > > (define (rubygems-fetch name) > "Return an alist representation of the RubyGems metadata for the package NAME, > or #f on failure." > - (json-fetch > - (string-append "https://rubygems.org/api/v1/gems/" name ".json"))) > + ;; XXX: We want to silence the download progress report, which is especially > + ;; annoying for 'guix refresh', but we have to use a file port. > + (call-with-output-file "/dev/null" > + (lambda (null) > + (with-error-to-port null > + (lambda () > + (json-fetch > + (string-append "https://rubygems.org/api/v1/gems/" name ".json"))))))) > > (define (ruby-package-name name) > "Given the NAME of a package on RubyGems, return a Guix-compliant name for > @@ -132,3 +145,47 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES." > (assoc-ref package "licenses")))) > (make-gem-sexp name version hash home-page synopsis > description dependencies licenses))))) > + > +(define (guix-package->gem-name package) > + "Given a PACKAGE built from rubygems.org, return the name of the > +package on RubyGems." > + (let ((source-url (and=> (package-source package) origin-uri))) > + ;; The URL has the form: > + ;; 'https://rubygems.org/downloads/' + > + ;; package name + '-' + version + '.gem' > + ;; e.g. "https://rubygems.org/downloads/hashery-2.1.1.gem" > + (substring source-url 31 (string-rindex source-url #\-)))) > + > +(define (gem-package? package) > + "Return true if PACKAGE is a gem package from RubyGems." > + > + (define (rubygems-url? url) > + (string-prefix? "https://rubygems.org/downloads/" url)) > + > + (let ((source-url (and=> (package-source package) origin-uri)) > + (fetch-method (and=> (package-source package) origin-method))) > + (and (eq? fetch-method download:url-fetch) > + (match source-url > + ((? string?) > + (rubygems-url? source-url)) > + ((source-url ...) > + (any rubygems-url? source-url)))))) > + > +(define (latest-release guix-package) > + "Return an for the latest release of GUIX-PACKAGE." > + (let* ((gem-name (guix-package->gem-name > + (specification->package guix-package))) > + (metadata (rubygems-fetch gem-name)) > + (version (assoc-ref metadata "version")) > + (url (rubygems-uri gem-name version))) > + (upstream-source > + (package guix-package) > + (version version) > + (urls (list url))))) > + > +(define %gem-updater > + (upstream-updater > + (name 'gem) > + (description "Updater for RubyGem packages") > + (pred gem-package?) > + (latest latest-release))) > diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm > index f9e3f31..bb38f09 100644 > --- a/guix/scripts/refresh.scm > +++ b/guix/scripts/refresh.scm > @@ -3,6 +3,7 @@ > ;;; Copyright © 2013 Nikita Karetnikov > ;;; Copyright © 2014 Eric Bavier > ;;; Copyright © 2015 Alex Kost > +;;; Copyright © 2016 Ben Woodcroft > ;;; > ;;; This file is part of GNU Guix. > ;;; > @@ -34,6 +35,7 @@ > #:select (%gnu-updater %gnome-updater)) > #:use-module (guix import elpa) > #:use-module (guix import cran) > + #:use-module (guix import gem) > #:use-module (guix gnupg) > #:use-module (gnu packages) > #:use-module ((gnu packages commencement) #:select (%final-inputs)) > @@ -196,7 +198,8 @@ unavailable optional dependencies such as Guile-JSON." > %elpa-updater > %cran-updater > %bioconductor-updater > - ((guix import pypi) => %pypi-updater))) > + ((guix import pypi) => %pypi-updater) > + ((guix import gem) => %gem-updater))) > > (define (lookup-updater name) > "Return the updater called NAME." >