Merge branch 'emacs-31' of git.savannah.gnu.org:/srv/git/emacs into emacs-31

This commit is contained in:
Eli Zaretskii 2026-08-24 18:54:46 +03:00
commit 9c9a26e60b
3 changed files with 176 additions and 35 deletions

View file

@ -322,8 +322,8 @@ Optional argument TYPE is type of output (nil means all)."
(push (concat i j) res))))
(manual-misc-manuals root)))))))
(let* ((dest (expand-file-name "manual" root))
(html-node-dir (expand-file-name "html_node" dest))
(html-mono-dir (expand-file-name "html_mono" dest))
(html-node-dir (expand-file-name "html_node/" dest))
(html-mono-dir (expand-file-name "html_mono/" dest))
(ps-dir (expand-file-name "ps" dest))
(pdf-dir (expand-file-name "pdf" dest))
(emacs (expand-file-name "doc/emacs/emacs.texi" root))
@ -369,6 +369,13 @@ Optional argument TYPE is type of output (nil means all)."
(dolist (manual misc)
(if (member type `(nil ,manual "misc"))
(manual-misc-html manual root html-node-dir html-mono-dir)))
;; Auxiliary files
(when (member type '(nil "elisp" "elisp-mono" "elisp-node"))
(dolist (file '("doc/lispref/elisp_type_hierarchy.txt"
"doc/lispref/elisp_type_hierarchy.jpg"))
(let ((file (expand-file-name file root)))
(copy-file file html-mono-dir t)
(copy-file file (expand-file-name "elisp/" html-node-dir) t))))
(message "Manuals created in %s" dest)))
(defconst manual-doctype-string
@ -761,6 +768,9 @@ style=\"text-align:left\">")
(and (equal type "lispintro")
(string-match-p "\\.\\(eps\\|pdf\\)\\'" file)))
(copy-file file stem)))
(when (equal type "lispref")
(copy-file "../doc/lispref/elisp_type_hierarchy.txt" stem)
(copy-file "../doc/lispref/elisp_type_hierarchy.jpg" stem))
(with-temp-buffer
(let ((outvars make-manuals-dist-output-variables)
(case-fold-search nil))

View file

@ -102,9 +102,7 @@ General steps (for each step, check for possible errors):
easiest way of creating the new ChangeLog.N is to rename the file
ChangeLog (without the .N suffix) left over from the last release
(it is usually unversioned) and commit it, together with the
modified Makefile.in. If you don't have the unversioned ChangeLog
file from the last release, you can take it from the release
tarball.
modified Makefile.in.
Now:
@ -133,6 +131,7 @@ General steps (for each step, check for possible errors):
Save the "*Authors*" buffer as etc/AUTHORS.
Check the diff looks reasonable. Maybe add more entries to
authors-ambiguous-files or authors-aliases, and repeat.
If making a release, move the "Version NN.N released." back to the top.
Commit and push any fixes to authors.el with a message like this:
; Update exported ChangeLog files and etc/AUTHORS
@ -161,30 +160,17 @@ General steps (for each step, check for possible errors):
one, as described above). Pick a date about a week from now when
you intend to make the release. Use M-x add-release-logs from
admin/admin.el to add entries to etc/HISTORY and the ChangeLog
file. It's best not to commit these files until the release is
actually made. Merge the entries from (unversioned) ChangeLog
into the top of the current versioned ChangeLog.N and commit that
along with etc/HISTORY. Then you can tag that commit as the
release.
file. Merge the entries from the unversioned ChangeLog into the
top of the current versioned ChangeLog.N and commit that along
with etc/HISTORY. Name the tar file as emacs-XX.Y-rc1.tar.
Alternatively, you can commit and tag with the RC tag right away,
and delay the final tagging until you actually decide to make a
release and announce it. The "git tag" command can tag a specific
commit if you give it the SHA1 of that commit, even if additional
commits have been pushed in the meantime.
If you need another release candidate, remember to adjust the
ChangeLog and etc/HISTORY entries. Never replace an existing
tarfile! If you need to fix something, always upload it with a
different name.
Name the tar file as emacs-XX.Y-rc1.tar. If all goes well in the
following week, you can simply rename the file and use it for the
actual release. If you need another release candidate, remember
to adjust the ChangeLog and etc/HISTORY entries.
If you need to change only a file(s) that cannot possibly affect
the build (README, ChangeLog, NEWS, etc.) then rather than doing
an entirely new build, it is better to unpack the existing
tarfile, modify the file(s), and tar it back up again.
Never replace an existing tarfile! If you need to fix something,
always upload it with a different name.
If this is the release itself, copy the unversioned ChangeLog from
the previous release candidate tarball into your worktree.
4. autoreconf -i -I m4 --force && make bootstrap
@ -231,8 +217,8 @@ General steps (for each step, check for possible errors):
Alternatively, if you want to do this manually using the compressed
tarballs:
tar tJf emacs-OLD.tar.xz | sed -e 's,^[^/]*,,' | sort > old_tmp
tar tJf emacs-NEW.tar.xz | sed -e 's,^[^/]*,,' | sort > new_tmp
tar tJf emacs-OLD.tar.xz | sed -e 's,^[^/]*,,' | sort >old_tmp
tar tJf emacs-NEW.tar.xz | sed -e 's,^[^/]*,,' | sort >new_tmp
diff -u old_tmp new_tmp
If this is the first pretest of a major release, just comparing
@ -289,8 +275,8 @@ General steps (for each step, check for possible errors):
11. Decide what compression schemes to offer.
For a release, at least gz and xz:
gzip --best --no-name -c emacs-NEW.tar > emacs-NEW.tar.gz
xz -c emacs-NEW.tar > emacs-NEW.tar.xz
gzip --best --no-name -c emacs-NEW.tar >emacs-NEW.tar.gz
xz -c emacs-NEW.tar >emacs-NEW.tar.xz
For pretests, just xz is probably fine (saves bandwidth).
Now we will upload the files to the GNU FTP server. In the case of
@ -304,6 +290,8 @@ General steps (for each step, check for possible errors):
-- NEW_FILE.gz NEW_FILE.xz ...
For a release:
gnupload [--user your@gpg.key.email] --to alpha.gnu.org:emacs/pretest \
--delete NEW-rc1_FILE.xz
gnupload [--user your@gpg.key.email] --to ftp.gnu.org:emacs \
NEW_FILE.gz NEW_FILE.xz ...
@ -321,8 +309,8 @@ General steps (for each step, check for possible errors):
clearsigned directive file like this:
gpg -b FILE
echo directory: emacs/pretest > FILE.directive (for a pretest)
echo directory: emacs > FILE.directive (for a release)
echo directory: emacs/pretest >FILE.directive (for a pretest)
echo directory: emacs >FILE.directive (for a release)
gpg --clearsign FILE.directive
Upload by anonymous ftp to ftp://ftp-upload.gnu.org/ the files FILE,
FILE.sig, FILE.directive.asc.
@ -333,8 +321,8 @@ General steps (for each step, check for possible errors):
12. After five minutes, verify that the files are visible at
<https://alpha.gnu.org/gnu/emacs/pretest/> for a pretest, or
<https://ftp.gnu.org/gnu/emacs/> for a release. If uploading a
pretest, the delete of the previous pretest a few minutes before the
creation of the new file.
pretest, the deletion of the previous pretest happens a few minutes
before the creation of the new file.
Download them and check the signatures and SHA1/SHA256 checksums.

View file

@ -51,5 +51,148 @@
;; Clean up tabs afterwards
(tab-bar-tabs-set nil))
(ert-deftest tab-bar-tests-quit-restore-window ()
:tags '(:unstable) ; Can hang.
(skip-when (pcase system-type
;; Skip test on MS-Windows in batch mode, since terminal
;; frames cannot be created in that case.
('windows-nt noninteractive)
;; This test is unreliable on macOS when run in batch mode
;; from Emacs (M-x compile).
('darwin (equal (getenv "TERM") "dumb"))
;; Emba runs the container without "--tty"
;; (the environment variable "TERM" is nil), and this
;; test fails with '(error "Could not open file: /dev/tty")'.
;; Therefore skip it unless it can use '(tty-type . "linux")'.
('gnu/linux (null (getenv "TERM")))))
(let* ((frame-params (when noninteractive
'((window-system . nil)
(tty-type . "linux"))))
(pop-up-frame-alist frame-params)
(frame-auto-hide-function 'delete-frame))
;; After commit 293eaf323a0 (bug#81575) 'frame-deletable-p'
;; checks if frames are on the same terminal. But in this test
;; the first frame F1 is on initial_terminal, but other created
;; frames are on #<terminal 1 on /dev/tty>. So create a new frame
;; on the same terminal as other created frames, and delete
;; the initial frame that is on another terminal.
(make-frame pop-up-frame-alist)
(delete-frame (car (last (frame-list))) nil)
;; 1.1. 'quit-restore-window' should delete the frame
;; from initial window (bug#59862)
(progn
(should (eq (length (frame-list)) 1))
(other-frame-prefix)
(info)
(should (eq (length (frame-list)) 2))
(should (equal (buffer-name) "*info*"))
(view-echo-area-messages)
(other-window 1)
(should (eq (length (window-list)) 2))
(should (equal (buffer-name) "*Messages*"))
(quit-window)
(should (eq (length (window-list)) 1))
(should (equal (buffer-name) "*info*"))
(quit-window)
(should (eq (length (frame-list)) 1)))
;; 1.2. 'quit-restore-window' should not delete the frame
;; from non-initial window (bug#59862)
(progn
(should (eq (length (frame-list)) 1))
(other-frame-prefix)
(info)
(should (eq (length (frame-list)) 2))
(should (equal (buffer-name) "*info*"))
(view-echo-area-messages)
(should (eq (length (window-list)) 2))
(should (equal (buffer-name) "*info*"))
(quit-window)
(should (eq (length (window-list)) 1))
(should (eq (length (frame-list)) 2))
(should (equal (buffer-name) "*Messages*"))
(quit-window)
(should (eq (length (frame-list)) 2))
;; Delete the created frame afterwards because with tty frames
;; the output of 'message' is bound to the original frame
(delete-frame (car (frame-list))))
;; 2.1. 'quit-restore-window' should close the tab
;; from initial window (bug#59862)
(progn
(should (eq (length (tab-bar-tabs)) 1))
(other-tab-prefix)
(info)
(should (eq (length (tab-bar-tabs)) 2))
(should (equal (buffer-name) "*info*"))
(view-echo-area-messages)
(other-window 1)
(should (eq (length (window-list)) 2))
(should (equal (buffer-name) "*Messages*"))
(quit-window)
(should (eq (length (window-list)) 1))
(should (equal (buffer-name) "*info*"))
(quit-window)
(should (eq (length (tab-bar-tabs)) 1)))
;; 2.2. 'quit-restore-window' should not close the tab
;; from non-initial window (bug#59862)
(progn
(should (eq (length (tab-bar-tabs)) 1))
(other-tab-prefix)
(info)
(should (eq (length (tab-bar-tabs)) 2))
(should (equal (buffer-name) "*info*"))
(view-echo-area-messages)
(should (eq (length (window-list)) 2))
(should (equal (buffer-name) "*info*"))
(quit-window)
(should (eq (length (window-list)) 1))
(should (eq (length (tab-bar-tabs)) 2))
(should (equal (buffer-name) "*Messages*"))
(quit-window)
(should (eq (length (tab-bar-tabs)) 2))
;; Clean up the tab afterwards
(tab-close))
;; 3.1. Don't delete the frame with dedicated window
;; from the second tab (bug#71386)
(with-selected-frame (make-frame frame-params)
(switch-to-buffer (generate-new-buffer "test1"))
(tab-new)
(switch-to-buffer (generate-new-buffer "test2"))
(set-window-dedicated-p (selected-window) t)
(kill-buffer)
(should (eq (length (frame-list)) 2))
(should (eq (length (tab-bar-tabs)) 1))
;; But now should delete the frame with dedicated window
;; from the last tab
(set-window-dedicated-p (selected-window) t)
(kill-buffer)
(should (eq (length (frame-list)) 1)))
;; 3.2. Don't delete the frame with an effectively-dedicated window
;; from the second tab (bug#71386)
(with-selected-frame (make-frame frame-params)
(let ((switch-to-prev-buffer-skip #'always)
(kill-buffer-quit-windows nil))
(switch-to-buffer (generate-new-buffer "test1"))
(tab-bar-new-tab)
(switch-to-buffer (generate-new-buffer "test2"))
;; This makes the window effectively dedicated.
(set-window-prev-buffers nil nil)
;; Killing the buffer should close the tab, leave one open tab,
;; and not delete the frame.
(kill-buffer)
(should (eq (length (tab-bar-tabs)) 1))
(should (eq (length (frame-list)) 2))
(delete-frame))))
;; Clean up tabs afterwards
(tab-bar-tabs-set nil))
(provide 'tab-bar-tests)
;;; tab-bar-tests.el ends here