Skip to content

Commit

Permalink
Keep original file if -c or --stdout is given
Browse files Browse the repository at this point in the history
Set removeSrcFile back to false when -c or --stdout is used to improve
compatibility with gzip(1) behavior.

gzip(1) is removing the original file on compression unless --stdout or
/-c is used. zstd is defaulting to keep the file unless --rm is used or
when it is called via a gzip symlink, in which it is removing by
default. Specifying -c/--stdout turns this behavior off.
  • Loading branch information
dirkmueller committed Feb 8, 2022
1 parent b848c16 commit 15ff5ad
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 9 deletions.
4 changes: 2 additions & 2 deletions programs/zstd.1
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.
.TH "ZSTD" "1" "January 2022" "zstd 1.5.2" "User Commands"
.TH "ZSTD" "1" "February 2022" "zstd 1.5.2" "User Commands"
.
.SH "NAME"
\fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files
Expand Down Expand Up @@ -165,7 +165,7 @@ Additionally, this can be used to limit memory for dictionary training\. This pa
\fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\.
.
.IP "\(bu" 4
\fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console)
\fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console); keep original files unchanged\.
.
.IP "\(bu" 4
\fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\.
Expand Down
2 changes: 1 addition & 1 deletion programs/zstd.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ the last one takes effect.
disable input and output checks. Allows overwriting existing files, input
from console, output to stdout, operating on links, block devices, etc.
* `-c`, `--stdout`:
write to standard output (even if it is the console)
write to standard output (even if it is the console); keep original files unchanged.
* `--[no-]sparse`:
enable / disable sparse FS support,
to make files with many zeroes smaller on disk.
Expand Down
10 changes: 5 additions & 5 deletions programs/zstdcli.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ static void usage_advanced(const char* programName)
DISPLAYOUT( "Advanced arguments : \n");
DISPLAYOUT( " -V : display Version number and exit \n");

DISPLAYOUT( " -c : write to standard output (even if it is the console) \n");
DISPLAYOUT( " -c : write to standard output (even if it is the console), keep original file \n");

DISPLAYOUT( " -v : verbose mode; specify multiple times to increase verbosity \n");
DISPLAYOUT( " -q : suppress warnings; specify twice to suppress errors too \n");
Expand Down Expand Up @@ -911,7 +911,7 @@ int main(int argCount, const char* argv[])
if (!strcmp(argument, "--help")) { usage_advanced(programName); CLEAN_RETURN(0); }
if (!strcmp(argument, "--verbose")) { g_displayLevel++; continue; }
if (!strcmp(argument, "--quiet")) { g_displayLevel--; continue; }
if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; g_displayLevel-=(g_displayLevel==2); continue; }
if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; FIO_setRemoveSrcFile(prefs, 0); g_displayLevel-=(g_displayLevel==2); continue; }
if (!strcmp(argument, "--ultra")) { ultra=1; continue; }
if (!strcmp(argument, "--check")) { FIO_setChecksumFlag(prefs, 2); continue; }
if (!strcmp(argument, "--no-check")) { FIO_setChecksumFlag(prefs, 0); continue; }
Expand Down Expand Up @@ -1096,7 +1096,7 @@ int main(int argCount, const char* argv[])
operation=zom_decompress; argument++; break;

/* Force stdout, even if stdout==console */
case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break;
case 'c': forceStdout=1; outFileName=stdoutmark; FIO_setRemoveSrcFile(prefs, 0); argument++; break;

/* Use file content as dictionary */
case 'D': argument++; NEXT_FIELD(dictFileName); break;
Expand Down Expand Up @@ -1258,7 +1258,7 @@ int main(int argCount, const char* argv[])
}

nbInputFileNames = filenames->tableSize; /* saving number of input files */

if (recursive) { /* at this stage, filenameTable is a list of paths, which can contain both files and directories */
UTIL_expandFNT(&filenames, followLinks);
}
Expand Down Expand Up @@ -1371,7 +1371,7 @@ int main(int argCount, const char* argv[])
}
UTIL_refFilename(filenames, stdinmark);
}

if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName)
outFileName = stdoutmark; /* when input is stdin, default output is stdout */

Expand Down
8 changes: 7 additions & 1 deletion tests/cli-tests/compression/basic.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/sh

set -e
set -euo pipefail

# Uncomment the set -v line for debugging
# set -v
Expand All @@ -24,6 +24,12 @@ zstd -c file | zstd -t
zstd --stdout file | zstd -t
println bob | zstd | zstd -t

# Test keeping input file when compressing to stdout in gzip mode
ln -s "$(which zstd)" ./gzip
./gzip -c file | zstd -t ; test -f file
./gzip --stdout file | zstd -t ; test -f file
rm ./gzip

# Test --rm
cp file file-rm
zstd --rm file-rm; zstd -t file-rm.zst
Expand Down

0 comments on commit 15ff5ad

Please sign in to comment.