From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: 43893@debbugs.gnu.org
Cc: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Subject: bug#43893: [PATCH v2] maint: update-guix-package: Prevent accidentally breaking guix pull.
Date: Sun, 11 Oct 2020 15:57:40 -0400 [thread overview]
Message-ID: <20201011195740.1993-1-maxim.cournoyer@gmail.com> (raw)
In-Reply-To: <87eem7qcxc.fsf@gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=yes, Size: 9095 bytes --]
Fixes <https://issues.guix.gnu.org/43893>.
This changes the 'update-guix-package' tool so that it:
1. Always uses a clean checkout to compute the hash of the updated 'guix'
package.
2. Ensures the commit used in the updated 'guix' package definition has already
been pushed upstream.
* build-aux/update-guix-package.scm (%savannah-guix-git-repo-push-url): New
variable.
(with-input-pipe-to-string): New syntax.
(find-origin-remote, git-add-worktree): New procedures.
(commit-already-pushed?): New predicate.
(main): Check the commit used has already been pushed upstream and compute the
hash from a clean checkout.
* doc/contributing.texi (Updating the Guix Package): Document it.
---
build-aux/update-guix-package.scm | 103 ++++++++++++++++++++----------
doc/contributing.texi | 43 +++++++++++++
2 files changed, 111 insertions(+), 35 deletions(-)
diff --git a/build-aux/update-guix-package.scm b/build-aux/update-guix-package.scm
index f695e91cfd..397b404922 100644
--- a/build-aux/update-guix-package.scm
+++ b/build-aux/update-guix-package.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -24,13 +25,20 @@
;;; Code:
(use-modules (guix)
+ (guix ui)
(guix git-download)
(guix upstream)
(guix utils)
(guix base32)
(guix build utils)
+ (guix scripts hash)
(gnu packages package-management)
- (ice-9 match))
+ (ice-9 match)
+ (ice-9 popen)
+ (ice-9 textual-ports)
+ (srfi srfi-1)
+ (srfi srfi-2)
+ (srfi srfi-26))
(define %top-srcdir
(string-append (current-source-directory) "/.."))
@@ -101,44 +109,69 @@ COMMIT."
(exp
(error "'guix' package definition is not as expected" exp)))))
-\f
-(define (main . args)
- (match args
- ((commit version)
- (with-store store
- (let* ((source (add-to-store store
- "guix-checkout" ;dummy name
- #t "sha256" %top-srcdir
- #:select? version-controlled?))
- (hash (query-path-hash store source))
- (location (package-definition-location))
- (old-hash (content-hash-value
- (origin-hash (package-source guix)))))
- (edit-expression location
- (update-definition commit hash
- #:old-hash old-hash
- #:version version))
+(define (git-add-worktree directory commit-ish)
+ "Create a new git worktree at DIRECTORY, detached on commit COMMIT-ISH."
+ (invoke "git" "worktree" "add" "--detach" directory commit-ish))
+
+(define %savannah-guix-git-repo-push-url
+ "git.savannah.gnu.org/srv/git/guix.git")
- ;; Re-add SOURCE to the store, but this time under the real name used
- ;; in the 'origin'. This allows us to build the package without
- ;; having to make a real checkout; thus, it also works when working
- ;; on a private branch.
- (reload-module
- (resolve-module '(gnu packages package-management)))
+(define-syntax-rule (with-input-pipe-to-string prog arg ...)
+ (let* ((input-pipe (open-pipe* OPEN_READ prog arg ...))
+ (output (get-string-all input-pipe))
+ (exit-val (status:exit-val (close-pipe input-pipe))))
+ (unless (zero? exit-val)
+ (error (format #f "Command ~s exited with non-zero exit status: ~s"
+ (string-join (list prog arg ...)) exit-val)))
+ (string-trim-both output)))
- (let* ((source (add-to-store store
- (origin-file-name (package-source guix))
- #t "sha256" source))
- (root (store-path-package-name source)))
+(define (find-origin-remote)
+ "Find the name of the git remote with the Savannah Guix git repo URL."
+ (and-let* ((remotes (string-split (with-input-pipe-to-string
+ "git" "remote" "-v")
+ #\newline))
+ (origin-entry (find (cut string-contains <>
+ (string-append
+ %savannah-guix-git-repo-push-url
+ " (push)"))
+ remotes)))
+ (first (string-split origin-entry #\tab))))
- ;; Add an indirect GC root for SOURCE in the current directory.
- (false-if-exception (delete-file root))
- (symlink source root)
- (add-indirect-root store
- (string-append (getcwd) "/" root))
+(define (commit-already-pushed? remote commit)
+ "True if COMMIT is found in the REMOTE repository."
+ (not (string-null? (with-input-pipe-to-string
+ "git" "branch" "-r" "--contains" commit
+ (string-append remote "/master")))))
- (format #t "source code for commit ~a: ~a (GC root: ~a)~%"
- commit source root)))))
+\f
+(define (main . args)
+ (match args
+ ((commit version)
+ (with-directory-excursion %top-srcdir
+ (or (getenv "GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT")
+ (commit-already-pushed? (find-origin-remote) commit)
+ (leave (G_ "Commit ~a is not pushed upstream. Aborting.~%") commit))
+ (dynamic-wind
+ (lambda ()
+ #t)
+ (lambda ()
+ (call-with-temporary-directory
+ (lambda (tmp-directory)
+ (let* ((dummy (git-add-worktree tmp-directory commit))
+ (hash (nix-base32-string->bytevector
+ (string-trim-both
+ (with-output-to-string
+ (lambda ()
+ (guix-hash "-rx" tmp-directory))))))
+ (location (package-definition-location))
+ (old-hash (content-hash-value
+ (origin-hash (package-source guix)))))
+ (edit-expression location
+ (update-definition commit hash
+ #:old-hash old-hash
+ #:version version))))))
+ (lambda ()
+ (invoke "git" "worktree" "prune")))))
((commit)
;; Automatically deduce the version and revision numbers.
(main commit #f))))
diff --git a/doc/contributing.texi b/doc/contributing.texi
index af3601442e..11a932a9bf 100644
--- a/doc/contributing.texi
+++ b/doc/contributing.texi
@@ -28,6 +28,7 @@ choice.
* Submitting Patches:: Share your work.
* Tracking Bugs and Patches:: Using Debbugs.
* Commit Access:: Pushing to the official repository.
+* Updating the Guix Package:: Updating the Guix package definition.
@end menu
@node Building from Git
@@ -1323,3 +1324,45 @@ only push their own awesome changes, but also offer some of their time
@emph{reviewing} and pushing other people's changes. As a committer,
you're welcome to use your expertise and commit rights to help other
contributors, too!
+
+@node Updating the Guix Package
+@section Updating the Guix Package
+
+@cindex update-guix-package, updating the guix package
+It is sometimes desirable to update the @code{guix} package itself (the
+package defined in @code{(gnu packages package-management)}), for
+example to make new daemon features available for use by the
+@code{guix-service-type} service type. In order to simplify this task,
+the following command can be used:
+
+@example
+make update-guix-package
+@end example
+
+The @code{update-guix-package} make target will use the last known
+@emph{commit} corresponding to @code{HEAD} in your Guix checkout,
+compute the hash of the Guix sources corresponding to that commit and
+update the @code{commit}, @code{revision} and hash of the @code{guix}
+package definition.
+
+To validate that the updated @code{guix} package hashes are correct and
+that it can be built successfully, the following command can be run from
+the directory of your Guix checkout:
+
+@example
+./pre-inst-env guix build guix
+@end example
+
+To guard against accidentally updating the @code{guix} package to a
+commit that others can't refer to, a check is made that the commit used
+has already been pushed to the Savannah-hosted Guix git repository.
+
+This check can be disabled, @emph{at your own peril}, by setting the
+@code{GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT} environment variable.
+
+To build the resulting 'guix' package when using a private commit, the
+following command can be used:
+
+@example
+./pre-inst-env guix build guix --with-git-url=guix=$PWD
+@end example
--
2.28.0
next prev parent reply other threads:[~2020-10-11 20:04 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-09 21:58 bug#43893: make update-guix-package produced an incorrect hash Maxim Cournoyer
2020-10-10 0:04 ` Danny Milosavljevic
2020-10-10 5:08 ` Maxim Cournoyer
2020-10-10 5:08 ` bug#43893: [PATCH] maint: update-guix-package: Ensure sources are clean Maxim Cournoyer
2020-10-10 11:59 ` Danny Milosavljevic
2020-10-11 2:35 ` Maxim Cournoyer
2020-10-10 20:08 ` Ludovic Courtès
2020-10-10 21:14 ` Danny Milosavljevic
2020-10-12 4:40 ` Maxim Cournoyer
2020-10-12 9:40 ` Ludovic Courtès
2020-10-12 14:18 ` Danny Milosavljevic
2020-10-11 19:43 ` Maxim Cournoyer
2020-10-12 9:43 ` Ludovic Courtès
2020-10-13 1:33 ` Maxim Cournoyer
2020-10-11 19:57 ` Maxim Cournoyer [this message]
2020-10-13 16:00 ` bug#43893: [PATCH v2] maint: update-guix-package: Prevent accidentally breaking guix pull Marius Bakke
2020-10-14 3:17 ` bug#43893: [PATCH v3] " Maxim Cournoyer
2020-10-20 21:06 ` Ludovic Courtès
2020-10-21 2:36 ` Maxim Cournoyer
2020-10-21 8:53 ` Ludovic Courtès
2020-10-23 4:38 ` Maxim Cournoyer
2020-10-23 15:01 ` Ludovic Courtès
2020-10-25 4:32 ` Maxim Cournoyer
2020-10-25 14:50 ` Ludovic Courtès
2020-10-25 15:29 ` Ludovic Courtès
2020-10-31 3:56 ` Maxim Cournoyer
2020-10-31 10:42 ` Ludovic Courtès
2020-11-09 19:28 ` Maxim Cournoyer
2020-11-09 22:03 ` Ludovic Courtès
2020-11-10 14:31 ` Maxim Cournoyer
2020-11-09 19:29 ` bug#43893: [PATCH] maint: update-guix-package: Optionally add sources to store Maxim Cournoyer
2020-11-09 22:18 ` Ludovic Courtès
2020-11-10 14:02 ` Maxim Cournoyer
2020-11-10 14:48 ` Ludovic Courtès
2020-11-10 15:18 ` Maxim Cournoyer
2020-11-09 22:44 ` bug#43893: [PATCH v5] " Maxim Cournoyer
2020-11-10 9:32 ` Ludovic Courtès
2020-10-25 14:41 ` bug#43893: [PATCH v3] maint: update-guix-package: Prevent accidentally breaking guix pull Ludovic Courtès
2020-10-25 19:17 ` Maxim Cournoyer
2020-10-14 4:10 ` bug#43893: [PATCH v2] " Maxim Cournoyer
2020-10-19 18:04 ` Maxim Cournoyer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201011195740.1993-1-maxim.cournoyer@gmail.com \
--to=maxim.cournoyer@gmail.com \
--cc=43893@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).