GNU bug report logs - #42800
[PATCH] Add (guix git-repo-download).

Previous Next

Package: guix-patches;

Reported by: Danny Milosavljevic <dannym <at> scratchpost.org>

Date: Mon, 10 Aug 2020 14:32:02 UTC

Severity: normal

Tags: patch

Done: Danny Milosavljevic <dannym <at> scratchpost.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 42800 in the body.
You can then email your comments to 42800 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#42800; Package guix-patches. (Mon, 10 Aug 2020 14:32:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Danny Milosavljevic <dannym <at> scratchpost.org>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Mon, 10 Aug 2020 14:32:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: guix-patches <at> gnu.org
Cc: Danny Milosavljevic <dannym <at> scratchpost.org>
Subject: [PATCH] Add (guix git-repo-download).
Date: Mon, 10 Aug 2020 13:39:31 +0200
* guix/build/git-repo.scm: New file.
* guix/git-repo-download.scm: New file.
* Makefile.am (MODULES): Add them.
---
 Makefile.am                |   2 +
 guix/build/git-repo.scm    |  74 +++++++++++++++++
 guix/git-repo-download.scm | 158 +++++++++++++++++++++++++++++++++++++
 3 files changed, 234 insertions(+)
 create mode 100644 guix/build/git-repo.scm
 create mode 100644 guix/git-repo-download.scm

diff --git a/Makefile.am b/Makefile.am
index 1e2c26f5ac..9c27113673 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -82,6 +82,7 @@ MODULES =					\
   guix/discovery.scm				\
   guix/bzr-download.scm            		\
   guix/git-download.scm				\
+  guix/git-repo-download.scm			\
   guix/hg-download.scm				\
   guix/swh.scm					\
   guix/monads.scm				\
@@ -176,6 +177,7 @@ MODULES =					\
   guix/build/bzr.scm				\
   guix/build/copy-build-system.scm		\
   guix/build/git.scm				\
+  guix/build/git-repo.scm			\
   guix/build/hg.scm				\
   guix/build/glib-or-gtk-build-system.scm	\
   guix/build/gnu-bootstrap.scm			\
diff --git a/guix/build/git-repo.scm b/guix/build/git-repo.scm
new file mode 100644
index 0000000000..571a022224
--- /dev/null
+++ b/guix/build/git-repo.scm
@@ -0,0 +1,74 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2014, 2016, 2019 Ludovic Courtès <ludo <at> gnu.org>
+;;; Copyright © 2020 Danny Milosavljevic <dannym <at> scratchpost.org>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix build git-repo)
+  #:use-module (guix build utils)
+  #:use-module (srfi srfi-34)
+  #:use-module (ice-9 format)
+  #:export (git-repo-fetch))
+
+;;; Commentary:
+;;;
+;;; This is the build-side support code of (guix git-repo-download).  It
+;;; allows a Git-repo repository to be cloned and checked out at a specific
+;;; revision.
+;;;
+;;; Code:
+
+(define* (git-repo-fetch manifest-url manifest-revision directory
+                    #:key (git-repo-command "git-repo"))
+  "Fetch packages according to the manifest at MANIFEST-URL with
+MANIFEST-REVISION.  MANIFEST-REVISION must be either a revision
+or a branch.  Return #t on success, #f otherwise."
+
+  ;; Disable TLS certificate verification.  The hash of the checkout is known
+  ;; in advance anyway.
+  (setenv "GIT_SSL_NO_VERIFY" "true")
+
+  (mkdir-p directory)
+
+  (guard (c ((invoke-error? c)
+             (format (current-error-port)
+                     "git-repo-fetch: '~a~{ ~a~}' failed with exit code ~a~%"
+                     (invoke-error-program c)
+                     (invoke-error-arguments c)
+                     (or (invoke-error-exit-status c) ;XXX: not quite accurate
+                         (invoke-error-stop-signal c)
+                         (invoke-error-term-signal c)))
+             (delete-file-recursively directory)
+             #f))
+    (with-directory-excursion directory
+      (invoke git-repo-command "init" "-u" manifest-url "-b" manifest-revision
+              "--depth=1")
+      (invoke git-repo-command "sync" "-c" "--fail-fast" "-v" "-j" "3")
+
+      ;; Delete vendor/**/.git, system/**/.git, toolchain/**/.git,
+      ;; .repo/**/.git etc since they contain timestamps.
+      (for-each delete-file-recursively
+       (find-files "." "^\\.git$" #:directories? #t))
+
+      ;; Delete git state directories since they contain timestamps.
+      (for-each delete-file-recursively
+       (find-files ".repo" "^.*\\.git$" #:directories? #t))
+
+      ;; This file contains timestamps.
+      (delete-file ".repo/.repo_fetchtimes.json")
+      #t)))
+
+;;; git-repo.scm ends here
diff --git a/guix/git-repo-download.scm b/guix/git-repo-download.scm
new file mode 100644
index 0000000000..27f7f1fa8d
--- /dev/null
+++ b/guix/git-repo-download.scm
@@ -0,0 +1,158 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo <at> gnu.org>
+;;; Copyright © 2017 Mathieu Lirzin <mthl <at> gnu.org>
+;;; Copyright © 2017 Christopher Baines <mail <at> cbaines.net>
+;;; Copyright © 2020 Jakub Kądziołka <kuba <at> kadziolka.net>
+;;; Copyright © 2020 Danny Milosavljevic <dannym <at> scratchpost.org>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix git-repo-download)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:use-module (guix monads)
+  #:use-module (guix records)
+  #:use-module (guix packages)
+  #:use-module (guix modules)
+  #:autoload   (guix build-system gnu) (standard-packages)
+  #:use-module (git) ; FIXME Remove
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 vlist)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-35)
+  #:export (git-repo-reference
+            git-repo-reference?
+            git-repo-reference-mainfest-url
+            git-repo-reference-revision
+
+            git-repo-fetch
+            git-repo-version
+            git-repo-file-name))
+
+;;; Commentary:
+;;;
+;;; An <origin> method that fetches a specific commit from a git-repo
+;;; repository.
+;;; The repository's manifest (URL and revision) can be specified with a
+;; <git-repo-reference> object.
+;;;
+;;; Code:
+
+(define-record-type* <git-repo-reference>
+  git-repo-reference make-git-repo-reference
+  git-repo-reference?
+  (manifest-url        git-repo-reference-manifest-url)
+  (manifest-revision   git-repo-reference-manifest-revision))
+
+(define (git-repo-package)
+  "Return the default git-repo package."
+  (let ((distro (resolve-interface '(gnu packages android))))
+    (module-ref distro 'git-repo)))
+
+(define* (git-repo-fetch ref hash-algo hash
+                    #:optional name
+                    #:key (system (%current-system)) (guile (default-guile))
+                    (git-repo (git-repo-package)))
+  "Return a fixed-output derivation that fetches REF, a <git-repo-reference>
+object.  The output is expected to have recursive hash HASH of type
+HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
+  ;; TODO: Remove.
+  (define inputs
+    (standard-packages))
+
+  (define zlib
+    (module-ref (resolve-interface '(gnu packages compression)) 'zlib))
+
+  (define guile-json
+    (module-ref (resolve-interface '(gnu packages guile)) 'guile-json-3))
+
+  (define gnutls
+    (module-ref (resolve-interface '(gnu packages tls)) 'gnutls))
+
+  (define config.scm
+    (scheme-file "config.scm"
+                 #~(begin
+                     (define-module (guix config)
+                       #:export (%libz))
+
+                     (define %libz
+                       #+(file-append zlib "/lib/libz")))))
+
+  (define modules
+    (cons `((guix config) => ,config.scm)
+          (delete '(guix config)
+                  (source-module-closure '((guix build git-repo)
+                                           (guix build utils)
+                                           (guix build download-nar))))))
+
+  (define build
+    (with-imported-modules modules
+      (with-extensions (list guile-json gnutls)   ;for (guix swh)
+        #~(begin
+            (use-modules (guix build git-repo)
+                         (guix build utils)
+                         (guix build download-nar)
+                         (ice-9 match))
+
+            ;; The 'git submodule' commands expects Coreutils, sed,
+            ;; grep, etc. to be in $PATH.
+            (set-path-environment-variable "PATH" '("bin")
+                                           (match '#+inputs
+                                             (((names dirs outputs ...) ...)
+                                              dirs)))
+
+            (setvbuf (current-output-port) 'line)
+            (setvbuf (current-error-port) 'line)
+
+            (or (git-repo-fetch (getenv "git-repo manifest-url")
+                                (getenv "git-repo manifest-revision")
+                                #$output
+                                #:git-repo-command
+                                (string-append #+git-repo "/bin/repo"))
+                (download-nar #$output))))))
+
+  (mlet %store-monad ((guile (package->derivation guile system)))
+    (gexp->derivation (or name "git-repo-checkout") build
+
+                      ;; Use environment variables and a fixed script name so
+                      ;; there's only one script in store for all the
+                      ;; downloads.
+                      #:script-name "git-repo-download"
+                      #:env-vars
+                      `(("git-repo manifest-url" .
+                         ,(git-repo-reference-manifest-url ref))
+                        ("git-repo manifest-revision" .
+                         ,(git-repo-reference-manifest-revision ref)))
+                      #:leaked-env-vars '("http_proxy" "https_proxy"
+                                          "LC_ALL" "LC_MESSAGES" "LANG"
+                                          "COLUMNS")
+                      #:system system
+                      #:local-build? #t           ;don't offload repo cloning
+                      #:hash-algo hash-algo
+                      #:hash hash
+                      #:recursive? #t
+                      #:guile-for-build guile)))
+
+(define (git-repo-version version revision)
+  "Return the version string for packages using git-repo-download."
+  (string-append version "-" (string-join (string-split revision #\/) "_")))
+
+(define (git-repo-file-name name version)
+  "Return the file-name for packages using git-repo-download."
+  (string-append name "-" version "-checkout"))
+
+




Information forwarded to guix-patches <at> gnu.org:
bug#42800; Package guix-patches. (Mon, 10 Aug 2020 14:52:01 GMT) Full text and rfc822 format available.

Message #8 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Jakub Kądziołka <kuba <at> kadziolka.net>
To: Danny Milosavljevic <dannym <at> scratchpost.org>
Cc: guix-patches <at> gnu.org
Subject: Re: [PATCH] Add (guix git-repo-download).
Date: Mon, 10 Aug 2020 16:50:58 +0200
[Message part 1 (text/plain, inline)]
On Mon, Aug 10, 2020 at 01:39:31PM +0200, Danny Milosavljevic wrote:
> * guix/build/git-repo.scm: New file.
> * guix/git-repo-download.scm: New file.
> * Makefile.am (MODULES): Add them.
> ---
>  Makefile.am                |   2 +
>  guix/build/git-repo.scm    |  74 +++++++++++++++++
>  guix/git-repo-download.scm | 158 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 234 insertions(+)
>  create mode 100644 guix/build/git-repo.scm
>  create mode 100644 guix/git-repo-download.scm

Danny,

I think the commit message and/or commentary is written somewhat
confusingly here. It took me a while to realize that "git-repo" is the
name of a tool that manages a multi-repository, and not just short for
"git repository".

How about replacing "git-repo repository" with "repository managed with
the git-repo tool" or "git-repo-based multirepository"?

Regards,
Jakub Kądziołka
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#42800; Package guix-patches. (Mon, 10 Aug 2020 15:06:01 GMT) Full text and rfc822 format available.

Message #11 received at 42800 <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: Jakub Kądziołka <kuba <at> kadziolka.net>
Cc: 42800 <at> debbugs.gnu.org
Subject: Re: [PATCH] Add (guix git-repo-download).
Date: Mon, 10 Aug 2020 17:05:12 +0200
[Message part 1 (text/plain, inline)]
Hi,

On Mon, 10 Aug 2020 16:50:58 +0200
Jakub Kądziołka <kuba <at> kadziolka.net> wrote:

> I think the commit message and/or commentary is written somewhat
> confusingly here. It took me a while to realize that "git-repo" is the
> name of a tool that manages a multi-repository, and not just short for
> "git repository".
> How about replacing "git-repo repository" with "repository managed with
> the git-repo tool" or "git-repo-based multirepository"?

Sure.  Where?  In the "Commentary" comment?  Good idea.

The naming "git-repo" is not great.  To be fair to upstream, their tool is
called "repo", not "git-repo".  Not sure if that's better though.

Also, I thought about naming our downloader (guix repo-download) instead of
(guix git-repo-download), but I thought that wouldn't improve things either.
Would it?
[Message part 2 (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#42800; Package guix-patches. (Mon, 10 Aug 2020 15:39:02 GMT) Full text and rfc822 format available.

Message #14 received at 42800 <at> debbugs.gnu.org (full text, mbox):

From: Jakub Kądziołka <kuba <at> kadziolka.net>
To: Danny Milosavljevic <dannym <at> scratchpost.org>
Cc: 42800 <at> debbugs.gnu.org
Subject: Re: [PATCH] Add (guix git-repo-download).
Date: Mon, 10 Aug 2020 17:38:42 +0200
[Message part 1 (text/plain, inline)]
On Mon, Aug 10, 2020 at 05:05:12PM +0200, Danny Milosavljevic wrote:
> Hi,
> 
> On Mon, 10 Aug 2020 16:50:58 +0200
> Jakub Kądziołka <kuba <at> kadziolka.net> wrote:
> 
> > I think the commit message and/or commentary is written somewhat
> > confusingly here. It took me a while to realize that "git-repo" is the
> > name of a tool that manages a multi-repository, and not just short for
> > "git repository".
> > How about replacing "git-repo repository" with "repository managed with
> > the git-repo tool" or "git-repo-based multirepository"?
> 
> Sure.  Where?  In the "Commentary" comment?  Good idea.

Yup.

> The naming "git-repo" is not great.  To be fair to upstream, their tool is
> called "repo", not "git-repo".  Not sure if that's better though.
> 
> Also, I thought about naming our downloader (guix repo-download) instead of
> (guix git-repo-download), but I thought that wouldn't improve things either.
> Would it?

Is the tool used at all outside of Android? Perhaps
android-repo-download would be a better disambugator?

Regards,
Jakub Kądziołka
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#42800; Package guix-patches. (Wed, 12 Aug 2020 22:49:01 GMT) Full text and rfc822 format available.

Message #17 received at 42800 <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: 42800 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym <at> scratchpost.org>
Subject: [PATCH v2] Add (guix android-repo-download).
Date: Thu, 13 Aug 2020 00:12:08 +0200
* guix/build/android-repo.scm: New file.
* guix/android-repo-download.scm: New file.
* Makefile.am (MODULES): Add them.
---
 Makefile.am                    |   2 +
 guix/android-repo-download.scm | 160 +++++++++++++++++++++++++++++++++
 guix/build/android-repo.scm    |  74 +++++++++++++++
 3 files changed, 236 insertions(+)
 create mode 100644 guix/android-repo-download.scm
 create mode 100644 guix/build/android-repo.scm

diff --git a/Makefile.am b/Makefile.am
index ee86571dcc..249cd24135 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -80,6 +80,7 @@ MODULES =					\
   guix/modules.scm				\
   guix/download.scm				\
   guix/discovery.scm				\
+  guix/android-repo-download.scm		\
   guix/bzr-download.scm            		\
   guix/git-download.scm				\
   guix/hg-download.scm				\
@@ -172,6 +173,7 @@ MODULES =					\
   guix/build/minify-build-system.scm		\
   guix/build/font-build-system.scm		\
   guix/build/go-build-system.scm		\
+  guix/build/android-repo.scm			\
   guix/build/asdf-build-system.scm		\
   guix/build/bzr.scm				\
   guix/build/copy-build-system.scm		\
diff --git a/guix/android-repo-download.scm b/guix/android-repo-download.scm
new file mode 100644
index 0000000000..722e885ec9
--- /dev/null
+++ b/guix/android-repo-download.scm
@@ -0,0 +1,160 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo <at> gnu.org>
+;;; Copyright © 2017 Mathieu Lirzin <mthl <at> gnu.org>
+;;; Copyright © 2017 Christopher Baines <mail <at> cbaines.net>
+;;; Copyright © 2020 Jakub Kądziołka <kuba <at> kadziolka.net>
+;;; Copyright © 2020 Danny Milosavljevic <dannym <at> scratchpost.org>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix android-repo-download)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:use-module (guix monads)
+  #:use-module (guix records)
+  #:use-module (guix packages)
+  #:use-module (guix modules)
+  #:autoload   (guix build-system gnu) (standard-packages)
+  #:use-module (git) ; FIXME Remove
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 vlist)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-35)
+  #:export (android-repo-reference
+            android-repo-reference?
+            android-repo-reference-mainfest-url
+            android-repo-reference-revision
+
+            android-repo-fetch
+            android-repo-version
+            android-repo-file-name))
+
+;;; Commentary:
+;;;
+;;; An <origin> method that fetches a specific commit from an Android Repo
+;;; repository.
+;;; The repository's manifest (URL and revision) can be specified with a
+;; <android-repo-reference> object.
+;;;
+;;; Code:
+
+(define-record-type* <android-repo-reference>
+  android-repo-reference make-android-repo-reference
+  android-repo-reference?
+  (manifest-url        android-repo-reference-manifest-url)
+  (manifest-revision   android-repo-reference-manifest-revision))
+
+(define (git-repo-package)
+  "Return the default git-repo package."
+  (let ((distro (resolve-interface '(gnu packages android))))
+    (module-ref distro 'git-repo)))
+
+(define* (android-repo-fetch ref hash-algo hash
+                             #:optional name
+                             #:key (system (%current-system))
+                             (guile (default-guile))
+                             (git-repo (git-repo-package)))
+  "Return a fixed-output derivation that fetches REF, an
+<android-repo-reference> object.  The output is expected to have recursive
+hash HASH of type HASH-ALGO (a symbol).  Use NAME as the file name, or a
+generic name if #f."
+  ;; TODO: Remove.
+  (define inputs
+    (standard-packages))
+
+  (define zlib
+    (module-ref (resolve-interface '(gnu packages compression)) 'zlib))
+
+  (define guile-json
+    (module-ref (resolve-interface '(gnu packages guile)) 'guile-json-3))
+
+  (define gnutls
+    (module-ref (resolve-interface '(gnu packages tls)) 'gnutls))
+
+  (define config.scm
+    (scheme-file "config.scm"
+                 #~(begin
+                     (define-module (guix config)
+                       #:export (%libz))
+
+                     (define %libz
+                       #+(file-append zlib "/lib/libz")))))
+
+  (define modules
+    (cons `((guix config) => ,config.scm)
+          (delete '(guix config)
+                  (source-module-closure '((guix build android-repo)
+                                           (guix build utils)
+                                           (guix build download-nar))))))
+
+  (define build
+    (with-imported-modules modules
+      (with-extensions (list guile-json gnutls)   ;for (guix swh)
+        #~(begin
+            (use-modules (guix build android-repo)
+                         (guix build utils)
+                         (guix build download-nar)
+                         (ice-9 match))
+
+            ;; The 'git submodule' commands expects Coreutils, sed,
+            ;; grep, etc. to be in $PATH.
+            (set-path-environment-variable "PATH" '("bin")
+                                           (match '#+inputs
+                                             (((names dirs outputs ...) ...)
+                                              dirs)))
+
+            (setvbuf (current-output-port) 'line)
+            (setvbuf (current-error-port) 'line)
+
+            (or (android-repo-fetch (getenv "android-repo manifest-url")
+                                    (getenv "android-repo manifest-revision")
+                                    #$output
+                                    #:git-repo-command
+                                    (string-append #+git-repo "/bin/repo"))
+                (download-nar #$output))))))
+
+  (mlet %store-monad ((guile (package->derivation guile system)))
+    (gexp->derivation (or name "android-repo-checkout") build
+
+                      ;; Use environment variables and a fixed script name so
+                      ;; there's only one script in store for all the
+                      ;; downloads.
+                      #:script-name "android-repo-download"
+                      #:env-vars
+                      `(("android-repo manifest-url" .
+                         ,(android-repo-reference-manifest-url ref))
+                        ("android-repo manifest-revision" .
+                         ,(android-repo-reference-manifest-revision ref)))
+                      #:leaked-env-vars '("http_proxy" "https_proxy"
+                                          "LC_ALL" "LC_MESSAGES" "LANG"
+                                          "COLUMNS")
+                      #:system system
+                      #:local-build? #t           ;don't offload repo cloning
+                      #:hash-algo hash-algo
+                      #:hash hash
+                      #:recursive? #t
+                      #:guile-for-build guile)))
+
+(define (android-repo-version version revision)
+  "Return the version string for packages using android-repo-download."
+  (string-append version "-" (string-join (string-split revision #\/) "_")))
+
+(define (android-repo-file-name name version)
+  "Return the file-name for packages using android-repo-download."
+  (string-append name "-" version "-checkout"))
+
+
diff --git a/guix/build/android-repo.scm b/guix/build/android-repo.scm
new file mode 100644
index 0000000000..cba50270ea
--- /dev/null
+++ b/guix/build/android-repo.scm
@@ -0,0 +1,74 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2014, 2016, 2019 Ludovic Courtès <ludo <at> gnu.org>
+;;; Copyright © 2020 Danny Milosavljevic <dannym <at> scratchpost.org>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (guix build android-repo)
+  #:use-module (guix build utils)
+  #:use-module (srfi srfi-34)
+  #:use-module (ice-9 format)
+  #:export (android-repo-fetch))
+
+;;; Commentary:
+;;;
+;;; This is the build-side support code of (guix android-repo-download).
+;;; It allows a multirepository managed by the git-repo tool to be cloned and
+;;; checked out at a specific revision.
+;;;
+;;; Code:
+
+(define* (android-repo-fetch manifest-url manifest-revision directory
+                             #:key (git-repo-command "git-repo"))
+  "Fetch packages according to the manifest at MANIFEST-URL with
+MANIFEST-REVISION.  MANIFEST-REVISION must be either a revision
+or a branch.  Return #t on success, #f otherwise."
+
+  ;; Disable TLS certificate verification.  The hash of the checkout is known
+  ;; in advance anyway.
+  (setenv "GIT_SSL_NO_VERIFY" "true")
+
+  (mkdir-p directory)
+
+  (guard (c ((invoke-error? c)
+             (format (current-error-port)
+                     "android-repo-fetch: '~a~{ ~a~}' failed with exit code ~a~%"
+                     (invoke-error-program c)
+                     (invoke-error-arguments c)
+                     (or (invoke-error-exit-status c) ;XXX: not quite accurate
+                         (invoke-error-stop-signal c)
+                         (invoke-error-term-signal c)))
+             (delete-file-recursively directory)
+             #f))
+    (with-directory-excursion directory
+      (invoke git-repo-command "init" "-u" manifest-url "-b" manifest-revision
+              "--depth=1")
+      (invoke git-repo-command "sync" "-c" "--fail-fast" "-v" "-j" "3")
+
+      ;; Delete vendor/**/.git, system/**/.git, toolchain/**/.git,
+      ;; .repo/**/.git etc since they contain timestamps.
+      (for-each delete-file-recursively
+       (find-files "." "^\\.git$" #:directories? #t))
+
+      ;; Delete git state directories since they contain timestamps.
+      (for-each delete-file-recursively
+       (find-files ".repo" "^.*\\.git$" #:directories? #t))
+
+      ;; This file contains timestamps.
+      (delete-file ".repo/.repo_fetchtimes.json")
+      #t)))
+
+;;; android-repo.scm ends here




Information forwarded to guix-patches <at> gnu.org:
bug#42800; Package guix-patches. (Thu, 13 Aug 2020 09:03:02 GMT) Full text and rfc822 format available.

Message #20 received at 42800 <at> debbugs.gnu.org (full text, mbox):

From: Mathieu Othacehe <othacehe <at> gnu.org>
To: Danny Milosavljevic <dannym <at> scratchpost.org>
Cc: 42800 <at> debbugs.gnu.org
Subject: Re: [bug#42800] [PATCH v2] Add (guix android-repo-download).
Date: Thu, 13 Aug 2020 11:02:28 +0200
Hello Danny,

> +;;; GNU Guix --- Functional package management for GNU
> +;;; Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo <at> gnu.org>
> +;;; Copyright © 2017 Mathieu Lirzin <mthl <at> gnu.org>
> +;;; Copyright © 2017 Christopher Baines <mail <at> cbaines.net>
> +;;; Copyright © 2020 Jakub Kądziołka <kuba <at> kadziolka.net>

I think you can strip out those copyrights.

> +  #:use-module (git) ; FIXME Remove

Why should it be removed?

> +  #:use-module (ice-9 match)
> +  #:use-module (ice-9 vlist)
> +  #:use-module (srfi srfi-1)
> +  #:use-module (srfi srfi-34)
> +  #:use-module (srfi srfi-35)
> +  #:export (android-repo-reference
> +            android-repo-reference?
> +            android-repo-reference-mainfest-url
                                         ^
                                         typo
                                         
> +            android-repo-reference-revision
> +
> +            android-repo-fetch
> +            android-repo-version
> +            android-repo-file-name))
> +
> +;;; Commentary:
> +;;;
> +;;; An <origin> method that fetches a specific commit from an Android Repo
> +;;; repository.
> +;;; The repository's manifest (URL and revision) can be specified with a
> +;; <android-repo-reference> object.

Missing semicolon.

> +;;;
> +;;; Code:
> +
> +(define-record-type* <android-repo-reference>
> +  android-repo-reference make-android-repo-reference
> +  android-repo-reference?
> +  (manifest-url        android-repo-reference-manifest-url)
> +  (manifest-revision   android-repo-reference-manifest-revision))
> +
> +(define (git-repo-package)
> +  "Return the default git-repo package."
> +  (let ((distro (resolve-interface '(gnu packages android))))
> +    (module-ref distro 'git-repo)))
> +
> +(define* (android-repo-fetch ref hash-algo hash
> +                             #:optional name
> +                             #:key (system (%current-system))
> +                             (guile (default-guile))
> +                             (git-repo (git-repo-package)))
> +  "Return a fixed-output derivation that fetches REF, an
> +<android-repo-reference> object.  The output is expected to have recursive
> +hash HASH of type HASH-ALGO (a symbol).  Use NAME as the file name, or a
> +generic name if #f."

if unset.

> +  ;; TODO: Remove.
> +  (define inputs
> +    (standard-packages))

Why should it be removed?

> +            (or (android-repo-fetch (getenv "android-repo manifest-url")
> +                                    (getenv "android-repo manifest-revision")

Spaces in env variable names are quite unusual.

> +    (with-directory-excursion directory
> +      (invoke git-repo-command "init" "-u" manifest-url "-b" manifest-revision
> +              "--depth=1")

It could also be useful to be able to select the manifest name, using
the "-m" switch.

> +      (invoke git-repo-command "sync" "-c" "--fail-fast" "-v" "-j" "3")

Any specific reason to default to 3 threads?

Otherwise this looks nice!

Thanks,

Mathieu




Reply sent to Danny Milosavljevic <dannym <at> scratchpost.org>:
You have taken responsibility. (Wed, 02 Sep 2020 13:05:02 GMT) Full text and rfc822 format available.

Notification sent to Danny Milosavljevic <dannym <at> scratchpost.org>:
bug acknowledged by developer. (Wed, 02 Sep 2020 13:05:02 GMT) Full text and rfc822 format available.

Message #25 received at 42800-done <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: 42800-done <at> debbugs.gnu.org
Subject: Re: [PATCH v2] Add (guix android-repo-download).
Date: Wed, 2 Sep 2020 15:04:22 +0200
[Message part 1 (text/plain, inline)]
Pushed to guix master as commit 3feb846420f24ef1c8b3fe310d293c7a2c91e1d4.
[Message part 2 (application/pgp-signature, inline)]

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Thu, 01 Oct 2020 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 3 years and 201 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.