]> code.delx.au - gnu-emacs/blobdiff - lisp/version.el
Augment docstring of ffap-string-at-point-mode-alist
[gnu-emacs] / lisp / version.el
index e63c51d0d26a2dd52bcc8442e61cc94b2ea3d5ed..c0b975ed31ba381844b0404b1d91c64d6733b517 100644 (file)
@@ -1,9 +1,9 @@
 ;;; version.el --- record version number of Emacs
 
-;; Copyright (C) 1985, 1992, 1994-1995, 1999-2012
-;;   Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1992, 1994-1995, 1999-2015 Free Software
+;; Foundation, Inc.
 
-;; Maintainer: FSF
+;; Maintainer: emacs-devel@gnu.org
 ;; Keywords: internal
 ;; Package: emacs
 
@@ -47,6 +47,7 @@ This variable first existed in version 19.23.")
 (defvar motif-version-string)
 (defvar gtk-version-string)
 (defvar ns-version-string)
+(defvar cairo-version-string)
 
 (defun emacs-version (&optional here)
   "Return string describing the version of Emacs that is running.
@@ -56,8 +57,8 @@ to the system configuration; look at `system-configuration' instead."
   (interactive "P")
   (let ((version-string
          (format (if (not (called-interactively-p 'interactive))
-                    "GNU Emacs %s (%s%s%s)\n of %s on %s"
-                  "GNU Emacs %s (%s%s%s) of %s on %s")
+                    "GNU Emacs %s (%s%s%s%s)\n of %s on %s"
+                  "GNU Emacs %s (%s%s%s%s) of %s on %s")
                  emacs-version
                 system-configuration
                 (cond ((featurep 'motif)
@@ -68,6 +69,9 @@ to the system configuration; look at `system-configuration' instead."
                       ((featurep 'ns)
                        (format ", NS %s" ns-version-string))
                       (t ""))
+                (if (featurep 'cairo)
+                    (format ", cairo version %s" cairo-version-string)
+                  "")
                 (if (and (boundp 'x-toolkit-scroll-bars)
                          (memq x-toolkit-scroll-bars '(xaw xaw3d)))
                     (format ", %s scroll bars"
@@ -85,42 +89,68 @@ to the system configuration; look at `system-configuration' instead."
 (defalias 'version 'emacs-version)
 
 ;; 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'."
+(defvar emacs-repository-version nil
+  "String giving the repository revision from which this Emacs was built.
+Value is nil if Emacs was not built from a repository checkout,
+or if we could not determine the revision.")
+
+(define-obsolete-variable-alias 'emacs-bzr-version
+                                'emacs-repository-version "24.4")
+
+(define-obsolete-function-alias 'emacs-bzr-get-version
+                                'emacs-repository-get-version "24.4")
+
+(defun emacs-repository-version-git (dir)
+  "Ask git itself for the version information for directory DIR."
+  (message "Waiting for git...")
+  (with-temp-buffer
+    (let ((default-directory (file-name-as-directory dir)))
+      (and (eq 0
+              (with-demoted-errors "Error running git rev-parse: %S"
+                (call-process "git" nil '(t nil) nil "rev-parse" "HEAD")))
+          (progn (goto-char (point-min))
+                 (looking-at "[0-9a-fA-F]\\{40\\}"))
+          (match-string 0)))))
+
+(defun emacs-repository--version-git-1 (file)
+  "Internal subroutine of `emacs-repository-get-version'."
+  (when (file-readable-p file)
+    (erase-buffer)
+    (insert-file-contents file)
+    (cond ((looking-at "[0-9a-fA-F]\\{40\\}")
+          (match-string 0))
+         ((looking-at "ref: \\(.*\\)")
+          (emacs-repository--version-git-1
+           (expand-file-name (match-string 1)
+                             (file-name-directory file)))))))
+
+(defun emacs-repository-get-version (&optional dir external)
+  "Try to return as a string the repository revision of the Emacs sources.
+The format of the returned string is dependent on the VCS in use.
+Value is nil if the sources do not seem to be under version
+control, 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'.
+Optional argument EXTERNAL non-nil means to just ask the VCS itself,
+if the sources appear to be under version control.  Otherwise only ask
+the VCS if we cannot find any information ourselves."
   (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.
-            ))))
+  (when (file-directory-p (expand-file-name ".git" dir))
+    (if external
+       (emacs-repository-version-git dir)
+      (or (let ((files '("HEAD" "refs/heads/master"))
+               file rev)
+           (with-temp-buffer
+             (while (and (not rev)
+                         (setq file (car files)))
+               (setq file (expand-file-name (format ".git/%s" file) dir)
+                     files (cdr files)
+                     rev (emacs-repository--version-git-1 file))))
+           rev)
+         ;; AFAICS this doesn't work during dumping (bug#20799).
+         (emacs-repository-version-git dir)))))
 
 ;; 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))