unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Wolfgang Scherer <Wolfgang.Scherer@gmx.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 39502@debbugs.gnu.org, dgutov@yandex.ru
Subject: bug#39502: [PATCH] Use one src status -a call for vc-src-dir-status-files
Date: Sat, 15 Feb 2020 03:44:40 +0100	[thread overview]
Message-ID: <7baabba4-5874-4593-592b-7b1e8172e0f9@gmx.de> (raw)
In-Reply-To: <837e0ppjpg.fsf@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 3325 bytes --]

Am 14.02.20 um 11:05 schrieb Eli Zaretskii:
>> From: Wolfgang Scherer <Wolfgang.Scherer@gmx.de>
>> Date: Tue, 11 Feb 2020 03:54:03 +0100
>>
>>>> I am not sure what you mean by "install the latest patch version on master"?
>>> You posted two versions. Maybe there will be further revisions.
>> I am not planning on any :-). But I am still not sure, which master you mean. I have no write access to the repository.
> Can you describe a simple use case to test your patch, and tell what
> are the differences between the situation before and after the patch?
> Then I will try the changes, and install them if I see no problems.
>
> (I'm asking for details because at least part of the changes are
> simply white-space changes, and it isn't easy to identify the part(s)
> that really change the code workings.)
Sorry, I have a whitespace cleaner command that I keep using
unconciously.

The use case is to have a SRC repository with another SRC sub-repositoy,
which in turn contains a further SRC repository. When entering
*vc-dir-mode* with `M-x vc-dir` in the topmost repository, the status of
all files in all 3 respositories should be shown.

OK, the change is not so hard to understand when you know the sequence
of events.

At First, only *vc-src--parse-state* used a call to `src status -a` to
inquire about a single FILE. *vc-src-dir-status-files* used
*vc-expand-dirs* to get the status for all files. There was a comment
saying it should be fixed by using one call to `src status -a` instead:

```elisp
(defun vc-src-dir-status-files (dir files update-function)
 ;; FIXME: Use one src status -a call for this
 (if (not files) (setq files (vc-expand-dirs (list dir) 'SRC)))
```

The difference is, that the call to `src status -a` provides a more
detailed status for all files in a directory with just a single call.
This is faster and helps managing the ignore files better.

The first step was to extract the status parser as *vc-src--parse-state*
for reuse in *vc-srv-dir-status-files*:

```elisp
(defun vc-src--parse-state (out)
  (when (null (string-match "does not exist or is unreadable" out))
    (let ((state (aref out 0)))
      (cond
       ;; FIXME: What to do about L code?
       ((eq state ?.) 'up-to-date)
       ((eq state ?A) 'added)
       ((eq state ?M) 'edited)
       ((eq state ?I) 'ignored)
       ((eq state ?R) 'removed)
       ((eq state ?!) 'missing)
       ((eq state ??) 'unregistered)
       (t 'up-to-date)))))
```

The code in *vc-src-state* was replaced by a single call to
*vc-src--parse-state*:

```diff
@@ -163,32 +177,44 @@ For a description of possible values, see `vc-check-master-templates'."
                      "status" "-a" (file-relative-name file))
                   (error nil)))))))
    (when (eq 0 status)
-   [...]
+   (vc-src--parse-state out))))
```

The last diff is a complete refactoring of *vc-src-dir-status-files* to
parse directories recursively, so there is no common code.

The user visible changes are just that unregistered and ignored files
are also shown. Everything else is necessarily identical.

I have attached a new patch with minimal whitespace changes.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Use-one-src-status-a-call-for-vc-src-dir-status-file.patch --]
[-- Type: text/x-patch; name="0001-Use-one-src-status-a-call-for-vc-src-dir-status-file.patch", Size: 4110 bytes --]

From 11a74c8a6df8978875b3185243d8285152e73ad6 Mon Sep 17 00:00:00 2001
From: Wolfgang Scherer <wolfgang.scherer@gmx.de>
Date: Sat, 15 Feb 2020 03:42:52 +0100
Subject: [PATCH] Use one src status -a call for vc-src-dir-status-files
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

lisp/vc/vc-src.el: (vc-src--parse-state) new function.
(vc-src-state) use vc-src--parse-state.
(vc-src-dir-status-files) use recursive calls to ‘src status -a’.
---
 lisp/vc/vc-src.el | 70 ++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 48 insertions(+), 22 deletions(-)

diff --git a/lisp/vc/vc-src.el b/lisp/vc/vc-src.el
index db127ee..fce93ef 100644
--- a/lisp/vc/vc-src.el
+++ b/lisp/vc/vc-src.el
@@ -146,6 +146,20 @@ For a description of possible values, see `vc-check-master-templates'."
 (progn
 (defun vc-src-registered (f) (vc-default-registered 'src f)))

+(defun vc-src--parse-state (out)
+  (when (null (string-match "does not exist or is unreadable" out))
+    (let ((state (aref out 0)))
+      (cond
+       ;; FIXME: What to do about L code?
+       ((eq state ?.) 'up-to-date)
+       ((eq state ?A) 'added)
+       ((eq state ?M) 'edited)
+       ((eq state ?I) 'ignored)
+       ((eq state ?R) 'removed)
+       ((eq state ?!) 'missing)
+       ((eq state ??) 'unregistered)
+       (t 'up-to-date)))))
+
 (defun vc-src-state (file)
   "SRC-specific version of `vc-state'."
   (let*
@@ -163,32 +177,44 @@ For a description of possible values, see `vc-check-master-templates'."
 		       "status" "-a" (file-relative-name file))
 		    (error nil)))))))
     (when (eq 0 status)
-      (when (null (string-match "does not exist or is unreadable" out))
-	(let ((state (aref out 0)))
-	  (cond
-	   ;; FIXME: What to do about A and L codes?
-	   ((eq state ?.) 'up-to-date)
-	   ((eq state ?A) 'added)
-	   ((eq state ?M) 'edited)
-	   ((eq state ?I) 'ignored)
-	   ((eq state ?R) 'removed)
-	   ((eq state ?!) 'missing)
-	   ((eq state ??) 'unregistered)
-	   (t 'up-to-date)))))))
+      (vc-src--parse-state out))))

 (autoload 'vc-expand-dirs "vc")

 (defun vc-src-dir-status-files (dir files update-function)
-  ;; FIXME: Use one src status -a call for this
-  (if (not files) (setq files (vc-expand-dirs (list dir) 'SRC)))
-  (let ((result nil))
-    (dolist (file files)
-      (let ((state (vc-state file))
-	    (frel (file-relative-name file)))
-	(when (and (eq (vc-backend file) 'SRC)
-		   (not (eq state 'up-to-date)))
-	  (push (list frel state) result))))
-    (funcall update-function result)))
+  (let*
+      ((result nil)
+       (status nil)
+       (default-directory (or dir default-directory))
+       (out
+        (with-output-to-string
+          (with-current-buffer
+              standard-output
+            (setq status
+                  ;; Ignore all errors.
+                  (condition-case nil
+                      (apply
+                       #'process-file vc-src-program nil t nil
+                       "status" "-a"
+                       (mapcar (lambda (f) (file-relative-name f)) files))
+                    (error nil))))))
+       dlist)
+    (when (eq 0 status)
+      (dolist (line (split-string out "[\n\r]" t))
+        (let* ((pair (split-string line "[\t]" t))
+               (state (vc-src--parse-state (car pair)))
+               (frel (cadr pair)))
+          (if (file-directory-p frel)
+              (push frel dlist)
+            (when (not (eq state 'up-to-date))
+              (push (list frel state) result)))
+          ))
+      (dolist (drel dlist)
+        (let* ((dresult (vc-src-dir-status-files (expand-file-name drel) nil #'identity)))
+          (dolist (dres dresult)
+            (push (list (concat (file-name-as-directory drel) (car dres)) (cadr dres)) result)))
+            )
+      (funcall update-function result))))

 (defun vc-src-command (buffer file-or-list &rest flags)
   "A wrapper around `vc-do-command' for use in vc-src.el.
--
2.7.4


  reply	other threads:[~2020-02-15  2:44 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-07 22:52 bug#39502: [PATCH] Use one src status -a call for vc-src-dir-status-files Wolfgang Scherer
     [not found] ` <handler.39502.B.158111597418374.ack@debbugs.gnu.org>
2020-02-08  5:35   ` bug#39502: Acknowledgement ([PATCH] Use one src status -a call for vc-src-dir-status-files) Wolfgang Scherer
2020-02-08  9:39 ` bug#39502: [PATCH] Use one src status -a call for vc-src-dir-status-files Dmitry Gutov
2020-02-10  0:47   ` Wolfgang Scherer
2020-02-10  4:29     ` Dmitry Gutov
2020-02-11  2:54       ` Wolfgang Scherer
2020-02-11  7:46         ` Dmitry Gutov
2020-02-14 10:05         ` Eli Zaretskii
2020-02-15  2:44           ` Wolfgang Scherer [this message]
2020-08-09 11:31           ` Lars Ingebrigtsen
2020-08-09 14:13             ` Eli Zaretskii
2020-08-09 17:42               ` Dmitry Gutov
2020-08-09 19:50                 ` Lars Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7baabba4-5874-4593-592b-7b1e8172e0f9@gmx.de \
    --to=wolfgang.scherer@gmx.de \
    --cc=39502@debbugs.gnu.org \
    --cc=dgutov@yandex.ru \
    --cc=eliz@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).