hrev52209 adds 1 changeset to branch 'master'
old head: b8a38e2bc1a6acae1b9a91dc082aafafe4af0911
new head: 81375d4fbb014aef855696c12cf7b0e49083a8b1
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=81375d4fbb01+%5Eb8a38e2bc1a6
----------------------------------------------------------------------------
81375d4fbb01: Package Kit: add Zstd compression.
Change-Id: Idbdb7cf1bde659046a88ea69a76e3b5fc4cd7013
Reviewed-on: https://review.haiku-os.org/323
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>
[ Jérôme Duval <jerome.duval@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev52209
Commit: 81375d4fbb014aef855696c12cf7b0e49083a8b1
URL: https://git.haiku-os.org/haiku/commit/?id=81375d4fbb01
Author: Jérôme Duval <jerome.duval@xxxxxxxxx>
Date: Wed Jul 11 09:36:44 2018 UTC
Committer: waddlesplash <waddlesplash@xxxxxxxxx>
Commit-Date: Sat Aug 11 23:10:00 2018 UTC
----------------------------------------------------------------------------
8 files changed, 82 insertions(+), 5 deletions(-)
headers/os/package/hpkg/HPKGDefs.h | 3 ++-
.../kernel/file_systems/packagefs/Jamfile | 14 ++++++++++-
src/bin/package/command_create.cpp | 11 ++++++++-
src/bin/package/command_recompress.cpp | 11 ++++++++-
src/bin/package/package.cpp | 2 ++
src/kits/package/Jamfile | 4 ++-
src/kits/package/hpkg/ReaderImplBase.cpp | 16 ++++++++++++
src/kits/package/hpkg/WriterImplBase.cpp | 26 ++++++++++++++++++++
----------------------------------------------------------------------------
diff --git a/headers/os/package/hpkg/HPKGDefs.h
b/headers/os/package/hpkg/HPKGDefs.h
index 4650a7ff05..ba7735c666 100644
--- a/headers/os/package/hpkg/HPKGDefs.h
+++ b/headers/os/package/hpkg/HPKGDefs.h
@@ -98,7 +98,8 @@ enum BHPKGAttributeID {
// compression types
enum {
B_HPKG_COMPRESSION_NONE = 0,
- B_HPKG_COMPRESSION_ZLIB = 1
+ B_HPKG_COMPRESSION_ZLIB = 1,
+ B_HPKG_COMPRESSION_ZSTD = 2
};
diff --git a/src/add-ons/kernel/file_systems/packagefs/Jamfile
b/src/add-ons/kernel/file_systems/packagefs/Jamfile
index 52aebe0975..5a31abff21 100644
--- a/src/add-ons/kernel/file_systems/packagefs/Jamfile
+++ b/src/add-ons/kernel/file_systems/packagefs/Jamfile
@@ -5,6 +5,17 @@ UseBuildFeatureHeaders zlib ;
UsePrivateKernelHeaders ;
UsePrivateHeaders package shared storage support ;
+local zstdSources ;
+local zstdKernelLib ;
+
+if [ FIsBuildFeatureEnabled zstd ] {
+ zstdSources = ZstdCompressionAlgorithm.cpp ;
+ zstdKernelLib = kernel_libzstd.a ;
+ UseBuildFeatureHeaders zstd ;
+ Includes [ FGristFiles $(zstdSources) ]
+ : [ BuildFeatureAttribute zstd : headers ] ;
+ SubDirC++Flags -DZSTD_ENABLED ;
+}
local subDirs =
indices
@@ -117,6 +128,7 @@ local storageKitSources =
local supportKitSources =
CompressionAlgorithm.cpp
ZlibCompressionAlgorithm.cpp
+ $(zstdSources)
;
KernelAddon packagefs
@@ -129,7 +141,7 @@ KernelAddon packagefs
$(storageKitSources)
$(supportKitSources)
- : kernel_libz.a
+ : kernel_libz.a $(zstdKernelLib)
;
diff --git a/src/bin/package/command_create.cpp
b/src/bin/package/command_create.cpp
index ed2498210b..b397201f06 100644
--- a/src/bin/package/command_create.cpp
+++ b/src/bin/package/command_create.cpp
@@ -39,6 +39,7 @@ command_create(int argc, const char* const* argv)
bool quiet = false;
bool verbose = false;
int32 compressionLevel =
BPackageKit::BHPKG::B_HPKG_COMPRESSION_LEVEL_BEST;
+ int32 compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_ZLIB;
while (true) {
static struct option sLongOptions[] = {
@@ -49,7 +50,7 @@ command_create(int argc, const char* const* argv)
};
opterr = 0; // don't print errors
- int c = getopt_long(argc, (char**)argv, "+b0123456789C:hi:I:qv",
+ int c = getopt_long(argc, (char**)argv,
"+b0123456789C:hi:I:qvz",
sLongOptions, NULL);
if (c == -1)
break;
@@ -96,6 +97,10 @@ command_create(int argc, const char* const* argv)
verbose = true;
break;
+ case 'z':
+ compression =
BPackageKit::BHPKG::B_HPKG_COMPRESSION_ZSTD;
+ break;
+
default:
print_usage_and_exit(true);
break;
@@ -123,6 +128,10 @@ command_create(int argc, const char* const* argv)
BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE);
}
+ if (compressionLevel == 0)
+ compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE;
+ writerParameters.SetCompression(compression);
+
PackageWriterListener listener(verbose, quiet);
BPackageWriter packageWriter(&listener);
status_t result = packageWriter.Init(packageFileName,
&writerParameters);
diff --git a/src/bin/package/command_recompress.cpp
b/src/bin/package/command_recompress.cpp
index c380a3e844..671e42e5e9 100644
--- a/src/bin/package/command_recompress.cpp
+++ b/src/bin/package/command_recompress.cpp
@@ -45,6 +45,7 @@ command_recompress(int argc, const char* const* argv)
bool quiet = false;
bool verbose = false;
int32 compressionLevel =
BPackageKit::BHPKG::B_HPKG_COMPRESSION_LEVEL_BEST;
+ int32 compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_ZLIB;
while (true) {
static struct option sLongOptions[] = {
@@ -55,7 +56,7 @@ command_recompress(int argc, const char* const* argv)
};
opterr = 0; // don't print errors
- int c = getopt_long(argc, (char**)argv, "+0123456789:hqv",
+ int c = getopt_long(argc, (char**)argv, "+0123456789:hqvz",
sLongOptions, NULL);
if (c == -1)
break;
@@ -86,6 +87,10 @@ command_recompress(int argc, const char* const* argv)
verbose = true;
break;
+ case 'z':
+ compression =
BPackageKit::BHPKG::B_HPKG_COMPRESSION_ZSTD;
+ break;
+
default:
print_usage_and_exit(true);
break;
@@ -124,6 +129,10 @@ command_recompress(int argc, const char* const* argv)
BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE);
}
+ if (compressionLevel == 0)
+ compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE;
+ writerParameters.SetCompression(compression);
+
PackageWriterListener listener(verbose, quiet);
BPackageWriter packageWriter(&listener);
if (strcmp(outputPackageFileName, "-") == 0) {
diff --git a/src/bin/package/package.cpp b/src/bin/package/package.cpp
index d47b8bca7b..bfbb6c348e 100644
--- a/src/bin/package/package.cpp
+++ b/src/bin/package/package.cpp
@@ -50,6 +50,7 @@ static const char* kUsage =
"\n"
" -q - Be quiet (don't show any output except for errors).\n"
" -v - Be verbose (show more info about created package).\n"
+ " -z - Use Zstd compression.\n"
"\n"
" create [ <options> ] <package>\n"
" Creates package file <package> from contents of current
directory.\n"
@@ -120,6 +121,7 @@ static const char* kUsage =
" Defaults to 9.\n"
" -q - Be quiet (don't show any output except for errors).\n"
" -v - Be verbose (show more info about created package).\n"
+ " -z - Use Zstd compression.\n"
"\n"
"Common Options:\n"
" -h, --help - Print this usage info.\n"
diff --git a/src/kits/package/Jamfile b/src/kits/package/Jamfile
index b849ecf189..98b03b92d4 100644
--- a/src/kits/package/Jamfile
+++ b/src/kits/package/Jamfile
@@ -62,7 +62,9 @@ local architectureObject ;
for architectureObject in [ MultiArchSubDirSetup ] {
on $(architectureObject) {
UseBuildFeatureHeaders curl ;
-
+ if [ FIsBuildFeatureEnabled zstd ] {
+ SubDirC++Flags -DZSTD_ENABLED ;
+ }
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package hpkg
] ;
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package hpkg
v1 ] ;
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package
manager ] ;
diff --git a/src/kits/package/hpkg/ReaderImplBase.cpp
b/src/kits/package/hpkg/ReaderImplBase.cpp
index bb3bb1b05e..c4e4978c15 100644
--- a/src/kits/package/hpkg/ReaderImplBase.cpp
+++ b/src/kits/package/hpkg/ReaderImplBase.cpp
@@ -20,6 +20,9 @@
#include <DataIO.h>
#include <ZlibCompressionAlgorithm.h>
+#ifdef ZSTD_ENABLED
+#include <ZstdCompressionAlgorithm.h>
+#endif
#include <package/hpkg/HPKGDefsPrivate.h>
#include <package/hpkg/PackageFileHeapReader.h>
@@ -824,6 +827,19 @@ ReaderImplBase::InitHeapReader(uint32 compression, uint32
chunkSize,
return B_NO_MEMORY;
}
break;
+#ifdef ZSTD_ENABLED
+ case B_HPKG_COMPRESSION_ZSTD:
+ decompressionAlgorithm =
DecompressionAlgorithmOwner::Create(
+ new(std::nothrow) BZstdCompressionAlgorithm,
+ new(std::nothrow) BZstdDecompressionParameters);
+
decompressionAlgorithmReference.SetTo(decompressionAlgorithm, true);
+ if (decompressionAlgorithm == NULL
+ || decompressionAlgorithm->algorithm == NULL
+ || decompressionAlgorithm->parameters == NULL) {
+ return B_NO_MEMORY;
+ }
+ break;
+#endif
default:
fErrorOutput->PrintError("Error: Invalid heap
compression\n");
return B_BAD_DATA;
diff --git a/src/kits/package/hpkg/WriterImplBase.cpp
b/src/kits/package/hpkg/WriterImplBase.cpp
index 7db79e1dc3..c17f534a61 100644
--- a/src/kits/package/hpkg/WriterImplBase.cpp
+++ b/src/kits/package/hpkg/WriterImplBase.cpp
@@ -20,6 +20,9 @@
#include <AutoDeleter.h>
#include <ZlibCompressionAlgorithm.h>
+#ifdef ZSTD_ENABLED
+#include <ZstdCompressionAlgorithm.h>
+#endif
#include <package/hpkg/DataReader.h>
#include <package/hpkg/ErrorOutput.h>
@@ -326,6 +329,29 @@ WriterImplBase::InitHeapReader(size_t headerSize)
throw std::bad_alloc();
}
break;
+#ifdef ZSTD_ENABLED
+ case B_HPKG_COMPRESSION_ZSTD:
+ compressionAlgorithm =
CompressionAlgorithmOwner::Create(
+ new(std::nothrow) BZstdCompressionAlgorithm,
+ new(std::nothrow) BZstdCompressionParameters(
+ fParameters.CompressionLevel()));
+
compressionAlgorithmReference.SetTo(compressionAlgorithm, true);
+
+ decompressionAlgorithm =
DecompressionAlgorithmOwner::Create(
+ new(std::nothrow) BZstdCompressionAlgorithm,
+ new(std::nothrow) BZstdDecompressionParameters);
+
decompressionAlgorithmReference.SetTo(decompressionAlgorithm, true);
+
+ if (compressionAlgorithm == NULL
+ || compressionAlgorithm->algorithm == NULL
+ || compressionAlgorithm->parameters == NULL
+ || decompressionAlgorithm == NULL
+ || decompressionAlgorithm->algorithm == NULL
+ || decompressionAlgorithm->parameters == NULL) {
+ throw std::bad_alloc();
+ }
+ break;
+#endif
default:
fErrorOutput->PrintError("Error: Invalid heap
compression\n");
return B_BAD_VALUE;