mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2026-09-10 07:46:51 -04:00
Merge branch 'emacs-31' of git.savannah.gnu.org:/srv/git/emacs into emacs-31
This commit is contained in:
commit
9c9a26e60b
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue