maint: update-guix-package: Optionally add sources to store.
Following discussions in <https://issues.guix.gnu.org/43893>, keeping a copy of the updated package source is desirable when generating a release. * build-aux/update-guix-package.scm (version-controlled?): Remove variable. (call-with-temporary-git-worktree): Renamed from 'with-temporary-git-worktree'. Update doc. Do not change directory implicitly. Define as a procedure, not a syntax. (keep-source-in-store): New procedure. (main): Adjust to use with call-with-temporary-git-worktree. Add the sources to the store when GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT is set. Exit gracefully when FIND-ORIGIN-REMOTE returns #f. (%savannah-guix-git-repo-push-url-regexp): Adjust match for a potential colon separator. * Makefile.am (GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT): Adjust. * .dir-locals.el (scheme-mode): Remove entry for with-temporary-git-worktree. * doc/contributing.texi (Updating the Guix Package): Update doc. Co-authored-by: Ludovic Courtès <ludo@gnu.org>master
parent
ef1107e2cc
commit
3de898b43c
|
@ -123,7 +123,6 @@
|
||||||
(eval . (put 'call-with-progress-reporter 'scheme-indent-function 1))
|
(eval . (put 'call-with-progress-reporter 'scheme-indent-function 1))
|
||||||
(eval . (put 'with-repository 'scheme-indent-function 2))
|
(eval . (put 'with-repository 'scheme-indent-function 2))
|
||||||
(eval . (put 'with-temporary-git-repository 'scheme-indent-function 2))
|
(eval . (put 'with-temporary-git-repository 'scheme-indent-function 2))
|
||||||
(eval . (put 'with-temporary-git-worktree 'scheme-indent-function 2))
|
|
||||||
(eval . (put 'with-environment-variables 'scheme-indent-function 1))
|
(eval . (put 'with-environment-variables 'scheme-indent-function 1))
|
||||||
(eval . (put 'with-fresh-gnupg-setup 'scheme-indent-function 1))
|
(eval . (put 'with-fresh-gnupg-setup 'scheme-indent-function 1))
|
||||||
|
|
||||||
|
|
|
@ -826,6 +826,7 @@ release: dist-with-updated-version
|
||||||
$(MKDIR_P) "$(releasedir)"
|
$(MKDIR_P) "$(releasedir)"
|
||||||
rm -f "$(releasedir)"/*
|
rm -f "$(releasedir)"/*
|
||||||
mv $(SOURCE_TARBALLS) "$(releasedir)"
|
mv $(SOURCE_TARBALLS) "$(releasedir)"
|
||||||
|
GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT=yes \
|
||||||
$(top_builddir)/pre-inst-env "$(GUILE)" \
|
$(top_builddir)/pre-inst-env "$(GUILE)" \
|
||||||
$(top_srcdir)/build-aux/update-guix-package.scm \
|
$(top_srcdir)/build-aux/update-guix-package.scm \
|
||||||
"`git rev-parse HEAD`" "$(PACKAGE_VERSION)"
|
"`git rev-parse HEAD`" "$(PACKAGE_VERSION)"
|
||||||
|
@ -840,6 +841,7 @@ release: dist-with-updated-version
|
||||||
mv "guix-binary.$$system.tar.xz" \
|
mv "guix-binary.$$system.tar.xz" \
|
||||||
"$(releasedir)/guix-binary-$(PACKAGE_VERSION).$$system.tar.xz" ; \
|
"$(releasedir)/guix-binary-$(PACKAGE_VERSION).$$system.tar.xz" ; \
|
||||||
done
|
done
|
||||||
|
GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT=yes \
|
||||||
$(top_builddir)/pre-inst-env "$(GUILE)" \
|
$(top_builddir)/pre-inst-env "$(GUILE)" \
|
||||||
$(top_srcdir)/build-aux/update-guix-package.scm \
|
$(top_srcdir)/build-aux/update-guix-package.scm \
|
||||||
"`git rev-parse HEAD`"
|
"`git rev-parse HEAD`"
|
||||||
|
|
|
@ -44,9 +44,6 @@
|
||||||
(define %top-srcdir
|
(define %top-srcdir
|
||||||
(string-append (current-source-directory) "/.."))
|
(string-append (current-source-directory) "/.."))
|
||||||
|
|
||||||
(define version-controlled?
|
|
||||||
(git-predicate %top-srcdir))
|
|
||||||
|
|
||||||
(define (package-definition-location)
|
(define (package-definition-location)
|
||||||
"Return the source properties of the definition of the 'guix' package."
|
"Return the source properties of the definition of the 'guix' package."
|
||||||
(call-with-input-file (location-file (package-location guix))
|
(call-with-input-file (location-file (package-location guix))
|
||||||
|
@ -114,8 +111,9 @@ COMMIT."
|
||||||
"Create a new git worktree at DIRECTORY, detached on commit COMMIT."
|
"Create a new git worktree at DIRECTORY, detached on commit COMMIT."
|
||||||
(invoke "git" "worktree" "add" "--detach" directory commit))
|
(invoke "git" "worktree" "add" "--detach" directory commit))
|
||||||
|
|
||||||
(define-syntax-rule (with-temporary-git-worktree commit body ...)
|
(define (call-with-temporary-git-worktree commit proc)
|
||||||
"Execute BODY in the context of a temporary git worktree created from COMMIT."
|
"Execute PROC in the context of a temporary git worktree created from
|
||||||
|
COMMIT. PROC receives the temporary directory file name as an argument."
|
||||||
(call-with-temporary-directory
|
(call-with-temporary-directory
|
||||||
(lambda (tmp-directory)
|
(lambda (tmp-directory)
|
||||||
(dynamic-wind
|
(dynamic-wind
|
||||||
|
@ -123,12 +121,12 @@ COMMIT."
|
||||||
#t)
|
#t)
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(git-add-worktree tmp-directory commit)
|
(git-add-worktree tmp-directory commit)
|
||||||
(with-directory-excursion tmp-directory body ...))
|
(proc tmp-directory))
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(invoke "git" "worktree" "remove" "--force" tmp-directory))))))
|
(invoke "git" "worktree" "remove" "--force" tmp-directory))))))
|
||||||
|
|
||||||
(define %savannah-guix-git-repo-push-url-regexp
|
(define %savannah-guix-git-repo-push-url-regexp
|
||||||
"git.(savannah|sv).gnu.org/srv/git/guix.git \\(push\\)")
|
"git.(savannah|sv).gnu.org:?/srv/git/guix.git \\(push\\)")
|
||||||
|
|
||||||
(define-syntax-rule (with-input-pipe-to-string prog arg ...)
|
(define-syntax-rule (with-input-pipe-to-string prog arg ...)
|
||||||
(let* ((input-pipe (open-pipe* OPEN_READ prog arg ...))
|
(let* ((input-pipe (open-pipe* OPEN_READ prog arg ...))
|
||||||
|
@ -156,27 +154,60 @@ COMMIT."
|
||||||
"git" "branch" "-r" "--contains" commit
|
"git" "branch" "-r" "--contains" commit
|
||||||
(string-append remote "/master")))))
|
(string-append remote "/master")))))
|
||||||
|
|
||||||
|
(define (keep-source-in-store store source)
|
||||||
|
"Add SOURCE to the store under the name that the 'guix' package expects."
|
||||||
|
|
||||||
|
;; 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)))
|
||||||
|
|
||||||
|
(let* ((source (add-to-store store
|
||||||
|
(origin-file-name (package-source guix))
|
||||||
|
#t "sha256" source
|
||||||
|
#:select? (git-predicate source)))
|
||||||
|
(root (store-path-package-name source)))
|
||||||
|
|
||||||
|
;; 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))
|
||||||
|
|
||||||
|
(info (G_ "source code kept in ~a (GC root: ~a)~%")
|
||||||
|
source root)))
|
||||||
|
|
||||||
|
|
||||||
(define (main . args)
|
(define (main . args)
|
||||||
(match args
|
(match args
|
||||||
((commit version)
|
((commit version)
|
||||||
(with-directory-excursion %top-srcdir
|
(with-directory-excursion %top-srcdir
|
||||||
(or (getenv "GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT")
|
(or (getenv "GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT")
|
||||||
(commit-already-pushed? (find-origin-remote) commit)
|
(let ((remote (find-origin-remote)))
|
||||||
|
(unless remote
|
||||||
|
(leave (G_ "Failed to find the origin git remote.~%")))
|
||||||
|
(commit-already-pushed? remote commit))
|
||||||
(leave (G_ "Commit ~a is not pushed upstream. Aborting.~%") commit))
|
(leave (G_ "Commit ~a is not pushed upstream. Aborting.~%") commit))
|
||||||
(let* ((hash (with-temporary-git-worktree commit
|
(call-with-temporary-git-worktree commit
|
||||||
(nix-base32-string->bytevector
|
(lambda (tmp-directory)
|
||||||
|
(let* ((hash (nix-base32-string->bytevector
|
||||||
(string-trim-both
|
(string-trim-both
|
||||||
(with-output-to-string
|
(with-output-to-string
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(guix-hash "-rx" ".")))))))
|
(guix-hash "-rx" tmp-directory))))))
|
||||||
(location (package-definition-location))
|
(location (package-definition-location))
|
||||||
(old-hash (content-hash-value
|
(old-hash (content-hash-value
|
||||||
(origin-hash (package-source guix)))))
|
(origin-hash (package-source guix)))))
|
||||||
(edit-expression location
|
(edit-expression location
|
||||||
(update-definition commit hash
|
(update-definition commit hash
|
||||||
#:old-hash old-hash
|
#:old-hash old-hash
|
||||||
#:version version)))))
|
#:version version))
|
||||||
|
;; When GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT is set, the sources are
|
||||||
|
;; added to the store. This is used as part of 'make release'.
|
||||||
|
(when (getenv "GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT")
|
||||||
|
(with-store store
|
||||||
|
(keep-source-in-store store tmp-directory))))))))
|
||||||
((commit)
|
((commit)
|
||||||
;; Automatically deduce the version and revision numbers.
|
;; Automatically deduce the version and revision numbers.
|
||||||
(main commit #f))))
|
(main commit #f))))
|
||||||
|
|
|
@ -1368,11 +1368,6 @@ 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.
|
has already been pushed to the Savannah-hosted Guix git repository.
|
||||||
|
|
||||||
This check can be disabled, @emph{at your own peril}, by setting the
|
This check can be disabled, @emph{at your own peril}, by setting the
|
||||||
@code{GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT} environment variable.
|
@code{GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT} environment variable. When
|
||||||
|
this variable is set, the updated package source is also added to the
|
||||||
To build the resulting 'guix' package when using a private commit, the
|
store. This is used as part of the release process of Guix.
|
||||||
following command can be used:
|
|
||||||
|
|
||||||
@example
|
|
||||||
./pre-inst-env guix build guix --with-git-url=guix=$PWD
|
|
||||||
@end example
|
|
||||||
|
|
Reference in New Issue