From patchwork Wed Mar 13 11:11:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Arun Isaac X-Patchwork-Id: 1418 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 07B4316CED; Wed, 13 Mar 2019 11:12:14 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTP id 61CB616CCC for ; Wed, 13 Mar 2019 11:12:10 +0000 (GMT) Received: from localhost ([127.0.0.1]:42408 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h41nt-0001A3-W2 for patchwork@mira.cbaines.net; Wed, 13 Mar 2019 07:12:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:44733) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h41nn-00019g-TF for guix-patches@gnu.org; Wed, 13 Mar 2019 07:12:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h41nm-0002SV-9g for guix-patches@gnu.org; Wed, 13 Mar 2019 07:12:03 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:55799) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h41nm-0002SP-3e for guix-patches@gnu.org; Wed, 13 Mar 2019 07:12:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1h41nl-0002zo-RC for guix-patches@gnu.org; Wed, 13 Mar 2019 07:12:01 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#34839] [PATCH] import: Add Launchpad updater. Resent-From: Arun Isaac Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 13 Mar 2019 11:12:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 34839 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 34839@debbugs.gnu.org X-Debbugs-Original-To: guix-patches@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.155247550511485 (code B ref -1); Wed, 13 Mar 2019 11:12:01 +0000 Received: (at submit) by debbugs.gnu.org; 13 Mar 2019 11:11:45 +0000 Received: from localhost ([127.0.0.1]:41110 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1h41nO-0002yx-D7 for submit@debbugs.gnu.org; Wed, 13 Mar 2019 07:11:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:58433) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1h41nL-0002yf-Ga for submit@debbugs.gnu.org; Wed, 13 Mar 2019 07:11:37 -0400 Received: from lists.gnu.org ([209.51.188.17]:38456) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h41nG-0002IK-BA for submit@debbugs.gnu.org; Wed, 13 Mar 2019 07:11:30 -0400 Received: from eggs.gnu.org ([209.51.188.92]:44582) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h41nE-00016y-J3 for guix-patches@gnu.org; Wed, 13 Mar 2019 07:11:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h41nC-0002H3-VD for guix-patches@gnu.org; Wed, 13 Mar 2019 07:11:28 -0400 Received: from mugam.systemreboot.net ([139.59.75.54]:60710) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h41nB-0002FT-Qh for guix-patches@gnu.org; Wed, 13 Mar 2019 07:11:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=systemreboot.net; s=default; h=Content-Transfer-Encoding:Content-Type: MIME-Version:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=cV452yU2wLmGwSfs1hZowN7SwGD5P4vviSxXXHYvaMs=; b=fPCA3sWnZatZIsdE9uGLMNSPq8 X5P6u7c6SCecQeB16cYg3jnKI9FsuQDDRoyaEN1YKIs062NP0Q5xGUH7uvXjJ1qyq0bNQo2Zl6cMz 1Qescwz3IDIgAOQ/l+RqEf3AJj5SK9ui18ksaA9jV9asgb8n0xJ/HZRwNNXWuygI9RxE=; Received: from [14.139.128.10] (helo=localhost.localdomain) by systemreboot.net with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.91) (envelope-from ) id 1h41n7-0004iP-3r; Wed, 13 Mar 2019 16:41:21 +0530 From: Arun Isaac Date: Wed, 13 Mar 2019 16:41:11 +0530 Message-Id: <20190313111111.16325-1-arunisaac@systemreboot.net> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: "Guix-patches" X-getmail-retrieved-from-mailbox: Patches * guix/import/launchpad.scm: New file. * Makefile.am (MODULES): Register it. * doc/guix.texi (Invoking guix refresh): Mention the Launchpad updater. --- Makefile.am | 1 + doc/guix.texi | 4 +- guix/import/launchpad.scm | 124 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 guix/import/launchpad.scm diff --git a/Makefile.am b/Makefile.am index cf35770ba7..fc39599962 100644 --- a/Makefile.am +++ b/Makefile.am @@ -202,6 +202,7 @@ MODULES = \ guix/import/gnu.scm \ guix/import/hackage.scm \ guix/import/json.scm \ + guix/import/launchpad.scm \ guix/import/opam.scm \ guix/import/print.scm \ guix/import/pypi.scm \ diff --git a/doc/guix.texi b/doc/guix.texi index 82cf2babb2..40213ebdba 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -48,7 +48,7 @@ Copyright @copyright{} 2017 Maxim Cournoyer@* Copyright @copyright{} 2017, 2018 Tobias Geerinckx-Rice@* Copyright @copyright{} 2017 George Clemmer@* Copyright @copyright{} 2017 Andy Wingo@* -Copyright @copyright{} 2017, 2018 Arun Isaac@* +Copyright @copyright{} 2017, 2018, 2019 Arun Isaac@* Copyright @copyright{} 2017 nee@* Copyright @copyright{} 2018 Rutger Helling@* Copyright @copyright{} 2018 Oleg Pykhalov@* @@ -8716,6 +8716,8 @@ the updater for @uref{https://hackage.haskell.org, Hackage} packages. the updater for @uref{https://www.stackage.org, Stackage} packages. @item crate the updater for @uref{https://crates.io, Crates} packages. +@item launchpad +the updater for @uref{https://launchpad.net, Launchpad} packages. @end table For instance, the following command only checks for updates of Emacs diff --git a/guix/import/launchpad.scm b/guix/import/launchpad.scm new file mode 100644 index 0000000000..ffd5e9221e --- /dev/null +++ b/guix/import/launchpad.scm @@ -0,0 +1,124 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2019 Arun Isaac +;;; +;;; 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 launchpad) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (web uri) + #:use-module ((guix download) #:prefix download:) + #:use-module (guix import json) + #:use-module (guix packages) + #:use-module (guix upstream) + #:use-module (guix utils) + #:export (%launchpad-updater)) + +(define (find-extension url) + "Return the extension of the archive e.g. '.tar.gz' given a URL, or +false if none is recognized" + (find (lambda (x) (string-suffix? x url)) + (list ".tar.gz" ".tar.bz2" ".tar.xz" + ".zip" ".tar" ".tgz" ".tbz" ".love"))) + +(define (updated-launchpad-url old-package new-version) + ;; Return a url for the OLD-PACKAGE with NEW-VERSION. If no source url in + ;; the OLD-PACKAGE is a Launchpad url, then return false. + + (define (updated-url url) + (and (string-prefix? "https://launchpad.net/" url) + (let ((ext (or (find-extension url) "")) + (name (package-name old-package)) + (version (package-version old-package)) + (repo (launchpad-repository url))) + (cond + ((and + (>= (length (string-split version #\.)) 2) + (string=? (string-append "https://launchpad.net/" + repo "/" (version-major+minor version) + "/" version "/+download/" repo "-" version ext) + url)) + (string-append "https://launchpad.net/" + repo "/" (version-major+minor new-version) + "/" new-version "/+download/" repo "-" new-version ext)) + (#t #f))))) ; Some URLs are not recognised. + + (let ((source-uri (and=> (package-source old-package) origin-uri)) + (fetch-method (and=> (package-source old-package) origin-method))) + (cond + ((eq? fetch-method download:url-fetch) + (match source-uri + ((? string?) + (updated-url source-uri)) + ((source-uri ...) + (find updated-url source-uri)))) + (else #f)))) + +(define (launchpad-package? package) + "Return true if PACKAGE is a package from Launchpad, else false." + (->bool (updated-launchpad-url package "1.0.0"))) + +(define (launchpad-repository url) + "Return a string e.g. linuxdcpp of the name of the repository, from a string +URL of the form +'https://launchpad.net/linuxdcpp/1.1/1.1.0/+download/linuxdcpp-1.1.0.tar.bz2'" + (match (string-split (uri-path (string->uri url)) #\/) + ((_ repo . rest) repo))) + +(define (latest-released-version package-name) + "Return a string of the newest released version name given the PACKAGE-NAME, +for example, 'linuxdcpp'. Return #f if there is no releases." + (define (pre-release? x) + ;; Versions containing anything other than digit characters and "." (for + ;; example, "5.1.0-rc1") are assumed to be pre-releases. + (not (string-every (char-set-union (char-set #\.) + char-set:digit) + (hash-ref x "version")))) + + (hash-ref + (last (remove + pre-release? + (hash-ref (json-fetch + (string-append "https://api.launchpad.net/1.0/" + package-name "/releases")) + "entries"))) + "version")) + +(define (latest-release pkg) + "Return an for the latest release of PKG." + (define (origin-github-uri origin) + (match (origin-uri origin) + ((? string? url) url) ; surely a Launchpad URL + ((urls ...) + (find (cut string-contains <> "launchpad.net") urls)))) + + (let* ((source-uri (origin-github-uri (package-source pkg))) + (name (package-name pkg)) + (newest-version (latest-released-version name))) + (if newest-version + (upstream-source + (package name) + (version newest-version) + (urls (list (updated-launchpad-url pkg newest-version)))) + #f))) ; On Launchpad but no proper releases + +(define %launchpad-updater + (upstream-updater + (name 'launchpad) + (description "Updater for Launchpad packages") + (pred launchpad-package?) + (latest latest-release)))