diff options
-rw-r--r-- | guix/import/github.scm | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/guix/import/github.scm b/guix/import/github.scm index af9f56e1dc..ef3b21ad6c 100644 --- a/guix/import/github.scm +++ b/guix/import/github.scm @@ -163,7 +163,19 @@ empty list." "Return a string of the newest released version name given a string URL like 'https://github.com/arq5x/bedtools2/archive/v2.24.0.tar.gz' and the name of the package e.g. 'bedtools2'. Return #f if there is no releases" - (let* ((json (fetch-releases-or-tags url))) + (let* ((token (%github-token)) + (releases-api-url (string-append + "https://api.github.com/repos/" + (github-user-slash-repository url) + "/releases")) + (tags-api-url (string-append + "https://api.github.com/repos/" + (github-user-slash-repository url) + "/tags")) + (json (json-fetch + (if token + (string-append tags-api-url "?access_token=" token) + tags-api-url)))) (if (eq? json #f) (if (%github-token) (error "Error downloading release information through the GitHub @@ -172,21 +184,26 @@ API when using a GitHub token") API. This may be fixed by using an access token and setting the environment variable GUIX_GITHUB_TOKEN, for instance one procured from https://github.com/settings/tokens")) - (let loop ((releases - (filter - (lambda (x) - ;; example pre-release: - ;; https://github.com/wwood/OrfM/releases/tag/v0.5.1 - ;; or an all-prerelease set - ;; https://github.com/powertab/powertabeditor/releases - (not (hash-ref x "prerelease"))) - json))) - (match releases - (() ;empty release list + + (let ((proper-releases + (filter + (lambda (x) + ;; example pre-release: + ;; https://github.com/wwood/OrfM/releases/tag/v0.5.1 + ;; or an all-prerelease set + ;; https://github.com/powertab/powertabeditor/releases + (and (not (hash-ref x "prerelease")) + (string-prefix? "release_" + (or (hash-ref x "tag_name") + (hash-ref x "name"))))) + json))) + (match proper-releases + (() ;empty release list #f) - ((release . rest) ;one or more releases - (let ((tag (or (hash-ref release "tag_name") ;a "release" - (hash-ref release "name"))) ;a tag + + ((release . rest) ;one or more releases + (let ((tag (or (hash-ref release "tag_name") + (hash-ref release "name"))) (name-length (string-length package-name))) ;; some tags include the name of the package e.g. "fdupes-1.51" ;; so remove these @@ -197,15 +214,7 @@ https://github.com/settings/tokens")) ;; some tags start with a "v" e.g. "v0.25.0" ;; where some are just the version number (if (string-prefix? "v" tag) - (substring tag 1) - - ;; Finally, reject tags that don't start with a digit: - ;; they may not represent a release. - (if (and (not (string-null? tag)) - (char-set-contains? char-set:digit - (string-ref tag 0))) - tag - (loop rest))))))))))) + (substring tag 1) tag))))))))) (define (latest-release pkg) "Return an <upstream-source> for the latest release of PKG." |