GNU bug report logs - #61289
30.0.50; Cannot reinstall language grammar after running `treesit-ready-p'

Previous Next

Package: emacs;

Reported by: 牟 桐 <mou.tong <at> outlook.com>

Date: Sun, 5 Feb 2023 07:47:02 UTC

Severity: normal

Found in version 30.0.50

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 61289 in the body.
You can then email your comments to 61289 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#61289; Package emacs. (Sun, 05 Feb 2023 07:47:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to 牟 桐 <mou.tong <at> outlook.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Sun, 05 Feb 2023 07:47:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: 牟 桐 <mou.tong <at> outlook.com>
To: "bug-gnu-emacs <at> gnu.org" <bug-gnu-emacs <at> gnu.org>
Subject: 30.0.50; Cannot reinstall language grammar after running
 `treesit-ready-p'
Date: Sat, 4 Feb 2023 12:59:53 +0000
[Message part 1 (text/plain, inline)]

Hi there,

I'm using Windows, so I'll use `libtree-sitter-c.dll` as an example:

1. `emacs -Q` to start a vanilla Emacs.

Run `M-x treesit-install-language-grammar`, then install the c
parser to `~/.emacs.d/tree-sitter`. If there is already a
`libtree-sitter-c.dll` there, the new installed library will
overwrite the old library.

2. Execute `(treesit-ready-p 'c)`, which returns t.

3. Run `M-x treesit-install-language-grammar` again, there will be a
warning:

```
⛔ Warning (treesit): Error encountered when installing language grammar: (file-error Copying file Operation not permitted c:/Users/redacted/AppData/Local/Temp/treesit-workdir5HPGoS/repo/src/libtree-sitter-c.dll c:/Users/redacted/.emacs.d/tree-sitter/libtree-sitter-c.dll)
```

I don't know whether this is a bug or not, since I think it's reasonable
to make the already used library not be able to be overwritten.

But someone reminded me that `treesit-ready-p` will be executed when you
load the `xxx-ts-mode`. If the execution of `treesit-ready-p` made the
`treesit-install-language-grammar` unusable, it means the design of that
function has a little problem.

---

dalu


In GNU Emacs 30.0.50 (build 7, x86_64-w64-mingw32) of 2023-02-03 built
on DALUW
Repository revision: ac7ec87a7a0db887e4ae7fe9005aea517958b778
Repository branch: master
Windowing system distributor 'Microsoft Corp.', version 10.0.22621
System Description: Microsoft Windows 10 Home China (v10.0.2009.22621.1194)

Configured using:
'configure --prefix=/c/emacs/emacs-git --without-dbus --without-pop
--with-native-compilation=aot'

Configured features:
ACL GIF GMP GNUTLS HARFBUZZ JPEG JSON LCMS2 LIBXML2 MODULES NATIVE_COMP
NOTIFY W32NOTIFY PDUMPER PNG RSVG SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XPM ZLIB

Important settings:
  value of $LANG: CHS
  locale-coding-system: cp65001

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message mailcap yank-media puny dired
dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg rfc6068
epg-config gnus-util text-property-search time-date mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail
rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils vc-git
diff-mode easy-mmode vc-dispatcher treesit cl-loaddefs comp comp-cstr
warnings icons subr-x rx cl-seq cl-macs gv cl-extra help-mode bytecomp
byte-compile cl-lib china-util rmc iso-transl tooltip cconv eldoc paren
electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
dos-w32 ls-lisp disp-table term/w32-win w32-win w32-vars term/common-win
tool-bar dnd fontset image regexp-opt fringe tabulated-list replace
newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar
rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock
font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq
simple cl-generic indonesian philippine cham georgian utf-8-lang
misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms
cp51932 hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese composite emoji-zwj charscript charprop case-table
epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button
loaddefs theme-loaddefs faces cus-face macroexp files window
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget keymap hashtable-print-readable backquote threads
w32notify w32 lcms2 multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 87683 14604)
(symbols 48 7929 0)
(strings 32 22771 2959)
(string-bytes 1 688676)
(vectors 16 16331)
(vector-slots 8 340811 17500)
(floats 8 48 160)
(intervals 56 406 0)
(buffers 984 13))
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#61289; Package emacs. (Sun, 05 Feb 2023 09:14:02 GMT) Full text and rfc822 format available.

Message #8 received at 61289 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: 牟 桐 <mou.tong <at> outlook.com>
Cc: 61289 <at> debbugs.gnu.org
Subject: Re: bug#61289: 30.0.50;
 Cannot reinstall language grammar after running `treesit-ready-p'
Date: Sun, 05 Feb 2023 11:13:37 +0200
> From: 牟 桐 <mou.tong <at> outlook.com>
> Date: Sat, 4 Feb 2023 12:59:53 +0000
> 
> I'm using Windows, so I'll use `libtree-sitter-c.dll` as an example:
> 
> 1. `emacs -Q` to start a vanilla Emacs.
> 
> Run `M-x treesit-install-language-grammar`, then install the c
> parser to `~/.emacs.d/tree-sitter`. If there is already a
> `libtree-sitter-c.dll` there, the new installed library will
> overwrite the old library.
> 
> 2. Execute `(treesit-ready-p 'c)`, which returns t.
> 
> 3. Run `M-x treesit-install-language-grammar` again, there will be a
> warning:
> 
> ```
> ⛔ Warning (treesit): Error encountered when installing language grammar: (file-error Copying file Operation not permitted c:/Users/redacted/AppData/Local/Temp/treesit-workdir5HPGoS/repo/src/libtree-sitter-c.dll c:/Users/redacted/.emacs.d/tree-sitter/libtree-sitter-c.dll)
> ```
> 
> I don't know whether this is a bug or not, since I think it's reasonable
> to make the already used library not be able to be overwritten.
> 
> But someone reminded me that `treesit-ready-p` will be executed when you
> load the `xxx-ts-mode`. If the execution of `treesit-ready-p` made the
> `treesit-install-language-grammar` unusable, it means the design of that
> function has a little problem.

This is a basic issue on MS-Windows: it won't allow you to overwrite a
DLL that is being used by some program.

Can you try the patch below and see if it solves the problem?

diff --git a/lisp/treesit.el b/lisp/treesit.el
index 948016d..7e31da9 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -2884,7 +2884,17 @@ treesit--install-language-grammar-1
           ;; Copy out.
           (unless (file-exists-p out-dir)
             (make-directory out-dir t))
-          (copy-file lib-name (file-name-as-directory out-dir) t t)
+          (let* ((library-fname (expand-file-name lib-name out-dir))
+                 (old-fname (concat library-fname ".old")))
+            ;; Rename the existing shared library, if any, then
+            ;; install the new one, and try deleting the old one.
+            ;; This is for Windows systems, where we cannot simply
+            ;; overwrite a DLL that is being used.
+            (if (file-exists-p library-fname)
+                (rename-file library-fname old-fname t))
+            (copy-file lib-name (file-name-as-directory out-dir) t t)
+            ;; Ignore errors, in case the old version is still used.
+            (ignore-errors (delete-file old-fname)))
           (message "Library installed to %s/%s" out-dir lib-name))
       (when (file-exists-p workdir)
         (delete-directory workdir t)))))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#61289; Package emacs. (Sun, 05 Feb 2023 09:59:02 GMT) Full text and rfc822 format available.

Message #11 received at 61289 <at> debbugs.gnu.org (full text, mbox):

From: 牟 桐 <mou.tong <at> outlook.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: "61289 <at> debbugs.gnu.org" <61289 <at> debbugs.gnu.org>
Subject: 回复: bug#61289: 30.0.50; Cannot reinstall language grammar after running `treesit-ready-p'
Date: Sun, 5 Feb 2023 09:58:49 +0000
[Message part 1 (text/plain, inline)]
Yes, after applying your patch, I believe this problem has been solved.

But I noticed the `libtree-sitter-xxx.dll.old` in the tree-sitter dir
hadn't been delelted.

If I remove the `ignore-errors` function in your patch, which seems like
this (sorry, I'm not a programmer and don't know how to use diff):

-          (copy-file lib-name (file-name-as-directory out-dir) t t)
+          (let* ((library-fname (expand-file-name lib-name out-dir))
+                 (old-fname (concat library-fname ".old")))
+            ;; Rename the existing shared library, if any, then
+            ;; install the new one, and try deleting the old one.
+            ;; This is for Windows systems, where we cannot simply
+            ;; overwrite a DLL that is being used.
+            (if (file-exists-p library-fname)
+                (rename-file library-fname old-fname t))
+            (copy-file lib-name (file-name-as-directory out-dir) t t)
+            ;; Ignore errors, in case the old version is still used.
+            (delete-file old-fname))

             ^
             I deleted the outside `ignore-errors` to know why the `xxx.old` hadn’t been deleted.

After applying the change, I got the same error as I mentioned before:

```
⛔ Warning (treesit): Error encountered when installing language grammar: (permission-denied Removing old name Permission denied c:/Users/redacted/.emacs.d/tree-sitter/libtree-sitter-c.dll.old)
```

Btw, can we make the variable ` treesit-language-source-alist`
customizable? (Use `defcustom` instead of `defvar`.) I'm using
`use-package` to manage my config. When I'm configuring treesit, I'd
like to use `:custom` instead of `:init` or `:config` since it can let
me set variable's value without writing `setq`.

发件人: Eli Zaretskii<mailto:eliz <at> gnu.org>
发送时间: 2023年2月5日 17:13
收件人: 牟 桐<mailto:mou.tong <at> outlook.com>
抄送: 61289 <at> debbugs.gnu.org<mailto:61289 <at> debbugs.gnu.org>
主题: Re: bug#61289: 30.0.50; Cannot reinstall language grammar after running `treesit-ready-p'

> From: 牟 桐 <mou.tong <at> outlook.com>
> Date: Sat, 4 Feb 2023 12:59:53 +0000
>
> I'm using Windows, so I'll use `libtree-sitter-c.dll` as an example:
>
> 1. `emacs -Q` to start a vanilla Emacs.
>
> Run `M-x treesit-install-language-grammar`, then install the c
> parser to `~/.emacs.d/tree-sitter`. If there is already a
> `libtree-sitter-c.dll` there, the new installed library will
> overwrite the old library.
>
> 2. Execute `(treesit-ready-p 'c)`, which returns t.
>
> 3. Run `M-x treesit-install-language-grammar` again, there will be a
> warning:
>
> ```
> ⛔ Warning (treesit): Error encountered when installing language grammar: (file-error Copying file Operation not permitted c:/Users/redacted/AppData/Local/Temp/treesit-workdir5HPGoS/repo/src/libtree-sitter-c.dll c:/Users/redacted/.emacs.d/tree-sitter/libtree-sitter-c.dll)
> ```
>
> I don't know whether this is a bug or not, since I think it's reasonable
> to make the already used library not be able to be overwritten.
>
> But someone reminded me that `treesit-ready-p` will be executed when you
> load the `xxx-ts-mode`. If the execution of `treesit-ready-p` made the
> `treesit-install-language-grammar` unusable, it means the design of that
> function has a little problem.

This is a basic issue on MS-Windows: it won't allow you to overwrite a
DLL that is being used by some program.

Can you try the patch below and see if it solves the problem?

diff --git a/lisp/treesit.el b/lisp/treesit.el
index 948016d..7e31da9 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -2884,7 +2884,17 @@ treesit--install-language-grammar-1
           ;; Copy out.
           (unless (file-exists-p out-dir)
             (make-directory out-dir t))
-          (copy-file lib-name (file-name-as-directory out-dir) t t)
+          (let* ((library-fname (expand-file-name lib-name out-dir))
+                 (old-fname (concat library-fname ".old")))
+            ;; Rename the existing shared library, if any, then
+            ;; install the new one, and try deleting the old one.
+            ;; This is for Windows systems, where we cannot simply
+            ;; overwrite a DLL that is being used.
+            (if (file-exists-p library-fname)
+                (rename-file library-fname old-fname t))
+            (copy-file lib-name (file-name-as-directory out-dir) t t)
+            ;; Ignore errors, in case the old version is still used.
+            (ignore-errors (delete-file old-fname)))
           (message "Library installed to %s/%s" out-dir lib-name))
       (when (file-exists-p workdir)
         (delete-directory workdir t)))))

[Message part 2 (text/html, inline)]

Reply sent to Eli Zaretskii <eliz <at> gnu.org>:
You have taken responsibility. (Sun, 05 Feb 2023 10:25:02 GMT) Full text and rfc822 format available.

Notification sent to 牟 桐 <mou.tong <at> outlook.com>:
bug acknowledged by developer. (Sun, 05 Feb 2023 10:25:02 GMT) Full text and rfc822 format available.

Message #16 received at 61289-done <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: 牟 桐 <mou.tong <at> outlook.com>
Cc: 61289-done <at> debbugs.gnu.org
Subject: Re: 
 回复: bug#61289: 30.0.50; Cannot reinstall language
 grammar after running `treesit-ready-p'
Date: Sun, 05 Feb 2023 12:24:46 +0200
> From: 牟 桐 <mou.tong <at> outlook.com>
> CC: "61289 <at> debbugs.gnu.org" <61289 <at> debbugs.gnu.org>
> Date: Sun, 5 Feb 2023 09:58:49 +0000
> 
> Yes, after applying your patch, I believe this problem has been solved.

Thanks.  I installed the change on the emacs-29 branch, and I'm
closing this bug.

> But I noticed the `libtree-sitter-xxx.dll.old` in the tree-sitter dir
> hadn't been delelted.

It cannot be deleted as long as the Emacs session which uses it is up
and running.  Windows doesn't let us delete a DLL that is being used,
that's why the patch renames it instead.

The next time you install a new version of the same DLL, the .old file
will be deleted, if it still exists.  Or you can delete it by hand.

> If I remove the `ignore-errors` function in your patch, which seems like
> this (sorry, I'm not a programmer and don't know how to use diff):
> 
> -          (copy-file lib-name (file-name-as-directory out-dir) t t)
> +          (let* ((library-fname (expand-file-name lib-name out-dir))
> +                 (old-fname (concat library-fname ".old")))
> +            ;; Rename the existing shared library, if any, then
> +            ;; install the new one, and try deleting the old one.
> +            ;; This is for Windows systems, where we cannot simply
> +            ;; overwrite a DLL that is being used.
> +            (if (file-exists-p library-fname)
> +                (rename-file library-fname old-fname t))
> +            (copy-file lib-name (file-name-as-directory out-dir) t t)
> +            ;; Ignore errors, in case the old version is still used.
> +            (delete-file old-fname))
> 
>              ^
>              I deleted the outside `ignore-errors` to know why the `xxx.old` hadn’t been deleted.
> 
> After applying the change, I got the same error as I mentioned before:
> 
> ```
> ⛔ Warning (treesit): Error encountered when installing language grammar: (permission-denied Removing old name Permission denied c:/Users/redacted/.emacs.d/tree-sitter/libtree-sitter-c.dll.old)
> ```

Of course: that's why the patch uses ignore-errors in the first
place.  The DLL cannot be deleted as long as it is used.

> Btw, can we make the variable ` treesit-language-source-alist`
> customizable? (Use `defcustom` instead of `defvar`.) I'm using
> `use-package` to manage my config. When I'm configuring treesit, I'd
> like to use `:custom` instead of `:init` or `:config` since it can let
> me set variable's value without writing `setq`.

This was considered, but we decided not to do that, for several good
reasons.  One reason is that Emacs itself changes the value, which is
not appropriate with defcustoms.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#61289; Package emacs. (Sun, 05 Feb 2023 11:27:02 GMT) Full text and rfc822 format available.

Message #19 received at 61289-done <at> debbugs.gnu.org (full text, mbox):

From: 牟 桐 <mou.tong <at> outlook.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: "61289-done <at> debbugs.gnu.org" <61289-done <at> debbugs.gnu.org>
Subject: 回复:  回复: bug#61289: 30.0.50; Cannot reinstall language grammar after running `treesit-ready-p'
Date: Sun, 5 Feb 2023 11:26:42 +0000
[Message part 1 (text/plain, inline)]
> Thanks.  I installed the change on the emacs-29 branch, and I'm
> closing this bug.

I compiled a new Emacs based on emacs-29 branch, it works fine, thanks
for your patience. Hope it will be merged to master soon 😊

> It cannot be deleted as long as the Emacs session which uses it is up
> and running.  Windows doesn't let us delete a DLL that is being used,
> that's why the patch renames it instead.

I get it, thanks for the explanation.

> This was considered, but we decided not to do that, for several good
> reasons.  One reason is that Emacs itself changes the value, which is
> not appropriate with defcustoms.

Oh, it seems that I think too little.

---

发件人: Eli Zaretskii<mailto:eliz <at> gnu.org>
发送时间: 2023年2月5日 18:24
收件人: 牟 桐<mailto:mou.tong <at> outlook.com>
抄送: 61289-done <at> debbugs.gnu.org<mailto:61289-done <at> debbugs.gnu.org>
主题: Re: 回复: bug#61289: 30.0.50; Cannot reinstall language grammar after running `treesit-ready-p'

> From: 牟 桐 <mou.tong <at> outlook.com>
> CC: "61289 <at> debbugs.gnu.org" <61289 <at> debbugs.gnu.org>
> Date: Sun, 5 Feb 2023 09:58:49 +0000
>
> Yes, after applying your patch, I believe this problem has been solved.

Thanks.  I installed the change on the emacs-29 branch, and I'm
closing this bug.

> But I noticed the `libtree-sitter-xxx.dll.old` in the tree-sitter dir
> hadn't been delelted.

It cannot be deleted as long as the Emacs session which uses it is up
and running.  Windows doesn't let us delete a DLL that is being used,
that's why the patch renames it instead.

The next time you install a new version of the same DLL, the .old file
will be deleted, if it still exists.  Or you can delete it by hand.

> If I remove the `ignore-errors` function in your patch, which seems like
> this (sorry, I'm not a programmer and don't know how to use diff):
>
> -          (copy-file lib-name (file-name-as-directory out-dir) t t)
> +          (let* ((library-fname (expand-file-name lib-name out-dir))
> +                 (old-fname (concat library-fname ".old")))
> +            ;; Rename the existing shared library, if any, then
> +            ;; install the new one, and try deleting the old one.
> +            ;; This is for Windows systems, where we cannot simply
> +            ;; overwrite a DLL that is being used.
> +            (if (file-exists-p library-fname)
> +                (rename-file library-fname old-fname t))
> +            (copy-file lib-name (file-name-as-directory out-dir) t t)
> +            ;; Ignore errors, in case the old version is still used.
> +            (delete-file old-fname))
>
>              ^
>              I deleted the outside `ignore-errors` to know why the `xxx.old` hadn’t been deleted.
>
> After applying the change, I got the same error as I mentioned before:
>
> ```
> ⛔ Warning (treesit): Error encountered when installing language grammar: (permission-denied Removing old name Permission denied c:/Users/redacted/.emacs.d/tree-sitter/libtree-sitter-c.dll.old)
> ```

Of course: that's why the patch uses ignore-errors in the first
place.  The DLL cannot be deleted as long as it is used.

> Btw, can we make the variable ` treesit-language-source-alist`
> customizable? (Use `defcustom` instead of `defvar`.) I'm using
> `use-package` to manage my config. When I'm configuring treesit, I'd
> like to use `:custom` instead of `:init` or `:config` since it can let
> me set variable's value without writing `setq`.

This was considered, but we decided not to do that, for several good
reasons.  One reason is that Emacs itself changes the value, which is
not appropriate with defcustoms.

[Message part 2 (text/html, inline)]

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sun, 05 Mar 2023 12:24:10 GMT) Full text and rfc822 format available.

This bug report was last modified 1 year and 45 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.