From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Dmitry Gutov Newsgroups: gmane.emacs.bugs Subject: bug#51497: 29.0.50; (vc-print-log) broken over TRAMP Date: Mon, 27 Dec 2021 03:36:33 +0200 Message-ID: <90ac6d38-e448-2415-60c3-aacd10f73172@yandex.ru> References: <877ddv9ue0.fsf@jpl.nasa.gov> <87tugyptju.fsf@gnus.org> <87tugy8h3a.fsf@secretsauce.net> <87pmrl8yhy.fsf@secretsauce.net> <60fea707-a9b2-d9f4-cc45-ffd4539887b6@yandex.ru> <87o87253sv.fsf@secretsauce.net> <60af7952-d702-d40f-928e-1320e6d9520f@yandex.ru> <83f40a2a-ae5a-2c6c-cf6a-44ff7c933d16@yandex.ru> <831r3tb7un.fsf@gnu.org> <7e04f090-81de-d5bd-746c-7f09ed0c38b0@yandex.ru> <83lf219i3u.fsf@gnu.org> <86r1btvsso.fsf@gmail.com> <86ilx4x4xv.fsf@gmail.com> <1f17978c-0498-a19b-6bb0-6f316a536f8e@yandex.ru> <83h7coa2cs.fsf@gnu.org> <92da67f0-9133-98ba-69e3-7408fab30539@yandex.ru> <83o86u7qxg.fsf@gnu.org> <5bbcd838-45a3-3d1d-5dd8-d58a0e8be4dc@yandex.ru> <838rxy7bq3.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------7D3857CFE9C52CB670CD712E" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="1020"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 Cc: 51497@debbugs.gnu.org, andrewjmoreton@gmail.com To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Dec 27 02:40:52 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1n1f0O-000Ae1-0Z for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 27 Dec 2021 02:40:52 +0100 Original-Received: from localhost ([::1]:39168 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n1f0M-0002Nq-C4 for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 26 Dec 2021 20:40:50 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:44846) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n1exf-0007gP-EC for bug-gnu-emacs@gnu.org; Sun, 26 Dec 2021 20:38:03 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:58611) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1n1exe-0002sG-3m for bug-gnu-emacs@gnu.org; Sun, 26 Dec 2021 20:38:03 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1n1exd-0008MX-Vs for bug-gnu-emacs@gnu.org; Sun, 26 Dec 2021 20:38:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Dmitry Gutov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 27 Dec 2021 01:38:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51497 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: moreinfo Original-Received: via spool by 51497-submit@debbugs.gnu.org id=B51497.164056907432129 (code B ref 51497); Mon, 27 Dec 2021 01:38:01 +0000 Original-Received: (at 51497) by debbugs.gnu.org; 27 Dec 2021 01:37:54 +0000 Original-Received: from localhost ([127.0.0.1]:41924 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1exV-0008M7-Ke for submit@debbugs.gnu.org; Sun, 26 Dec 2021 20:37:54 -0500 Original-Received: from mail-wr1-f49.google.com ([209.85.221.49]:36502) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1exT-0008Lt-SQ for 51497@debbugs.gnu.org; Sun, 26 Dec 2021 20:37:52 -0500 Original-Received: by mail-wr1-f49.google.com with SMTP id r17so29581836wrc.3 for <51497@debbugs.gnu.org>; Sun, 26 Dec 2021 17:37:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=tHb4SCHqPZaQXp9/d93Eoy85iITSmvUsbukTWcHsnCw=; b=aoiduNnIXl0lffxTwAsOgPexFfacw4Lj1KaXbYDqPE7tPUP6jnGYeZSioDUkdeP3pv MFVOcSx8TDs+7ReXm6vhgMuH08KDJt4DVOcGeMiDOKp1w81bnCGkbjCIgIehAqakI0Zu o1IqWLhHHlUL6sQo+v5A9fjoWrwIqbKEDVuCqBvgwsDP4GgartnTxsP+lQRWn1wKLOJx x9BuIysmhs1y9duiEcoPly2eU60amj5a74L+0JQvb3STsxZRnWufvveGhivoI4aaqqSI Ng19yUWJuVFOUslDBG7CVKcfWPvLZDwGGS2fMmLl0wCqw2iybPO+px29UN7+aB1uifQZ +ytA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language; bh=tHb4SCHqPZaQXp9/d93Eoy85iITSmvUsbukTWcHsnCw=; b=AYYWLCTg+BoxhU01MLy2re3K7oynOPhE/ZCbi8DPcW7gRwYJnFrC9ztvzxA0ZEUYRe xmv43kR+NLnq/uedo1apM66GmRLKmKCV9rJYE5WUeWYJeceYwvBtZppTixYll5ObFzs9 0rXrBogUa92/o0AvQqCd7S+20ioZu3TPK/kbNxbgaNBiCkQ75YM2QUTXApQ7aM1MvXj7 8uOzpyeC/olLMSdzF9Tc61W0rHursl81nMOGJkx0LnPcinPljCbKW1QGCy7SP3w7bGo9 woEDpWUhnwIeNkVmGEJ7wdgZ87TOLPWTZoa0p6vWp2ja851X5L9X/UdVpYbXM7/REuOG ZUIA== X-Gm-Message-State: AOAM533Qwq/gDrAryly4Qp5dNhBoBGGINbab686Z62f/TXD0Cfw3hXiN hP8R1rvbeoDujCynNJ64UK0= X-Google-Smtp-Source: ABdhPJyLlOsnBk6hCaNcr4Nl7n3ZoHLxuVGhJ+qYqmpJvysbfm9W9u8uU1ZoMyHxjYaYZCh+oRahzw== X-Received: by 2002:adf:da51:: with SMTP id r17mr11719492wrl.389.1640569065949; Sun, 26 Dec 2021 17:37:45 -0800 (PST) Original-Received: from [10.112.109.103] ([194.36.25.10]) by smtp.googlemail.com with ESMTPSA id b2sm16037139wrd.35.2021.12.26.17.37.44 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 26 Dec 2021 17:37:45 -0800 (PST) In-Reply-To: <838rxy7bq3.fsf@gnu.org> Content-Language: en-US X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:223169 Archived-At: This is a multi-part message in MIME format. --------------7D3857CFE9C52CB670CD712E Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 08.11.2021 21:18, Eli Zaretskii wrote: > So what would you suggest as the way forward, for both emacs-28 and > the master branches (the 2 solutions could be different)? Do you > still prefer to go with your original patch for emacs-28? I'm still of two minds a little bit: conceptually, the current approach is a little cleaner because it forces the opt-in approach, and thus won't affect any command (or use of functions like vc-git--run-command-string outside of vc-git.el) that didn't opt into using literal pathspecs. But my original approach is simpler and shorter, and together with an opt-out var seems to solve every problem so far. It doesn't need version detection either (a patch to have it work on remote hosts was discussed previously here). So here's the patch (my current preferred solution for both emacs-28 and master). Waiting for feedback from AndyM. --------------7D3857CFE9C52CB670CD712E Content-Type: text/x-patch; charset=UTF-8; name="redo-literal-pathspecs.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="redo-literal-pathspecs.diff" diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index 3b634471ac..4c4eb915ed 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -502,10 +502,12 @@ project-files (declare-function vc-hg-command "vc-hg") (defun project--vc-list-files (dir backend extra-ignores) + (defvar vc-git-use-literal-pathspecs) (pcase backend (`Git (let ((default-directory (expand-file-name (file-name-as-directory dir))) (args '("-z")) + (vc-git-use-literal-pathspecs nil) files) ;; Include unregistered. (setq args (append args '("-c" "-o" "--exclude-standard"))) diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 5c6a39aec9..19264c9d3c 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -223,6 +223,12 @@ vc-git-revision-complete-only-branches ;; History of Git commands. (defvar vc-git-history nil) +;; Default to t because commands which don't support literal pathspecs +;; ignore the environment variable silently. +(defvar vc-git-use-literal-pathspecs t + "Non-nil to treat pathspecs in commands literally. +Good example of file name that needs this: \"test[56].xx\".") + ;; Clear up the cache to force vc-call to check again and discover ;; new functions when we reload this file. (put 'Git 'vc-functions nil) @@ -242,20 +248,6 @@ vc-git-update-on-retrieve-tag ;;;###autoload (load "vc-git" nil t) ;;;###autoload (vc-git-registered file)))) -;; Good example of file name that needs this: "test[56].xx". -(defun vc-git--literal-pathspec (file) - "Prepend :(literal) path magic to FILE." - (when file - ;; Expand abbreviated file names. - (when (file-name-absolute-p file) - (setq file (expand-file-name file))) - (concat ":(literal)" (file-local-name file)))) - -(defun vc-git--literal-pathspecs (files) - "Prepend :(literal) path magic to FILES." - (unless (vc-git--file-list-is-rootdir files) - (mapcar #'vc-git--literal-pathspec files))) - (defun vc-git-registered (file) "Check whether FILE is registered with git." (let ((dir (vc-git-root file))) @@ -269,12 +261,12 @@ vc-git-registered (name (file-relative-name file dir)) (str (with-demoted-errors "Error: %S" (cd dir) - (vc-git--out-ok "ls-files" "-c" "-z" "--" (vc-git--literal-pathspec name)) + (vc-git--out-ok "ls-files" "-c" "-z" "--" name) ;; If result is empty, use ls-tree to check for deleted ;; file. (when (eq (point-min) (point-max)) (vc-git--out-ok "ls-tree" "--name-only" "-z" "HEAD" - "--" (vc-git--literal-pathspec name))) + "--" name)) (buffer-string)))) (and str (> (length str) (length name)) @@ -358,7 +350,7 @@ vc-git-state ,@(when (version<= "1.7.6.3" (vc-git--program-version)) '("--ignored")) "--")) - (status (apply #'vc-git--run-command-string (vc-git--literal-pathspec file) args))) + (status (apply #'vc-git--run-command-string file args))) (if (null status) ;; If status is nil, there was an error calling git, likely because ;; the file is not in a git repo. @@ -636,28 +628,28 @@ vc-git-dir-status-goto-stage (pcase (vc-git-dir-status-state->stage git-state) ('update-index (if files - (vc-git-command (current-buffer) 'async (vc-git--literal-pathspecs files) "add" "--refresh" "--") + (vc-git-command (current-buffer) 'async files "add" "--refresh" "--") (vc-git-command (current-buffer) 'async nil "update-index" "--refresh"))) ('ls-files-added - (vc-git-command (current-buffer) 'async (vc-git--literal-pathspecs files) + (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-c" "-s" "--")) ('ls-files-up-to-date - (vc-git-command (current-buffer) 'async (vc-git--literal-pathspecs files) + (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-c" "-s" "--")) ('ls-files-conflict - (vc-git-command (current-buffer) 'async (vc-git--literal-pathspecs files) + (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-u" "--")) ('ls-files-unknown - (vc-git-command (current-buffer) 'async (vc-git--literal-pathspecs files) + (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-o" "--exclude-standard" "--")) ('ls-files-ignored - (vc-git-command (current-buffer) 'async (vc-git--literal-pathspecs files) + (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-o" "-i" "--directory" "--no-empty-directory" "--exclude-standard" "--")) ;; --relative added in Git 1.5.5. ('diff-index - (vc-git-command (current-buffer) 'async (vc-git--literal-pathspecs files) + (vc-git-command (current-buffer) 'async files "diff-index" "--relative" "-z" "-M" "HEAD" "--"))) (vc-run-delayed (vc-git-after-dir-status-stage git-state)))) @@ -885,12 +877,12 @@ vc-git-register (when flist (vc-git-command nil 0 flist "update-index" "--add" "--")) (when dlist - (vc-git-command nil 0 (vc-git--literal-pathspecs dlist) "add")))) + (vc-git-command nil 0 dlist "add")))) (defalias 'vc-git-responsible-p #'vc-git-root) (defun vc-git-unregister (file) - (vc-git-command nil 0 (vc-git--literal-pathspec file) "rm" "-f" "--cached" "--")) + (vc-git-command nil 0 file "rm" "-f" "--cached" "--")) (declare-function log-edit-mode "log-edit" ()) (declare-function log-edit-toggle-header "log-edit" (header value)) @@ -956,7 +948,7 @@ vc-git-checkin (lambda (value) (when (equal value "yes") (list argument))))) ;; When operating on the whole tree, better pass "-a" than ".", since "." ;; fails when we're committing a merge. - (apply #'vc-git-command nil 0 (if only (vc-git--literal-pathspecs files)) + (apply #'vc-git-command nil 0 (if only files) (nconc (if msg-file (list "commit" "-F" (file-local-name msg-file)) (list "commit" "-m")) @@ -983,7 +975,7 @@ vc-git-find-revision (coding-system-for-write 'binary) (fullname (let ((fn (vc-git--run-command-string - (vc-git--literal-pathspec file) "ls-files" "-z" "--full-name" "--"))) + file "ls-files" "-z" "--full-name" "--"))) ;; ls-files does not return anything when looking for a ;; revision of a file that has been renamed or removed. (if (string= fn "") @@ -1000,14 +992,14 @@ vc-git-find-ignore-file (vc-git-root file))) (defun vc-git-checkout (file &optional rev) - (vc-git-command nil 0 (vc-git--literal-pathspec file) "checkout" (or rev "HEAD"))) + (vc-git-command nil 0 file "checkout" (or rev "HEAD"))) (defun vc-git-revert (file &optional contents-done) "Revert FILE to the version stored in the git repository." (if contents-done (vc-git-command nil 0 file "update-index" "--") - (vc-git-command nil 0 (vc-git--literal-pathspec file) "reset" "-q" "--") - (vc-git-command nil nil (vc-git--literal-pathspec file) "checkout" "-q" "--"))) + (vc-git-command nil 0 file "reset" "-q" "--") + (vc-git-command nil nil file "checkout" "-q" "--"))) (defvar vc-git-error-regexp-alist '(("^ \\(.+\\)\\> *|" 1 nil nil 0)) @@ -1091,7 +1083,7 @@ vc-git-merge-branch (defun vc-git-conflicted-files (directory) "Return the list of files with conflicts in DIRECTORY." (let* ((status - (vc-git--run-command-string (vc-git--literal-pathspec directory) "status" "--porcelain" "--")) + (vc-git--run-command-string directory "status" "--porcelain" "--")) (lines (when status (split-string status "\n" 'omit-nulls))) files) (dolist (line lines files) @@ -1180,7 +1172,7 @@ vc-git-print-log (let ((inhibit-read-only t)) (with-current-buffer buffer (apply #'vc-git-command buffer - 'async (vc-git--literal-pathspecs files) + 'async files (append '("log" "--no-color") (when (and vc-git-print-log-follow @@ -1434,7 +1426,7 @@ vc-git-diff (if vc-git-diff-switches (apply #'vc-git-command (or buffer "*vc-diff*") 1 ; bug#21969 - (vc-git--literal-pathspecs files) + files command "--exit-code" (append (vc-switches 'git 'diff) @@ -1519,7 +1511,7 @@ vc-git-previous-revision (let* ((fname (file-relative-name file)) (prev-rev (with-temp-buffer (and - (vc-git--out-ok "rev-list" "-2" rev "--" (vc-git--literal-pathspec fname)) + (vc-git--out-ok "rev-list" "-2" rev "--" fname) (goto-char (point-max)) (bolp) (zerop (forward-line -1)) @@ -1547,7 +1539,7 @@ vc-git-next-revision (current-rev (with-temp-buffer (and - (vc-git--out-ok "rev-list" "-1" rev "--" (vc-git--literal-pathspec file)) + (vc-git--out-ok "rev-list" "-1" rev "--" file) (goto-char (point-max)) (bolp) (zerop (forward-line -1)) @@ -1559,7 +1551,7 @@ vc-git-next-revision (and current-rev (with-temp-buffer (and - (vc-git--out-ok "rev-list" "HEAD" "--" (vc-git--literal-pathspec file)) + (vc-git--out-ok "rev-list" "HEAD" "--" file) (goto-char (point-min)) (search-forward current-rev nil t) (zerop (forward-line -1)) @@ -1569,13 +1561,13 @@ vc-git-next-revision (or (vc-git-symbolic-commit next-rev) next-rev))) (defun vc-git-delete-file (file) - (vc-git-command nil 0 (vc-git--literal-pathspec file) "rm" "-f" "--")) + (vc-git-command nil 0 file "rm" "-f" "--")) (defun vc-git-rename-file (old new) (vc-git-command nil 0 (list old new) "mv" "-f" "--")) (defun vc-git-mark-resolved (files) - (vc-git-command nil 0 (vc-git--literal-pathspecs files) "add")) + (vc-git-command nil 0 files "add")) (defvar vc-git-extra-menu-map (let ((map (make-sparse-keymap))) @@ -1797,6 +1789,8 @@ vc-git-command (process-environment (append `("GIT_DIR" + ,@(when vc-git-use-literal-pathspecs + "GIT_LITERAL_PATHSPECS=1") ;; Avoid repository locking during background operations ;; (bug#21559). ,@(when revert-buffer-in-progress-p @@ -1834,6 +1828,8 @@ vc-git--call (process-environment (append `("GIT_DIR" + ,@(when vc-git-use-literal-pathspecs + "GIT_LITERAL_PATHSPECS=1") ;; Avoid repository locking during background operations ;; (bug#21559). ,@(when revert-buffer-in-progress-p --------------7D3857CFE9C52CB670CD712E--