Merge from trunk.
[bpt/emacs.git] / lisp / version.el
index d28a300..804727a 100644 (file)
@@ -1,6 +1,6 @@
 ;;; version.el --- record version number of Emacs -*- no-byte-compile: t -*-
 
-;; Copyright (C) 1985, 1992, 1994-1995, 1999-2011
+;; Copyright (C) 1985, 1992, 1994-1995, 1999-2012
 ;;   Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
@@ -40,7 +40,8 @@ This variable first existed in version 19.23.")
 (defconst emacs-build-time (current-time) "\
 Time at which Emacs was dumped out.")
 
-(defconst emacs-build-system (system-name))
+(defconst emacs-build-system (system-name) "\
+Name of the system on which Emacs was built.")
 
 (defun emacs-version (&optional here) "\
 Return string describing the version of Emacs that is running.
@@ -78,13 +79,46 @@ to the system configuration; look at `system-configuration' instead."
 ;; We hope that this alias is easier for people to find.
 (defalias 'version 'emacs-version)
 
-;; We put version info into the executable in the form that `ident' uses.
-(or (eq system-type 'windows-nt)
-    (purecopy (concat "\n$Id: " (subst-char-in-string ?\n ?\s (emacs-version))
-                     " $\n")))
+;; Set during dumping, this is a defvar so that it can be setq'd.
+(defvar emacs-bzr-version nil "\
+String giving the bzr revision from which this Emacs was built.
+Value is the bzr revision number and a revision ID separated by a blank.
+Value is nil if Emacs was not built from a bzr checkout, or if we could
+not determine the revision.")
+
+(defun emacs-bzr-get-version (&optional dir) "\
+Try to return as a string the bzr revision number of the Emacs sources.
+Value is the bzr revision number and a revision ID separated by a blank.
+Value is nil if the sources do not seem to be under bzr, or if we could
+not determine the revision.  Note that this reports on the current state
+of the sources, which may not correspond to the running Emacs.
+
+Optional argument DIR is a directory to use instead of `source-directory'."
+  (or dir (setq dir source-directory))
+  (when (file-directory-p (setq dir (expand-file-name ".bzr/branch" dir)))
+    (let (file loc)
+      (cond ((file-readable-p
+              (setq file (expand-file-name "last-revision" dir)))
+             (with-temp-buffer
+               (insert-file-contents file)
+               (goto-char (point-max))
+               (if (looking-back "\n")
+                   (delete-char -1))
+               (buffer-string)))
+            ;; OK, no last-revision.  Is it a lightweight checkout?
+            ((file-readable-p
+              (setq file (expand-file-name "location" dir)))
+             ;; If the parent branch is local, try looking there for the revid.
+             (if (setq loc (with-temp-buffer
+                             (insert-file-contents file)
+                             (if (looking-at "file://\\(.*\\)")
+                                 (match-string 1))))
+                 (emacs-bzr-get-version loc)))
+            ;; Could fall back to eg `bzr testament' at this point.
+            ))))
 
-;;Local variables:
-;;version-control: never
-;;End:
+;; We put version info into the executable in the form that `ident' uses.
+(purecopy (concat "\n$Id: " (subst-char-in-string ?\n ?\s (emacs-version))
+                 " $\n"))
 
 ;;; version.el ends here