Subject: Re: bug#41821: 28.0.50; read-directory-name in vc commands should provide defaults from projects

From: Dmitry Gutov <[email-masked]>
Date: Sat, 20 Jun 2020 04:35:40 +0300

On 19.06.2020 02:28, Juri Linkov wrote:
> Maybe something like:

Not too bad.

Though I'd rather not extend the public contract of project.el with a 
function that special-cases VC projects.

So maybe something like this instead:

diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 9b12d44978..19a4c7f60d 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -2508,6 +2508,19 @@ vc-print-log
           )
      (vc-print-log-internal backend files working-revision nil limit)))

+;; Or use project-try-vc after all. But this should be faster in the
+;; event when there actually are non-VC based projects in the list.
+(defun vc--known-vc-roots ()
+  (require 'project)
+  (defvar project--list)
+  (project--ensure-read-project-list)
+  (seq-filter (lambda (dir)
+                (let ((backend (vc-responsible-backend dir)))
+                  (if backend
+                      (condition-case nil
+                          (vc-call-backend backend 'root dir)
+                        (vc-not-supported
+                         nil)))))
+              (mapcar #'car project--list)))
+
  ;;;###autoload
  (defun vc-print-root-log (&optional limit revision)
    "List the revision history for the current VC controlled tree in a 
window.
@@ -2547,7 +2560,9 @@ vc-print-root-log
  	 rootdir)
      (if backend
  	(setq rootdir (vc-call-backend backend 'root default-directory))
-      (setq rootdir (read-directory-name "Directory for VC revision 
log: "))
+      (setq rootdir (read-directory-name "Directory for VC revision log: "
+                                         nil
+                                         (vc--known-vc-roots)))
        (setq backend (vc-responsible-backend rootdir))
        (unless backend
          (error "Directory is not version controlled")))

Personally, though, when I want behavior like this, I would probably 
just type 'C-x p v'.

The directory name reading with completion performed by 
project-prompt-project-dir is more quick and handy (though I'll confess 
to using Ivy as the completion UI for this and one other function; 
vertical completion fits these long string values best).

It also puts the selected project on the top of the list, which 
vc--known-vc-roots (or your function) don't do.