From: Dmitry Gutov <dgutov@yandex.ru>
To: emacs-devel@gnu.org
Subject: Re: A project-files implementation for Git projects
Date: Thu, 19 Sep 2019 19:01:44 +0300 [thread overview]
Message-ID: <f1949772-58ee-cca3-3f07-8c66e4eb10ec@yandex.ru> (raw)
In-Reply-To: <87ef0dy18z.fsf@gnu.org>
Hi Tassilo,
On 18.09.2019 20:15, Tassilo Horn wrote:
> Well, ok. I've now played with an interface
>
> (vc-call-backend (vc-responsible-backend dir)
> 'list-files
> dir
> include-unregistered
> extra-includes)
Not sure we should use the vc-call-backend route when only 1 or 2
backends will work well enough, but OK, it's not essential.
> where extra-includes works in addition to the standard VC ignore rules
> (.gitignore, .hgignore). Or do you want to override the VC-internal
> rules?
I'm afraid it might not work as well if we try to treat all (modified)
ignores the same. In my understanding, the speed with which Git lists
files to a large extent stems from not having to apply the ignores to
the already-registered files. Someone should benchmark this, but I think
if we use the "negative pathspec" approach mentioned below for all
ignores together, it might slow down file listing by an order of
magnitude or several.
> At least for Git and Hg, I came up with reasonable implementations:
>
> --8<---------------cut here---------------start------------->8---
> (defun vc-git-list-files (&optional dir
> include-unregistered
> extra-ignores)
> (let ((default-directory (or dir default-directory))
> (args '("-z")))
> (when include-unregistered
> (setq args (nconc args '("-c" "-o" "--exclude-standard"))))
> (when extra-ignores
> (setq args (nconc args
> (mapcan
> (lambda (i)
> (list "--exclude" i))
> (copy-list extra-ignores)))))
> (mapcar
> #'expand-file-name
> (cl-remove-if
> #'string-empty-p
> (split-string
> (apply #'vc-git--run-command-string nil "ls-files" args)
> "\0")))))
>
> (defun vc-hg-list-files (&optional dir
> include-unregistered
> extra-ignores)
> (let ((default-directory (or dir default-directory))
> args
> files)
> (when include-unregistered
> (setq args (nconc args '("--all"))))
> (when extra-ignores
> (setq args (nconc args
> (mapcan
> (lambda (i)
> (list "--exclude" i))
> (copy-list extra-ignores)))))
> (with-temp-buffer
> (apply #'vc-hg-command t 0 "."
> "status" args)
> (goto-char (point-min))
> (while (re-search-forward "^[?C]\s+\\(.*\\)$" nil t)
> (setq files (cons (expand-file-name (match-string 1))
> files))))
> (nreverse files)))
Terrific, thank you! How is Hg's performance with this approach? Does
adding a few ignores (like 5 or 10) slow down the output measurably?
BTW, can Hg support extra whitelist entries as well?
> --8<---------------cut here---------------end--------------->8---
>
> There's a semantic difference between Git and Hg in the treatment of
> extra-ignores. With Git, the extra-ignores do not rule out committed
> files (i.e., they are only effective for untracked files) while for Hg,
> they also rule out committed files. I think the Hg semantics are
> probably better
Better and important, IMO.
> but I don't see how to change the Git version so that it
> acts the same way (except by re-filtering in lisp, of course), do you?
Previously suggested:
https://stackoverflow.com/questions/36753573/how-do-i-exclude-files-from-git-ls-files/53083343#53083343
That means converting all extra-ignores into negative pathspec strings.
> I haven't looked at the other backends. I guess bzr will probably be
> doable, too. However, for SVN, there's no way to list unregistered
> files. A correct (but horribly slow) default implementation should also
> be doable.
Yeah, I wonder if we should treat this as a VC operation. On the other
hand, the fallback implementation could just as well use 'find'.
next prev parent reply other threads:[~2019-09-19 16:01 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-06 9:19 A project-files implementation for Git projects Tassilo Horn
2019-09-06 12:52 ` Stefan Monnier
2019-09-10 6:25 ` Tassilo Horn
2019-09-10 12:56 ` Stefan Monnier
2019-09-10 13:39 ` Tassilo Horn
2019-09-10 13:56 ` Stefan Monnier
2019-09-11 11:00 ` Tassilo Horn
2019-09-11 20:01 ` Tassilo Horn
2019-09-13 20:38 ` Tassilo Horn
2019-09-14 0:29 ` Dmitry Gutov
2019-09-14 16:26 ` Tassilo Horn
2019-09-15 18:56 ` Dmitry Gutov
2019-09-16 2:27 ` Eli Zaretskii
2019-09-16 3:36 ` Dmitry Gutov
2019-09-16 15:25 ` Eli Zaretskii
2019-09-17 10:46 ` Dmitry Gutov
2019-09-17 12:03 ` Eli Zaretskii
2019-09-17 12:55 ` Dmitry Gutov
2019-09-17 13:14 ` Eli Zaretskii
2019-09-19 15:33 ` Dmitry Gutov
2019-09-19 17:29 ` Eli Zaretskii
2019-09-20 11:25 ` Dmitry Gutov
2019-09-20 12:59 ` Eli Zaretskii
2019-09-20 13:28 ` Dmitry Gutov
2019-09-20 13:45 ` Stefan Monnier
2019-09-20 13:54 ` Dmitry Gutov
2019-09-20 14:12 ` Michael Albinus
2019-09-20 14:30 ` Eli Zaretskii
2019-09-20 14:51 ` Dmitry Gutov
2019-09-20 15:04 ` Michael Albinus
2019-09-22 9:23 ` Dmitry Gutov
2019-09-20 14:55 ` Michael Albinus
2019-09-20 15:55 ` Eli Zaretskii
2019-09-20 15:01 ` Stefan Monnier
2019-09-20 15:59 ` Eli Zaretskii
2019-09-20 17:32 ` Stefan Monnier
2019-09-20 17:49 ` Eli Zaretskii
2019-09-20 18:04 ` Stefan Monnier
2019-09-20 14:23 ` Eli Zaretskii
2019-09-20 14:48 ` Dmitry Gutov
2019-09-16 13:32 ` Tassilo Horn
2019-09-17 11:06 ` Dmitry Gutov
2019-09-18 17:15 ` Tassilo Horn
2019-09-19 16:01 ` Dmitry Gutov [this message]
2019-09-22 8:56 ` Tassilo Horn
2019-09-22 9:37 ` Dmitry Gutov
2019-09-23 7:42 ` Tassilo Horn
2019-09-23 12:22 ` Dmitry Gutov
2019-09-27 16:17 ` Tassilo Horn
2019-09-30 0:09 ` Dmitry Gutov
2019-09-30 0:25 ` Stefan Monnier
2019-09-30 6:50 ` Dmitry Gutov
2019-09-30 17:09 ` Stefan Monnier
2019-10-01 8:19 ` Dmitry Gutov
2019-10-01 12:31 ` Stefan Monnier
2019-10-01 13:10 ` Stefan Monnier
2019-10-01 23:38 ` Dmitry Gutov
2019-10-03 9:25 ` Felician Nemeth
2019-10-03 10:32 ` Dmitry Gutov
2019-10-03 11:15 ` Felician Nemeth
2019-10-03 12:31 ` Dmitry Gutov
2019-10-03 14:39 ` Felician Nemeth
2019-10-03 14:42 ` Dmitry Gutov
2019-10-03 15:10 ` Felician Nemeth
2019-10-03 15:15 ` Dmitry Gutov
2019-10-01 8:11 ` Dmitry Gutov
2019-10-03 8:33 ` Tassilo Horn
2019-10-03 13:19 ` Dmitry Gutov
2019-10-03 17:15 ` Tassilo Horn
2019-10-03 22:49 ` Dmitry Gutov
2019-10-04 7:47 ` Tassilo Horn
2019-10-04 7:58 ` Tassilo Horn
2019-10-04 13:16 ` Dmitry Gutov
2019-10-04 8:49 ` Tassilo Horn
2019-10-04 12:57 ` Dmitry Gutov
2019-10-04 13:59 ` Tassilo Horn
2019-10-04 15:24 ` Dmitry Gutov
2019-10-04 12:16 ` Stefan Monnier
2019-10-04 13:08 ` Dmitry Gutov
2019-10-03 7:41 ` Tassilo Horn
2019-10-03 12:33 ` Dmitry Gutov
2019-10-03 12:51 ` Tassilo Horn
2019-10-04 5:52 ` Co-authoring and attribution in commit message (was: A project-files implementation for Git projects) Kévin Le Gouguec
2019-10-04 8:33 ` Co-authoring and attribution in commit message Dmitry Gutov
2019-10-04 21:36 ` Karl Fogel
2019-10-05 6:55 ` Eli Zaretskii
2019-10-03 23:02 ` A project-files implementation for Git projects Dmitry Gutov
2019-09-14 0:33 ` Dmitry Gutov
2019-09-14 16:43 ` Tassilo Horn
2019-09-15 8:29 ` Dmitry Gutov
2019-09-15 9:06 ` Dmitry Gutov
2019-09-10 13:57 ` Robert Pluim
2019-09-10 14:24 ` Dmitry Gutov
2019-09-10 14:41 ` Eli Zaretskii
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=f1949772-58ee-cca3-3f07-8c66e4eb10ec@yandex.ru \
--to=dgutov@yandex.ru \
--cc=emacs-devel@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).