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

3
;; Copyright (C) 2001, 2005 Free Software Foundation, Inc.
Gerd Moellmann's avatar
Gerd Moellmann committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

;; This file is part of GNU Emacs.

;; GNU Emacs 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.

;; 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
;; along with GNU Emacs; see the file COPYING.  If not, write to the
Lute Kamstra's avatar
Lute Kamstra committed
19 20
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
Gerd Moellmann's avatar
Gerd Moellmann committed
21 22 23

;;; Commentary:

24 25
;; add-release-logs	Add ``Version X released'' change log entries.
;; set-version		Change Emacs version number in source tree.
Gerd Moellmann's avatar
Gerd Moellmann committed
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

;;; Code:

(defun process-lines (program &rest args)
  "Execute PROGRAM with ARGS, returning its output as a list of lines.
Signal an error if the program returns with a non-zero exit status."
  (with-temp-buffer
    (let ((status (apply 'call-process program nil (current-buffer) nil args)))
      (unless (eq status 0)
	(error "%s exited with status %s" program status))
      (goto-char (point-min))
      (let (lines)
	(while (not (eobp))
	  (setq lines (cons (buffer-substring-no-properties
			     (line-beginning-position)
			     (line-end-position))
			    lines))
	  (forward-line 1))
	(nreverse lines)))))

(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: ")
50
  (setq root (expand-file-name root))
Gerd Moellmann's avatar
Gerd Moellmann committed
51 52
  (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))
53
  (require 'add-log)
Gerd Moellmann's avatar
Gerd Moellmann committed
54 55
  (let* ((logs (process-lines "find" root "-name" "ChangeLog"))
	 (entry (format "%s  %s  <%s>\n\n\t* Version %s released.\n\n"
56 57 58 59
			(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
60
    (dolist (log logs)
61
      (unless (string-match "/gnus/" log)
Gerd Moellmann's avatar
Gerd Moellmann committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75
	(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."
76
  (interactive "DEmacs root directory: \nsVersion number: ")
Gerd Moellmann's avatar
Gerd Moellmann committed
77 78 79 80 81 82 83 84 85
  (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."))))))
  (set-version-in-file root "man/emacs.texi" version
86 87 88
		       (rx (and "EMACSVER" (1+ space)
				(submatch (1+ (in "0-9."))))))
  (set-version-in-file root "lispref/elisp.texi" version
Gerd Moellmann's avatar
Gerd Moellmann committed
89
		       (rx (and "EMACSVER" (1+ space)
90 91 92 93 94 95 96 97 98 99
				(submatch (1+ (in "0-9."))))))
  ;; 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) ","
100
		  (cadr (cdr version-components)) ","
101 102 103 104
		  (cadr (cdr (cdr version-components)))))
	 (comma-space-version
	  (concat (car version-components) ", "
		  (cadr version-components) ", "
105
		  (cadr (cdr version-components)) ", "
106 107 108 109 110 111 112 113 114 115 116 117 118
		  (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, ")))
119 120 121 122 123 124 125 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
				  "\\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) */"))))))
156

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