[haiku-commits] BRANCH weinhold-github.new-hpkg-format [4d54b5c] src/kits/package/hpkg src/bin/package headers/private/package/hpkg build/jam headers/os/package/hpkg

  • From: weinhold-github.new-hpkg-format <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 19 May 2013 02:00:35 +0200 (CEST)

added 3 changesets to branch 'refs/remotes/weinhold-github/new-hpkg-format'
old head: d1f1dd4262029d3e4e699c3a4e7e0f7a94d0b359
new head: 4d54b5c51dd50ae2e135a11652122aa942808a10
overview: https://github.com/weinhold/HaikuPM/compare/d1f1dd4...4d54b5c

----------------------------------------------------------------------------

ae85e59: ZlibCompressor: Allow setting the compression level

914c310: Allow specifying the compression level for package creation
  
  * Introduce BPackageWriterParameters which comprises all parameters
    for package creation, currently flags and compression level. Such an
    object can be passed to BPackageWriter::Init() and is passed on to
    PackageWriterImpl and WriterImplBase.
  * PackageFileHeapWriter: Add compressionLevel property and pass the
    value on to ZlibCompressor.
  * package add/create: Add options -0 ... -9 to specify the compression
    level to be used.

4d54b5c: Add HAIKU_PACKAGE_COMPRESSION_LEVEL build variable
  
  It allows to control the compression level used for package creation
  and update. The default (9) is *very* slow, so developers may want to
  use a smaller level during the regular development process to keep
  turn-around times low.

                                    [ Ingo Weinhold <ingo_weinhold@xxxxxx> ]

----------------------------------------------------------------------------

18 files changed, 196 insertions(+), 39 deletions(-)
build/jam/PackageRules                           |  6 +++
build/jam/UserBuildConfig.ReadMe                 | 12 +++++
build/scripts/build_haiku_package                |  7 ++-
headers/os/package/hpkg/HPKGDefs.h               |  7 +++
headers/os/package/hpkg/PackageWriter.h          | 21 +++++++-
.../private/package/hpkg/PackageFileHeapWriter.h |  4 +-
headers/private/package/hpkg/PackageWriterImpl.h |  7 ++-
headers/private/package/hpkg/WriterImplBase.h    |  8 +--
headers/private/package/hpkg/ZlibCompressor.h    |  5 +-
src/bin/package/command_add.cpp                  | 26 +++++++--
src/bin/package/command_create.cpp               | 26 +++++++--
src/bin/package/package.cpp                      |  6 +++
src/kits/package/hpkg/PackageFileHeapWriter.cpp  | 10 ++--
src/kits/package/hpkg/PackageWriter.cpp          | 55 +++++++++++++++++++-
src/kits/package/hpkg/PackageWriterImpl.cpp      | 10 ++--
src/kits/package/hpkg/RepositoryWriterImpl.cpp   |  2 +-
src/kits/package/hpkg/WriterImplBase.cpp         | 14 ++---
src/kits/package/hpkg/ZlibCompressor.cpp         |  9 ++--

############################################################################

Commit:      ae85e594e1d5a7e13914b6ff80df186cc39d222e
Author:      Ingo Weinhold <ingo_weinhold@xxxxxx>
Date:        Sat May 18 23:00:36 2013 UTC

ZlibCompressor: Allow setting the compression level

----------------------------------------------------------------------------

diff --git a/headers/private/package/hpkg/ZlibCompressor.h 
b/headers/private/package/hpkg/ZlibCompressor.h
index d29abdd..4f6dd14 100644
--- a/headers/private/package/hpkg/ZlibCompressor.h
+++ b/headers/private/package/hpkg/ZlibCompressor.h
@@ -27,14 +27,15 @@ public:
                                                                
ZlibCompressor(BDataOutput* output);
                                                                
~ZlibCompressor();
 
-                       status_t                        Init();
+                       status_t                        Init(int 
compressionLevel = Z_BEST_COMPRESSION);
                        status_t                        CompressNext(const 
void* input,
                                                                        size_t 
inputSize);
                        status_t                        Finish();
 
        static  status_t                        CompressSingleBuffer(const 
void* input,
                                                                        size_t 
inputSize, void* output,
-                                                                       size_t 
outputSize, size_t& _compressedSize);
+                                                                       size_t 
outputSize, size_t& _compressedSize,
+                                                                       int 
compressionLevel = Z_BEST_COMPRESSION);
 
 private:
                        z_stream                        fStream;
diff --git a/src/kits/package/hpkg/ZlibCompressor.cpp 
b/src/kits/package/hpkg/ZlibCompressor.cpp
index 17801b4..ed4219d 100644
--- a/src/kits/package/hpkg/ZlibCompressor.cpp
+++ b/src/kits/package/hpkg/ZlibCompressor.cpp
@@ -38,7 +38,7 @@ ZlibCompressor::~ZlibCompressor()
 
 
 status_t
-ZlibCompressor::Init()
+ZlibCompressor::Init(int compressionLevel)
 {
        // initialize the stream
        fStream.next_in = NULL;
@@ -56,7 +56,7 @@ ZlibCompressor::Init()
        fStream.adler = 0;
        fStream.reserved = 0;
 
-       int zlibError = deflateInit(&fStream, Z_BEST_COMPRESSION);
+       int zlibError = deflateInit(&fStream, compressionLevel);
        if (zlibError != Z_OK)
                return TranslateZlibError(zlibError);
 
@@ -128,7 +128,8 @@ ZlibCompressor::Finish()
 
 /*static*/ status_t
 ZlibCompressor::CompressSingleBuffer(const void* input, size_t inputSize,
-       void* output, size_t outputSize, size_t& _compressedSize)
+       void* output, size_t outputSize, size_t& _compressedSize,
+       int compressionLevel)
 {
        if (inputSize == 0 || outputSize == 0)
                return B_BAD_VALUE;
@@ -151,7 +152,7 @@ ZlibCompressor::CompressSingleBuffer(const void* input, 
size_t inputSize,
                0                                                       // 
reserved
        };
 
-       int zlibError = deflateInit(&zStream, Z_BEST_COMPRESSION);
+       int zlibError = deflateInit(&zStream, compressionLevel);
        if (zlibError != Z_OK)
                return TranslateZlibError(zlibError);
 

############################################################################

Commit:      914c310717a2e36b194d8b2c95aa380c50bbd20c
Author:      Ingo Weinhold <ingo_weinhold@xxxxxx>
Date:        Sat May 18 23:07:08 2013 UTC

Allow specifying the compression level for package creation

* Introduce BPackageWriterParameters which comprises all parameters
  for package creation, currently flags and compression level. Such an
  object can be passed to BPackageWriter::Init() and is passed on to
  PackageWriterImpl and WriterImplBase.
* PackageFileHeapWriter: Add compressionLevel property and pass the
  value on to ZlibCompressor.
* package add/create: Add options -0 ... -9 to specify the compression
  level to be used.

----------------------------------------------------------------------------

diff --git a/headers/os/package/hpkg/HPKGDefs.h 
b/headers/os/package/hpkg/HPKGDefs.h
index 7cd931b..b11a788 100644
--- a/headers/os/package/hpkg/HPKGDefs.h
+++ b/headers/os/package/hpkg/HPKGDefs.h
@@ -166,6 +166,13 @@ enum {
 };
 
 
+enum {
+       B_HPKG_COMPRESSION_LEVEL_NONE           = 0,
+       B_HPKG_COMPRESSION_LEVEL_FASTEST        = 1,
+       B_HPKG_COMPRESSION_LEVEL_BEST           = 9
+};
+
+
 }      // namespace BHPKG
 
 }      // namespace BPackageKit
diff --git a/headers/os/package/hpkg/PackageWriter.h 
b/headers/os/package/hpkg/PackageWriter.h
index e3eb30d..99c924b 100644
--- a/headers/os/package/hpkg/PackageWriter.h
+++ b/headers/os/package/hpkg/PackageWriter.h
@@ -41,13 +41,32 @@ public:
 };
 
 
+class BPackageWriterParameters {
+public:
+                                                               
BPackageWriterParameters();
+                                                               
~BPackageWriterParameters();
+
+                       uint32                          Flags() const;
+                       void                            SetFlags(uint32 flags);
+
+                       int32                           CompressionLevel() 
const;
+                       void                            
SetCompressionLevel(int32 compressionLevel);
+
+private:
+                       uint32                          fFlags;
+                       int32                           fCompressionLevel;
+};
+
+
 class BPackageWriter {
 public:
                                                                BPackageWriter(
                                                                        
BPackageWriterListener* listener);
                                                                
~BPackageWriter();
 
-                       status_t                        Init(const char* 
fileName, uint32 flags = 0);
+                       status_t                        Init(const char* 
fileName,
+                                                                       const 
BPackageWriterParameters* parameters
+                                                                               
= NULL);
                        status_t                        SetInstallPath(const 
char* installPath);
                        void                            SetCheckLicenses(bool 
checkLicenses);
                        status_t                        AddEntry(const char* 
fileName, int fd = -1);
diff --git a/headers/private/package/hpkg/PackageFileHeapWriter.h 
b/headers/private/package/hpkg/PackageFileHeapWriter.h
index 3b4d24e..d62f82e 100644
--- a/headers/private/package/hpkg/PackageFileHeapWriter.h
+++ b/headers/private/package/hpkg/PackageFileHeapWriter.h
@@ -35,7 +35,8 @@ class PackageFileHeapWriter : public 
PackageFileHeapAccessorBase,
        private AbstractDataWriter {
 public:
                                                                
PackageFileHeapWriter(BErrorOutput* errorOutput,
-                                                                       int fd, 
off_t heapOffset);
+                                                                       int fd, 
off_t heapOffset,
+                                                                       int32 
compressionLevel);
                                                                
~PackageFileHeapWriter();
 
                        void                            Init();
@@ -86,6 +87,7 @@ private:
                        void*                           fCompressedDataBuffer;
                        size_t                          fPendingDataSize;
                        Array<uint64>           fOffsets;
+                       int32                           fCompressionLevel;
 };
 
 
diff --git a/headers/private/package/hpkg/PackageWriterImpl.h 
b/headers/private/package/hpkg/PackageWriterImpl.h
index 306f5cc..c9499c8 100644
--- a/headers/private/package/hpkg/PackageWriterImpl.h
+++ b/headers/private/package/hpkg/PackageWriterImpl.h
@@ -29,6 +29,7 @@ namespace BHPKG {
 
 class BDataReader;
 class BErrorOutput;
+class BPackageWriterParameters;
 
 
 namespace BPrivate {
@@ -46,7 +47,8 @@ public:
                                                                        
BPackageWriterListener* listener);
                                                                
~PackageWriterImpl();
 
-                       status_t                        Init(const char* 
fileName, uint32 flags);
+                       status_t                        Init(const char* 
fileName,
+                                                                       const 
BPackageWriterParameters& parameters);
                        status_t                        SetInstallPath(const 
char* installPath);
                        void                            SetCheckLicenses(bool 
checkLicenses);
                        status_t                        AddEntry(const char* 
fileName, int fd = -1);
@@ -62,7 +64,8 @@ private:
                        typedef DoublyLinkedList<Entry> EntryList;
 
 private:
-                       status_t                        _Init(const char* 
fileName, uint32 flags);
+                       status_t                        _Init(const char* 
fileName,
+                                                                       const 
BPackageWriterParameters& parameters);
                        status_t                        _Finish();
 
                        status_t                        _RegisterEntry(const 
char* fileName, int fd);
diff --git a/headers/private/package/hpkg/WriterImplBase.h 
b/headers/private/package/hpkg/WriterImplBase.h
index 0965bcf..c45d850 100644
--- a/headers/private/package/hpkg/WriterImplBase.h
+++ b/headers/private/package/hpkg/WriterImplBase.h
@@ -12,6 +12,7 @@
 
 #include <package/hpkg/DataOutput.h>
 #include <package/hpkg/DataWriters.h>
+#include <package/hpkg/PackageWriter.h>
 #include <package/hpkg/Strings.h>
 #include <package/hpkg/ZlibCompressor.h>
 
@@ -99,7 +100,8 @@ protected:
                        typedef DoublyLinkedList<PackageAttribute> 
PackageAttributeList;
 
 protected:
-                       status_t                        Init(const char* 
fileName, uint32 flags);
+                       status_t                        Init(const char* 
fileName,
+                                                                       const 
BPackageWriterParameters& parameters);
 
                        void                            RegisterPackageInfo(
                                                                        
PackageAttributeList& attributeList,
@@ -168,7 +170,7 @@ private:
                        const char*                     fFileType;
                        BErrorOutput*           fErrorOutput;
                        const char*                     fFileName;
-                       uint32                          fFlags;
+                       BPackageWriterParameters fParameters;
                        int                                     fFD;
                        bool                            fFinished;
 
@@ -211,7 +213,7 @@ WriterImplBase::FD() const
 inline uint32
 WriterImplBase::Flags() const
 {
-       return fFlags;
+       return fParameters.Flags();
 }
 
 
diff --git a/src/bin/package/command_add.cpp b/src/bin/package/command_add.cpp
index 601624c..4759244 100644
--- a/src/bin/package/command_add.cpp
+++ b/src/bin/package/command_add.cpp
@@ -35,6 +35,7 @@ command_add(int argc, const char* const* argv)
        bool quiet = false;
        bool verbose = false;
        bool force = false;
+       int32 compressionLevel = 
BPackageKit::BHPKG::B_HPKG_COMPRESSION_LEVEL_BEST;
 
        while (true) {
                static struct option sLongOptions[] = {
@@ -45,12 +46,25 @@ command_add(int argc, const char* const* argv)
                };
 
                opterr = 0; // don't print errors
-               int c = getopt_long(argc, (char**)argv, "+C:fhi:qv", 
sLongOptions,
-                       NULL);
+               int c = getopt_long(argc, (char**)argv, "+0123456789C:fhi:qv",
+                       sLongOptions, NULL);
                if (c == -1)
                        break;
 
                switch (c) {
+                       case '0':
+                       case '1':
+                       case '2':
+                       case '3':
+                       case '4':
+                       case '5':
+                       case '6':
+                       case '7':
+                       case '8':
+                       case '9':
+                               compressionLevel = c - '0';
+                               break;
+
                        case 'C':
                                changeToDirectory = optarg;
                                break;
@@ -96,10 +110,14 @@ command_add(int argc, const char* const* argv)
        int entriesToAddCount = argc - optind;
 
        // create package
+       BPackageWriterParameters writerParameters;
+       writerParameters.SetFlags(
+               B_HPKG_WRITER_UPDATE_PACKAGE | (force ? B_HPKG_WRITER_FORCE_ADD 
: 0));
+       writerParameters.SetCompressionLevel(compressionLevel);
+
        PackageWriterListener listener(verbose, quiet);
        BPackageWriter packageWriter(&listener);
-       status_t result = packageWriter.Init(packageFileName,
-               B_HPKG_WRITER_UPDATE_PACKAGE | (force ? B_HPKG_WRITER_FORCE_ADD 
: 0));
+       status_t result = packageWriter.Init(packageFileName, 
&writerParameters);
        if (result != B_OK)
                return 1;
 
diff --git a/src/bin/package/command_create.cpp 
b/src/bin/package/command_create.cpp
index 2e9d027..b3777dd 100644
--- a/src/bin/package/command_create.cpp
+++ b/src/bin/package/command_create.cpp
@@ -24,8 +24,9 @@
 #include "PackageWritingUtils.h"
 
 
-using BPackageKit::BHPKG::BPackageWriterListener;
 using BPackageKit::BHPKG::BPackageWriter;
+using BPackageKit::BHPKG::BPackageWriterListener;
+using BPackageKit::BHPKG::BPackageWriterParameters;
 
 
 int
@@ -37,6 +38,7 @@ command_create(int argc, const char* const* argv)
        bool isBuildPackage = false;
        bool quiet = false;
        bool verbose = false;
+       int32 compressionLevel = 
BPackageKit::BHPKG::B_HPKG_COMPRESSION_LEVEL_BEST;
 
        while (true) {
                static struct option sLongOptions[] = {
@@ -47,12 +49,25 @@ command_create(int argc, const char* const* argv)
                };
 
                opterr = 0; // don't print errors
-               int c = getopt_long(argc, (char**)argv, "+bC:hi:I:qv", 
sLongOptions,
-                       NULL);
+               int c = getopt_long(argc, (char**)argv, "+b0123456789C:hi:I:qv",
+                       sLongOptions, NULL);
                if (c == -1)
                        break;
 
                switch (c) {
+                       case '0':
+                       case '1':
+                       case '2':
+                       case '3':
+                       case '4':
+                       case '5':
+                       case '6':
+                       case '7':
+                       case '8':
+                       case '9':
+                               compressionLevel = c - '0';
+                               break;
+
                        case 'b':
                                isBuildPackage = true;
                                break;
@@ -101,9 +116,12 @@ command_create(int argc, const char* const* argv)
        }
 
        // create package
+       BPackageWriterParameters writerParameters;
+       writerParameters.SetCompressionLevel(compressionLevel);
+
        PackageWriterListener listener(verbose, quiet);
        BPackageWriter packageWriter(&listener);
-       status_t result = packageWriter.Init(packageFileName);
+       status_t result = packageWriter.Init(packageFileName, 
&writerParameters);
        if (result != B_OK)
                return 1;
 
diff --git a/src/bin/package/package.cpp b/src/bin/package/package.cpp
index d7bbe3a..240517b 100644
--- a/src/bin/package/package.cpp
+++ b/src/bin/package/package.cpp
@@ -26,6 +26,9 @@ static const char* kUsage =
        "  add [ <options> ] <package> <entries>...\n"
        "    Adds the specified entries <entries> to package file <package>.\n"
        "\n"
+       "    -0 ... -9  - Use compression level 0 ... 9. 0 means no, 9 best "
+               "compression.\n"
+       "                 Defaults to 9.\n"
        "    -C <dir>   - Change to directory <dir> before adding entries.\n"
        "    -f         - Force adding, replacing already existing entries. "
                "Without\n"
@@ -41,6 +44,9 @@ static const char* kUsage =
        "  create [ <options> ] <package>\n"
        "    Creates package file <package> from contents of current 
directory.\n"
        "\n"
+       "    -0 ... -9  - Use compression level 0 ... 9. 0 means no, 9 best "
+               "compression.\n"
+       "                 Defaults to 9.\n"
        "    -b         - Create an empty build package. Only the .PackageInfo "
                "will\n"
        "                 be added.\n"
diff --git a/src/kits/package/hpkg/PackageFileHeapWriter.cpp 
b/src/kits/package/hpkg/PackageFileHeapWriter.cpp
index d7fc523..1ca2fe7 100644
--- a/src/kits/package/hpkg/PackageFileHeapWriter.cpp
+++ b/src/kits/package/hpkg/PackageFileHeapWriter.cpp
@@ -210,13 +210,14 @@ private:
 
 
 PackageFileHeapWriter::PackageFileHeapWriter(BErrorOutput* errorOutput, int fd,
-       off_t heapOffset)
+       off_t heapOffset, int32 compressionLevel)
        :
        PackageFileHeapAccessorBase(errorOutput, fd, heapOffset),
        fPendingDataBuffer(NULL),
        fCompressedDataBuffer(NULL),
        fPendingDataSize(0),
-       fOffsets()
+       fOffsets(),
+       fCompressionLevel(compressionLevel)
 {
 }
 
@@ -566,9 +567,12 @@ PackageFileHeapWriter::_WriteChunk(const void* data, 
size_t size,
 status_t
 PackageFileHeapWriter::_WriteDataCompressed(const void* data, size_t size)
 {
+       if (fCompressionLevel == B_HPKG_COMPRESSION_LEVEL_NONE)
+               return B_BUFFER_OVERFLOW;
+
        size_t compressedSize;
        status_t error = ZlibCompressor::CompressSingleBuffer(data, size,
-               fCompressedDataBuffer, size, compressedSize);
+               fCompressedDataBuffer, size, compressedSize, fCompressionLevel);
        if (error != B_OK)
                return error;
 
diff --git a/src/kits/package/hpkg/PackageWriter.cpp 
b/src/kits/package/hpkg/PackageWriter.cpp
index 3fcbec8..2a5582e 100644
--- a/src/kits/package/hpkg/PackageWriter.cpp
+++ b/src/kits/package/hpkg/PackageWriter.cpp
@@ -16,6 +16,53 @@ namespace BPackageKit {
 namespace BHPKG {
 
 
+// #pragma mark - BPackageWriterParameters
+
+
+BPackageWriterParameters::BPackageWriterParameters()
+       :
+       fFlags(0),
+       fCompressionLevel(B_HPKG_COMPRESSION_LEVEL_BEST)
+{
+}
+
+
+BPackageWriterParameters::~BPackageWriterParameters()
+{
+}
+
+
+uint32
+BPackageWriterParameters::Flags() const
+{
+       return fFlags;
+}
+
+
+void
+BPackageWriterParameters::SetFlags(uint32 flags)
+{
+       fFlags = flags;
+}
+
+
+int32
+BPackageWriterParameters::CompressionLevel() const
+{
+       return fCompressionLevel;
+}
+
+
+void
+BPackageWriterParameters::SetCompressionLevel(int32 compressionLevel)
+{
+       fCompressionLevel = compressionLevel;
+}
+
+
+// #pragma mark - BPackageWriter
+
+
 BPackageWriter::BPackageWriter(BPackageWriterListener* listener)
        :
        fImpl(new (std::nothrow) PackageWriterImpl(listener))
@@ -30,12 +77,16 @@ BPackageWriter::~BPackageWriter()
 
 
 status_t
-BPackageWriter::Init(const char* fileName, uint32 flags)
+BPackageWriter::Init(const char* fileName,
+       const BPackageWriterParameters* parameters)
 {
        if (fImpl == NULL)
                return B_NO_MEMORY;
 
-       return fImpl->Init(fileName, flags);
+       BPackageWriterParameters defaultParameters;
+
+       return fImpl->Init(fileName,
+               parameters != NULL ? *parameters : defaultParameters);
 }
 
 
diff --git a/src/kits/package/hpkg/PackageWriterImpl.cpp 
b/src/kits/package/hpkg/PackageWriterImpl.cpp
index fc407ea..11813db 100644
--- a/src/kits/package/hpkg/PackageWriterImpl.cpp
+++ b/src/kits/package/hpkg/PackageWriterImpl.cpp
@@ -463,10 +463,11 @@ PackageWriterImpl::~PackageWriterImpl()
 
 
 status_t
-PackageWriterImpl::Init(const char* fileName, uint32 flags)
+PackageWriterImpl::Init(const char* fileName,
+       const BPackageWriterParameters& parameters)
 {
        try {
-               return _Init(fileName, flags);
+               return _Init(fileName, parameters);
        } catch (status_t error) {
                return error;
        } catch (std::bad_alloc) {
@@ -602,9 +603,10 @@ PackageWriterImpl::Finish()
 
 
 status_t
-PackageWriterImpl::_Init(const char* fileName, uint32 flags)
+PackageWriterImpl::_Init(const char* fileName,
+       const BPackageWriterParameters& parameters)
 {
-       status_t result = inherited::Init(fileName, flags);
+       status_t result = inherited::Init(fileName, parameters);
        if (result != B_OK)
                return result;
 
diff --git a/src/kits/package/hpkg/RepositoryWriterImpl.cpp 
b/src/kits/package/hpkg/RepositoryWriterImpl.cpp
index c8ceb33..ec9cf99 100644
--- a/src/kits/package/hpkg/RepositoryWriterImpl.cpp
+++ b/src/kits/package/hpkg/RepositoryWriterImpl.cpp
@@ -250,7 +250,7 @@ RepositoryWriterImpl::Finish()
 status_t
 RepositoryWriterImpl::_Init(const char* fileName)
 {
-       return inherited::Init(fileName, 0);
+       return inherited::Init(fileName, BPackageWriterParameters());
 }
 
 
diff --git a/src/kits/package/hpkg/WriterImplBase.cpp 
b/src/kits/package/hpkg/WriterImplBase.cpp
index 88d9d9b..0e3e6aa 100644
--- a/src/kits/package/hpkg/WriterImplBase.cpp
+++ b/src/kits/package/hpkg/WriterImplBase.cpp
@@ -220,7 +220,7 @@ WriterImplBase::WriterImplBase(const char* fileType, 
BErrorOutput* errorOutput)
        fFileType(fileType),
        fErrorOutput(errorOutput),
        fFileName(NULL),
-       fFlags(0),
+       fParameters(),
        fFD(-1),
        fFinished(false),
        fDataWriter(NULL)
@@ -236,21 +236,24 @@ WriterImplBase::~WriterImplBase()
                close(fFD);
 
        if (!fFinished && fFileName != NULL
-               && (fFlags & B_HPKG_WRITER_UPDATE_PACKAGE) == 0) {
+               && (Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) == 0) {
                unlink(fFileName);
        }
 }
 
 
 status_t
-WriterImplBase::Init(const char* fileName, uint32 flags)
+WriterImplBase::Init(const char* fileName,
+       const BPackageWriterParameters& parameters)
 {
+       fParameters = parameters;
+
        if (fPackageStringCache.Init() != B_OK)
                throw std::bad_alloc();
 
        // open file (don't truncate in update mode)
        int openMode = O_RDWR;
-       if ((flags & B_HPKG_WRITER_UPDATE_PACKAGE) == 0)
+       if ((Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) == 0)
                openMode |= O_CREAT | O_TRUNC;
 
        fFD = open(fileName, openMode, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
@@ -261,11 +264,10 @@ WriterImplBase::Init(const char* fileName, uint32 flags)
        }
 
        fFileName = fileName;
-       fFlags = flags;
 
        // create heap writer
        fHeapWriter = new PackageFileHeapWriter(fErrorOutput, FD(),
-               sizeof(hpkg_header));
+               sizeof(hpkg_header), fParameters.CompressionLevel());
        fHeapWriter->Init();
        fDataWriter = fHeapWriter->DataWriter();
 

############################################################################

Commit:      4d54b5c51dd50ae2e135a11652122aa942808a10
Author:      Ingo Weinhold <ingo_weinhold@xxxxxx>
Date:        Sat May 18 23:48:53 2013 UTC

Add HAIKU_PACKAGE_COMPRESSION_LEVEL build variable

It allows to control the compression level used for package creation
and update. The default (9) is *very* slow, so developers may want to
use a smaller level during the regular development process to keep
turn-around times low.

----------------------------------------------------------------------------

diff --git a/build/jam/PackageRules b/build/jam/PackageRules
index 9502174..602cef0 100644
--- a/build/jam/PackageRules
+++ b/build/jam/PackageRules
@@ -310,6 +310,8 @@ rule BuildHaikuPackage package : packageInfo
        AddVariableToScript $(script) : tmpDir : $(tempDir) ;
        AddVariableToScript $(script) : addBuildCompatibilityLibDir
                : $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ;
+       AddVariableToScript $(script) : compressionLevel
+               : $(HAIKU_PACKAGE_COMPRESSION_LEVEL) ;
        AddVariableToScript $(script) : updateOnly
                : [ on $(package) return $(HAIKU_CONTAINER_UPDATE_ONLY) ] ;
        AddTargetVariableToScript $(script) : <build>addattr ;
@@ -434,3 +436,7 @@ rule AddLibrariesToPackage directory : libs
        AddLibrariesToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE)
                : $(directory) : $(libs) ;
 }
+
+
+# default value for the package compression level
+HAIKU_PACKAGE_COMPRESSION_LEVEL ?= 9 ;
diff --git a/build/jam/UserBuildConfig.ReadMe b/build/jam/UserBuildConfig.ReadMe
index 53ff677..2252fd9 100644
--- a/build/jam/UserBuildConfig.ReadMe
+++ b/build/jam/UserBuildConfig.ReadMe
@@ -79,6 +79,18 @@ HAIKU_INSTALL_DIR = /Haiku ;
 # freshly be initialized with BFS. Useful when installing Haiku on a partition.
 HAIKU_DONT_CLEAR_IMAGE = 1 ;
 
+# Set the compression level for the creation and update of Haiku packages to 1.
+# Values from 0 to 9 are supported. 0 means no compression, 1 fastest, ..., and
+# 9 best. The default is 9 which should be used for official builds (release or
+# nightly) to achieve the smallest possible package files at the cost of long
+# package building times. For developers who frequently rebuild/update packages
+# level 1 is a good compromise. Depending on the package data it's about an
+# order of magnitude faster while still achieving acceptable compression 
ratios.
+# Using level 0 will make package creation mostly I/O bound. It can be used, if
+# package size is not a concern. Depending on the package data, files may be
+# several times larger than even with level 1.
+HAIKU_PACKAGE_COMPRESSION_LEVEL = 1 ;
+
 
 # Affects the haiku-image, haiku-vmware-image, and install-haiku targets. Only
 # targets on which the HAIKU_INCLUDE_IN_IMAGE variable has been set will be
diff --git a/build/scripts/build_haiku_package 
b/build/scripts/build_haiku_package
index b2e091f..736d94c 100755
--- a/build/scripts/build_haiku_package
+++ b/build/scripts/build_haiku_package
@@ -7,6 +7,7 @@ set -o errexit
 # outputDir
 # sourceDir
 # tmpDir
+# compressionLevel
 # updateOnly
 #
 # addattr
@@ -69,7 +70,9 @@ $mimeset --mimedb "$mimeDB" "$contentsDir"
 # create the package
 if [ ! $updateOnly ]; then
        rm -f "$packagePath"
-       $package create -q -i "$packageInfoPath" -C "$contentsDir" 
"$packagePath"
+       $package create -q "-$compressionLevel" -i "$packageInfoPath" \
+               -C "$contentsDir" "$packagePath"
 else
-       $package add -q -f -i "$packageInfoPath" -C "$contentsDir" 
"$packagePath" .
+       $package add -q -f "-$compressionLevel" -i "$packageInfoPath" \
+               -C "$contentsDir" "$packagePath" .
 fi


Other related posts:

  • » [haiku-commits] BRANCH weinhold-github.new-hpkg-format [4d54b5c] src/kits/package/hpkg src/bin/package headers/private/package/hpkg build/jam headers/os/package/hpkg - weinhold-github . new-hpkg-format