GNU bug report logs - #52451
27.1; jka-compr-write-region produces wrong type argument error

Previous Next

Package: emacs;

Reported by: Braun Gábor <braungb88 <at> gmail.com>

Date: Sun, 12 Dec 2021 14:10:02 UTC

Severity: normal

Found in version 27.1

To reply to this bug, email your comments to 52451 AT debbugs.gnu.org.

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#52451; Package emacs. (Sun, 12 Dec 2021 14:10:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Braun Gábor <braungb88 <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Sun, 12 Dec 2021 14:10:02 GMT) Full text and rfc822 format available.

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

From: Braun Gábor <braungb88 <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 27.1; jka-compr-write-region produces wrong type argument error
Date: Sun, 12 Dec 2021 15:09:08 +0100
Hi,

Start Emacs via the command

 emacs -Q --batch -l jka-compr.el --eval '(let ((jka-compr-really-do-compress 
t) (debug-on-error t)) (jka-compr-write-region "foo" nil "/tmp/test.gz"))'        


This should run without any error.
Instead the following appears on the terminal:


uncompressing jka-compr.el.gz...
uncompressing jka-compr.el.gz...done
Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil)
  -(nil "foo")
  (= (- end start) (buffer-size))
  (or (null start) (= (- end start) (buffer-size)))
  (and jka-compr-really-do-compress (or (null start) (= (- end start) (buffer-
size))))
  (if (and jka-compr-really-do-compress (or (null start) (= (- end start) 
(buffer-size)))) (setq magic nil))
  (let* ((filename (expand-file-name file)) (visit-file (if (stringp visit) 
(expand-file-name visit) filename)) (info (jka-compr-get-compression-info visit-
file)) (magic (and info (jka-compr-info-file-magic-bytes info)))) (if (and jka-
compr-really-do-compress (or (null start) (= (- end start) (buffer-size)))) 
(setq magic nil)) (if (and info (not (and magic (equal (if (stringp start) 
(substring start 0 ...) (let* ... ...)) magic)))) (let ((can-append (jka-
compr-info-can-append info)) (compress-program (jka-compr-info-compress-
program info)) (compress-message (jka-compr-info-compress-message info)) 
(compress-args (jka-compr-info-compress-args info)) (base-name (file-name-
nondirectory visit-file)) temp-file temp-buffer (coding-system-used last-coding-
system-used)) (or compress-program (error "No compression program defined")) 
(setq temp-buffer (get-buffer-create " *jka-compr-wr-temp*")) (save-current-
buffer (set-buffer temp-buffer) (widen) (erase-buffer)) (if (and append (not can-
append) (file-exists-p filename)) (let* ((local-copy (file-local-copy filename)) 
(local-file (or local-copy filename))) (setq temp-file local-file)) (setq temp-file 
(jka-compr-make-temp-name))) (and compress-message jka-compr-verbose (message 
"%s %s..." compress-message base-name)) (jka-compr-run-real-handler 'write-
region (list start end temp-file t 'dont)) (setq coding-system-used last-
coding-system-used) (let ((coding-system-for-read 'no-conversion)) (jka-compr-
call-process compress-program (concat compress-message " " base-name) temp-file 
temp-buffer nil compress-args)) (save-current-buffer (set-buffer temp-buffer) (let 
((coding-system-for-write 'no-conversion)) (jka-compr-run-real-handler 'write-
region (list (point-min) (point-max) filename (and append can-append) 'dont 
lockname mustbenew)) (erase-buffer))) (delete-file temp-file) (and compress-
message jka-compr-verbose (message "%s %s...done" compress-message base-
name)) (cond ((eq visit t) (setq buffer-file-name filename) (setq jka-compr-
really-do-compress t) (set-visited-file-modtime)) ((stringp visit) (setq buffer-
file-name visit) (let ((buffer-file-name filename)) (set-visited-file-modtime)))) 
(and (or (eq visit t) (eq visit nil) (stringp visit)) (message "Wrote %s" 
visit-file)) (setq last-coding-system-used coding-system-used) nil) (jka-compr-
run-real-handler 'write-region (list start end filename append visit lockname 
mustbenew))))
  jka-compr-write-region("foo" nil "/tmp/test.gz")
  (let ((jka-compr-really-do-compress t) (debug-on-error t)) (jka-compr-write-
region "foo" nil "/tmp/test.gz"))
  eval((let ((jka-compr-really-do-compress t) (debug-on-error t)) (jka-compr-
write-region "foo" nil "/tmp/test.gz")) t)
  command-line-1(("-l" "jka-compr.el" "--eval" "(let ((jka-compr-really-do-
compress t) (debug-on-e..."))
  command-line()
  normal-top-level()


My guess is that the debugger refers to the following snippet
in function `jka-commpr-write-region':

    ;; If we uncompressed this file when visiting it,
    ;; then recompress it when writing it
    ;; even if the contents look compressed already.
    (if (and jka-compr-really-do-compress
             (or (null start)
                 (= (- end start) (buffer-size))))
	(setq magic nil))

This seems to falsely assume that START is nil or a buffer position,
even though the docstring of `write-region' explicitly allows it to be a
string.

Best wishes,

     Gábor Braun


In GNU Emacs 27.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo 
version 1.16.0)
 of 2021-03-28, modified by Debian built on x86-conova-01
Windowing system distributor 'The X.Org Foundation', version 11.0.12011000
System Description: Devuan GNU/Linux 4 (chimaera)

Configured using:
 'configure --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/lib
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --enable-libsystemd --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/27.1/site-lisp:/usr/
local/share/emacs/site-lisp:/usr/share/emacs/27.1/site-lisp:/usr/share/emacs/
site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --build
 x86_64-linux-gnu --prefix=/usr --sharedstatedir=/var/lib
 --libexecdir=/usr/lib --localstatedir=/var/lib
 --infodir=/usr/share/info --mandir=/usr/share/man --enable-libsystemd
 --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/27.1/site-lisp:/usr/
local/share/emacs/site-lisp:/usr/share/emacs/27.1/site-lisp:/usr/share/emacs/
site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --with-cairo
 --with-x=yes --with-x-toolkit=gtk3 --with-toolkit-scroll-bars
 'CFLAGS=-g -O2
 -ffile-prefix-map=/build/emacs-LlFm6W/emacs-27.1+1=. -fstack-protector-strong
 -Wformat -Werror=format-security -Wall' 'CPPFLAGS=-Wdate-time
 -D_FORTIFY_SOURCE=2' LDFLAGS=-Wl,-z,relro'

Configured features:
XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM DBUS GSETTINGS GLIB NOTIFY
INOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE HARFBUZZ M17N_FLT LIBOTF
ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM MODULES THREADS LIBSYSTEMD
JSON PDUMPER LCMS2 GMP

Important settings:
  value of $LANG: hu_HU.UTF-8
  locale-coding-system: utf-8-unix







Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#52451; Package emacs. (Sun, 12 Dec 2021 14:29:01 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Braun Gábor <braungb88 <at> gmail.com>
Cc: 52451 <at> debbugs.gnu.org
Subject: Re: bug#52451: 27.1;
 jka-compr-write-region produces wrong type argument error
Date: Sun, 12 Dec 2021 16:28:09 +0200
> From: Braun Gábor <braungb88 <at> gmail.com>
> Date: Sun, 12 Dec 2021 15:09:08 +0100
> 
> Start Emacs via the command
> 
>  emacs -Q --batch -l jka-compr.el --eval '(let ((jka-compr-really-do-compress 
> t) (debug-on-error t)) (jka-compr-write-region "foo" nil "/tmp/test.gz"))'        
> 
> 
> This should run without any error.
> Instead the following appears on the terminal:
> 
> 
> uncompressing jka-compr.el.gz...
> uncompressing jka-compr.el.gz...done
> Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil)
>   -(nil "foo")
>   (= (- end start) (buffer-size))
>   (or (null start) (= (- end start) (buffer-size)))

Why did you assume that jka-compr-write-region supports compressing a
string, not just a portion of a buffer?  I don't see it documented
anywhere.

> My guess is that the debugger refers to the following snippet
> in function `jka-commpr-write-region':
> 
>     ;; If we uncompressed this file when visiting it,
>     ;; then recompress it when writing it
>     ;; even if the contents look compressed already.
>     (if (and jka-compr-really-do-compress
>              (or (null start)
>                  (= (- end start) (buffer-size))))
> 	(setq magic nil))
> 
> This seems to falsely assume that START is nil or a buffer position,
> even though the docstring of `write-region' explicitly allows it to be a
> string.

When will write-region invoke jka-commpr-write-region if it is called
with the first argument a string?  That's the use case we should
discuss, not the direct invocation of jka-commpr-write-region in your
recipe, I think.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#52451; Package emacs. (Sun, 12 Dec 2021 18:54:02 GMT) Full text and rfc822 format available.

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

From: Braun Gábor <braungb88 <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 52451 <at> debbugs.gnu.org
Subject: Re: bug#52451: 27.1;
 jka-compr-write-region produces wrong type argument error
Date: Sun, 12 Dec 2021 19:53:38 +0100
Hi Eli,

> When will write-region invoke jka-commpr-write-region if it is called
> with the first argument a string?

OK, here is a recipe.

$ echo FOO >test
$ gzip test
$ emacs -Q --batch -l jka-compr.el --eval '(let ((debug-on-error t)) (find-file 
"test.gz") (write-region "foo" nil "foo.gz"))'                     
uncompressing jka-compr.el.gz...
uncompressing jka-compr.el.gz...done
uncompressing test.gz...
uncompressing test.gz...done
Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil)
  -(nil "foo")
  (= (- end start) (buffer-size))
  (or (null start) (= (- end start) (buffer-size)))
  (and jka-compr-really-do-compress (or (null start) (= (- end start) (buffer-
size))))
  (if (and jka-compr-really-do-compress (or (null start) (= (- end start) 
(buffer-size)))) (setq magic nil))
  (let* ((filename (expand-file-name file)) (visit-file (if (stringp visit) 
(expand-file-name visit) filename)) (info (jka-compr-get-compression-info visit-
file)) (magic (and info (jka-compr-info-file-magic-bytes info)))) (if (and jka-
compr-really-do-compress (or (null start) (= (- end start) (buffer-size)))) 
(setq magic nil)) (if (and info (not (and magic (equal (if (stringp start) 
(substring start 0 ...) (let* ... ...)) magic)))) (let ((can-append (jka-
compr-info-can-append info)) (compress-program (jka-compr-info-compress-
program info)) (compress-message (jka-compr-info-compress-message info)) 
(compress-args (jka-compr-info-compress-args info)) (base-name (file-name-
nondirectory visit-file)) temp-file temp-buffer (coding-system-used last-coding-
system-used)) (or compress-program (error "No compression program defined")) 
(setq temp-buffer (get-buffer-create " *jka-compr-wr-temp*")) (save-current-
buffer (set-buffer temp-buffer) (widen) (erase-buffer)) (if (and append (not can-
append) (file-exists-p filename)) (let* ((local-copy (file-local-copy filename)) 
(local-file (or local-copy filename))) (setq temp-file local-file)) (setq temp-file 
(jka-compr-make-temp-name))) (and compress-message jka-compr-verbose (message 
"%s %s..." compress-message base-name)) (jka-compr-run-real-handler 'write-
region (list start end temp-file t 'dont)) (setq coding-system-used last-
coding-system-used) (let ((coding-system-for-read 'no-conversion)) (jka-compr-
call-process compress-program (concat compress-message " " base-name) temp-file 
temp-buffer nil compress-args)) (save-current-buffer (set-buffer temp-buffer) (let 
((coding-system-for-write 'no-conversion)) (jka-compr-run-real-handler 'write-
region (list (point-min) (point-max) filename (and append can-append) 'dont 
lockname mustbenew)) (erase-buffer))) (delete-file temp-file) (and compress-
message jka-compr-verbose (message "%s %s...done" compress-message base-
name)) (cond ((eq visit t) (setq buffer-file-name filename) (setq jka-compr-
really-do-compress t) (set-visited-file-modtime)) ((stringp visit) (setq buffer-
file-name visit) (let ((buffer-file-name filename)) (set-visited-file-modtime)))) 
(and (or (eq visit t) (eq visit nil) (stringp visit)) (message "Wrote %s" 
visit-file)) (setq last-coding-system-used coding-system-used) nil) (jka-compr-
run-real-handler 'write-region (list start end filename append visit lockname 
mustbenew))))
  jka-compr-write-region("foo" nil "/dev/shm/foo.gz" nil nil "/dev/shm/foo.gz" 
nil)
  apply(jka-compr-write-region ("foo" nil "/dev/shm/foo.gz" nil nil "/dev/shm/
foo.gz" nil))
  (if (and jka-op (not jka-compr-inhibit)) (apply jka-op args) (jka-compr-run-
real-handler operation args))
  (let ((jka-op (get operation 'jka-compr))) (if (and jka-op (not jka-compr-
inhibit)) (apply jka-op args) (jka-compr-run-real-handler operation args)))
  (progn (let ((jka-op (get operation 'jka-compr))) (if (and jka-op (not jka-
compr-inhibit)) (apply jka-op args) (jka-compr-run-real-handler operation 
args))))
  (unwind-protect (progn (let ((jka-op (get operation 'jka-compr))) (if (and 
jka-op (not jka-compr-inhibit)) (apply jka-op args) (jka-compr-run-real-
handler operation args)))) (set-match-data save-match-data-internal 
'evaporate))
  (let ((save-match-data-internal (match-data))) (unwind-protect (progn (let 
((jka-op (get operation 'jka-compr))) (if (and jka-op (not jka-compr-inhibit)) 
(apply jka-op args) (jka-compr-run-real-handler operation args)))) (set-match-
data save-match-data-internal 'evaporate)))
  jka-compr-handler(write-region "foo" nil "/dev/shm/foo.gz" nil nil "/dev/
shm/foo.gz" nil)
  write-region("foo" nil "foo.gz")
  (let ((debug-on-error t)) (find-file "test.gz") (write-region "foo" nil 
"foo.gz"))
  eval((let ((debug-on-error t)) (find-file "test.gz") (write-region "foo" nil 
"foo.gz")) t)
  command-line-1(("-l" "jka-compr.el" "--eval" "(let ((debug-on-error t)) 
(find-file \"test.gz\") (w..."))
  command-line()
  normal-top-level()

Best wishes,

	Gábor







Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#52451; Package emacs. (Mon, 13 Dec 2021 13:03:01 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Braun Gábor <braungb88 <at> gmail.com>
Cc: 52451 <at> debbugs.gnu.org
Subject: Re: bug#52451: 27.1;
 jka-compr-write-region produces wrong type argument error
Date: Mon, 13 Dec 2021 15:02:30 +0200
> From: Braun Gábor <braungb88 <at> gmail.com>
> Cc: 52451 <at> debbugs.gnu.org
> Date: Sun, 12 Dec 2021 19:53:38 +0100
> 
> > When will write-region invoke jka-commpr-write-region if it is called
> > with the first argument a string?
> 
> OK, here is a recipe.
> 
> $ echo FOO >test
> $ gzip test
> $ emacs -Q --batch -l jka-compr.el --eval '(let ((debug-on-error t)) (find-file 
> "test.gz") (write-region "foo" nil "foo.gz"))'                     

I'm not sure jka-compr is for supporting such use cases.  jka-compr is
a package for transparently visiting and editing compressed files, it
is not supposed to provide methods for writing arbitrary compressed
data to files that didn't exist.

Does anyone else have an opinion about this?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#52451; Package emacs. (Tue, 14 Dec 2021 13:53:01 GMT) Full text and rfc822 format available.

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

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 52451 <at> debbugs.gnu.org, Braun Gábor <braungb88 <at> gmail.com>
Subject: Re: bug#52451: 27.1; jka-compr-write-region produces wrong type
 argument error
Date: Tue, 14 Dec 2021 14:52:35 +0100
Eli Zaretskii <eliz <at> gnu.org> writes:

>> $ echo FOO >test
>> $ gzip test
>> $ emacs -Q --batch -l jka-compr.el --eval '(let ((debug-on-error t))
>> (find-file
>> "test.gz") (write-region "foo" nil "foo.gz"))'                     
>
> I'm not sure jka-compr is for supporting such use cases.  jka-compr is
> a package for transparently visiting and editing compressed files, it
> is not supposed to provide methods for writing arbitrary compressed
> data to files that didn't exist.
>
> Does anyone else have an opinion about this?

It's certainly an odd use case, but `write-region' is documented to work
that way, so I think we should support it.  (If possible.)

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




This bug report was last modified 3 years and 182 days ago.

Previous Next


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