Added --exclude-compressed flag feature that skips compression of precompressed files

This commit is contained in:
Shashank Tavildar 2019-10-25 15:49:11 -07:00
parent 6d5e0f1c9f
commit 48f856640e
5 changed files with 52 additions and 2 deletions

View File

@ -1453,7 +1453,12 @@ FIO_compressFilename_srcFile(FIO_prefs_t* const prefs,
ress.srcFile = FIO_openSrcFile(srcFileName);
if (ress.srcFile == NULL) return 1; /* srcFile could not be opened */
if (g_excludeCompressedFiles && !UTIL_isPrecompressedFile(srcFileName)) { /* precompressed file (--exclude-compressed). DO NOT COMPRESS */
DISPLAYLEVEL(4, "Precompressed file: %s \n", srcFileName);
fclose(ress.srcFile);
ress.srcFile = NULL;
return 0;
}
result = FIO_compressFilename_dstFile(prefs, ress, dstFileName, srcFileName, compressionLevel);
fclose(ress.srcFile);

View File

@ -326,6 +326,27 @@ int UTIL_prepareFileList(const char *dirName, char** bufStart, size_t* pos, char
#endif /* #ifdef _WIN32 */
/* Check if the file is precompressed (.zst, .lz4, .gz, .xz).
YES => Skip the file (return 0)
NO => return 1
*/
int UTIL_isPrecompressedFile(const char *inputName)
{
return compareExtensions(inputName,compressedFileExtensions);
}
int compareExtensions(const char* infilename, const char extensionList[4][10])
{
int i=0;
//char* ext = strchr(infilename, '.');
for(i=0;i<4;i++)
{
char* ext = strstr(infilename,extensionList[i]);
if(ext)
return 0;
}
return 1;
}
/*
* UTIL_createFileList - takes a list of files and directories (params: inputNames, inputNamesNb), scans directories,
* and returns a new list of files (params: return value, allocatedBuffer, allocatedNamesNb).

View File

@ -127,6 +127,8 @@ extern int g_utilDisplayLevel;
typedef struct stat stat_t;
#endif
int g_excludeCompressedFiles;
static const char compressedFileExtensions[4][10] = {".zst",".gz",".xz",".lz4"};
int UTIL_fileExist(const char* filename);
int UTIL_isRegularFile(const char* infilename);
@ -135,6 +137,8 @@ U32 UTIL_isDirectory(const char* infilename);
int UTIL_getFileStat(const char* infilename, stat_t* statbuf);
int UTIL_isSameFile(const char* file1, const char* file2);
int UTIL_compareStr(const void *p1, const void *p2);
int UTIL_isPrecompressedFile(const char* infilename);
int compareExtensions(const char* infilename, const char extensionList[4][10]);
U32 UTIL_isFIFO(const char* infilename);
U32 UTIL_isLink(const char* infilename);

View File

@ -118,6 +118,7 @@ static int usage(const char* programName)
#endif
DISPLAY( " -D file: use `file` as Dictionary \n");
DISPLAY( " -o file: result stored into `file` (only if 1 input file) \n");
DISPLAY( "--exclude-compressed: only compress files that are not previously compressed \n");
DISPLAY( " -f : overwrite output without prompting and (de)compress links \n");
DISPLAY( "--rm : remove source file(s) after successful de/compression \n");
DISPLAY( " -k : preserve source file(s) (default) \n");
@ -708,7 +709,7 @@ int main(int argCount, const char* argv[])
if (!strcmp(argument, "--compress-literals")) { literalCompressionMode = ZSTD_lcm_huffman; continue; }
if (!strcmp(argument, "--no-compress-literals")) { literalCompressionMode = ZSTD_lcm_uncompressed; continue; }
if (!strcmp(argument, "--no-progress")) { FIO_setNoProgress(1); continue; }
if (!strcmp(argument, "--exclude-compressed")) { g_excludeCompressedFiles = 1; continue; }
/* long commands with arguments */
#ifndef ZSTD_NODICT
if (longCommandWArg(&argument, "--train-cover")) {

View File

@ -215,6 +215,25 @@ $ZSTD tmp -c --compress-literals -19 | $ZSTD -t
$ZSTD -b --fast=1 -i0e1 tmp --compress-literals
$ZSTD -b --fast=1 -i0e1 tmp --no-compress-literals
println "test: --exclude-compressed flag"
mkdir precompressedFilterTestDir
./datagen $size > precompressedFilterTestDir/input.5
./datagen $size > precompressedFilterTestDir/input.6
$ZSTD --exclude-compressed --long --rm -r precompressedFilterTestDir
sleep 5
./datagen $size > precompressedFilterTestDir/input.7
./datagen $size > precompressedFilterTestDir/input.8
$ZSTD --exclude-compressed --long --rm -r precompressedFilterTestDir
file1timestamp=`date -r precompressedFilterTestDir/input.5.zst +%s`
file2timestamp=`date -r precompressedFilterTestDir/input.7.zst +%s`
if [[ $file2timestamp -ge $file1timestamp ]]; then
println "Test is successful. input.5.zst is not precompressed and therefore not compressed/modified again."
else
println "Test is not successful"
fi
println "Test completed"
sleep 5
println "test : file removal"
$ZSTD -f --rm tmp
test ! -f tmp # tmp should no longer be present