##// END OF EJS Templates
debian: support building a single deb for multiple py3 versions...
debian: support building a single deb for multiple py3 versions Around transitions from one python minor version to another (such as 3.7 to 3.8), the current packaging can be slightly problematic - it produces a `control` file that requires that the version of `python3` that's installed be exactly the one that was used on the build machine for the `mercurial` package, by containing a line like: Depends: sensible-utils, libc6 (>= 2.14), python3 (<< 3.8), python3 (>= 3.7~), python3:any (>= 3.5~) This is because it "knows" we only built for v3.7, which is the current default on my system. By building the native components for multiple versions, we can make it produce a line like this, which is compatible with 3.7 AND 3.8: Depends: sensible-utils, libc6 (>= 2.14), python3 (<< 3.9), python3 (>= 3.7~), python3:any (>= 3.5~) This isn't *normally* required, so I'm not making it the default. For those that receive their python3 and mercurial packages from their distro, and/or don't have to worry about a situation where the team that manages the python3 installation isn't the same as the team that manages the mercurial installation, this is probably not necessary. I chose the names `DEB_HG_*` because `DEB_*` is passed through `debuild` automatically (otherwise we'd have to explicitly allow the options through, which is a nuisance), and the `HG` part is to make it clear that this isn't a "standard" debian option that other packages might respect. Test Plan: 1. "nothing changed": - built a deb without these changes - built a deb with these changes but everything at the default - used diffoscope to compare, all differences were due to timestamps 2. "explicit is the same as implicit" (single version) - built a deb with everything at the default - built a deb with DEB_HG_PYTHON_VERSIONS=3.7 - used diffoscope to compare, all differences were due to timestamps 3. "explicit is the same as implicit" (multi version) - built a deb with DEB_HG_MULTI_VERSION=1 - built a deb with DEB_HG_PYTHON_VERSIONS=3.7 - used diffoscope to compare, all differences were due to timestamps 4. (single version, 3.7) doesn't work with python3.8 - `/usr/bin/python3.7 /usr/bin/hg debuginstall` works - `/usr/bin/python3.8 /usr/bin/hg debuginstall` crashes 5. (multi version, 3.7 + 3.8) - `/usr/bin/python3.7 /usr/bin/hg debuginstall` works - `/usr/bin/python3.8 /usr/bin/hg debuginstall` works Differential Revision: https://phab.mercurial-scm.org/D8642

File last commit:

r15782:7de76300 default
r45543:36178b5c default
Show More
mq.el
417 lines | 12.2 KiB | text/x-common-lisp | EmacsLispLexer
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 ;;; mq.el --- Emacs support for Mercurial Queues
;; Copyright (C) 2006 Bryan O'Sullivan
;; Author: Bryan O'Sullivan <bos@serpentine.com>
;; mq.el is free software; you can redistribute it and/or modify it
Matt Mackall
Update license to GPLv2+
r10263 ;; under the terms of the GNU General Public License version 2 or any
;; later version.
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
;; mq.el 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 mq.el, GNU Emacs, or XEmacs; see the file COPYING (`C-h
Martin Geisler
Remove FSF mailing address from GPL headers...
r15782 ;; C-l'). If not, see <http://www.gnu.org/licenses/>.
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
NIIMI Satoshi
mercurial.el, mq.el: remove runtime dependencies on CL package...
r5465 (eval-when-compile (require 'cl))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (require 'mercurial)
(defcustom mq-mode-hook nil
"Hook run when a buffer enters mq-mode."
:type 'sexp
:group 'mercurial)
(defcustom mq-global-prefix "\C-cq"
"The global prefix for Mercurial Queues keymap bindings."
:type 'sexp
:group 'mercurial)
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (defcustom mq-edit-mode-hook nil
"Hook run after a buffer is populated to edit a patch description."
:type 'sexp
:group 'mercurial)
Bryan O'Sullivan
mq.el: add hook to run when finishing the edit of a patch.
r4427 (defcustom mq-edit-finish-hook nil
"Hook run before a patch description is finished up with."
:type 'sexp
:group 'mercurial)
Bryan O'Sullivan
mq.el: add mq-signoff, to sign off on a patch
r4429 (defcustom mq-signoff-address nil
"Address with which to sign off on a patch."
:type 'string
:group 'mercurial)
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
;;; Internal variables.
Brendan Cully
mq.el: add mode-line hook
r3370 (defvar mq-mode nil
"Is this file managed by MQ?")
(make-variable-buffer-local 'mq-mode)
(put 'mq-mode 'permanent-local t)
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (defvar mq-patch-history nil)
Brendan Cully
mq.el: add mode-line hook
r3370 (defvar mq-top-patch '(nil))
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (defvar mq-prev-buffer nil)
(make-variable-buffer-local 'mq-prev-buffer)
(put 'mq-prev-buffer 'permanent-local t)
NIIMI Satoshi
mq.el: declare variable mq-top
r5466 (defvar mq-top nil)
(make-variable-buffer-local 'mq-top)
(put 'mq-top 'permanent-local t)
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
;;; Global keymap.
NIIMI Satoshi
mq.el: define keymaps as convensions
r5468 (defvar mq-global-map
(let ((map (make-sparse-keymap)))
(define-key map "." 'mq-push)
(define-key map ">" 'mq-push-all)
(define-key map "," 'mq-pop)
(define-key map "<" 'mq-pop-all)
(define-key map "=" 'mq-diff)
(define-key map "r" 'mq-refresh)
(define-key map "e" 'mq-refresh-edit)
(define-key map "i" 'mq-new)
(define-key map "n" 'mq-next)
(define-key map "o" 'mq-signoff)
(define-key map "p" 'mq-previous)
(define-key map "s" 'mq-edit-series)
(define-key map "t" 'mq-top)
map))
(global-set-key mq-global-prefix mq-global-map)
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
Brendan Cully
mq.el: add mode-line hook
r3370 (add-minor-mode 'mq-mode 'mq-mode)
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 ;;; Refresh edit mode keymap.
NIIMI Satoshi
mq.el: define keymaps as convensions
r5468 (defvar mq-edit-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\C-c\C-c" 'mq-edit-finish)
(define-key map "\C-c\C-k" 'mq-edit-kill)
(define-key map "\C-c\C-s" 'mq-signoff)
map))
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 ;;; Helper functions.
Bryan O'Sullivan
mq.el: add mq-new function.
r4422 (defun mq-read-patch-name (&optional source prompt force)
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 "Read a patch name to use with a command.
May return nil, meaning \"use the default\"."
(let ((patches (split-string
(hg-chomp (hg-run0 (or source "qseries"))) "\n")))
Bryan O'Sullivan
mq.el: add mq-new function.
r4422 (when force
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (completing-read (format "Patch%s: " (or prompt ""))
NIIMI Satoshi
mercurial.el, mq.el: remove runtime dependencies on CL package...
r5465 (mapcar (lambda (x) (cons x x)) patches)
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 nil
nil
nil
'mq-patch-history))))
(defun mq-refresh-buffers (root)
(save-excursion
(dolist (buf (hg-buffers-visiting-repo root))
(when (not (verify-visited-file-modtime buf))
(set-buffer buf)
(let ((ctx (hg-buffer-context)))
(message "Refreshing %s..." (buffer-name))
(revert-buffer t t t)
(hg-restore-context ctx)
(message "Refreshing %s...done" (buffer-name))))))
Brendan Cully
mq.el: add mode-line hook
r3370 (hg-update-mode-lines root)
(mq-update-mode-lines root))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
(defun mq-last-line ()
(goto-char (point-max))
(beginning-of-line)
(when (looking-at "^$")
(forward-line -1))
(let ((bol (point)))
(end-of-line)
(let ((line (buffer-substring bol (point))))
(when (> (length line) 0)
line))))
Thomas Arendsen Hein
Remove trailing spaces
r5081
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (defun mq-push (&optional patch)
"Push patches until PATCH is reached.
If PATCH is nil, push at most one patch."
Bryan O'Sullivan
mq.el: add mq-new function.
r4422 (interactive (list (mq-read-patch-name "qunapplied" " to push"
current-prefix-arg)))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (let ((root (hg-root))
(prev-buf (current-buffer))
last-line ok)
(unless root
(error "Cannot push outside a repository!"))
(hg-sync-buffers root)
(let ((buf-name (format "MQ: Push %s" (or patch "next patch"))))
(kill-buffer (get-buffer-create buf-name))
(split-window-vertically)
(other-window 1)
(switch-to-buffer (get-buffer-create buf-name))
(cd root)
(message "Pushing...")
(setq ok (= 0 (apply 'call-process (hg-binary) nil t t "qpush"
(if patch (list patch))))
last-line (mq-last-line))
(let ((lines (count-lines (point-min) (point-max))))
Bryan O'Sullivan
mq.el: don't fill half the screen with a single line of output.
r4428 (if (or (<= lines 1)
(and (equal lines 2) (string-match "Now at:" last-line)))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (progn
(kill-buffer (current-buffer))
(delete-window))
(hg-view-mode prev-buf))))
(mq-refresh-buffers root)
(sit-for 0)
(when last-line
(if ok
(message "Pushing... %s" last-line)
(error "Pushing... %s" last-line)))))
Thomas Arendsen Hein
Remove trailing spaces
r5081
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (defun mq-push-all ()
"Push patches until all are applied."
(interactive)
(mq-push "-a"))
(defun mq-pop (&optional patch)
"Pop patches until PATCH is reached.
If PATCH is nil, pop at most one patch."
Bryan O'Sullivan
mq.el: add mq-new function.
r4422 (interactive (list (mq-read-patch-name "qapplied" " to pop to"
current-prefix-arg)))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (let ((root (hg-root))
last-line ok)
(unless root
(error "Cannot pop outside a repository!"))
(hg-sync-buffers root)
(set-buffer (generate-new-buffer "qpop"))
(cd root)
(message "Popping...")
(setq ok (= 0 (apply 'call-process (hg-binary) nil t t "qpop"
(if patch (list patch))))
last-line (mq-last-line))
(kill-buffer (current-buffer))
(mq-refresh-buffers root)
(sit-for 0)
(when last-line
(if ok
(message "Popping... %s" last-line)
(error "Popping... %s" last-line)))))
Thomas Arendsen Hein
Remove trailing spaces
r5081
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (defun mq-pop-all ()
"Push patches until none are applied."
(interactive)
(mq-pop "-a"))
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (defun mq-refresh-internal (root &rest args)
(hg-sync-buffers root)
(let ((patch (mq-patch-info "qtop")))
(message "Refreshing %s..." patch)
(let ((ret (apply 'hg-run "qrefresh" args)))
(if (equal (car ret) 0)
(message "Refreshing %s... done." patch)
(error "Refreshing %s... %s" patch (hg-chomp (cdr ret)))))))
Bryan O'Sullivan
imported patch mq-refresh-git.patch
r4426 (defun mq-refresh (&optional git)
"Refresh the topmost applied patch.
With a prefix argument, generate a git-compatible patch."
(interactive "P")
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (let ((root (hg-root)))
(unless root
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (error "Cannot refresh outside of a repository!"))
Bryan O'Sullivan
imported patch mq-refresh-git.patch
r4426 (apply 'mq-refresh-internal root (if git '("--git")))))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (defun mq-patch-info (cmd &optional msg)
(let* ((ret (hg-run cmd))
(info (hg-chomp (cdr ret))))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (if (equal (car ret) 0)
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (if msg
(message "%s patch: %s" msg info)
info)
(error "%s" info))))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
(defun mq-top ()
"Print the name of the topmost applied patch."
(interactive)
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (mq-patch-info "qtop" "Top"))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
(defun mq-next ()
"Print the name of the next patch to be pushed."
(interactive)
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (mq-patch-info "qnext" "Next"))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
(defun mq-previous ()
"Print the name of the first patch below the topmost applied patch.
This would become the active patch if popped to."
(interactive)
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (mq-patch-info "qprev" "Previous"))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (defun mq-edit-finish ()
Bryan O'Sullivan
mq.el: Add comment to mq-edit-finish.
r3010 "Finish editing the description of this patch, and refresh the patch."
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (interactive)
(unless (equal (mq-patch-info "qtop") mq-top)
(error "Topmost patch has changed!"))
(hg-sync-buffers hg-root)
Bryan O'Sullivan
mq.el: add hook to run when finishing the edit of a patch.
r4427 (run-hooks 'mq-edit-finish-hook)
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (mq-refresh-internal hg-root "-m" (buffer-substring (point-min) (point-max)))
(let ((buf mq-prev-buffer))
(kill-buffer nil)
(switch-to-buffer buf)))
Thomas Arendsen Hein
Remove trailing spaces
r5081
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (defun mq-edit-kill ()
"Kill the edit currently being prepared."
(interactive)
(when (or (not (buffer-modified-p)) (y-or-n-p "Really kill this edit? "))
(let ((buf mq-prev-buffer))
(kill-buffer nil)
(switch-to-buffer buf))))
Brendan Cully
mq.el: add mode-line hook
r3370 (defun mq-get-top (root)
(let ((entry (assoc root mq-top-patch)))
(if entry
(cdr entry))))
(defun mq-set-top (root patch)
(let ((entry (assoc root mq-top-patch)))
(if entry
(if patch
(setcdr entry patch)
(setq mq-top-patch (delq entry mq-top-patch)))
(setq mq-top-patch (cons (cons root patch) mq-top-patch)))))
(defun mq-update-mode-lines (root)
(let ((cwd default-directory))
(cd root)
(condition-case nil
(mq-set-top root (mq-patch-info "qtop"))
(error (mq-set-top root nil)))
(cd cwd))
(let ((patch (mq-get-top root)))
(save-excursion
(dolist (buf (hg-buffers-visiting-repo root))
(set-buffer buf)
(if mq-mode
(setq mq-mode (or (and patch (concat " MQ:" patch)) " MQ")))))))
(defun mq-mode (&optional arg)
"Minor mode for Mercurial repositories with an MQ patch queue"
(interactive "i")
(cond ((hg-root)
(setq mq-mode (if (null arg) (not mq-mode)
arg))
(mq-update-mode-lines (hg-root))))
(run-hooks 'mq-mode-hook))
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (defun mq-edit-mode ()
"Mode for editing the description of a patch.
Key bindings
------------
\\[mq-edit-finish] use this description
\\[mq-edit-kill] abandon this description"
(interactive)
(use-local-map mq-edit-mode-map)
(set-syntax-table text-mode-syntax-table)
(setq local-abbrev-table text-mode-abbrev-table
major-mode 'mq-edit-mode
mode-name "MQ-Edit")
(set-buffer-modified-p nil)
(setq buffer-undo-list nil)
(run-hooks 'text-mode-hook 'mq-edit-mode-hook))
Thomas Arendsen Hein
Remove trailing spaces
r5081
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007 (defun mq-refresh-edit ()
"Refresh the topmost applied patch, editing the patch description."
(interactive)
Bryan O'Sullivan
mq.el: add ability to edit a patch.
r3009 (while mq-prev-buffer
(set-buffer mq-prev-buffer))
(let ((root (hg-root))
(prev-buffer (current-buffer))
(patch (mq-patch-info "qtop")))
(hg-sync-buffers root)
(let ((buf-name (format "*MQ: Edit description of %s*" patch)))
(switch-to-buffer (get-buffer-create buf-name))
(when (= (point-min) (point-max))
(set (make-local-variable 'hg-root) root)
(set (make-local-variable 'mq-top) patch)
(setq mq-prev-buffer prev-buffer)
(insert (hg-run0 "qheader"))
(goto-char (point-min)))
(mq-edit-mode)
(cd root)))
(message "Type `C-c C-c' to finish editing and refresh the patch."))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
Bryan O'Sullivan
mq.el: add mq-new function.
r4422 (defun mq-new (name)
"Create a new empty patch named NAME.
The patch is applied on top of the current topmost patch.
With a prefix argument, forcibly create the patch even if the working
directory is modified."
(interactive (list (mq-read-patch-name "qseries" " to create" t)))
(message "Creating patch...")
(let ((ret (if current-prefix-arg
(hg-run "qnew" "-f" name)
(hg-run "qnew" name))))
(if (equal (car ret) 0)
(progn
(hg-update-mode-lines (buffer-file-name))
(message "Creating patch... done."))
(error "Creating patch... %s" (hg-chomp (cdr ret))))))
Bryan O'Sullivan
mq.el: add mq-edit-series function.
r4423 (defun mq-edit-series ()
"Edit the MQ series file directly."
(interactive)
(let ((root (hg-root)))
(unless root
(error "Not in an MQ repository!"))
(find-file (concat root ".hg/patches/series"))))
Bryan O'Sullivan
mq.el: allow mq-diff to take a git option.
r4425 (defun mq-diff (&optional git)
"Display a diff of the topmost applied patch.
With a prefix argument, display a git-compatible diff."
(interactive "P")
Bryan O'Sullivan
mq.el: add mq-diff function.
r4424 (hg-view-output ((format "MQ: Diff of %s" (mq-patch-info "qtop")))
Bryan O'Sullivan
mq.el: allow mq-diff to take a git option.
r4425 (if git
(call-process (hg-binary) nil t nil "qdiff" "--git")
(call-process (hg-binary) nil t nil "qdiff"))
Bryan O'Sullivan
mq.el: add mq-diff function.
r4424 (diff-mode)
(font-lock-fontify-buffer)))
Bryan O'Sullivan
mq.el: add mq-signoff, to sign off on a patch
r4429 (defun mq-signoff ()
"Sign off on the current patch, in the style used by the Linux kernel.
If the variable mq-signoff-address is non-nil, it will be used, otherwise
the value of the ui.username item from your hgrc will be used."
(interactive)
(let ((was-editing (eq major-mode 'mq-edit-mode))
signed)
(unless was-editing
(mq-refresh-edit))
(save-excursion
(let* ((user (or mq-signoff-address
(hg-run0 "debugconfig" "ui.username")))
(signoff (concat "Signed-off-by: " user)))
(if (search-forward signoff nil t)
(message "You have already signed off on this patch.")
(goto-char (point-max))
(let ((case-fold-search t))
(if (re-search-backward "^Signed-off-by: " nil t)
(forward-line 1)
(insert "\n")))
(insert signoff)
(message "%s" signoff)
(setq signed t))))
(unless was-editing
(if signed
(mq-edit-finish)
(mq-edit-kill)))))
Bryan O'Sullivan
Emacs: add mq.el, early support for Mercurial Queues.
r3007
(provide 'mq)
;;; Local Variables:
;;; prompt-to-byte-compile: nil
;;; end: