From: Andreas Gerler Date: Tue, 28 Aug 2018 18:03:21 +0000 (+0200) Subject: Adding debian-changelog-mode X-Git-Url: http://git.bundesbrandschatzamt.de/?a=commitdiff_plain;h=7af95070a62bb70ae01c8844475747ba0dc5a69b;p=emacsconfig.git Adding debian-changelog-mode Signed-off-by: Andreas Gerler --- diff --git a/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode-autoloads.el b/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode-autoloads.el new file mode 100644 index 00000000..c0f2a5ae --- /dev/null +++ b/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode-autoloads.el @@ -0,0 +1,52 @@ +;;; debian-changelog-mode-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "debian-changelog-mode" "debian-changelog-mode.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from debian-changelog-mode.el + +(autoload 'debian-changelog-add-entry "debian-changelog-mode" "\ +Add a new change entry to a debian-style changelog. +If called from buffer other than a debian/changelog, this will search +for the debian/changelog file to add the entry to. + +\(fn)" t nil) + +(autoload 'debian-changelog-mode "debian-changelog-mode" "\ +Major mode for editing Debian-style change logs. +Runs `debian-changelog-mode-hook' if it exists. + +Key bindings: + +\\{debian-changelog-mode-map} + +If you want to use your debian.org email address for debian/changelog +entries without using it for the rest of your email, use the `customize` +interface to set it, or simply set the variable +`debian-changelog-mailing-address' in your ~/.emacs file, e.g. + + (setq debian-changelog-mailing-address \"myname@debian.org\")) + +\(fn)" t nil) +(add-to-list 'auto-mode-alist '("/debian/*NEWS" . debian-changelog-mode)) +(add-to-list 'auto-mode-alist '("NEWS.Debian" . debian-changelog-mode)) +(add-to-list 'auto-mode-alist '("/debian/\\([[:lower:][:digit:]][[:lower:][:digit:].+-]+\\.\\)?changelog\\'" . debian-changelog-mode)) +(add-to-list 'auto-mode-alist '("changelog.Debian" . debian-changelog-mode)) +(add-to-list 'auto-mode-alist '("changelog.dch" . debian-changelog-mode)) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "debian-changelog-mode" '("debian-changelog-" "imenu--create-debian-changelog-index"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; debian-changelog-mode-autoloads.el ends here diff --git a/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode-pkg.el b/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode-pkg.el new file mode 100644 index 00000000..3fe25394 --- /dev/null +++ b/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode-pkg.el @@ -0,0 +1,2 @@ +;;; -*- no-byte-compile: t -*- +(define-package "debian-changelog-mode" "20180322.934" "major mode for Debian changelog files." 'nil :commit "8ca6eeccb26c71c6166993382917b94b9d3c03e2") diff --git a/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode.el b/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode.el new file mode 100644 index 00000000..e300da98 --- /dev/null +++ b/elpa/debian-changelog-mode-20180322.934/debian-changelog-mode.el @@ -0,0 +1,1815 @@ +;;; debian-changelog-mode.el --- major mode for Debian changelog files. +;; Package-Version: 20180322.934 + +;; Copyright (C) 1996 Ian Jackson +;; Copyright (C) 1997 Klee Dienes +;; Copyright (C) 1999 Chris Waters +;; Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Peter S Galbraith +;; Copyright (C) 2006, 2007, 2009, 2010 Peter S Galbraith +;; +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; debian-changelog-mode.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 your Debian installation, in /usr/share/common-licenses/GPL +;; If not, write to the Free Software Foundation, 51 Franklin Street, +;; Suite 500 Boston, MA 02110-1335, USA + +;;; Commentary: +;; +;; This is a major mode for Debian changelog files. The main features +;; are: +;; +;; - fontification (varies with upload urgency, etc). +;; - create a entry for a new version (guessing the version number). +;; - finalize a version with proper timestamp and syntax. +;; - add an entry from another file in the source package. +;; - interface with `debian-bug' to fetch list of bugs from the web, +;; read a bug report via browse-url or as email, close a bug with +;; thanks. +;; - closed bugs are fontified and clickable to view them via browse-url. +;; +;; The mode is entered automatically when editing a debian/changelog file. +;; See the menus "Bugs" and "Changelog" for commands or do `C-h m' to get +;; the list of keybindings. +;; +;; From other files in unpacked sources, do `M-x debian-changelog-add-entry' +;; to add an entry for that file in the changelog file. + +;;; History +;; +;; V1.00 30aug00 Peter S Galbraith +;; - Prior version had no changelogs; starting one now. +;; This is the potato version plus extensions by Chris Waters (easymenu; +;; better menus, font-lock support). +;; V1.01 30aug00 Peter S Galbraith +;; - debian-changelog-finalise-last-version: Use XEmacs' (user-mail-address) +;; function if variable user-mail-address is undefined. +;; Thanks to Robert Bihlmeyer , closes Bug#61524 +;; - debian-changelog-finalise-last-version: Takes account of some env vars +;; Thanks to Rafael Laboissiere , closes Bug#61226 +;; - debian-changelog-close-bug: new command. +;; V1.02 23Feb01 Peter S Galbraith +;; - Added `debian-changelog-suggest-version', a mechanisn for guessing +;; what the new version number should be. +;; Closes half of Bug#85412 +;; V1.03 23Feb01 Peter S Galbraith +;; - Fixed `fill-paragraph' by tweaks to paragraph-start and +;; paragraph-separate variables. +;; Closes second half of Bug#85412 +;; V1.04 23Feb01 Peter S Galbraith +;; - Added `debian-changelog-web-bugs' `debian-changelog-web-packages' +;; `debian-changelog-web-package' +;; V1.05 23Feb01 Peter S Galbraith +;; - made `debian-changelog-suggest-package-name' more picky about finding +;; an acceptable name. +;; V1.06 28Feb01 Peter S Galbraith +;; - Create customizable variables debian-changelog-full-name and +;; debian-changelog-mailing-address. +;; - Make debian-changelog-finalise-last-version use them. +;; V1.07 28Feb01 Peter S Galbraith +;; - debian-changelog-suggest-version: Handle epochs! +;; closes: Bug#87964: dpkg-dev-el: does wrong things with epochs +;; V1.08 07Mar01 Peter S Galbraith +;; debian-changelog-suggest-version: Handle package names with hyphens! +;; closes: #88589 and #88245 +;; V1.09 09Mar01 Peter S Galbraith +;; debian-changelog-suggest-version: better regexps for version numbers +;; Created debian-changelog-increment-version +;; V1.10 10Mar01 Peter S Galbraith +;; tweaks docs for debian-changelog-mode function concerning +;; add-log-mailing-address (now obsolete). +;; V1.11 24Apr01 Peter S Galbraith +;; Add stuff to try to trim out obsolete "Local Variables:" block from +;; changelog files. +;; V1.12 24Apr01 Peter S Galbraith +;; Modify font-lock code. closes: #93243 +;; V1.13 27Apr01 Peter S Galbraith +;; Move code concerning local variables near beginning of file such that +;; `hack-local-variables' doesn't complain. +;; V1.14 30Apr01 Peter S Galbraith +;; Add `critical' bug severity (see http://bugs.debian.org/94475) +;; V1.15 30Apr01 Peter S Galbraith +;; Tweak font-locking bug number regexp to match dpkg-parsechangelog 1.9.1 +;; V1.16 30Apr01 Peter S Galbraith +;; Added debian-changelog-web-bug (will bound to a mouse button later) +;; V1.17 30Apr01 Peter S Galbraith +;; debian-changelog-increment-version: Handle 3.5.4.0 case (single digits) +;; closes: #95831 +;; V1.18 30Apr01 Peter S Galbraith +;; Add mouse interface to web-bug (with green highlight). +;; V1.19 01May01 Peter S Galbraith +;; Add imenu support as `History'. Bug: The history menu is empty when +;; point is on the (mouse-highlighted) bug number (using emacs-20.7). +;; V1.20 02May01 Peter S Galbraith +;; Leave `mode: debian-changelog-mode' alone for native packages. +;; V1.21 02May01 Peter S Galbraith +;; Fix empty History menu when on bug numbers. +;; V1.22 02May01 Peter S Galbraith +;; Fontify version number (e.g. NMU in warning-face) +;; V1.23 02May01 Peter S Galbraith +;; Bypass imenu-progress-message because it breaks byte-compilation (?) +;; V1.24 03May01 Peter S Galbraith +;; Correct fix for imenu-progress-message macro (can't rely on variable +;; defined here for loading of imenu during byte-compilation). +;; V1.25 04May01 Peter S Galbraith +;; Add `experimental' distribution. +;; V1.26 04May01 Peter S Galbraith +;; Web site changed the URL for package searches: +;; http://cgi.debian.org/cgi-bin -> http://packages.debian.org/cgi-bin +;; V1.27 04May01 Peter S Galbraith +;; Set new version to `experimental' when last one was set to that. +;; closes: #96260: Default to the same distribution as the previous release +;; V1.28 04May01 Peter S Galbraith +;; Make `set-distribution' and `set-urgency' unavailable when changelog +;; is finalised (error at command line and menu grayed-out). +;; V1.29 04May01 Peter S Galbraith +;; Add-to auto-mode-alist in case not using dpkg-dev-el package. +;; V1.30 09May01 Peter S Galbraith +;; Fixed brain-damaged auto-mode-alist added in V1.29 (*blush*). +;; V1.31 28May01 Peter S Galbraith +;; Fix typo (closes: #98577). +;; Add a message display after each call to browse-url. +;; V1.32 28May01 Peter S Galbraith +;; - XEmacs21's easy-menu-define doesn't like :active. +;; - XEmacs21 need easy-menu-add call in mode setup. +;; - debian-changelog-setheadervalue: check at this lower level if finalised. +;; V1.33 29May01 Peter S Galbraith +;; Fix History IMenu for XEmacs21 (it doesn't autoload +;; match-string-no-properties). +;; V1.34 29May01 Peter S Galbraith +;; - debian-changelog-fontify-version: allow version numbers with many hyphens +;; - debian-changelog-suggest-version: heavy changes to deal with many hyphens +;; V1.35 06Jun01 Peter S Galbraith +;; - patch from Brian Warner to make +;; debian-changelog-local-variables-maybe-remove-done really buffer-local. +;; - Change another occurrence of make-local-variable. +;; V1.36 11Jun01 Peter S Galbraith +;; changed urgency "critical" to "emergency". +;; See http://lists.debian.org/debian-policy-0106/msg00095.html +;; V1.37 11Jun01 Peter S Galbraith +;; debian-changelog-suggest-version: another tweak when upstream version +;; number contains hyphens (closes: #100162). +;; V1.38 13Jun01 Peter S Galbraith +;; debian-changelog-suggest-version: peppered regexp-quote at various places +;; to match package names and version that contain regexp characters. +;; V1.39 13Jun01 Peter S Galbraith +;; change (provide 'debian-changelog) to (provide 'debian-changelog-mode) +;; (closes: #100639) Thanks *again* Yann Dirson! +;; V1.40 22Jun01 Peter S Galbraith +;; Changed urgency "emergency" back to "critical" (!) +;; See http://lists.debian.org/debian-policy-0106/msg00240.html +;; V1.41 04Jul01 Peter S Galbraith +;; debian-changelog-finalised-p updated by Tommi Virtanen +;; (closes: #102088) +;; V1.42 10Jul01 Peter S Galbraith +;; debian-changelog-finalised-p: tweak regexp (really closes: #102088) +;; V1.43 25Jul01 Peter S Galbraith +;; font-lock enforces 2 space exactly between email and date. +;; V1.44 26Jul01 Peter S Galbraith +;; No conditions left to keep variable block (See bug #105889) +;; - Removed debian-changelog-package-native-p function. +;; - Removed debian-changelog-local-variables-email-p function. +;; - Removed debian-changelog-local-variables-remove-address function. +;; - Removed debian-changelog-local-variables-remove-mode function. +;; - Created debian-changelog-local-variables-remove function. +;; V1.45 15Aug01 Peter S Galbraith +;; Bug list menu added (via wget). +;; V1.46 15Aug01 Roland Mas +;; One-character tweak to package name font-lock regexp. +;; V1.47 15Aug01 Peter S Galbraith +;; debian-changelog-web-bug: bug fix when called from menu +;; V1.48 19Sep01 Brian Warner +;; - move to end of file before prompting for removal of local variables. +;; - remove global def of debian-changelog-local-variables-maybe-remove-done. +;; V1.49 22Nov01 Roland Mas +;; debian-changelog-suggest-version: tweak regexp for case of upstream +;; version number with a single character. +;; V1.50 30Nov01 Roland Mas +;; replaced debian-changelog.el by debian-changelog-mode.el +;; V1.51 24Jan02 Peter S Galbraith +;; debian-changelog-web-bugs: return all bugs for the source package. +;; V1.52 07Feb02 Peter S Galbraith +;; debian-changelog-build-bug-menu: return all bugs for the source package. +;; V1.53 13May02 Peter S Galbraith +;; debian-changelog-mode: Add call to hack-local-variables since the "Local +;; variables:" block wasn't parsed otherwise. Strange. +;; V1.54 29May02 Peter S Galbraith +;; s/font-latex-warning-face/debian-changelog-warning-face/ +;; Now that was a weird leftover from cut/paste! +;; V1.55 03June02 Peter S Galbraith +;; fontify woody-proposed-updates as frozen. +;; V1.56 25July02 Peter S Galbraith +;; debian-changelog-mode: Remove call to hack-local-variables added in V1.53 +;; since a "mode: debian-changelog" setting created an infinite loop. +;; The bug I attemped to fix in V1.53 occurred when debian-changelog-mode +;; was invoked using the debian-changelog-find-file-hook mecanism in +;; 50dpkg-dev-el.el. This invoked debian-changelog-mode which called +;; kill-all-local-variables, deleting our settings. To get around this, I +;; no longer call 'text-mode' and copied whatever setting we need from it +;; (because it also kill-all-local-variables). +;; closes: #153982. +;; V1.57 29July02 Peter S Galbraith +;; debian-changelog-mode: Reinsert kill-all-local-variables removed in +;; last version. It's used by font-lock-mode to turn on font-lock-mode +;; when global-font-lock-mode is used. Since this kills the Local +;; Variables, the mode can no longer be entered late in the game as was +;; done in 50dpkg-dev-el.el by a find-file-hooks. Instead, use a +;; change-log-mode-hook which is less intrusive anyway. +;; V1.58 29July02 Peter S Galbraith +;; debian-changelog-greater-than: new function to determine if a version +;; number is greater than another. Used it to incorporate some logic +;; for for better guessing of new version numbers for native packages to +;; fix bug #113964. +;; V1.59 02Aug2002 Peter S Galbraith +;; Remove a bunch of code duplicated in debian-bug.el and load that file +;; instead. +;; debian-changelog-web-bugs -> debian-bug-web-bugs +;; debian-changelog-web-bug -> debian-bug-web-bug +;; debian-changelog-web-packages -> debian-bug-web-packages +;; debian-changelog-web-package -> debian-bug-web-package +;; dpkg-dev-el package should depend on versioned debbugs-el. +;; V1.60 15Aug2002 Peter S Galbraith +;; Update list of possible distributions to upload to from list given +;; from http://bugs.debian.org/150466 (Closes: #156762) +;; V1.61 20Aug2002 Peter S Galbraith +;; Prompt for confirmation and give *big* warning if user wants to set +;; the upload distribution to a -security one. See discussion on +;; http://bugs.debian.org/150466 +;; V1.62 20Aug2002 Peter S Galbraith +;; V1.63 05Sep2002 Peter S Galbraith +;; Fontify bugs on multiple-line closes: statements. Patch from +;; Frédéric Bothamy. (Closes: #159041) +;; V1.64 05Sep2002 Peter S Galbraith +;; debian-changelog-suggest-version fix (Closes: #159643) +;; V1.65 05Sep2002 Peter S Galbraith +;; - Stupid bug fix. s/debian-bug-bug-alist/debian-bug-alist/. +;; - Bug closing regexp enhancement from Roland Mas. +;; V1.66 24Oct2002 Peter S Galbraith +;; - Add UNRELEASED distribution, patch from Junichi Uekawa +;; with additional menu entry (Closes: #166163). +;; See bug #164470 for relevance and usage of UNRELEASED distribution. +;; V1.67 14Apr2003 Peter S Galbraith +;; - Use debian-bug.el's debian-bug-open-alist (needs emacs-goodies-el 19.4) +;; V1.68 21Apr2003 Peter S Galbraith +;; Byte-compilation cleanup. +;; V1.69 27Apr2003 Peter S Galbraith +;; - defcustom debian-changelog-mode-hook added. (Closes: #190853) +;; - debian-changelog-add-version creates new version in empty file +;; (Closes: #191285) +;; V1.70 28May2003 Peter S Galbraith +;; - Define (really) match-string-no-properties for XEmacs (Closes: #195181) +;; V1.71 02Sep2003 Peter S Galbraith +;; - When closing a bug, insert bug title and thanks if bug info was +;; downloaded from the web. +;; V1.72 17Sep2003 Peter S Galbraith +;; - Added browse-url link to `Best Practices for debian/changelog' in menu. +;; V1.73 04Nov2003 Peter S Galbraith +;; - checkdoc fixed (not complete!) +;; - Add autoload tag. +;; V1.74 22Nov2003 Peter S Galbraith +;; - Make `debian-changelog-add-entry' works from files in unpacked sources. +;; Thanks to Junichi Uekawa for suggesting it (Closes: #220641) +;; V1.75 27Nov2003 Peter S Galbraith +;; - Add menu entry for "Archived Bugs for This Package", for +;; "Developer Page for This Package" and +;; "Developer Page for This Maintainer". +;; - Added function `debian-changelog-maintainer' and interactive command +;; `debian-changelog-web-developer-page'. +;; V1.76 17Dec2003 Peter S Galbraith +;; - debian-changelog-setdistribution: Use `should-use-dialog-box-p' on XEmacs +;; (Closes: #224187) +;; V1.77 19Feb2004 Peter S Galbraith +;; - Add file NEWS.Debian to auto-mode-alist. Thanks to Chris Lawrence +;; for suggesting it. (Closes: #233310) +;; V1.78 14Apr2004 Peter S Galbraith +;; - debian-changelog-setdistribution: Dismiss warning window when setting +;; distribution to security. Thanks to Martin Schulze (Closes: #234730) +;; - Should mark line beginning with a tab as invalid. Fontified in warning +;; face. Thanks to Michel Daenzer (Closes: #235310). +;; V1.79 07June2005 Jari Aalto +;; - fix byte-compilation warning about +;; `(fboundp (quote imenu))' called for effect (Closes: #309788) +;; V1.80 15Sep2005 Rafael Laboissiere +;; - Add debian-changelog-add-version-hook defaulting to +;; debian-changelog-add-new-upstream-release (Closes: #296725) +;; V1.81 19Sep2005 Peter S Galbraith +;; - Add outline-regexp and C-cC-n and C-cC-p movement commands as +;; suggested by Romain Francoise (Closes: #322994) +;; V1.82 05Sep2006 Peter Samuelson +;; - Add tilde support for upstream version numbers (Closes: #382514) +;; V1.83 11Oct2006 Luca Capello +;; - Rename `debian-changelog-maintainer' to `debian-changelog-last-maintainer', +;; this is what the function really work on +;; - `debian-changelog-last-maintainer' now returns a list of "(NAME EMAIL)" +;; and not only EMAIL +;; - Add `debian-changelog-comaintainer-insert', which actually inserts the +;; co-maintainer name in the form "[ NAME ]" +;; - Add `debian-changelog-comaintainer', which checks if we're in a +;; co-maintenance, calling `debian-changelog-comaintainer-insert' +;; - Add co-maintenance support to `debian-changelog-unfinalise-last-version' +;; V1.84 14May2007 Peter S Galbraith +;; - Use "date -R" instead of deprecated "822-date" +;; (Closes: #423142, #423155, #423828) +;; - Tighter regexp for finalisation string +;; V1.85 25Jul2007 Peter S Galbraith +;; - Adapt patch from Luca Capello for bug #431091 +;; V1.86 08Aug2007 Peter S Galbraith +;; - auto-mode-alist for "/debian/*NEWS" files (Closes: #424779) +;; V1.87 02Sep2007 Peter S Galbraith +;; - Implement pacakge lookup on http://packages.debian.org/ +;; See http://bugs.debian.org/87725 +;; - Patch from Luca Capello to add keys to generate the +;; open bug alist. +;; V1.88 12Apr2008 Trent W. Buck +;; - Generalize auto-mode-alist entry. +;; See http://bugs.debian.org/457047 +;; V1.89 23Feb2009 Jari.aalto@cante.net +;; - finalize date in UTC (User configurable) (Closes: #503700) +;; V1.90 24Oct2009 Rafael Laboissiere +;; - debian-changelog-close-bug does not work properly under XEmacs 21.4.21 +;; because the arguments passed to replace-in-string in the inline function +;; debian-chagelog--rris are in the wrong order. Closes: #476271 +;; V1.91 12Nov2009 Peter S Galbraith +;; Updated URL for "Best practices". +;; V1.92 27Apr2010 Peter S Galbraith +;; Invoke `debian-bug-build-bug-menu' with SOURCE arg set to t. +;; Needs debian-el 33.2 +;; V1.93 10May2010 Peter S Galbraith +;; Fix typo (Closes: #580818) +;; V1.94 28Jul2010 Kevin Ryde +;; Simplify auto-mode-alist (Closes: #587924) +;; V1.95 01Dec2013 Matt Kraai +;; Change the default urgency to medium (Closes: #731105) +;; V1.96 06Nov2016 Guido Günther +;; Bug fix: "improve handling of {old-, }stable-proposed-updates", thanks +;; to Guido Gunther (Closes: #818010). +;; V1.97 06Nov2016 Pierre Carrier (on 2013-07-04) +;; https://bugs.launchpad.net/ubuntu/+source/emacs-goodies-el/+bug/1197870 +;; Bug fix #803767 debian-changelog-mode: don't rely on external date +;; See also https://github.com/pcarrier/debian-changelog-mode/commit/285d4cc938468fd3d7d74584da7981705727fbab +;; V1.98 06Nov2016 Kumar Appaiah +;; highlight backports (Closes: #708317) + +;;; Acknowledgements: (These people have contributed) +;; Roland Rosenfeld +;; James LewisMoss +;; Rafael Laboissiere +;; Brian Warner +;; Yann Dirson + +;;; Code: + +(defgroup debian-changelog nil "Debian changelog maintenance" + :group 'tools + :prefix "debian-changelog-") + +(defgroup debian-changelog-faces nil + "Faces for fontifying text in debian-changelog." + :prefix "debian-changelog-" + :group 'debian-changelog) + +(defcustom debian-changelog-full-name (or (getenv "DEBFULLNAME") + (user-full-name)) + "*Full name of user, for inclusion in Debian changelog headers. +This defaults to the contents of environment variable DEBFULLNAME +or else to the value returned by the function `user-full-name'." + :group 'debian-changelog + :type 'string) + +(defcustom debian-changelog-mailing-address + (or (getenv "DEBEMAIL") + (getenv "EMAIL") + (and (boundp 'user-mail-address) user-mail-address) + (and (fboundp 'user-mail-address) (user-mail-address))) + "*Electronic mail address of user, for inclusion in Debian changelog headers. +This defaults to the value of (in order of precedence): + Contents of environment variable DEBEMAIL, + Contents of environment variable EMAIL, + Value of `user-mail-address' variable, + Value returned by the `user-mail-address' function." + :group 'debian-changelog + :type 'string) + +(defcustom debian-changelog-allowed-distributions + '("unstable" + "testing" + "testing-security" + "stable" + "stable-security" + "stable-proposed-updates" + "oldstable-security" + "oldstable-proposed-updates" + "experimental" + "UNRELEASED" ) + "*Allowed values for distribution." + :group 'debian-changelog + :type '(repeat string)) + +(defcustom debian-changelog-local-variables-maybe-remove t + "*Ask to remove obsolete \"Local Variables:\" block from changelog. +This is done only under certain conditions." + :group 'debian-changelog + :type 'boolean) + +(defcustom debian-changelog-highlight-mouse-t t + "*Use special overlay for bug numbers, defining mouse-3 to web interface." + :group 'debian-changelog + :type 'boolean) + +(defcustom debian-changelog-use-imenu (fboundp 'imenu-add-to-menubar) + "*Use imenu package for debian-changelog-mode? +If you do not wish this behaviour, reset it in your .emacs file like so: + + (setq debian-changelog-use-imenu nil)" + :group 'debian-changelog + :type 'boolean) + +;; This solves the consistency problem with `debian-changelog-close-bug' +;; as per bug #431091 +(defcustom debian-changelog-close-bug-statement "(Closes: #%s)." + "The text to be inserted to close a bug. `%s' is replaced by +the bug number." + :group 'debian-changelog + :type 'string) + +(defcustom debian-changelog-mode-hook nil + "Normal hook run when entering Debian Changelog mode." + :group 'debian-changelog + :type 'hook + :options '(turn-on-auto-fill flyspell-mode)) + +(defcustom debian-changelog-add-version-hook + (list 'debian-changelog-add-new-upstream-release) + "Hooks run just before inserting the signature separator \"--\" in a +new version in debian/changelog." + :group 'debian-changelog + :type 'hook) + +(defcustom debian-changelog-date-utc-flag nil + "If non-nil, return date string in UTC when finalizing entry. +See function `debian-changelog-date-string'." + :group 'debian-changelog + :type 'boolean) + +;; This function is from emacs/lisp/calendar/icalendar.el, +;; necessary to replace "%s" with the bug number in +;; `debian-changelog-close-bug-statement' +(defsubst debian-changelog--rris (&rest args) + "Replace regular expression in string. +Pass ARGS to `replace-regexp-in-string' (GNU Emacs) or to +`replace-in-string' (XEmacs)." + ;; XEmacs: + (if (fboundp 'replace-in-string) + (save-match-data ;; apparently XEmacs needs save-match-data + ;; and arguments are in different order. + ;; Patch from Rafael Laboissiere + ;; Closes: #476271 + (apply 'replace-in-string (list (nth 2 args) (nth 0 args) (nth 1 args)))) + ;; Emacs: + (apply 'replace-regexp-in-string args))) + +(defvar debian-changelog-local-variables-maybe-remove-done nil + "Internal flag so we prompt only once.") + +(autoload 'debian-bug-web-bug "debian-bug") +(autoload 'debian-bug-web-bugs "debian-bug") +(autoload 'debian-bug-web-packages "debian-bug") +(autoload 'debian-bug-web-package "debian-bug") +(autoload 'debian-bug-bug-menu-init "debian-bug") +(autoload 'debian-bug-web-this-bug-under-mouse "debian-bug") +(autoload 'debian-bug-web-developer-page "debian-bug") +(defvar debian-bug-open-alist) + + +(require 'add-log) +(require 'easymenu) +(eval-when-compile + (require 'cl)) + +;; XEmacs21.1 compatibility -- from XEmacs's apel/poe.el +(unless (fboundp 'match-string-no-properties) + (defun match-string-no-properties (num &optional string) + "Return string of text matched by last search, without text properties. +NUM specifies which parenthesized expression in the last regexp. + Value is nil if NUMth pair didn't match, or there were less than NUM pairs. +Zero means the entire text matched by the whole regexp or whole string. +STRING should be given if the last search was by `string-match' on STRING." + (if (match-beginning num) + (if string + (let ((result + (substring string (match-beginning num) (match-end num)))) + (set-text-properties 0 (length result) nil result) + result) + (buffer-substring-no-properties (match-beginning num) + (match-end num)))))) +;; +;; Clean up old "Local Variables:" entries +;; Peter Galbraith + +;; **Important note** +;; +;; If we get the following warning: +;; +;; File local-variables error: (error "Local variables entry is missing the prefix") +;; +;; when installing the dpkg-dev-el package, it's because the command +;; (hack-local-variables) from files.el is bailing on all the "Local +;; Variables:" strings in this file. The simplest solution is to keep all +;; occurrences of this string before the last 3000 characters of the file, +;; where `hack-local-variables' starts looking: + +;; First, I made the add-log-mailing-address variable obsolete but still +;; left the "mode:" line in the variable block for Debian native packages +;; because it was impossible to tell what they were from the installed +;; changelog.gz name. In bug #105889, I came up with code to stick in +;; /etc/emacs/site-start.d/50dpkg-dev-el.el to figure that out in a +;; find-file-hooks hook. So now the variable block is completely obsolete. +(defun debian-changelog-local-variables-maybe-remove () + "Ask to remove local variables block if buffer not read-only." + (interactive) + (if (or debian-changelog-local-variables-maybe-remove-done + buffer-read-only) + nil + (setq debian-changelog-local-variables-maybe-remove-done t) + (if (debian-changelog-local-variables-exists-p) + (save-excursion + (goto-char (point-max)) ; local vars are always at end + (if (yes-or-no-p + "Remove obsolete \"local variables:\" from changelog? ") + (debian-changelog-local-variables-remove)))))) + +(defun debian-changelog-local-variables-exists-p () + "Return t if package has a \"Local Variables:\" block." + (save-excursion + (let ((case-fold-search t)) + (goto-char (point-max)) + (and (re-search-backward "^local variables:" nil t) + (or (re-search-forward "add-log-mailing-address:" nil t) + (re-search-forward "mode: debian-changelog" nil t)))))) + +(defun debian-changelog-local-variables-remove () + "Remove `add-log-mailing-address' entry from local variables block." + (save-excursion + (let ((case-fold-search t)) + (goto-char (point-max)) + ;; Remove add-log-mailing-address: line if it exists + (if (and (re-search-backward "^local variables:" nil t) + (re-search-forward "add-log-mailing-address: .+\n" nil t)) + (delete-region (match-beginning 0)(match-end 0))) + (goto-char (point-max)) + ;; Remove "mode: debian-changelog" line if it exists + (if (and (re-search-backward "^local variables:" nil t) + (re-search-forward "mode: debian-changelog.*\n" nil t)) + (delete-region (match-beginning 0)(match-end 0))) + (goto-char (point-max)) + ;; Remove empty variable block if it exists + (if (re-search-backward "^local variables: *\nend:" nil t) + (delete-region (match-beginning 0)(match-end 0)))))) + +;; +;; internal functions: getheadervalue and setheadervalue both use a +;; regexp to probe the changelog entry for specific fields. + +;; warning: if used with a "re" that doesn't have at least one group, +;; the results will be unpredictable (to say the least). + +(defun debian-changelog-setheadervalue (re str) + (if (eq (debian-changelog-finalised-p) t) + (error (substitute-command-keys "most recent version has been finalised - use \\[debian-changelog-unfinalise-last-version] or \\[debian-changelog-add-version]"))) + (let ((lineend (save-excursion (end-of-line)(point)))) + (save-excursion + (goto-char (point-min)) + (if (re-search-forward re lineend t) + (let ((a (match-beginning 1)) + (b (match-end 1))) + (goto-char a) + (delete-region a b) + (insert str)))))) + +(defun debian-changelog-getheadervalue (re) + (let ((lineend (save-excursion (end-of-line) (point)))) + (save-excursion + (goto-char (point-min)) + (re-search-forward re lineend) + (buffer-substring-no-properties (match-beginning 1) (match-end 1))))) + +;; +;; some get/set functions for specific fields +;; (Chris Waters) + +(defun debian-changelog-seturgency (val) + (debian-changelog-setheadervalue "\\;[^\n]* urgency=\\(\\sw+\\)" val)) +(defun debian-changelog-geturgency () + (debian-changelog-getheadervalue "\\;[^\n]* urgency=\\(\\sw+\\)")) +(defun debian-changelog-getdistribution () + (debian-changelog-getheadervalue ") \\(.*\\)\\;")) +(defvar last-nonmenu-event) +(defun debian-changelog-setdistribution (val) + (if (not (string-match "^.*security" val)) + (debian-changelog-setheadervalue ") \\(.*\\)\\;" val) + (cond + ((or (and (fboundp 'should-use-dialog-box-p) + (should-use-dialog-box-p)) + (and window-system + (equal last-nonmenu-event '(menu-bar)) + use-dialog-box)) + (if (y-or-n-p + (concat + "Warning, although the {oldstable,stable,testing}-security +distribution exists it should not be used unless you are a +member of the security team. Please don't upload to it if you +are not 150% sure that your package is suitable. In case of +doubt, please send the files to team@security.debian.org via +mail instead. + +Upload to " val " anyway?")) + (debian-changelog-setheadervalue ") \\(.*\\)\\;" val))) + (t + (let ((window-config (current-window-configuration))) + (with-output-to-temp-buffer "*Help*" + (princ (concat + "Warning, although the {oldstable,stable,testing}-security +distribution exists it should not be used unless you are a +member of the security team. Please don't upload to it if you +are not 150% sure that your package is suitable. In case of +doubt, please send the files to team@security.debian.org via +mail instead. + +Upload to " val " anyway?"))) + (if (y-or-n-p (format "Upload to %s anyway? " val)) + (debian-changelog-setheadervalue ") \\(.*\\)\\;" val)) + (set-window-configuration window-config)))))) + +;; +;; keymap table definition +;; + +(autoload 'outline-next-visible-heading "outline") +(autoload 'outline-prev-visible-heading "outline") + +(defvar debian-changelog-mode-map nil + "Keymap for Debian changelog major mode.") +(if debian-changelog-mode-map + nil + (setq debian-changelog-mode-map (make-sparse-keymap)) + (define-key debian-changelog-mode-map "\C-c\C-a" + 'debian-changelog-add-entry) + (define-key debian-changelog-mode-map "\C-c\C-o" + 'debian-changelog-build-open-bug-list) + (define-key debian-changelog-mode-map "\C-c\C-b" + 'debian-changelog-close-bug) + (define-key debian-changelog-mode-map "\C-c\C-f" + 'debian-changelog-finalise-last-version) + (define-key debian-changelog-mode-map "\C-c\C-c" + 'debian-changelog-finalise-and-save) + (define-key debian-changelog-mode-map "\C-c\C-v" + 'debian-changelog-add-version) + (define-key debian-changelog-mode-map "\C-c\C-d" + 'debian-changelog-distribution) + (define-key debian-changelog-mode-map "\C-c\C-u" + 'debian-changelog-urgency) + (define-key debian-changelog-mode-map "\C-c\C-e" + 'debian-changelog-unfinalise-last-version) + (define-key debian-changelog-mode-map "\C-c\C-n" + 'outline-next-visible-heading) + (define-key debian-changelog-mode-map "\C-c\C-p" + 'outline-previous-visible-heading)) + + +;; +;; menu definition (Chris Waters) +;; + +(defvar debian-changelog-is-XEmacs + (and + (not (null (save-match-data (string-match "XEmacs\\|Lucid" emacs-version)))) + (= 21 emacs-major-version))) + +(cond + (debian-changelog-is-XEmacs +(easy-menu-define + debian-changelog-menu debian-changelog-mode-map "Debian Changelog Mode Menu" + '("Changelog" + ["New Version" debian-changelog-add-version (debian-changelog-finalised-p)] + ["Add Entry" debian-changelog-add-entry + (not (debian-changelog-finalised-p))] + ["Build Open Bug List" debian-changelog-build-open-bug-list] + ["Close Bug" debian-changelog-close-bug + (not (debian-changelog-finalised-p))] + "--" + ("Set Distribution" + ["unstable" (debian-changelog-setdistribution "unstable") t] + ("--") + ["testing" (debian-changelog-setdistribution "testing") t] + ["testing-security" (debian-changelog-setdistribution "testing-security") t] + ("--") + ["stable" (debian-changelog-setdistribution "stable") t] + ["stable-security" (debian-changelog-setdistribution "stable-security") t] + ["stable-proposed-updates" (debian-changelog-setdistribution "stable-proposed-updates") t] + ("--") + ["oldstable-security" (debian-changelog-setdistribution "oldstable-security") t] + ["oldstable-proposed-updates" (debian-changelog-setdistribution "oldstable-proposed-updates") t] + ("--") + ["experimental" (debian-changelog-setdistribution "experimental") t] + ["UNRELEASED" (debian-changelog-setdistribution "UNRELEASED") t]) + ("Set Urgency" + ["low" (debian-changelog-seturgency "low") t] + ["medium" (debian-changelog-seturgency "medium") t] + ["high" (debian-changelog-seturgency "high") t] + ["critical" (debian-changelog-seturgency "critical") t]) + "--" + ["Unfinalise" debian-changelog-unfinalise-last-version + (debian-changelog-finalised-p)] + ["Finalise" debian-changelog-finalise-last-version + (not (debian-changelog-finalised-p))] + ["Finalise+Save" debian-changelog-finalise-and-save + (not (debian-changelog-finalised-p))] + "--" + "Web View" + ["Best Practices" (browse-url "http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-debian-changelog") t] + ["Bugs for This Package" (debian-bug-web-bugs) t] + ["Archived Bugs for This Package" (debian-bug-web-bugs t) t] + ["Bug Number..." (debian-bug-web-bug) t] + ["Package Info" (debian-bug-web-packages) t] +;; ("Package web pages..." +;; ["stable" (debian-bug-web-package "stable") t] +;; ["testing" (debian-bug-web-package "testing") t] +;; ["unstable" (debian-bug-web-package "unstable") t]) + ["Developer Page for This Package" (debian-bug-web-developer-page) t] + ["Developer Page for This Maintainer" (debian-changelog-web-developer-page) + t] + "--" + ["Customize" (customize-group "debian-changelog") (fboundp 'customize-group)]))) + (t +(easy-menu-define + debian-changelog-menu debian-changelog-mode-map "Debian Changelog Mode Menu" + '("Changelog" + ["New Version" debian-changelog-add-version (debian-changelog-finalised-p)] + ["Add Entry" debian-changelog-add-entry + (not (debian-changelog-finalised-p))] + ["Build Open Bug List" debian-changelog-build-open-bug-list] + ["Close Bug" debian-changelog-close-bug + (not (debian-changelog-finalised-p))] + "--" + ("Set Distribution" :active (not (debian-changelog-finalised-p)) + ["unstable" (debian-changelog-setdistribution "unstable") t] + ("--") + ["testing" (debian-changelog-setdistribution "testing") t] + ["testing-security" (debian-changelog-setdistribution "testing-security") t] + ("--") + ["stable" (debian-changelog-setdistribution "stable") t] + ["stable-security" (debian-changelog-setdistribution "stable-security") t] + ["stable-proposed-updates" (debian-changelog-setdistribution "stable-proposed-updates") t] + ("--") + ["oldstable-security" (debian-changelog-setdistribution "oldstable-security") t] + ["oldstable-proposed-updates" (debian-changelog-setdistribution "oldstable-proposed-updates") t] + ("--") + ["experimental" (debian-changelog-setdistribution "experimental") t] + ["UNRELEASED" (debian-changelog-setdistribution "UNRELEASED") t]) + ("Set Urgency" :active (not (debian-changelog-finalised-p)) + ["low" (debian-changelog-seturgency "low") t] + ["medium" (debian-changelog-seturgency "medium") t] + ["high" (debian-changelog-seturgency "high") t] + ["critical" (debian-changelog-seturgency "critical") t]) + "--" + ["Unfinalise" debian-changelog-unfinalise-last-version + (debian-changelog-finalised-p)] + ["Finalise" debian-changelog-finalise-last-version + (not (debian-changelog-finalised-p))] + ["Finalise+Save" debian-changelog-finalise-and-save + (not (debian-changelog-finalised-p))] + "--" + "Web View" + ["Best Practices" (browse-url "http://www.debian.org/doc/developers-reference/ch-best-pkging-practices.en.html#s-bpp-debian-changelog") t] + ["Bugs for This Package" (debian-bug-web-bugs) t] + ["Archived Bugs for This Package" (debian-bug-web-bugs t) t] + ["Bug Number..." (debian-bug-web-bug) t] + ["Package Info" (debian-bug-web-packages) t] + ("Package web pages..." + ["stable" (debian-bug-web-package "stable") t] + ["testing" (debian-bug-web-package "testing") t] + ["unstable" (debian-bug-web-package "unstable") t]) + ["Developer Page for This Package" (debian-bug-web-developer-page) t] + ["Developer Page for This Maintainer" (debian-changelog-web-developer-page) + t] + "--" + ["Customize" (customize-group "debian-changelog") (fboundp 'customize-group)])))) + +;; +;; interactive function to add a new line to the changelog +;; + +;;;###autoload +(defun debian-changelog-add-entry () + "Add a new change entry to a debian-style changelog. +If called from buffer other than a debian/changelog, this will search +for the debian/changelog file to add the entry to." + (interactive) + (if (string-match ".*/debian/changelog" (buffer-file-name)) + (debian-changelog-add-entry-plain) + (debian-changelog-add-entry-file))) + +(defun debian-changelog-add-entry-plain () + "Add a new change entry to a debian-style changelog." + (if (eq (debian-changelog-finalised-p) t) + (error (substitute-command-keys "most recent version has been finalised - use \\[debian-changelog-unfinalise-last-version] or \\[debian-changelog-add-version]"))) + (goto-char (point-min)) + (re-search-forward "\n --") + (backward-char 5) + (if (prog1 (looking-at "\n") (forward-char 1)) + nil + (insert "\n")) + (insert " * ") + (save-excursion (insert "\n"))) + +(defun debian-changelog-add-entry-file () + "Add an entry for current file in debian/changelog." + (let* ((this-file (buffer-file-name)) + (directory (if (not this-file) + (error "This buffer has no file associated to it") + (directory-file-name (file-name-directory this-file)))) + (filename (file-name-nondirectory this-file)) + (success)) + (while directory + (let ((changelog (expand-file-name "debian/changelog" directory))) + (cond + ((file-readable-p changelog) + (debian-changelog-add-entry-file-specified changelog filename) + (setq directory nil + success t)) + (t + (if (not (string-match "\\(.*\\)/\\([^/]+\\)$" directory)) + (setq directory nil) + (setq filename (concat (match-string 2 directory) "/" filename) + directory (match-string 1 directory))))))) + (if (not success) + (error "debian directory not found")))) + +(defun debian-changelog-add-entry-file-specified (changelog filename) + "Insert an entry in debian CHANGELOG file for FILENAME." + (interactive) + (find-file changelog) + (if (eq (debian-changelog-finalised-p) t) + (let ((action (capitalize + (read-string + "Most recent version is finalised, [u]nfinalize or [a]dd new version? ")))) + (if (not (string-match "^[uU]" action)) + (debian-changelog-add-version) + (debian-changelog-unfinalise-last-version) + (debian-changelog-add-entry-plain))) + (debian-changelog-add-entry-plain)) + (insert filename ": ")) + +;; +;; interactive function to close bugs by number. (Peter Galbraith) +;; + +(defvar debian-changelog-close-bug-takes-arg t + "A compatibility flag for debian-bug.el.") + +(defun debian-changelog-build-open-bug-list () + "Generate open bugs list, i.e. `debian-bug-open-alist'." + (interactive) + (debian-bug-build-bug-menu (debian-changelog-suggest-package-name) t)) + +(defun debian-changelog-close-bug (bug-number) + "Add a new change entry to close a BUG-NUMBER." + (interactive + (progn + (if (eq (debian-changelog-finalised-p) t) + (error (substitute-command-keys "most recent version has been finalised - use \\[debian-changelog-unfinalise-last-version] or \\[debian-changelog-add-version]"))) + (list (completing-read "Bug number to close: " + debian-bug-open-alist nil nil)))) + (if (not (string-match "^[0-9]+$" bug-number)) + (error "The bug number should consists of only digits")) + (debian-changelog-add-entry) + (cond + ((and debian-bug-open-alist + (assoc bug-number debian-bug-open-alist)) + (insert (cadr (assoc bug-number debian-bug-open-alist))) + (fill-paragraph nil)) + (t + (save-excursion + (insert " " (debian-changelog--rris + "%s" bug-number debian-changelog-close-bug-statement))) + (message "Enter a brief description of what was done here.")))) + +;; +;; interactive functions to set urgency and distribution +;; + +(defun debian-changelog-distribution () + "Delete the current distribution and prompt for a new one." + (interactive) + (if (eq (debian-changelog-finalised-p) t) + (error (substitute-command-keys "most recent version has been finalised - use \\[debian-changelog-unfinalise-last-version] or \\[debian-changelog-add-version]"))) + (let ((str (completing-read + "Select distribution: " + debian-changelog-allowed-distributions + nil t nil))) + (if (not (equal str "")) + (debian-changelog-setdistribution str)))) + +(defun debian-changelog-urgency () + "Delete the current urgency and prompt for a new one." + (interactive) + (if (eq (debian-changelog-finalised-p) t) + (error (substitute-command-keys "most recent version has been finalised - use \\[debian-changelog-unfinalise-last-version] or \\[debian-changelog-add-version]"))) + (let ((str (completing-read + "Select urgency: " + '(("low" 1) ("medium" 2) ("high" 3) ("critical" 4)) + nil t nil))) + (if (not (equal str "")) + (debian-changelog-seturgency str)))) + +;; +;; internal function: test if changelog has been finalized or not +;; New version by Tommi Virtanen +;; Sun, 24 Jun 2001 16:03:01 UTC; Debian bug #102088 +;; - +;; regexp tweaked by psg, Tue Jul 10 15:29:54 EDT 2001 + +(defun debian-changelog-finalised-p () + "Check whether the most recent debian-style changelog entry is finalised yet. +\(ie, has a maintainer name and email address and a release date." + (save-excursion + (goto-char (point-min)) + (or (re-search-forward "\n\\S-" (point-max) t) + (goto-char (point-max))) + (if (re-search-backward "\n --" (point-min) t) + (forward-char 4) + ;;(beginning-of-line) + ;;(insert " --\n\n") + ;;(backward-char 2) + ) + (cond + ((looking-at + "[ \n]+\\S-[^\n\t]+\\S- <[^ \t\n<>]+> +\\S-[^\t\n]+\\S-[ \t]*\n") + t) + ((looking-at "[ \t]*\n") + nil) + (t + "finalisation line has bad format (not ` -- maintainer date')")))) +;; +;; interactive functions to add new versions (whole new sections) +;; to changelog. +;; + +(defvar debian-changelog-new-upstream-release-p nil) + +(defun debian-changelog-add-new-upstream-release () + "Normal hook for adding \"new upstream release\" entry to changelog." + (when debian-changelog-new-upstream-release-p + (insert "New upstream release") + (setq debian-changelog-new-upstream-release-p nil))) + +(defun debian-changelog-add-version () + "Add a new version section to a debian-style changelog file. +If file is empty, create initial entry." + (interactive) + (if (not (= (point-min)(point-max))) + (let ((f (debian-changelog-finalised-p))) + (and (stringp f) (error f)) + (or f (error "Previous version not yet finalised")))) + (goto-char (point-min)) + (let ((pkg-name (or (debian-changelog-suggest-package-name) + (read-string "Package name: "))) + (version (or (debian-changelog-suggest-version) + (read-string "New version (including any revision): ")))) + (if (debian-changelog-experimental-p) + (insert pkg-name " (" version ") experimental; urgency=medium\n\n * ") + (insert pkg-name " (" version ") " (car debian-changelog-allowed-distributions) "; urgency=medium\n\n * ")) + (run-hooks 'debian-changelog-add-version-hook) + (save-excursion (insert "\n\n --\n\n")))) + +(defun debian-changelog-experimental-p () +;; Peter S Galbraith, 04 May 2001 + "Return t if last upload is to experimental." + (save-excursion + (goto-char (point-min)) + (looking-at "\\sw.* (.+).* \\(experimental\\)"))) + +(defun debian-changelog-suggest-package-name () +;; Peter S Galbraith, 23 Feb 2001 + "Return package name from first line of the changelog, or nil." + (save-excursion + (goto-char (point-min)) + (if (looking-at + "\\(\\S-+\\) +(\\([^()\n\t-]+\\)\\(-\\([^()]+\\)\\)?\\() +[^\n]*\\)") + (match-string-no-properties 1)))) + +(defun debian-changelog-greater-than (vsn1 vsn2) + "Return t if VSN1 is greater than VSN2." + (save-excursion + (let ((tmp-buffer (get-buffer-create + " *debian-changelog-mode-temp-buffer*"))) + (set-buffer tmp-buffer) + (unwind-protect + (progn + (let ((mesg (call-process "dpkg" nil '(t nil) nil + "--compare-versions" vsn1 "gt" vsn2))) + (if (equal mesg 0) + t + nil))) + (kill-buffer tmp-buffer))))) + +(defun debian-changelog-suggest-version () +;; Peter S Galbraith, 23 Feb 2001 + "Return a suggested new version number to use for this changelog, or nil." + (save-excursion + (goto-char (point-min)) + (let ((findmatch t)) + (cond + ((looking-at +;;; The following is not strictly correct. The upstream version may actually +;;; contain a hyphen if a debian version number also exists, making two hyphens +;;; I'm also assuming it begins with a digit, which is not enforced + "\\(\\S-+\\) +(\\([0-9]:\\)?\\([0-9][0-9a-zA-Z.+:~]*\\)\\(-\\([0-9a-zA-Z.+~]+\\)\\)?\\() +[^\n]*\\)")) + + ;; No match... + ;; Check again for multiple hyphens, and adjust match-data if found + ;; to leave only the bit past the last hyphen as the debian version + ;; number. + ((looking-at + "\\(\\S-+\\) +(\\([0-9]:\\)?\\([0-9][0-9a-zA-Z.+:~]*\\)\\(-\\([0-9a-zA-Z.+~]+\\)\\)*\\() +[^\n]*\\)") + ;; We have a hit. Adjust match-data... + (goto-char (match-end 5)) + (skip-chars-backward "0-9a-zA-Z.+~") + (let ((deb-vsn-beg (point)) + (ups-vsn-end (1- (point)))) + (store-match-data + (list + (match-beginning 0)(match-end 0) + (match-beginning 1)(match-end 1) + (match-beginning 2)(match-end 2) + (match-beginning 3) ups-vsn-end + (match-beginning 4)(match-end 4) + deb-vsn-beg (match-end 5) + (match-beginning 6)(match-end 6))))) + (t + (setq findmatch nil))) + + +;;; match 1: package name +;;; match 2: epoch, if it exists +;;; match 3: upstream version number +;;; match 4: debian version number exists if matched +;;; match 5: debian version number +;;; match 6: rest of string + (if (not findmatch) + nil + (let ((pkg-name (match-string-no-properties 1)) + (epoch (or (match-string-no-properties 2) "")) + (upstream-vsn (match-string-no-properties 3)) + (debian-vsn (match-string-no-properties 5))) + ;;debug (message "name: %s epoch: %s version: %s debian: %s" pkg-name epoch upstream-vsn debian-vsn)))) + + (cond + ;; Debian vsn exists + Old upstream version matches current one. + ;; -> Increment Debian version... + ((and debian-vsn + (string-match + (regexp-quote (concat "/" pkg-name "-" upstream-vsn "/debian/changelog")) + buffer-file-name)) + (concat epoch upstream-vsn "-" + (debian-changelog-increment-version debian-vsn))) + + ;; Same as above, but more general in case directory name doesn't + ;; match package name. -> Increment Debian version... + ((and debian-vsn + (string-match + (concat "-" (regexp-quote upstream-vsn) "/debian/changelog") + buffer-file-name)) + (concat epoch upstream-vsn "-" + (debian-changelog-increment-version debian-vsn))) + + ;; Debian vsn exists but old upstream version doesn't match new one. + ;; -> Use new upstream version with "-1" debian version. +;;;FIXME: I should perhaps check that the directory name version is higher +;;;than that currently in changelog. + ((and debian-vsn + (string-match (concat + "/" + (regexp-quote pkg-name) + "-\\([0-9][0-9a-zA-Z.+~-]+\\)/debian/changelog") + buffer-file-name)) + (setq debian-changelog-new-upstream-release-p t) + (concat epoch (match-string 1 buffer-file-name) "-1")) + + ;; Same as above, but more general in case directory name doesn't + ;; match package name. + ;; -> Use new upstream version with "-1" debian version. + ((and debian-vsn + (string-match + (concat "-\\([0-9][0-9a-zA-Z.+~-]+\\)/debian/changelog") + buffer-file-name)) + (setq debian-changelog-new-upstream-release-p t) + (concat epoch (match-string 1 buffer-file-name) "-1")) + + ;; Debian vsn exists, but directory name has no version + ;; -> increment Debian vsn (no better guess) + (debian-vsn + (concat epoch upstream-vsn "-" + (debian-changelog-increment-version debian-vsn))) + + ;;; No Debian version number... + + ;; No debian version number and version number from changelog + ;; already greater than from directory name. + ((and (not debian-vsn) + (not (string-match + (concat "/" (regexp-quote pkg-name) "-" + (regexp-quote upstream-vsn) "/debian/changelog") + buffer-file-name)) + (string-match (concat "/" (regexp-quote pkg-name) + "-\\([0-9a-zA-Z.+~]+\\)/debian/changelog") + buffer-file-name) + (debian-changelog-greater-than + upstream-vsn (match-string 1 buffer-file-name))) + (concat epoch (debian-changelog-increment-version upstream-vsn))) + + ;; No debian version number (Debian native) and old upstream + ;; version matches new one (e.g. 'dpk-source -x package' without + ;; then bumping up the version in the directory name. + ((and (not debian-vsn) + (string-match (concat "/" (regexp-quote pkg-name) "-" + (regexp-quote upstream-vsn) + "/debian/changelog") + buffer-file-name) + (concat epoch + (debian-changelog-increment-version upstream-vsn)))) + + ;; No debian version number and version number from changelog + ;; less than from directory name. + ((and (not debian-vsn) + (not (string-match + (concat "/" (regexp-quote pkg-name) "-" + (regexp-quote upstream-vsn) "/debian/changelog") + buffer-file-name)) + (string-match (concat + "/" (regexp-quote pkg-name) + "-\\([0-9a-zA-Z.+~]+\\)/debian/changelog") + buffer-file-name) + (debian-changelog-greater-than + (match-string 1 buffer-file-name) upstream-vsn)) + (concat epoch (match-string 1 buffer-file-name))) + + ((string-match (concat "/" (regexp-quote pkg-name) + "-\\([0-9a-zA-Z.+~]+\\)/debian/changelog") + buffer-file-name) + ;;Hmmm.. return version number from directory if we get this far + (concat epoch (match-string 1 buffer-file-name))) + ((string-match + (concat "-\\([0-9][0-9a-zA-Z.+~]+\\)/debian/changelog") + buffer-file-name) + ;;Hmmm.. return version number from directory if we get this far + (concat epoch (match-string 1 buffer-file-name))) + + ;; Directory name has no version -> increment what we have. + (t + (concat epoch + (debian-changelog-increment-version upstream-vsn))))))))) + +(defun debian-changelog-increment-version (version) +;; Peter S Galbraith, 09 Mar 2001 + "Increment the last numeric portion of a VERSION number. +1 -> 2 +0potato1 -> 0potato2 +1.01 -> 1.02" + (cond + ((string-match "[1-9][0-9]*$" version) + (let ((first-part (substring version 0 (match-beginning 0))) + (snd-part (match-string 0 version))) + (concat + first-part (number-to-string (+ 1 (string-to-number snd-part)))))) + ((string-match "[0-9]*$" version) + ;; 3.5.4.0 -> 3.5.4.1 + (let ((first-part (substring version 0 (match-beginning 0))) + (snd-part (match-string 0 version))) + (concat + first-part (number-to-string (+ 1 (string-to-number snd-part)))))) + (t + ;; Safety net only - first condition should catch all + (number-to-string (+ 1 (string-to-number version)))))) + +(defun debian-changelog-finalise-and-save () + "Finalise, if necessary, and then save a debian-style changelog file." + (interactive) + (let ((f (debian-changelog-finalised-p))) + (and (stringp f) (error f)) + (or f (debian-changelog-finalise-last-version))) + (save-buffer)) + +;; +;; internal function to get date as string (used by finalising routines) +;; + +(defun debian-changelog-date-string () + "Return RFC-822 format date string. +Use UTC if `debian-changelog-date-utc-flag' is non-nil." + (let ((system-time-locale "C")) + (format-time-string "%a, %d %b %Y %T %z" nil + debian-changelog-date-utc-flag))) +;; +;; interactive functions to finalize entry +;; + +;;; Use debian-changelog-full-name and debian-changelog-mailing-address instead +;; (make-local-variable 'add-log-full-name) +;; (make-local-variable 'add-log-mailing-address) + +(defun debian-changelog-finalise-last-version () + "Finalise maintainer's name and email and release date." + (interactive) + (and (debian-changelog-finalised-p) + (debian-changelog-unfinalise-last-version)) + (if debian-changelog-local-variables-maybe-remove + (debian-changelog-local-variables-maybe-remove)) + (save-excursion + (goto-char (point-min)) + (re-search-forward "\n --\\([ \t]*\\)") + (delete-region (match-beginning 1) (match-end 1)) + (insert " " debian-changelog-full-name + " <" debian-changelog-mailing-address "> " + (debian-changelog-date-string)))) + +(defun debian-changelog-last-maintainer () + "Return maintainer name and e-mail of the last changelog entry as +a list in the form (NAME EMAIL)." + (save-excursion + (goto-char (point-min)) + (let ((string + (if (re-search-forward "^ -- \\(.*\\)>" nil t) + (if (fboundp 'match-string-no-properties) + (match-string-no-properties 1) + (match-string 1)) + (error "Maintainer name and email not found.")))) + (split-string string " <")))) + +(defun debian-changelog-web-developer-page () + "Browse the BTS for the last upload maintainer's developer summary page." + (interactive) + (if (not (featurep 'browse-url)) + (progn + (load "browse-url" nil t) + (if (not (featurep 'browse-url)) + (error "This function requires the browse-url elisp package")))) + (let ((email (cadr (debian-changelog-last-maintainer)))) + (browse-url (concat "http://qa.debian.org/developer.php?login=" email)) + (message "Looking up developer summary page for %s via browse-url" email))) + +;; co-maintenance as per bug #352957 by Luca Capello 2006 +(defun debian-changelog-comaintainer-insert (name separator) + "In the line before SEPARATOR, insert the co-maintainer name as for +the form [ NAME ]." + (goto-char (point-min)) + (re-search-forward (concat "\n " separator)) + (previous-line 1) + (insert "\n [ " name " ]") + (when (string= "--" separator) + (insert "\n"))) + +(defun debian-changelog-comaintainer () + "If the last maintainer is different from the current one, create a +co-maintained changelog entry." + (let ((name (car (debian-changelog-last-maintainer)))) + (unless (string= name debian-changelog-full-name) + (let ((maintainers-found) + (debian-changelog-last-entry-end + (progn (goto-char (point-min)) + (re-search-forward "\n --")))) + (mapc (lambda (x) + (goto-char (point-min)) + (when (search-forward x debian-changelog-last-entry-end t) + (add-to-list 'maintainers-found x))) + (list name debian-changelog-full-name)) + ;; set the co-maintenance if any + (if maintainers-found + ;; co-maintenance, debian-changelog-full-name is not present + (if (and (member name maintainers-found) + (not (member debian-changelog-full-name + maintainers-found))) + (debian-changelog-comaintainer-insert + debian-changelog-full-name "--")) + ;; no co-maintenance + (mapc (lambda (x) + (debian-changelog-comaintainer-insert (car x) (cadr x))) + `((,name " *") (,debian-changelog-full-name "--")))))))) + +;; +;; interactive function to unfinalise changelog (so modifications can be made) +;; + +(defun debian-changelog-unfinalise-last-version () + "Remove the `finalisation' information. +Removes maintainer's name, email address and release date so that new entries +can be made." + (interactive) + (if (debian-changelog-finalised-p) nil + (error "Most recent version is not finalised")) + (save-excursion + (debian-changelog-comaintainer) + (goto-char (point-min)) + (re-search-forward "\n --") + (let ((dels (point))) + (end-of-line) + (delete-region dels (point))))) + +;; +;; top level interactive function to activate mode +;; + +(defvar imenu-create-index-function) +;;;###autoload +(defun debian-changelog-mode () + "Major mode for editing Debian-style change logs. +Runs `debian-changelog-mode-hook' if it exists. + +Key bindings: + +\\{debian-changelog-mode-map} + +If you want to use your debian.org email address for debian/changelog +entries without using it for the rest of your email, use the `customize` +interface to set it, or simply set the variable +`debian-changelog-mailing-address' in your ~/.emacs file, e.g. + + (setq debian-changelog-mailing-address \"myname@debian.org\"))" + + (interactive) + (kill-all-local-variables) + (setq major-mode 'debian-changelog-mode + mode-name "Debian changelog" + left-margin 2 + fill-prefix " " + fill-column 74) + ;;(hack-local-variables) + ;; Can't hack-local-varibles because a "mode: " creates an infinite loop. + ;; It doesn't matter anyway. The Local Variable block is parsed after + ;; the mode is run when visited by find-file. That's the only time it's + ;; done. + (use-local-map debian-changelog-mode-map) + ;; Let each entry behave as one paragraph: +; (set (make-local-variable 'paragraph-start) "\\*") +; (set (make-local-variable 'paragraph-separate) "\\*\\|\\s-*$|\\S-") + ;; PSG: The following appears to get fill-paragraph to finally work! + (set (make-local-variable 'paragraph-start) "\\*\\|\\s *$\\|\f\\|^\\<") + (set (make-local-variable 'paragraph-separate) "\\s *$\\|\f\\|^\\<") + ;; Let each version behave as one page. + ;; Match null string on the heading line so that the heading line + ;; is grouped with what follows. + (set (make-local-variable 'page-delimiter) "^\\<") + (set (make-local-variable 'version-control) 'never) + (set (make-local-variable 'adaptive-fill-regexp) "\\s *") + (set (make-local-variable 'font-lock-defaults) + '((debian-changelog-font-lock-keywords + debian-changelog-font-lock-keywords-1 + debian-changelog-font-lock-keywords-2) t t)) + (set (make-local-variable + 'debian-changelog-local-variables-maybe-remove-done) nil) + (set (make-local-variable 'indent-line-function) 'indent-relative-maybe) + (set (make-local-variable 'outline-regexp) "^[a-z]") + (setq local-abbrev-table text-mode-abbrev-table) + (set-syntax-table text-mode-syntax-table) + (debian-bug-bug-menu-init debian-changelog-mode-map) + (easy-menu-add debian-changelog-menu) + (cond + (debian-changelog-use-imenu + (require 'imenu) + (setq imenu-create-index-function 'imenu--create-debian-changelog-index) + (if (or window-system + (fboundp 'tmm-menubar)) + (progn + (imenu-add-to-menubar "History") + ;(imenu-update-menubar) + )))) + (cond + (debian-changelog-highlight-mouse-t + (debian-changelog-setup-highlight-mouse-keymap) + (debian-changelog-highlight-mouse))) + (run-hooks 'debian-changelog-mode-hook)) +;;(easy-menu-add debian-changelog-menu)) + +;; +;; font-lock face defs by Peter Galbraith + +(defvar debian-changelog-warning-face 'debian-changelog-warning-face + "Face to use for important keywords.") + +(cond + ((and (fboundp 'facep) + (facep 'font-lock-warning-face)) + (copy-face 'font-lock-warning-face 'debian-changelog-warning-face)) + ((fboundp 'defface) + (defface debian-changelog-warning-face + '((((class grayscale)(background light))(:foreground "DimGray" :bold t)) + (((class grayscale)(background dark))(:foreground "LightGray" :bold t)) + (((class color)(background light))(:foreground "red" :bold t )) + (((class color)(background dark))(:foreground "red" :bold t )) + (t (:bold t))) + "Face for debian-changelog important strings." + :group 'debian-changelog-faces)) + (t + ;;; XEmacs19: + (make-face 'debian-changelog-warning-face + "Face to use for important keywords.in debian-changelog-mode") + (make-face-bold 'debian-changelog-warning-face) + ;; XEmacs uses a tag-list thingy to determine if we are using color + ;; or mono (and I assume a dark background). + (set-face-foreground 'debian-changelog-warning-face + "red" 'global nil 'append))) + +;; +;; font-lock definition by Chris Waters, +;; revisited by Peter Galbraith (Apr 2001) + +;; Available faces: +;; keyword-face, type-face, string-face, comment-face, +;; variable-name-face, function-name-face +;; in emacs only: builtin-face, constant-face, warning-face +;; in xemacs only: reference-face, doc-string-face, preprocessor-face + +;; the mappings I've done below only use faces available in both emacsen. +;; this is somewhat limiting; I may consider adding my own faces later. + +(defvar debian-changelog-font-lock-keywords-1 + (list + ;; package name line: pkg (1.0-1) unstable; urgency=medium + '(debian-changelog-fontify-version + (1 font-lock-function-name-face) + (2 font-lock-type-face nil t) + (3 font-lock-string-face nil t) + (4 debian-changelog-warning-face nil t)) + '(debian-changelog-fontify-stable . debian-changelog-warning-face) + '(debian-changelog-fontify-backports . debian-changelog-warning-face) + '(debian-changelog-fontify-frozen . font-lock-type-face) + '(debian-changelog-fontify-unstable . font-lock-string-face) + '(debian-changelog-fontify-experimental . debian-changelog-warning-face) + '(debian-changelog-fontify-unreleased . debian-changelog-warning-face) + '(debian-changelog-fontify-urgency-crit . debian-changelog-warning-face) + '(debian-changelog-fontify-urgency-high . debian-changelog-warning-face) + '(debian-changelog-fontify-urgency-med . font-lock-type-face) + '(debian-changelog-fontify-urgency-low . font-lock-string-face) + ;; bug closers + '(;"\\(closes:\\) *\\(\\(bug\\)?#? *[0-9]+\\(, *\\(bug\\)?#? *[0-9]+\\)*\\)" + ;; Process lines that continue on multiple lines - Fred Bothamy + "\\(closes:\\)[ \t\n]*\\(\\(bug\\)?#? *[0-9]+\\(,[ \t\n]*\\(bug\\)?#? *[0-9]+\\)*\\)" + (1 font-lock-keyword-face) + (2 debian-changelog-warning-face)) + '("^\t.*$" . debian-changelog-warning-face) + ;; maintainer line (enforce 2 space exactly between email and date) + '("^ -- \\(.+\\) <\\(.+@.+\\)> \\([^ ].+\\)$" + (1 font-lock-variable-name-face) + (2 font-lock-variable-name-face) + (3 font-lock-string-face))) + "First level highlighting for `debian-changelog-mode'.") + +(defvar debian-changelog-font-lock-keywords-2 + (append + debian-changelog-font-lock-keywords-1 + ;; bullet lines + '(("^ +\\(\\*\\)" 1 font-lock-comment-face))) + "High level highlighting for `debian-changelog-mode'.") + +(defvar debian-changelog-font-lock-keywords + debian-changelog-font-lock-keywords-1 + "Default expressions to highlight in `debian-changelog-mode'.") + +;; Fontifier function by Peter Galbraith, Apr 24 2001 + +(defun debian-changelog-fontify-version (limit) + "Return match for package name and version number up to LIMIT. +match 1 -> package name + 2 -> native vsn number + 3 -> non-native vsn number + 4 -> non-native NMU vsn number" + (when (re-search-forward +;;; The following is not strictly correct. The upstream version may actually +;;; contain a hyphen if a debian version number also exists, making two hyphens +;;; I'm assuming it begins with a digit, which is not enforced + "^\\(\\S-+\\) (\\([0-9]:\\)?\\([0-9][0-9a-zA-Z.+:~]*\\)\\(-\\([0-9a-zA-Z.+~]+\\)\\)*)" nil t) +;; ^ +;; Note the asterix above, allowing more than one hyphen in the version +;; number, but wrongly assuming that all of it is the Debian version +;; instead of only the bit past the last hyphen. I might get NMUs wrongly +;; for version numbers with multiple hyphens. + +;; match 1: package name +;; match 2: epoch, if it exists +;; match 3: upstream version number +;; match 4: debian version number exists if matched +;; match 5: debian version number + (cond + ((not (match-string 4)) + ;; No Debian version number -> Debian native package + (store-match-data + (list (match-beginning 1)(match-end 3) + (match-beginning 1)(match-end 1) + (match-beginning 3)(match-end 3) + nil nil + nil nil))) + ((match-string 4) + ;; Debian version number -> Let's see if NMU... + (let* ((deb-vsn (match-string 5)) + (is-NMU (save-match-data (string-match "\\." deb-vsn)))) + (cond + (is-NMU + (store-match-data + (list (match-beginning 1)(match-end 5) + (match-beginning 1)(match-end 1) + nil nil + nil nil + (match-beginning 3)(match-end 5)))) + (t + (store-match-data + (list (match-beginning 1)(match-end 5) + (match-beginning 1)(match-end 1) + nil nil + (match-beginning 3)(match-end 5) + nil nil))))))) + t)) + +(defun debian-changelog-fontify-urgency-crit (limit) + (when (re-search-forward "^\\sw.* (.+).*; \\(urgency=critical\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-urgency-high (limit) + (when (re-search-forward "^\\sw.* (.+).*; \\(urgency=high\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-urgency-med (limit) + (when (re-search-forward "^\\sw.* (.+).*; \\(urgency=medium\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-urgency-low (limit) + (when (re-search-forward "^\\sw.* (.+).*; \\(urgency=low\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-stable (limit) + (when (re-search-forward "^\\sw.* (.+).* \\(\\(old\\)?stable\\(-security\\|-proposed-updates\\)?\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-frozen (limit) + (when (re-search-forward "^\\sw.* (.+).* \\(testing\\(-security\\)?\\|frozen\\|woody-proposed-updates\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-unstable (limit) + (when (re-search-forward "^\\sw.* (.+).* \\(unstable\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-experimental (limit) + (when (re-search-forward "^\\sw.* (.+).* \\(experimental\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-unreleased (limit) + (when (re-search-forward "^\\sw.* (.+).* \\(UNRELEASED\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +(defun debian-changelog-fontify-backports (limit) + (when (re-search-forward "^\\sw.* (.+).* \\([a-z][a-z]*-backports\\)" limit t) + (store-match-data + (list (match-beginning 1)(match-end 1))) + t)) + +;; +;; browse-url interfaces, by Peter Galbraith, Feb 23 2001 +;; + +(defvar debian-changelog-is-XEmacs + (not (null (save-match-data (string-match "XEmacs\\|Lucid" emacs-version))))) + +(defvar debian-changelog-mouse-keymap nil + "Keymap for mouse commands.") + +(defun debian-changelog-setup-highlight-mouse-keymap () + (setq debian-changelog-mouse-keymap + ;;; First, copy the local keymap so we don't have `disappearing' menus + ;;; when the mouse is moved over a bug number. + + ;;; FIXME: Check out (mouse-major-mode-menu) to see how it grabs the local + ;;; menus to display. + (let ((m (copy-keymap (current-local-map)))) +;; (cond +;; ((and debian-changelog-use-imenu +;; (or window-system (fboundp 'tmm-menubar))) +;; (imenu-add-to-menubar "History"))) + (cond + (debian-changelog-is-XEmacs + (set-keymap-name m 'debian-changelog-mouse-keymap) + (define-key m [button3] + 'debian-bug-web-this-bug-under-mouse)) + (t + (define-key m [down-mouse-3] + 'debian-bug-web-this-bug-under-mouse))) + m))) + +(defvar debian-changelog-ext-list nil + "XEmacs buffer-local list of debian-changelog-cite extents.") +(make-variable-buffer-local 'debian-changelog-ext-list) +(put 'debian-changelog-ext-list 'permanent-local t) + +(defun debian-changelog-highlight-mouse () + "Make that nice green highlight when the mouse is over a bug number. +Also set keymap." + (interactive) + (save-excursion + (let ((s)(e)(extent)(local-extent-list debian-changelog-ext-list) + (inhibit-read-only t) + (modified (buffer-modified-p))) ;put-text-property changing this? + ;; Remove the mouse face properties first. + (setq debian-changelog-ext-list nil) ;Reconstructed below... + (if (string-match "XEmacs\\|Lucid" emacs-version) + (while local-extent-list + (setq extent (car local-extent-list)) + (if (or (extent-detached-p extent) + (and (<= (point-min)(extent-start-position extent)) + (>= (point-max)(extent-end-position extent)))) + (delete-extent extent) + (setq debian-changelog-ext-list + (cons extent debian-changelog-ext-list))) + (setq local-extent-list (cdr local-extent-list))) + ;; Remove properties for regular emacs + ;; FIXME This detroys all mouse-faces and local-maps! + (let ((before-change-functions) (after-change-functions)) + (remove-text-properties (point-min) (point-max) + '(mouse-face t local-map t)))) + (goto-char (point-min)) + ;; FIXME: Ideally, I want to hightlight _only_ the digit parts + ;; (skipping the coma, and the word "bug". + (while + (re-search-forward +;;; "\\(closes:\\) *\\(\\(bug\\)?#? *[0-9]+\\(, *\\(bug\\)?#? *[0-9]+\\)*\\)" + ;; Same deal as for font-lock - patch from Fred Bothamy. + "\\(closes:\\)[ \t\n]*\\(\\(bug\\)?#? *[0-9]+\\(,[ \t\n]*\\(bug\\)?#? *[0-9]+\\)*\\)" + nil t) + (setq s (match-beginning 2)) + (setq e (match-end 2)) + (cond + ((string-match "XEmacs\\|Lucid" emacs-version) + (setq extent (make-extent s e)) + (setq debian-changelog-ext-list + (cons extent debian-changelog-ext-list)) + (set-extent-property extent 'highlight t) + (set-extent-property extent 'start-open t) +; (set-extent-property extent 'balloon-help 'debian-changelog-label-help) +; (set-extent-property extent 'help-echo 'debian-changelog-label-help-echo) + (set-extent-property extent 'keymap debian-changelog-mouse-keymap)) + (t + (let ((before-change-functions) (after-change-functions)) + (put-text-property s e 'local-map + debian-changelog-mouse-keymap) + (put-text-property s e 'mouse-face 'highlight))))) + (set-buffer-modified-p modified)))) + +;;;------------- +;;; imenu stuff - Peter Galbraith, May 2001 + +(eval-when-compile + (require 'cl) + (if (fboundp 'imenu) ;Make sure auto-load is loaded + (require 'imenu))) + +(defvar debian-changelog-imenu-doing-closebug nil + "Internal flag set when imenu is processing many bug closings.") +(make-variable-buffer-local 'debian-changelog-imenu-doing-closebug) + +(defun debian-changelog-imenu-prev-index-position-function () + (cond + (debian-changelog-imenu-doing-closebug + (if (not (posix-search-backward + "\\(closes:\\)\\|[^0-9]\\([0-9]+\\)" nil t)) + nil ; No match + ;; match 1 -> "closes:" + ;; match 2 -> a bug number + (cond + ((match-string 1) + (setq debian-changelog-imenu-doing-closebug nil) + (debian-changelog-imenu-prev-index-position-function)) + (t + ;; Return the bug number match + t)))) + (t + (if (not (re-search-backward + "\\(closes: *\\(bug\\)?#? *[0-9]+\\)\\|\\(^\\sw.* (\\(.+\\))\\)" + nil t)) + nil ; No match + ;; match 1 -> "closes:" + ;; match 4 -> a version number + (cond + ((match-string 1) + (setq debian-changelog-imenu-doing-closebug t) + (forward-char -1) + (re-search-forward + "\\(closes:\\) *\\(\\(bug\\)?#? *[0-9]+\\(, *\\(bug\\)?#? *[0-9]+\\)*\\)" + nil t) + (forward-char 1) + (debian-changelog-imenu-prev-index-position-function)) + (t + ;; Return the version number match + t)))))) + +(defvar debian-changelog-imenu-counter nil + "Debian-changelog-mode internal variable for imenu support.") + +(defun imenu--create-debian-changelog-index () + (save-match-data + (save-excursion + (let ((index-alist '()) + (index-bug-alist '()) + (index-bugsorted-alist '()) + (prev-pos 0) + (imenu-scanning-message "Scanning changelog for History (%3d%%)") + ) + (setq debian-changelog-imenu-counter -99) + (goto-char (point-max)) + (imenu-progress-message prev-pos 0 t) +;;; (message "Scanning changelog history...") + (setq debian-changelog-imenu-doing-closebug nil) + (while (debian-changelog-imenu-prev-index-position-function) + (imenu-progress-message prev-pos nil t) + (let ((marker (make-marker))) + (set-marker marker (point)) + (cond + ((match-beginning 2) ;bug number + (push (cons (match-string-no-properties 2) marker) + index-bug-alist)) + ((match-beginning 4) ;version number + (push (cons (match-string-no-properties 4) marker) + index-alist))))) + (imenu-progress-message prev-pos 100 t) +;;; (message "Scanning changelog history... done.") + (cond + (index-bug-alist + (push (cons "Closed Bugs (chrono)" + index-bug-alist) + index-alist) + (setq index-bugsorted-alist (copy-alist index-bug-alist)) + (push (cons "Closed Bugs (sorted)" + (sort index-bugsorted-alist + 'debian-changelog-imenu-sort)) + index-alist))) + index-alist)))) + +(defun debian-changelog-imenu-sort (el1 el2) + "Predicate to compare labels in lists." + (string< (car el2) (car el1) )) + +;;; end of imenu stuff +;;;------------- + +;;; Setup auto-mode-alist +;; (in case /etc/emacs/site-start.d/50dpkg-dev.el not used) +;; +;; Crib note: no need for "NEWS.Debian.gz" or "changelog.Debian.gz" entries +;; since jka-compr.el dispatches using the basename after uncompressing. + +(add-to-list 'auto-mode-alist '("/debian/*NEWS" . debian-changelog-mode)) +(add-to-list 'auto-mode-alist '("NEWS.Debian" . debian-changelog-mode)) + +;;(add-to-list 'auto-mode-alist '("/debian/changelog\\'" . debian-changelog-mode)) +;;; Instead use this. See http://bugs.debian.org/457047 by Trent W. Buck +;;; Valid package names spec is Debian Policy section 5.6.7 +(add-to-list + 'auto-mode-alist + '("/debian/\\([[:lower:][:digit:]][[:lower:][:digit:].+-]+\\.\\)?changelog\\'" + . debian-changelog-mode)) + +(add-to-list 'auto-mode-alist '("changelog.Debian" . debian-changelog-mode)) + ;; For debchange +(add-to-list 'auto-mode-alist '("changelog.dch" . debian-changelog-mode)) + +;;;###autoload(add-to-list 'auto-mode-alist '("/debian/*NEWS" . debian-changelog-mode)) +;;;###autoload(add-to-list 'auto-mode-alist '("NEWS.Debian" . debian-changelog-mode)) +;;;###autoload(add-to-list 'auto-mode-alist '("/debian/\\([[:lower:][:digit:]][[:lower:][:digit:].+-]+\\.\\)?changelog\\'" . debian-changelog-mode)) +;;;###autoload(add-to-list 'auto-mode-alist '("changelog.Debian" . debian-changelog-mode)) +;;;###autoload(add-to-list 'auto-mode-alist '("changelog.dch" . debian-changelog-mode)) + +(provide 'debian-changelog-mode) + +;;; debian-changelog-mode.el ends here diff --git a/elpa/debian-changelog-mode-readme.txt b/elpa/debian-changelog-mode-readme.txt new file mode 100644 index 00000000..86936826 --- /dev/null +++ b/elpa/debian-changelog-mode-readme.txt @@ -0,0 +1,340 @@ +This is a major mode for Debian changelog files. The main features +are: + + - fontification (varies with upload urgency, etc). + - create a entry for a new version (guessing the version number). + - finalize a version with proper timestamp and syntax. + - add an entry from another file in the source package. + - interface with `debian-bug' to fetch list of bugs from the web, + read a bug report via browse-url or as email, close a bug with + thanks. + - closed bugs are fontified and clickable to view them via browse-url. + +The mode is entered automatically when editing a debian/changelog file. +See the menus "Bugs" and "Changelog" for commands or do `C-h m' to get +the list of keybindings. + +From other files in unpacked sources, do `M-x debian-changelog-add-entry' +to add an entry for that file in the changelog file. + +History + +V1.00 30aug00 Peter S Galbraith + - Prior version had no changelogs; starting one now. + This is the potato version plus extensions by Chris Waters (easymenu; + better menus, font-lock support). +V1.01 30aug00 Peter S Galbraith + - debian-changelog-finalise-last-version: Use XEmacs' (user-mail-address) + function if variable user-mail-address is undefined. + Thanks to Robert Bihlmeyer , closes Bug#61524 + - debian-changelog-finalise-last-version: Takes account of some env vars + Thanks to Rafael Laboissiere , closes Bug#61226 + - debian-changelog-close-bug: new command. +V1.02 23Feb01 Peter S Galbraith + - Added `debian-changelog-suggest-version', a mechanisn for guessing + what the new version number should be. + Closes half of Bug#85412 +V1.03 23Feb01 Peter S Galbraith + - Fixed `fill-paragraph' by tweaks to paragraph-start and + paragraph-separate variables. + Closes second half of Bug#85412 +V1.04 23Feb01 Peter S Galbraith + - Added `debian-changelog-web-bugs' `debian-changelog-web-packages' + `debian-changelog-web-package' +V1.05 23Feb01 Peter S Galbraith + - made `debian-changelog-suggest-package-name' more picky about finding + an acceptable name. +V1.06 28Feb01 Peter S Galbraith + - Create customizable variables debian-changelog-full-name and + debian-changelog-mailing-address. + - Make debian-changelog-finalise-last-version use them. +V1.07 28Feb01 Peter S Galbraith + - debian-changelog-suggest-version: Handle epochs! + closes: Bug#87964: dpkg-dev-el: does wrong things with epochs +V1.08 07Mar01 Peter S Galbraith + debian-changelog-suggest-version: Handle package names with hyphens! + closes: #88589 and #88245 +V1.09 09Mar01 Peter S Galbraith + debian-changelog-suggest-version: better regexps for version numbers + Created debian-changelog-increment-version +V1.10 10Mar01 Peter S Galbraith + tweaks docs for debian-changelog-mode function concerning + add-log-mailing-address (now obsolete). +V1.11 24Apr01 Peter S Galbraith + Add stuff to try to trim out obsolete "Local Variables:" block from + changelog files. +V1.12 24Apr01 Peter S Galbraith + Modify font-lock code. closes: #93243 +V1.13 27Apr01 Peter S Galbraith + Move code concerning local variables near beginning of file such that + `hack-local-variables' doesn't complain. +V1.14 30Apr01 Peter S Galbraith + Add `critical' bug severity (see http://bugs.debian.org/94475) +V1.15 30Apr01 Peter S Galbraith + Tweak font-locking bug number regexp to match dpkg-parsechangelog 1.9.1 +V1.16 30Apr01 Peter S Galbraith + Added debian-changelog-web-bug (will bound to a mouse button later) +V1.17 30Apr01 Peter S Galbraith + debian-changelog-increment-version: Handle 3.5.4.0 case (single digits) + closes: #95831 +V1.18 30Apr01 Peter S Galbraith + Add mouse interface to web-bug (with green highlight). +V1.19 01May01 Peter S Galbraith + Add imenu support as `History'. Bug: The history menu is empty when + point is on the (mouse-highlighted) bug number (using emacs-20.7). +V1.20 02May01 Peter S Galbraith + Leave `mode: debian-changelog-mode' alone for native packages. +V1.21 02May01 Peter S Galbraith + Fix empty History menu when on bug numbers. +V1.22 02May01 Peter S Galbraith + Fontify version number (e.g. NMU in warning-face) +V1.23 02May01 Peter S Galbraith + Bypass imenu-progress-message because it breaks byte-compilation (?) +V1.24 03May01 Peter S Galbraith + Correct fix for imenu-progress-message macro (can't rely on variable + defined here for loading of imenu during byte-compilation). +V1.25 04May01 Peter S Galbraith + Add `experimental' distribution. +V1.26 04May01 Peter S Galbraith + Web site changed the URL for package searches: + http://cgi.debian.org/cgi-bin -> http://packages.debian.org/cgi-bin +V1.27 04May01 Peter S Galbraith + Set new version to `experimental' when last one was set to that. + closes: #96260: Default to the same distribution as the previous release +V1.28 04May01 Peter S Galbraith + Make `set-distribution' and `set-urgency' unavailable when changelog + is finalised (error at command line and menu grayed-out). +V1.29 04May01 Peter S Galbraith + Add-to auto-mode-alist in case not using dpkg-dev-el package. +V1.30 09May01 Peter S Galbraith + Fixed brain-damaged auto-mode-alist added in V1.29 (*blush*). +V1.31 28May01 Peter S Galbraith + Fix typo (closes: #98577). + Add a message display after each call to browse-url. +V1.32 28May01 Peter S Galbraith + - XEmacs21's easy-menu-define doesn't like :active. + - XEmacs21 need easy-menu-add call in mode setup. + - debian-changelog-setheadervalue: check at this lower level if finalised. +V1.33 29May01 Peter S Galbraith + Fix History IMenu for XEmacs21 (it doesn't autoload + match-string-no-properties). +V1.34 29May01 Peter S Galbraith + - debian-changelog-fontify-version: allow version numbers with many hyphens + - debian-changelog-suggest-version: heavy changes to deal with many hyphens +V1.35 06Jun01 Peter S Galbraith + - patch from Brian Warner to make + debian-changelog-local-variables-maybe-remove-done really buffer-local. + - Change another occurrence of make-local-variable. +V1.36 11Jun01 Peter S Galbraith + changed urgency "critical" to "emergency". + See http://lists.debian.org/debian-policy-0106/msg00095.html +V1.37 11Jun01 Peter S Galbraith + debian-changelog-suggest-version: another tweak when upstream version + number contains hyphens (closes: #100162). +V1.38 13Jun01 Peter S Galbraith + debian-changelog-suggest-version: peppered regexp-quote at various places + to match package names and version that contain regexp characters. +V1.39 13Jun01 Peter S Galbraith + change (provide 'debian-changelog) to (provide 'debian-changelog-mode) + (closes: #100639) Thanks *again* Yann Dirson! +V1.40 22Jun01 Peter S Galbraith + Changed urgency "emergency" back to "critical" (!) + See http://lists.debian.org/debian-policy-0106/msg00240.html +V1.41 04Jul01 Peter S Galbraith + debian-changelog-finalised-p updated by Tommi Virtanen + (closes: #102088) +V1.42 10Jul01 Peter S Galbraith + debian-changelog-finalised-p: tweak regexp (really closes: #102088) +V1.43 25Jul01 Peter S Galbraith + font-lock enforces 2 space exactly between email and date. +V1.44 26Jul01 Peter S Galbraith + No conditions left to keep variable block (See bug #105889) + - Removed debian-changelog-package-native-p function. + - Removed debian-changelog-local-variables-email-p function. + - Removed debian-changelog-local-variables-remove-address function. + - Removed debian-changelog-local-variables-remove-mode function. + - Created debian-changelog-local-variables-remove function. +V1.45 15Aug01 Peter S Galbraith + Bug list menu added (via wget). +V1.46 15Aug01 Roland Mas + One-character tweak to package name font-lock regexp. +V1.47 15Aug01 Peter S Galbraith + debian-changelog-web-bug: bug fix when called from menu +V1.48 19Sep01 Brian Warner + - move to end of file before prompting for removal of local variables. + - remove global def of debian-changelog-local-variables-maybe-remove-done. +V1.49 22Nov01 Roland Mas + debian-changelog-suggest-version: tweak regexp for case of upstream + version number with a single character. +V1.50 30Nov01 Roland Mas + replaced debian-changelog.el by debian-changelog-mode.el +V1.51 24Jan02 Peter S Galbraith + debian-changelog-web-bugs: return all bugs for the source package. +V1.52 07Feb02 Peter S Galbraith + debian-changelog-build-bug-menu: return all bugs for the source package. +V1.53 13May02 Peter S Galbraith + debian-changelog-mode: Add call to hack-local-variables since the "Local + variables:" block wasn't parsed otherwise. Strange. +V1.54 29May02 Peter S Galbraith + s/font-latex-warning-face/debian-changelog-warning-face/ + Now that was a weird leftover from cut/paste! +V1.55 03June02 Peter S Galbraith + fontify woody-proposed-updates as frozen. +V1.56 25July02 Peter S Galbraith + debian-changelog-mode: Remove call to hack-local-variables added in V1.53 + since a "mode: debian-changelog" setting created an infinite loop. + The bug I attemped to fix in V1.53 occurred when debian-changelog-mode + was invoked using the debian-changelog-find-file-hook mecanism in + 50dpkg-dev-el.el. This invoked debian-changelog-mode which called + kill-all-local-variables, deleting our settings. To get around this, I + no longer call 'text-mode' and copied whatever setting we need from it + (because it also kill-all-local-variables). + closes: #153982. +V1.57 29July02 Peter S Galbraith + debian-changelog-mode: Reinsert kill-all-local-variables removed in + last version. It's used by font-lock-mode to turn on font-lock-mode + when global-font-lock-mode is used. Since this kills the Local + Variables, the mode can no longer be entered late in the game as was + done in 50dpkg-dev-el.el by a find-file-hooks. Instead, use a + change-log-mode-hook which is less intrusive anyway. +V1.58 29July02 Peter S Galbraith + debian-changelog-greater-than: new function to determine if a version + number is greater than another. Used it to incorporate some logic + for for better guessing of new version numbers for native packages to + fix bug #113964. +V1.59 02Aug2002 Peter S Galbraith + Remove a bunch of code duplicated in debian-bug.el and load that file + instead. + debian-changelog-web-bugs -> debian-bug-web-bugs + debian-changelog-web-bug -> debian-bug-web-bug + debian-changelog-web-packages -> debian-bug-web-packages + debian-changelog-web-package -> debian-bug-web-package + dpkg-dev-el package should depend on versioned debbugs-el. +V1.60 15Aug2002 Peter S Galbraith + Update list of possible distributions to upload to from list given + from http://bugs.debian.org/150466 (Closes: #156762) +V1.61 20Aug2002 Peter S Galbraith + Prompt for confirmation and give *big* warning if user wants to set + the upload distribution to a -security one. See discussion on + http://bugs.debian.org/150466 +V1.62 20Aug2002 Peter S Galbraith +V1.63 05Sep2002 Peter S Galbraith + Fontify bugs on multiple-line closes: statements. Patch from + Frédéric Bothamy. (Closes: #159041) +V1.64 05Sep2002 Peter S Galbraith + debian-changelog-suggest-version fix (Closes: #159643) +V1.65 05Sep2002 Peter S Galbraith + - Stupid bug fix. s/debian-bug-bug-alist/debian-bug-alist/. + - Bug closing regexp enhancement from Roland Mas. +V1.66 24Oct2002 Peter S Galbraith + - Add UNRELEASED distribution, patch from Junichi Uekawa + with additional menu entry (Closes: #166163). + See bug #164470 for relevance and usage of UNRELEASED distribution. +V1.67 14Apr2003 Peter S Galbraith + - Use debian-bug.el's debian-bug-open-alist (needs emacs-goodies-el 19.4) +V1.68 21Apr2003 Peter S Galbraith + Byte-compilation cleanup. +V1.69 27Apr2003 Peter S Galbraith + - defcustom debian-changelog-mode-hook added. (Closes: #190853) + - debian-changelog-add-version creates new version in empty file + (Closes: #191285) +V1.70 28May2003 Peter S Galbraith + - Define (really) match-string-no-properties for XEmacs (Closes: #195181) +V1.71 02Sep2003 Peter S Galbraith + - When closing a bug, insert bug title and thanks if bug info was + downloaded from the web. +V1.72 17Sep2003 Peter S Galbraith + - Added browse-url link to `Best Practices for debian/changelog' in menu. +V1.73 04Nov2003 Peter S Galbraith + - checkdoc fixed (not complete!) + - Add autoload tag. +V1.74 22Nov2003 Peter S Galbraith + - Make `debian-changelog-add-entry' works from files in unpacked sources. + Thanks to Junichi Uekawa for suggesting it (Closes: #220641) +V1.75 27Nov2003 Peter S Galbraith + - Add menu entry for "Archived Bugs for This Package", for + "Developer Page for This Package" and + "Developer Page for This Maintainer". + - Added function `debian-changelog-maintainer' and interactive command + `debian-changelog-web-developer-page'. +V1.76 17Dec2003 Peter S Galbraith + - debian-changelog-setdistribution: Use `should-use-dialog-box-p' on XEmacs + (Closes: #224187) +V1.77 19Feb2004 Peter S Galbraith + - Add file NEWS.Debian to auto-mode-alist. Thanks to Chris Lawrence + for suggesting it. (Closes: #233310) +V1.78 14Apr2004 Peter S Galbraith + - debian-changelog-setdistribution: Dismiss warning window when setting + distribution to security. Thanks to Martin Schulze (Closes: #234730) + - Should mark line beginning with a tab as invalid. Fontified in warning + face. Thanks to Michel Daenzer (Closes: #235310). +V1.79 07June2005 Jari Aalto + - fix byte-compilation warning about + `(fboundp (quote imenu))' called for effect (Closes: #309788) +V1.80 15Sep2005 Rafael Laboissiere + - Add debian-changelog-add-version-hook defaulting to + debian-changelog-add-new-upstream-release (Closes: #296725) +V1.81 19Sep2005 Peter S Galbraith + - Add outline-regexp and C-cC-n and C-cC-p movement commands as + suggested by Romain Francoise (Closes: #322994) +V1.82 05Sep2006 Peter Samuelson + - Add tilde support for upstream version numbers (Closes: #382514) +V1.83 11Oct2006 Luca Capello + - Rename `debian-changelog-maintainer' to `debian-changelog-last-maintainer', + this is what the function really work on + - `debian-changelog-last-maintainer' now returns a list of "(NAME EMAIL)" + and not only EMAIL + - Add `debian-changelog-comaintainer-insert', which actually inserts the + co-maintainer name in the form "[ NAME ]" + - Add `debian-changelog-comaintainer', which checks if we're in a + co-maintenance, calling `debian-changelog-comaintainer-insert' + - Add co-maintenance support to `debian-changelog-unfinalise-last-version' +V1.84 14May2007 Peter S Galbraith + - Use "date -R" instead of deprecated "822-date" + (Closes: #423142, #423155, #423828) + - Tighter regexp for finalisation string +V1.85 25Jul2007 Peter S Galbraith + - Adapt patch from Luca Capello for bug #431091 +V1.86 08Aug2007 Peter S Galbraith + - auto-mode-alist for "/debian/*NEWS" files (Closes: #424779) +V1.87 02Sep2007 Peter S Galbraith + - Implement pacakge lookup on http://packages.debian.org/ + See http://bugs.debian.org/87725 + - Patch from Luca Capello to add keys to generate the + open bug alist. +V1.88 12Apr2008 Trent W. Buck + - Generalize auto-mode-alist entry. + See http://bugs.debian.org/457047 +V1.89 23Feb2009 Jari.aalto@cante.net + - finalize date in UTC (User configurable) (Closes: #503700) +V1.90 24Oct2009 Rafael Laboissiere + - debian-changelog-close-bug does not work properly under XEmacs 21.4.21 + because the arguments passed to replace-in-string in the inline function + debian-chagelog--rris are in the wrong order. Closes: #476271 +V1.91 12Nov2009 Peter S Galbraith + Updated URL for "Best practices". +V1.92 27Apr2010 Peter S Galbraith + Invoke `debian-bug-build-bug-menu' with SOURCE arg set to t. + Needs debian-el 33.2 +V1.93 10May2010 Peter S Galbraith + Fix typo (Closes: #580818) +V1.94 28Jul2010 Kevin Ryde + Simplify auto-mode-alist (Closes: #587924) +V1.95 01Dec2013 Matt Kraai + Change the default urgency to medium (Closes: #731105) +V1.96 06Nov2016 Guido Günther + Bug fix: "improve handling of {old-, }stable-proposed-updates", thanks + to Guido Gunther (Closes: #818010). +V1.97 06Nov2016 Pierre Carrier (on 2013-07-04) + https://bugs.launchpad.net/ubuntu/+source/emacs-goodies-el/+bug/1197870 + Bug fix #803767 debian-changelog-mode: don't rely on external date + See also https://github.com/pcarrier/debian-changelog-mode/commit/285d4cc938468fd3d7d74584da7981705727fbab +V1.98 06Nov2016 Kumar Appaiah + highlight backports (Closes: #708317) + +Acknowledgements: (These people have contributed) + Roland Rosenfeld + James LewisMoss + Rafael Laboissiere + Brian Warner + Yann Dirson