Subject: bug#55039: [PATCH] Use VC-relative file names in ChangeLog entries

From: Philip Kaludercic <[email-masked]>
Date: Wed, 07 Sep 2022 15:53:29 +0000

Eli Zaretskii <[email-masked]> writes:

>> From: Philip Kaludercic <[email-masked]>
>> Cc: Eli Zaretskii <[email-masked]>,  [email-masked]
>> Date: Tue, 06 Sep 2022 20:10:41 +0000
>> 
>> --- a/doc/emacs/maintaining.texi
>> +++ b/doc/emacs/maintaining.texi
>> @@ -694,7 +694,10 @@ Log Buffer
>>  (@code{log-edit-generate-changelog-from-diff}), to generate skeleton
>>  ChangeLog entries, listing all changed file and function names based
>>  on the diff of the VC fileset.  Consecutive entries left empty will be
>> -combined by @kbd{C-q} (@code{fill-paragraph}).
>> +combined by @kbd{C-q} (@code{fill-paragraph}).  By default the
>> +inserted file names will just be the files without a path.  If
>> +@code{diff-add-log-relative-names} is non-nil, a partial path relative
>> +to the VC root directory will be inserted instead.
>
> GNU Coding Standards frown on using "path" for anything but PATH-style
> directory lists.  Please use "leading directories" or somesuch here,
> as that's what you mean.

I've just remove the changes to the manual from my patch.

>> +*** New user option 'diff-relative-names-in-changelog'.
>> +If non-nil insert file names in ChangeLog skeletons relative to the
>              ^
> Comma missing there.

Done.

>> +(defcustom diff-add-log-relative-names nil
>> +  "Use relative file names when generating ChangeLog messages."
>
> This doesn't say relative to what.  It also doesn't mention the
> commands which are affected.

Added.

>>  (defun diff-add-log-current-defuns ()
>>    "Return an alist of defun names for the current diff.
>>  The elements of the alist are of the form (FILE . (DEFUN...)),
>> -where DEFUN... is a list of function names found in FILE."
>> +where DEFUN... is a list of function names found in FILE.  If
>> +`diff-add-log-relative-names' is non-nil, insert file names
>> +relative to the VC root directory."
>
> The "insert" part is out of place here, since there's no insertion.
>
> How about
>
>   If `diff-add-log-relative-names' is non-nil, file names in the alist
>   are relative to the root directory of the VC repository.
>
> instead?

I like it.

>From 8ef441e5d5340b06dd04d294a384ae05bf7f5615 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <[email-masked]>
Date: Tue, 6 Sep 2022 22:06:29 +0200
Subject: [PATCH] Add new user option 'diff-add-log-use-relative-names'

* .dir-locals.el: Set 'diff-add-log-use-relative-names' to t
* etc/NEWS: Mention 'diff-add-log-relative-names'
* lisp/vc/diff-mode.el (diff-add-log-use-relative-names): Add new option.
(diff-add-log-current-defuns): Use new option.
---
 .dir-locals.el       |  3 ++-
 etc/NEWS             |  5 +++++
 lisp/vc/diff-mode.el | 20 ++++++++++++++++++--
 3 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/.dir-locals.el b/.dir-locals.el
index 1c90ddcf56..9882a19f85 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -5,7 +5,8 @@
          (sentence-end-double-space . t)
          (fill-column . 70)
 	 (emacs-lisp-docstring-fill-column . 65)
-         (bug-reference-url-format . "https://debbugs.gnu.org/%s")))
+         (bug-reference-url-format . "https://debbugs.gnu.org/%s")
+	 (diff-add-log-use-relative-names . t)))
  (c-mode . ((c-file-style . "GNU")
             (c-noise-macro-names . ("INLINE" "ATTRIBUTE_NO_SANITIZE_UNDEFINED" "UNINIT" "CALLBACK" "ALIGN_STACK"))
             (electric-quote-comment . nil)
diff --git a/etc/NEWS b/etc/NEWS
index b61b88d6fb..76c66a8e39 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1340,6 +1340,11 @@ Sets the value of the buffer-local variable 'whitespace-style' in
 'diff-mode' buffers.  By default, this variable is '(face trailing)',
 which preserves behavior from previous Emacs versions.
 
++++
+*** New user option 'diff-add-log-use-relative-names'.
+If non-nil insert file names in ChangeLog skeletons relative to the
+VC root directory.
+
 ** Ispell
 
 ---
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index a01943437c..1d2fbca0e5 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -2336,10 +2336,21 @@ diff-undo
   (let ((inhibit-read-only t))
     (undo arg)))
 
+(defcustom diff-add-log-use-relative-names nil
+  "Use relative file names when generating ChangeLog skeletons.
+The files will be relative to the root directory of the VC
+repository.  This option affects the behaviour of
+`diff-add-log-current-defuns'."
+  :type 'boolean
+  :safe #'booleanp
+  :version "29.1")
+
 (defun diff-add-log-current-defuns ()
   "Return an alist of defun names for the current diff.
 The elements of the alist are of the form (FILE . (DEFUN...)),
-where DEFUN... is a list of function names found in FILE."
+where DEFUN... is a list of function names found in FILE.  If
+`diff-add-log-use-relative-names' is non-nil, file names in the alist
+are relative to the root directory of the VC repository."
   (save-excursion
     (goto-char (point-min))
     (let* ((defuns nil)
@@ -2373,7 +2384,12 @@ diff-add-log-current-defuns
           ;; hunks (e.g., "diff --git ..." etc).
           (re-search-forward diff-hunk-header-re nil t)
         (setq hunk-end (save-excursion (diff-end-of-hunk)))
-        (pcase-let* ((filename (substring-no-properties (diff-find-file-name)))
+        (pcase-let* ((filename (substring-no-properties
+                                (if diff-add-log-use-relative-names
+                                    (file-relative-name
+                                     (diff-find-file-name)
+                                     (vc-root-dir))
+                                  (diff-find-file-name))))
                      (=lines 0)
                      (+lines 0)
                      (-lines 0)
-- 
2.30.2