From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Tassilo Horn Newsgroups: gmane.emacs.devel Subject: A project-files implementation for Git projects Date: Fri, 06 Sep 2019 11:19:55 +0200 Message-ID: <8736h9rdc4.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="37058"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Sep 06 11:20:14 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1i6APd-0009T7-Qf for ged-emacs-devel@m.gmane.org; Fri, 06 Sep 2019 11:20:13 +0200 Original-Received: from localhost ([::1]:53756 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i6APc-0000j3-4X for ged-emacs-devel@m.gmane.org; Fri, 06 Sep 2019 05:20:12 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:60297) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i6APU-0000h1-Bh for emacs-devel@gnu.org; Fri, 06 Sep 2019 05:20:05 -0400 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]:54271) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1i6APU-0006Ew-7o for emacs-devel@gnu.org; Fri, 06 Sep 2019 05:20:04 -0400 Original-Received: from auth1-smtp.messagingengine.com ([66.111.4.227]:50865) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.82) (envelope-from ) id 1i6APT-0001Xh-I9 for emacs-devel@gnu.org; Fri, 06 Sep 2019 05:20:03 -0400 Original-Received: from compute7.internal (compute7.nyi.internal [10.202.2.47]) by mailauth.nyi.internal (Postfix) with ESMTP id 0A257221DF for ; Fri, 6 Sep 2019 05:20:02 -0400 (EDT) Original-Received: from mailfrontend1 ([10.202.2.162]) by compute7.internal (MEProxy); Fri, 06 Sep 2019 05:20:02 -0400 X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduvddrudejledgtdeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvffufffkfgggtgesthdtredttd ertdenucfhrhhomhepvfgrshhsihhlohcujfhorhhnuceothhsughhsehgnhhurdhorhhg qeenucfkphepgeeirdektddrjedtrddvheenucfrrghrrghmpehmrghilhhfrhhomhepth hhohhrnhdomhgvshhmthhprghuthhhphgvrhhsohhnrghlihhthidqkeeijeefkeejkeeg qdeifeehvdelkedqthhsughhpeepghhnuhdrohhrghesfhgrshhtmhgrihhlrdhfmhenuc evlhhushhtvghrufhiiigvpedt X-ME-Proxy: Original-Received: from thinkpad-t440p (p2e504619.dip0.t-ipconnect.de [46.80.70.25]) by mail.messagingengine.com (Postfix) with ESMTPA id 3CEB580068 for ; Fri, 6 Sep 2019 05:20:01 -0400 (EDT) Mail-Followup-To: emacs-devel@gnu.org X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:239893 Archived-At: Hi all, I'm struggling a bit with the performance of `project-files' for large projects so I've tried coming up with a faster implementation for Git projects which uses "git ls-files" instead of "find". --8<---------------cut here---------------start------------->8--- (cl-defmethod project-files ((project (head vc)) &optional dirs) "Implementation of `project-files' for Git projects." (cl-mapcan (lambda (dir) (if-let ((git (and (file-exists-p (expand-file-name ".git/config" dir)) (executable-find "git")))) (let ((default-directory dir)) (sort (split-string (shell-command-to-string (concat git " ls-files -z")) "\0" t) #'string<)) ;; No Git project, so go with the default. (cl-call-next-method))) (or dirs (project-roots project)))) --8<---------------cut here---------------end--------------->8--- Some benchmarking shows that it's about 8 times faster on my system. Would something like this be worthwhile to have in project.el? Some notes: - Actually, that hasn't to be a cl-defmethod because the project type vc doesn't tell if it's a git project and we still need to test each dir separately. So basically the default implementation could do that just as well. Or maybe the project types could be transient or (vc . ) where is some vc-backend? - It changes the semantics a bit. The default implementation finds all files (minus the ignored) from a project's directory while git ls-files just lists the tracked files. Bye, Tassilo