From 0419734fd39f8cd67472c0294295ef1508e39d85 Mon Sep 17 00:00:00 2001 From: Phillip Lord Date: Wed, 15 Jun 2016 17:36:42 +0100 Subject: [PATCH] Fix error from vc-git when GIT_DIR is set * lisp/vc/vc-git.el (vc-git-working-revision): Set default-directory to repository root to prevent an error when GIT_DIR is relative to it. * test/automated/vc-git-tests.el: New file. Addresses Bug#23769 --- lisp/vc/vc-git.el | 8 ++++-- test/automated/vc-git-tests.el | 60 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 test/automated/vc-git-tests.el diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index f35c84d..ea26a7d 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -260,9 +260,13 @@ vc-git-state (vc-git--state-code diff-letter))) (if (vc-git--empty-db-p) 'added 'up-to-date)))) -(defun vc-git-working-revision (_file) +(defun vc-git-working-revision (file) "Git-specific version of `vc-working-revision'." - (let (process-file-side-effects) + ;; Call this in the root directory, or Emacs may error when setting + ;; the modeline when called from a git pre-commit hook, which sets + ;; GIT_DIR. (Bug #23769) + (let ((default-directory (vc-git-root file)) + (process-file-side-effects)) (vc-git--rev-parse "HEAD"))) (defun vc-git--symbolic-ref (file) diff --git a/test/automated/vc-git-tests.el b/test/automated/vc-git-tests.el new file mode 100644 index 0000000..8001bcb --- /dev/null +++ b/test/automated/vc-git-tests.el @@ -0,0 +1,60 @@ +;;; vc-git-tests.el --- tests for vc/vc-git.el + +;; Copyright (C) 2016 Free Software Foundation, Inc. + +;; 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 3 of the License, 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. If not, see . + +;;; Commentary: + +;;; Code: + +(require 'ert) +(require 'vc-git) + +;; This will break when merged from the emacs-25 branch to master, +;; because of the change of directory structure. The actual file is +;; not important at all, so long as it is checked into git. +(defvar vc-git-tests-file + (concat + (expand-file-name + "data/xref/" + (file-name-directory (or load-file-name (buffer-file-name)))) + "file1.txt")) + + +(ert-deftest open-this-file () + "Test for Bug #23769." + (should + (let ((git-dir (getenv "GIT_DIR"))) + (unwind-protect + (progn + (setenv "GIT_DIR" nil) + (find-file vc-git-tests-file)) + (when (get-file-buffer vc-git-tests-file) + (setenv "GIT_DIR" git-dir) + (kill-buffer (get-file-buffer vc-git-tests-file)))))) + (should + (let ((git-dir (getenv "GIT_DIR"))) + (unwind-protect + (progn + (setenv "GIT_DIR" ".git") + (find-file vc-git-tests-file)) + (when (get-file-buffer vc-git-tests-file) + (setenv "GIT_DIR" git-dir) + (kill-buffer (get-file-buffer vc-git-tests-file))))))) + + +;;; vc-git-tests.el ends here -- 2.8.4