admin.el 9.88 KB
Newer Older
Gerd Moellmann's avatar
Gerd Moellmann committed
1 2
;;; admin.el --- utilities for Emacs administration

3
;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
Glenn Morris's avatar
Glenn Morris committed
4
;;   Free Software Foundation, Inc.
Gerd Moellmann's avatar
Gerd Moellmann committed
5 6 7

;; This file is part of GNU Emacs.

8
;; GNU Emacs is free software: you can redistribute it and/or modify
Gerd Moellmann's avatar
Gerd Moellmann committed
9
;; it under the terms of the GNU General Public License as published by
10 11
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
Gerd Moellmann's avatar
Gerd Moellmann committed
12 13 14 15 16 17 18

;; GNU Emacs 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
19
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
Gerd Moellmann's avatar
Gerd Moellmann committed
20 21 22

;;; Commentary:

23 24
;; add-release-logs	Add ``Version X released'' change log entries.
;; set-version		Change Emacs version number in source tree.
Glenn Morris's avatar
Glenn Morris committed
25 26
;; set-copyright        Change emacs short copyright string (eg as
;;                      printed by --version) in source tree.
Gerd Moellmann's avatar
Gerd Moellmann committed
27 28 29 30 31 32 33

;;; Code:

(defun add-release-logs (root version)
  "Add \"Version VERSION released.\" change log entries in ROOT.
Root must be the root of an Emacs source tree."
  (interactive "DEmacs root directory: \nNVersion number: ")
34
  (setq root (expand-file-name root))
Gerd Moellmann's avatar
Gerd Moellmann committed
35 36
  (unless (file-exists-p (expand-file-name "src/emacs.c" root))
    (error "%s doesn't seem to be the root of an Emacs source tree" root))
37
  (require 'add-log)
Gerd Moellmann's avatar
Gerd Moellmann committed
38 39
  (let* ((logs (process-lines "find" root "-name" "ChangeLog"))
	 (entry (format "%s  %s  <%s>\n\n\t* Version %s released.\n\n"
40 41 42 43
			(funcall add-log-time-format)
			(or add-log-full-name (user-full-name))
			(or add-log-mailing-address user-mail-address)
			version)))
Gerd Moellmann's avatar
Gerd Moellmann committed
44
    (dolist (log logs)
45
      (unless (string-match "/gnus/" log)
Gerd Moellmann's avatar
Gerd Moellmann committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59
	(find-file log)
	(goto-char (point-min))
	(insert entry)))))

(defun set-version-in-file (root file version rx)
  (find-file (expand-file-name file root))
  (goto-char (point-min))
  (unless (re-search-forward rx nil t)
    (error "Version not found in %s" file))
  (replace-match (format "%s" version) nil nil nil 1))

(defun set-version (root version)
  "Set Emacs version to VERSION in relevant files under ROOT.
Root must be the root of an Emacs source tree."
60
  (interactive "DEmacs root directory: \nsVersion number: ")
Gerd Moellmann's avatar
Gerd Moellmann committed
61 62 63 64 65 66 67 68
  (unless (file-exists-p (expand-file-name "src/emacs.c" root))
    (error "%s doesn't seem to be the root of an Emacs source tree" root))
  (set-version-in-file root "lisp/version.el" version
		       (rx (and "emacs-version" (0+ space)
				?\" (submatch (1+ (not (in ?\")))) ?\")))
  (set-version-in-file root "README" version
		       (rx (and "version" (1+ space)
				(submatch (1+ (in "0-9."))))))
69 70 71 72 73
  (set-version-in-file root "configure.in" version
		       (rx (and "AC_INIT" (1+ (not (in ?,)))
                                ?, (0+ space)
                                (submatch (1+ (in "0-9."))))))
  (set-version-in-file root "doc/emacs/emacs.texi" version
74 75
		       (rx (and "EMACSVER" (1+ space)
				(submatch (1+ (in "0-9."))))))
76
  (set-version-in-file root "doc/lispref/elisp.texi" version
Gerd Moellmann's avatar
Gerd Moellmann committed
77
		       (rx (and "EMACSVER" (1+ space)
78
				(submatch (1+ (in "0-9."))))))
79 80 81 82 83 84
  (set-version-in-file root "doc/lispref/vol1.texi" version
		       (rx (and "EMACSVER" (1+ space)
				(submatch (1+ (in "0-9."))))))
  (set-version-in-file root "doc/lispref/vol2.texi" version
		       (rx (and "EMACSVER" (1+ space)
				(submatch (1+ (in "0-9."))))))
85 86 87
  (set-version-in-file root "doc/lispref/book-spine.texinfo" version
		       (rx (and "Emacs Version" (1+ space)
				(submatch (1+ (in "0-9."))))))
88 89 90 91
  (set-version-in-file root "doc/man/emacs.1" version
		       (rx (and ".TH EMACS" (1+ not-newline)
                                "GNU Emacs" (1+ space)
				(submatch (1+ (in "0-9."))))))
92 93 94
  (set-version-in-file root "doc/misc/faq.texi" version
		       (rx (and "VER" (1+ space)
				(submatch (1+ (in "0-9."))))))
95 96 97
  (set-version-in-file root "lib-src/makefile.w32-in" version
		       (rx (and "VERSION" (0+ space) "=" (0+ space)
				(submatch (1+ (in "0-9."))))))
98 99 100 101 102 103 104 105 106
  ;; nt/emacs.rc also contains the version number, but in an awkward
  ;; format. It must contain four components, separated by commas, and
  ;; in two places those commas are followed by space, in two other
  ;; places they are not.
  (let* ((version-components (append (split-string version "\\.")
				    '("0" "0")))
	 (comma-version
	  (concat (car version-components) ","
		  (cadr version-components) ","
107
		  (cadr (cdr version-components)) ","
108 109 110 111
		  (cadr (cdr (cdr version-components)))))
	 (comma-space-version
	  (concat (car version-components) ", "
		  (cadr version-components) ", "
112
		  (cadr (cdr version-components)) ", "
113 114 115 116 117 118 119 120 121 122 123 124 125
		  (cadr (cdr (cdr version-components))))))
    (set-version-in-file root "nt/emacs.rc" comma-version
			 (rx (and "FILEVERSION" (1+ space)
				  (submatch (1+ (in "0-9,"))))))
    (set-version-in-file root "nt/emacs.rc" comma-version
			 (rx (and "PRODUCTVERSION" (1+ space)
				  (submatch (1+ (in "0-9,"))))))
    (set-version-in-file root "nt/emacs.rc" comma-space-version
			 (rx (and "\"FileVersion\"" (0+ space) ?, (0+ space)
				  ?\" (submatch (1+ (in "0-9, "))) "\\0\"")))
    (set-version-in-file root "nt/emacs.rc" comma-space-version
			 (rx (and "\"ProductVersion\"" (0+ space) ?,
				  (0+ space) ?\" (submatch (1+ (in "0-9, ")))
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
				  "\\0\"")))
    ;; Some files in the "mac" subdirectory also contain the version
    ;; number.
    (set-version-in-file
     root "mac/Emacs.app/Contents/Resources/English.lproj/InfoPlist.strings"
     version (rx (and "CFBundleShortVersionString" (0+ space) ?= (0+ space) ?\"
		      (submatch (1+ (in "0-9."))))))
    (set-version-in-file
     root "mac/Emacs.app/Contents/Resources/English.lproj/InfoPlist.strings"
     version (rx (and "CFBundleGetInfoString" (0+ space) ?= (0+ space) ?\"
		      (submatch (1+ (in "0-9."))))))
    (set-version-in-file root "mac/src/Emacs.r" (car version-components)
			 (rx (and "GNU Emacs " (submatch (1+ (in "0-9")))
				  " for Mac OS")))
    (set-version-in-file root "mac/src/Emacs.r" (car version-components)
			 (rx (and (submatch (1+ (in "0-9"))) (0+ space) ?\,
				  (0+ space) "/* Major revision in BCD */")))
    (set-version-in-file root "mac/src/Emacs.r" (cadr version-components)
			 (rx (and (submatch (1+ (in "0-9"))) (0+ space) ?\,
				  (0+ space) "/* Minor revision in BCD */")))
    (set-version-in-file root "mac/src/Emacs.r" (cadr (cdr version-components))
			 (rx (and (submatch (1+ (in "0-9"))) (0+ space) ?\,
				  (0+ space) "/* Non-final release # */")))
    (set-version-in-file root "mac/src/Emacs.r" version
			 (rx (and (submatch (1+ (in "0-9."))) (0+ space) ?\" ?\,
				  (0+ space) "/* Short version number */")))
    (set-version-in-file root "mac/src/Emacs.r" version
			 (rx (and "/* Short version number */" (0+ space) ?\"
				  (submatch (1+ (in "0-9."))))))
    (let* ((third-component (string-to-number (cadr (cdr version-components))))
	   (release (cond ((>= third-component 90) "alpha")
			  ((>= third-component 50) "development")
			  (t "final"))))
      (set-version-in-file
       root "mac/src/Emacs.r" release
       (rx (and (submatch (1+ (in "a-z"))) (0+ space) ?\, (0+ space)
		"/* development, alpha, beta, or final (release) */"))))))
163

Glenn Morris's avatar
Glenn Morris committed
164
;; Note this makes some assumptions about form of short copyright.
Glenn Morris's avatar
Glenn Morris committed
165
;; FIXME add the \year in the refcards/*.tex files.
Glenn Morris's avatar
Glenn Morris committed
166 167 168 169 170 171 172 173 174 175 176 177 178 179
(defun set-copyright (root copyright)
  "Set Emacs short copyright to COPYRIGHT in relevant files under ROOT.
Root must be the root of an Emacs source tree."
  (interactive (list
                (read-directory-name "Emacs root directory: " nil nil t)
                (read-string
                 "Short copyright string: "
                 (format "Copyright (C) %s Free Software Foundation, Inc."
                         (format-time-string "%Y")))))
  (unless (file-exists-p (expand-file-name "src/emacs.c" root))
    (error "%s doesn't seem to be the root of an Emacs source tree" root))
  (set-version-in-file root "lisp/version.el" copyright
		       (rx (and "emacs-copyright" (0+ space)
				?\" (submatch (1+ (not (in ?\")))) ?\")))
180 181 182
  (set-version-in-file root "lib-src/ebrowse.c" copyright
                       (rx (and "emacs_copyright" (0+ (not (in ?\")))
				?\" (submatch (1+ (not (in ?\")))) ?\")))
Glenn Morris's avatar
Glenn Morris committed
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
  (set-version-in-file root "lib-src/etags.c" copyright
                       (rx (and "emacs_copyright" (0+ (not (in ?\")))
				?\" (submatch (1+ (not (in ?\")))) ?\")))
  (set-version-in-file root "lib-src/rcs2log" copyright
		       (rx (and "Copyright" (0+ space) ?= (0+ space)
				?\' (submatch (1+ nonl)))))
  (set-version-in-file
   root "mac/Emacs.app/Contents/Resources/English.lproj/InfoPlist.strings"
   copyright (rx (and "CFBundleGetInfoString" (0+ space) ?= (0+ space) ?\"
                      (1+ anything)
                      (submatch "Copyright" (1+ (not (in ?\")))))))
  ;; This one is a nuisance, as it needs to be split over two lines.
  (string-match "\\(.*[0-9]\\{4\\} *\\)\\(.*\\)" copyright)
  (let ((csign "\\0xa9")
        (cyear (match-string 1 copyright))  ; "Copyright (C) 2007 "
        (owner (match-string 2 copyright))) ; "Free Software Foundation, Inc."
    (set-version-in-file root "mac/src/Emacs.r"
                         (regexp-quote
                          (replace-regexp-in-string "(C)"
                                                    (regexp-quote csign) cyear))
                         (rx (and
                              (submatch "Copyright" (0+ space) (eval csign)
                                        (0+ space) (= 4 num)
                                        (0+ (not (in ?\")))) ?\")))
    (set-version-in-file root "mac/src/Emacs.r" owner
                         (rx (and ?\"
                              (submatch (1+ (not (in ?\"))))
                              ?\" (0+ space)
                              "/* Long version number */")))))

Glenn Morris's avatar
Glenn Morris committed
213 214
(provide 'admin)

Miles Bader's avatar
Miles Bader committed
215
;;; arch-tag: 4ea83636-2293-408b-884e-ad64f22a3bf5
Gerd Moellmann's avatar
Gerd Moellmann committed
216
;; admin.el ends here.