Subject: bug#37217: [PATCH] vc-default-ignore implementation is incorrect

From: Wolfgang Scherer <[email-masked]>
Date: Thu, 29 Aug 2019 02:53:20 +0200

Only the basename of FILE is written to the ignore file. This is
wrong for all filenames relative to project root with one ore
more parent directories.

The remove option is also implemented incorrectly.

The attached patch fixes these errors.

From 7ca81822189035db9a117b66ed8365b4eb2ab88b Mon Sep 17 00:00:00 2001
From: Wolfgang Scherer <[email-masked]>
Date: Thu, 29 Aug 2019 02:51:03 +0200
Subject: [PATCH] Fixes vc-default-ignore

* lisp/vc/vc.el: (vc-default-ignore) Treat FILE parameter as relative
to DIRECTORY parameter.  Construct a file-path relative to directory
of ignore file.  When removing, use properly anchored regexp.  Remove
entire line, not just the match.
---
 lisp/vc/vc.el | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 4cac153..2b1f163 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -1417,17 +1417,22 @@ remove from the list of ignored files."

 (defun vc-default-ignore (backend file &optional directory remove)
   "Ignore FILE under the VCS of DIRECTORY (default is `default-directory').
-FILE is a file wildcard, relative to the root directory of DIRECTORY.
+FILE is a wildcard specification, either relative to
+DIRECTORY or absolute.
 When called from Lisp code, if DIRECTORY is non-nil, the
 repository to use will be deduced by DIRECTORY; if REMOVE is
 non-nil, remove FILE from ignored files.
 Argument BACKEND is the backend you are using."
   (let ((ignore
 	 (vc-call-backend backend 'find-ignore-file (or directory default-directory)))
-	(pattern (file-relative-name
-		  (expand-file-name file) (file-name-directory file))))
+	file-path root-dir pattern)
+    (setq file-path (expand-file-name file directory))
+    (setq root-dir (file-name-directory ignore))
+    (when (not (string= (substring file-path 0 (length root-dir)) root-dir))
+      (error "Ignore spec %s is not below project root %s" file-path root-dir))
+    (setq pattern (substring file-path (length root-dir)))
     (if remove
-	(vc--remove-regexp pattern ignore)
+	(vc--remove-regexp (concat "^" (regexp-quote pattern ) "\n?") ignore)
       (vc--add-line pattern ignore))))

 (defun vc-default-ignore-completion-table (backend file)
--
2.7.4