bug#29094: dired-do-compress creates empty archives

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

bug#29094: dired-do-compress creates empty archives

Max-5
Hi,

When Z is pressed on a directory, dired (according to
dired-compress-file-suffixes variable) runs the following command:

tar -c directory | gzip -c9 > directory.tar.gz

On my system running this command results in an error:

tar: Failed open to write on /dev/rst0: Permission denied

as tar(1) defaults -f to /dev/rst0.

Argument '-f-' should be used to write to stdout.

Also '-v' is probably not needed here, since the output is not used
anywhere.

Here is a patch to correct this behaviour:

diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 94938cf679..14f4be07be 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -974,8 +974,8 @@ command with a prefix argument (the value does not matter)."
     ;; "tar -zxf" isn't used because it's not available on the
     ;; Solaris10 version of tar. Solaris10 becomes obsolete in 2021.
     ;; Same thing on AIX 7.1.
-    ("\\.tar\\.gz\\'" "" "gzip -dc %i | tar -xv")
-    ("\\.tgz\\'" "" "gzip -dc %i | tar -xv")
+    ("\\.tar\\.gz\\'" "" "gzip -dc %i | tar -xf -")
+    ("\\.tgz\\'" "" "gzip -dc %i | tar -xf -")
     ("\\.gz\\'" "" "gunzip")
     ("\\.Z\\'" "" "uncompress")
     ;; For .z, try gunzip.  It might be an old gzip file,
@@ -990,7 +990,7 @@ command with a prefix argument (the value does not matter)."
     ;; This item controls naming for compression.
     ("\\.tar\\'" ".tgz" nil)
     ;; This item controls the compression of directories
-    (":" ".tar.gz" "tar -c %i | gzip -c9 > %o"))
+    (":" ".tar.gz" "tar -cf - %i | gzip -c9 > %o"))
   "Control changes in file name suffixes for compression and uncompression.
 Each element specifies one transformation rule, and has the form:
   (REGEXP NEW-SUFFIX PROGRAM)
@@ -1007,9 +1007,9 @@ Otherwise, the rule is a compression rule, and compression is done with gzip.
 ARGS are command switches passed to PROGRAM.")
 
 (defvar dired-compress-files-alist
-  '(("\\.tar\\.gz\\'" . "tar -c %i | gzip -c9 > %o")
-    ("\\.tar\\.bz2\\'" . "tar -c %i | bzip2 -c9 > %o")
-    ("\\.tar\\.xz\\'" . "tar -c %i | xz -c9 > %o")
+  '(("\\.tar\\.gz\\'" . "tar -cf - %i | gzip -c9 > %o")
+    ("\\.tar\\.bz2\\'" . "tar -cf - %i | bzip2 -c9 > %o")
+    ("\\.tar\\.xz\\'" . "tar -cf - %i | xz -c9 > %o")
     ("\\.zip\\'" . "zip %o -r --filesync %i"))
   "Control the compression shell command for `dired-do-compress-to'.
 




Reply | Threaded
Open this post in threaded view
|

bug#29094: dired-do-compress creates empty archives

Noam Postavsky-2
tags 29094 + patch
quit

Max <[hidden email]> writes:

> When Z is pressed on a directory, dired (according to
> dired-compress-file-suffixes variable) runs the following command:
>
> tar -c directory | gzip -c9 > directory.tar.gz
>
> On my system running this command results in an error:
>
> tar: Failed open to write on /dev/rst0: Permission denied
>
> as tar(1) defaults -f to /dev/rst0.
>
> Argument '-f-' should be used to write to stdout.

Right, the GNU tar manual says [1]

    By default, tar uses an archive file name that was compiled when it was
    built on the system; usually this name refers to some physical tape
    drive on the machine. However, the person who installed tar on the
    system may not have set the default to a meaningful value as far as most
    users are concerned.

So it's actually a bit surprising that the current values apparently
work for most people.  I guess most GNU/Linux distros set the default to
stdin?

As far as I can tell, dropping the 'f' option was just an oversight (see
[2] and other messages in that thread).

> Also '-v' is probably not needed here, since the output is not used
> anywhere.

Makes sense.

> Here is a patch to correct this behaviour:

I think it's good for emacs-26.  I assume you haven't assigned copyright
to Emacs (so it should be marked as a tiny change)?

[1]: https://www.gnu.org/software/tar/manual/html_node/file.html
[2]: https://lists.gnu.org/archive/html/emacs-devel/2015-10/msg01282.html 



Reply | Threaded
Open this post in threaded view
|

bug#29094: dired-do-compress creates empty archives

Max-5
Noam Postavsky writes:

> So it's actually a bit surprising that the current values apparently
> work for most people.  I guess most GNU/Linux distros set the default
> to stdin?

I've investigated this a bit further. There is a DEFAULT_ARCHIVE
variable in GNU tar which is set at configuration time. The default
is '-'. Most distributions probably use the defaults.

In OpenBSD [1] and FreeBSD [2] makefiles for GNU tar DEFAULT_ARCHIVE
set to point to a tape drive. Probably to be consistent with tar(1)
provided in the base system which is also points to a tape drive.

> I assume you haven't assigned copyright to Emacs (so it should be
> marked as a tiny change)?

I haven't yet. As far as I know, these kind of small patches are
accepted without assigning a copyright. If not, please, let me know.

[1]: https://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/archivers/gtar/Makefile?rev=1.78
[2]: https://svnweb.freebsd.org/ports/head/archivers/gtar/Makefile?revision=421635



Reply | Threaded
Open this post in threaded view
|

bug#29094: dired-do-compress creates empty archives

Eli Zaretskii
In reply to this post by Noam Postavsky-2
> From: Noam Postavsky <[hidden email]>
> Date: Mon, 04 Dec 2017 20:46:07 -0500
> Cc: [hidden email]
>
> So it's actually a bit surprising that the current values apparently
> work for most people.  I guess most GNU/Linux distros set the default to
> stdin?

It's that, and also these commands are probably rarely used.

> I think it's good for emacs-26.

Yes.



Reply | Threaded
Open this post in threaded view
|

bug#29094: dired-do-compress creates empty archives

Eli Zaretskii
In reply to this post by Max-5
> Date: Thu, 7 Dec 2017 06:25:23 +0300
> From: Max <[hidden email]>
> Cc: [hidden email]
>
> > I assume you haven't assigned copyright to Emacs (so it should be
> > marked as a tiny change)?
>
> I haven't yet. As far as I know, these kind of small patches are
> accepted without assigning a copyright.

True.  (But what matters is the sum total of your contributions, so
enough such small patches will still exhaust your grace amount.)

Thanks.




Reply | Threaded
Open this post in threaded view
|

bug#29094: dired-do-compress creates empty archives

Noam Postavsky-2
In reply to this post by Eli Zaretskii
tags 29094 fixed
close 29094 26.1
quit

Eli Zaretskii <[hidden email]> writes:

>> I think it's good for emacs-26.
>
> Yes.

Pushed to emacs-26.

[1: cd53b6399b]: 2017-12-11 17:38:28 -0500
  Fix dired-do-compress when tar doesn't default to stdin (Bug#29094)
  https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=cd53b6399b187f5a6719dd58a489f4c55fd094aa