From 3f4f8b04ed2d318536c9f54e0c575603ed75d92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dirk=20M=C3=BCller?= Date: Mon, 7 Feb 2022 20:39:15 +0100 Subject: [PATCH] Keep original file if -c or --stdout is given 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. --- programs/zstd.1 | 4 ++-- programs/zstd.1.md | 2 +- programs/zstdcli.c | 10 +++++----- tests/cli-tests/compression/basic.sh | 4 ++++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/programs/zstd.1 b/programs/zstd.1 index 0e6e016e9..346b08b18 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -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 @@ -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\. diff --git a/programs/zstd.1.md b/programs/zstd.1.md index 569ca1aa0..c78fd4abf 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -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. diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 0b9b82a98..6c200bc98 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -178,7 +178,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"); @@ -925,7 +925,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; } @@ -1114,7 +1114,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; /* do not store filename - gzip compatibility - nothing to do */ case 'n': argument++; break; @@ -1279,7 +1279,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); } @@ -1392,7 +1392,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 */ diff --git a/tests/cli-tests/compression/basic.sh b/tests/cli-tests/compression/basic.sh index 8b63e4076..b6e2aa045 100755 --- a/tests/cli-tests/compression/basic.sh +++ b/tests/cli-tests/compression/basic.sh @@ -24,6 +24,10 @@ 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 +$ZSTD_SYMLINK_DIR/gzip -c file | zstd -t ; test -f file +$ZSTD_SYMLINK_DIR/gzip --stdout file | zstd -t ; test -f file + # Test --rm cp file file-rm zstd --rm file-rm; zstd -t file-rm.zst