Hello community,
here is the log from the commit of package deltarpm for openSUSE:Factory checked in at 2019-07-13 13:33:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/deltarpm (Old)
and /work/SRC/openSUSE:Factory/.deltarpm.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "deltarpm"
Sat Jul 13 13:33:57 2019 rev:30 rq:712123 version:3.6.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/deltarpm/deltarpm.changes 2018-01-16 09:30:45.166310508 +0100
+++ /work/SRC/openSUSE:Factory/.deltarpm.new.4615/deltarpm.changes 2019-07-13 13:34:00.023342155 +0200
@@ -1,0 +2,11 @@
+Sat Jun 22 05:53:28 UTC 2019 - Neal Gompa
+
+- Actually enable zstd compression
+
+-------------------------------------------------------------------
+Thu Jun 13 16:45:13 CEST 2019 - mls@suse.de
+
+- update to deltarpm-3.6.2
+ * support for zstd compression
+
+-------------------------------------------------------------------
Old:
----
deltarpm-3.6.1.tar.bz2
New:
----
deltarpm-3.6.2.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ deltarpm.spec ++++++
--- /var/tmp/diff_new_pack.2v91BI/_old 2019-07-13 13:34:00.895341924 +0200
+++ /var/tmp/diff_new_pack.2v91BI/_new 2019-07-13 13:34:00.899341923 +0200
@@ -1,7 +1,7 @@
#
# spec file for package deltarpm
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -21,13 +21,13 @@
# we need to build against recent rpm, so avoid the new payload
%define _binary_payload w9.bzdio
Name: deltarpm
-Version: 3.6.1
+Version: 3.6.2
Release: 0
Summary: Tools to Create and Apply deltarpms
License: BSD-3-Clause
Group: System/Packages
Url: https://github.com/rpm-software-management/deltarpm/
-Source: deltarpm-3.6.1.tar.bz2
+Source: deltarpm-3.6.2.tar.bz2
BuildRequires: libbz2-devel
%if %{with python2}
BuildRequires: python2-devel
@@ -37,6 +37,7 @@
%endif
BuildRequires: rpm-devel
BuildRequires: xz-devel
+BuildRequires: pkgconfig(libzstd)
%description
This package contains tools to create and apply deltarpms. A deltarpm
@@ -68,7 +69,7 @@
%setup -q
%build
-make CC="gcc" CFLAGS="%{optflags}" rpmdumpheader="%{_prefix}/lib/rpm/rpmdumpheader" %{?_smp_mflags} all python
+make CC="gcc" CFLAGS="%{optflags} -DWITH_ZSTD=1" rpmdumpheader="%{_prefix}/lib/rpm/rpmdumpheader" %{?_smp_mflags} all python
%install
PYS=""
++++++ deltarpm-3.6.1.tar.bz2 -> deltarpm-3.6.2.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/Makefile new/deltarpm-3.6.2/Makefile
--- old/deltarpm-3.6.1/Makefile 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/Makefile 2019-06-13 15:28:26.000000000 +0200
@@ -8,9 +8,9 @@
zlibldflags=$(zlibbundled)
zlibcppflags=-I$(zlibdir)
pylibprefix=/
-CFLAGS = -fPIC -O2 -Wall -g
+CFLAGS = -fPIC -O2 -Wall -g -DWITH_ZSTD=1
CPPFLAGS = -fPIC -DDELTARPM_64BIT -DBSDIFF_NO_SUF -DRPMDUMPHEADER=\"$(rpmdumpheader)\" $(zlibcppflags)
-LDLIBS = -lbz2 $(zlibldflags) -llzma
+LDLIBS = -lbz2 $(zlibldflags) -llzma -lzstd
LDFLAGS =
PYTHONS = python python3
@@ -18,6 +18,10 @@
python: _deltarpmmodule.so
+perl:
+ cd perl; perl Makefile.PL
+ @make -C perl
+
makedeltarpm: makedeltarpm.o writedeltarpm.o md5.o util.o rpml.o rpmhead.o cpio.o delta.o cfile.o $(zlibbundled)
applydeltarpm: applydeltarpm.o readdeltarpm.o md5.o sha256.o util.o rpmhead.o cpio.o cfile.o prelink.o $(zlibbundled)
@@ -84,7 +88,7 @@
fi; \
done
-.PHONY: clean install
+.PHONY: clean install perl
makedeltarpm.o: makedeltarpm.c deltarpm.h util.h md5.h rpmhead.h delta.h cfile.h
applydeltarpm.o: applydeltarpm.c deltarpm.h util.h md5.h rpmhead.h cpio.h cfile.h prelink.h
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/applydeltaiso.c new/deltarpm-3.6.2/applydeltaiso.c
--- old/deltarpm-3.6.1/applydeltaiso.c 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/applydeltaiso.c 2019-06-13 15:28:26.000000000 +0200
@@ -122,6 +122,7 @@
unsigned char buf[8192];
printf("%s: verbatim copy\n", namebuf);
+ fflush(stdout);
len = cget4(cf);
while (len)
{
@@ -141,9 +142,15 @@
return;
}
if (ctype == 254)
- printf("%s: copying unchanged payload\n", namebuf);
+ {
+ printf("%s: copying unchanged payload\n", namebuf);
+ fflush(stdout);
+ }
else
- printf("%s (%s): applying delta\n", namebuf, cfile_comp2str(ctype));
+ {
+ printf("%s (%s): applying delta\n", namebuf, cfile_comp2str(ctype));
+ fflush(stdout);
+ }
rpmn = cget4(cf);
if (rpmn < 0 || rpmn >= nmpn)
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/applydeltarpm.c new/deltarpm-3.6.2/applydeltarpm.c
--- old/deltarpm-3.6.1/applydeltarpm.c 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/applydeltarpm.c 2019-06-13 15:28:26.000000000 +0200
@@ -1295,6 +1295,8 @@
addblkcomp = CFILE_COMP_LZMA;
else if (d.addblklen > 6 && (d.addblk[0] == 0xfd && d.addblk[1] == '7' && d.addblk[2] == 'z' && d.addblk[3] == 'X' && d.addblk[4] == 'Z'))
addblkcomp = CFILE_COMP_XZ;
+ else if (d.addblklen > 4 && (d.addblk[0] & 0xf0) == 0x20 &&d.addblk[1] == 0xb5 && d.addblk[2] == 0x2f && d.addblk[3] == 0xfd)
+ addblkcomp = CFILE_COMP_ZSTD;
if (info)
{
unsigned int *size;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/cfile.c new/deltarpm-3.6.2/cfile.c
--- old/deltarpm-3.6.1/cfile.c 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/cfile.c 2019-06-13 15:28:26.000000000 +0200
@@ -11,10 +11,6 @@
#include
#include
-#include
-#include
-#include
-
#include "cfile.h"
/*****************************************************************
@@ -818,6 +814,162 @@
return cfile_unreadbuf(f, buf, len, 0);
}
+#ifdef WITH_ZSTD
+/*****************************************************************
+ * zstd io
+ */
+
+static struct cfile *
+cropen_zstd(struct cfile *f)
+{
+ f->strm.zstd_d = ZSTD_createDStream();
+ if (ZSTD_isError(ZSTD_initDStream(f->strm.zstd_d)))
+ {
+ free(f);
+ return 0;
+ }
+ f->zstd_in.src = f->buf;
+ f->zstd_in.pos = 0;
+ f->zstd_in.size = f->bufN == -1 ? 0 : f->bufN;
+ f->eof = 0;
+ return f;
+}
+
+static int
+crread_zstd(struct cfile *f, void *buf, int len)
+{
+ int used, eof = 0;
+ size_t ret = 0;
+ if (f->eof)
+ return 0;
+ f->zstd_out.size = len;
+ f->zstd_out.dst = buf;
+ f->zstd_out.pos = 0;
+ for (;;)
+ {
+ if (!eof && f->zstd_in.pos == f->zstd_in.size && f->bufN)
+ {
+ if (cfile_readbuf(f, f->buf, sizeof(f->buf)) == -1)
+ return -1;
+ f->zstd_in.pos = 0;
+ f->zstd_in.size = f->bufN;
+ if (!f->bufN)
+ eof = 1;
+ }
+ used = f->zstd_in.pos;
+ if (ret || !eof)
+ ret = ZSTD_decompressStream(f->strm.zstd_d, &f->zstd_out, &f->zstd_in);
+ used = f->zstd_in.pos - used;
+ if (used && f->ctxup)
+ f->ctxup(f->ctx, (unsigned char *)(f->zstd_in.src + f->zstd_in.pos - used), used);
+ f->bytes += used;
+ if (ret == 0 && eof)
+ {
+ f->eof = 1;
+ return f->zstd_out.pos;
+ }
+ if (ZSTD_isError(ret))
+ return -1;
+ if (f->zstd_out.pos == len)
+ return len;
+ }
+}
+
+static int
+crclose_zstd(struct cfile *f)
+{
+ int r;
+ ZSTD_freeDStream(f->strm.zstd_d);
+ if (f->fd == CFILE_IO_CFILE && f->zstd_in.pos < f->zstd_in.size)
+ {
+ struct cfile *cf = (struct cfile *)f->fp;
+ if (cf->unread(cf, (void *)f->zstd_in.src + f->zstd_in.pos, f->zstd_in.size - f->zstd_in.pos) != -1)
+ f->zstd_in.pos = f->zstd_in.size;
+ }
+ r = (f->len != CFILE_LEN_UNLIMITED ? f->len : 0) + (f->zstd_in.size - f->zstd_in.pos);
+ if (f->unreadbuf != f->buf)
+ free(f->unreadbuf);
+ free(f);
+ return r;
+}
+
+static struct cfile *
+cwopen_zstd(struct cfile *f)
+{
+ f->strm.zstd_c = ZSTD_createCStream();
+ if (!f->strm.zstd_c)
+ {
+ free(f);
+ return 0;
+ }
+ if (!f->level)
+ f->level = 3;
+ if (ZSTD_isError(ZSTD_initCStream(f->strm.zstd_c, f->level)))
+ {
+ ZSTD_freeCStream(f->strm.zstd_c);
+ free(f);
+ return 0;
+ }
+ f->zstd_out.dst = f->buf;
+ f->zstd_out.pos = 0;
+ f->zstd_out.size = sizeof(f->buf);
+ return f;
+}
+
+static int
+cwclose_zstd(struct cfile *f)
+{
+ int bytes;
+ for (;;)
+ {
+ size_t ret;
+ f->zstd_out.pos = 0;
+ ret = ZSTD_endStream(f->strm.zstd_c, &f->zstd_out);
+ if (ZSTD_isError(ret))
+ return -1;
+ if (f->zstd_out.pos && cfile_writebuf(f, f->buf, f->zstd_out.pos) != f->zstd_out.pos)
+ return -1;
+ if (ret == 0)
+ break;
+ }
+ ZSTD_freeCStream(f->strm.zstd_c);
+ if (f->fd == CFILE_IO_ALLOC)
+ cwclose_fixupalloc(f);
+ bytes = f->bytes;
+ free(f);
+ return bytes;
+}
+
+static int
+cwwrite_zstd(struct cfile *f, void *buf, int len)
+{
+ if (len <= 0)
+ return len < 0 ? -1 : 0;
+ f->zstd_in.src = buf;
+ f->zstd_in.pos = 0;
+ f->zstd_in.size = len;
+ for (;;)
+ {
+ size_t ret;
+ f->zstd_out.pos = 0;
+ ret = ZSTD_compressStream(f->strm.zstd_c, &f->zstd_out, &f->zstd_in);
+ if (ZSTD_isError(ret))
+ return -1;
+ if (f->zstd_out.pos)
+ if (cfile_writebuf(f, f->buf, f->zstd_out.pos) != f->zstd_out.pos)
+ return -1;
+ if (f->zstd_in.pos == len)
+ return len;
+ }
+}
+
+static int
+crunread_zstd(struct cfile *f, void *buf, int len)
+{
+ return cfile_unreadbuf(f, buf, len, 0);
+}
+#endif
+
/*****************************************************************
* uncompressed io
*/
@@ -1118,7 +1270,7 @@
fp = f->fp;
}
else
- f = malloc(sizeof(*f));
+ f = calloc(1, sizeof(*f));
if (!f)
return 0;
f->fd = fd;
@@ -1157,6 +1309,8 @@
comp = CFILE_COMP_LZMA;
else if (f->buf[0] == 0xfd && f->buf[1] == '7' && f->buf[2] == 'z' && f->buf[3] == 'X' && f->buf[4] == 'Z')
comp = CFILE_COMP_XZ;
+ else if ((f->buf[0] & 0xf0) == 0x20 && f->buf[1] == 0xb5 && f->buf[2] == 0x2f && f->buf[3] == 0xfd)
+ comp = CFILE_COMP_ZSTD;
}
}
f->comp = CFILE_COMPALGO(comp);
@@ -1204,6 +1358,14 @@
f->write = mode == CFILE_OPEN_WR ? cwwrite_lz : 0;
f->close = mode == CFILE_OPEN_RD ? crclose_lz : cwclose_lz;
return mode == CFILE_OPEN_RD ? cropen_lz(f) : cwopen_xz(f);
+#ifdef WITH_ZSTD
+ case CFILE_COMP_ZSTD:
+ f->read = mode == CFILE_OPEN_RD ? crread_zstd : 0;
+ f->unread = mode == CFILE_OPEN_RD ? crunread_zstd : 0;
+ f->write = mode == CFILE_OPEN_WR ? cwwrite_zstd : 0;
+ f->close = mode == CFILE_OPEN_RD ? crclose_zstd : cwclose_zstd;
+ return mode == CFILE_OPEN_RD ? cropen_zstd(f) : cwopen_zstd(f);
+#endif
default:
free(f);
return 0;
@@ -1269,6 +1431,8 @@
return "lzma";
case CFILE_COMP_XZ:
return "xz";
+ case CFILE_COMP_ZSTD:
+ return "zstd";
}
return "???";
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/cfile.h new/deltarpm-3.6.2/cfile.h
--- old/deltarpm-3.6.1/cfile.h 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/cfile.h 2019-06-13 15:28:26.000000000 +0200
@@ -8,6 +8,9 @@
#include
#include
#include
+#ifdef WITH_ZSTD
+#include
+#endif
struct cfile {
int fd;
@@ -29,7 +32,15 @@
bz_stream bz;
z_stream gz;
lzma_stream lz;
+#ifdef WITH_ZSTD
+ ZSTD_CStream *zstd_c;
+ ZSTD_DStream *zstd_d;
+#endif
} strm;
+#ifdef WITH_ZSTD
+ ZSTD_inBuffer zstd_in;
+ ZSTD_outBuffer zstd_out;
+#endif
int (*read)(struct cfile *f, void *buf, int len);
int (*write)(struct cfile *f, void *buf, int len);
int (*close)(struct cfile *f);
@@ -56,6 +67,7 @@
#define CFILE_COMP_BZ_17 (4)
#define CFILE_COMP_LZMA (5)
#define CFILE_COMP_XZ (6)
+#define CFILE_COMP_ZSTD (7)
#define CFILE_COMP_BZ CFILE_COMP_BZ_20
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/combinedeltarpm.8 new/deltarpm-3.6.2/combinedeltarpm.8
--- old/deltarpm-3.6.1/combinedeltarpm.8 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/combinedeltarpm.8 2019-06-13 15:28:26.000000000 +0200
@@ -19,7 +19,7 @@
.SH DESCRIPTION
combinedeltarpm creates a new deltarpm from multiple old ones.
-Applying the rsulting deltarpm has the same effect as applying
+Applying the resulting deltarpm has the same effect as applying
each of the old ones in the specified order. Use the
.B -v
option to make combinedeltarpm more verbose about its work.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/delta.c new/deltarpm-3.6.2/delta.c
--- old/deltarpm-3.6.1/delta.c 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/delta.c 2019-06-13 15:28:26.000000000 +0200
@@ -429,7 +429,7 @@
{
if ((scsc+lastoffset= 32)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/drpmsync new/deltarpm-3.6.2/drpmsync
--- old/deltarpm-3.6.1/drpmsync 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/drpmsync 2019-06-13 15:28:26.000000000 +0200
@@ -3452,6 +3452,7 @@
my $cmdline_use_filelist;
my $cmdline_norecurse;
my $cmdline_list;
+my $cmdline_no_delete;
my @cmdline_filter;
my @cmdline_filter_arch;
@@ -3564,6 +3565,27 @@
filelist_apply_filter_arch($flp);
}
+sub usage {
+ print "Usage: drpmsync [-c config_file]\n";
+ print " [--repo repository] Path to cache repository\n";
+ print " [--repo-add] add files to cache\n";
+ print " [--repo-validate] check files in cache\n";
+ print " [--norecurse-validate] without recursion\n";
+ print " [--list] non recursive list files only\n";
+ print " [--list-recursive] recursive list files only\n";
+ print " [--get-filelist DIR] retrieve filelist for DIR\n";
+ print " [--filelist-synctree DIR]\n";
+ print " [--use-filelist DIR]\n";
+ print " [--exclude regexp]\n";
+ print " [--include regexp]\n";
+ print " [--exclude-arch regexp]\n";
+ print " [--include-arch regexp]\n";
+ print " [--no-delete] do not delete files not present on the other side\n";
+ print " by default files not present are removed\n";
+ print " [--help] this message\n";
+ print "\n";
+}
+
while (@ARGV) {
last if $ARGV[0] !~ /^-/;
my $opt = shift @ARGV;
@@ -3606,7 +3628,13 @@
} elsif ($opt eq '--include-arch') {
die("--include-arch: argument required\n") unless @ARGV;
push @cmdline_filter_arch, '+'.shift(@ARGV);
+ } elsif ($opt eq '--no-delete') {
+ $cmdline_no_delete = 1;
+ } elsif ($opt eq '--help') {
+ usage();
+ exit(0);
} else {
+ usage();
die("$opt: unknown option\n");
}
}
@@ -3912,17 +3940,19 @@
send_fin();
# part 5
-@files = sort {$a->[0] cmp $b->[0]} values %files;
-for my $file (grep {!$syncfiles{$_->[0]}} reverse @files) {
- recvlog_print("- $file->[0]");
- if ($file->[2] =~ /^0/) {
- rmdir("$basedir/$file->[0]") || die("rmdir $basedir/$file->[0]: $!\n");
- } else {
- unlink("$basedir/$file->[0]") || die("unlink $basedir/$file->[0]: $!\n");
- repo_del("$basedir/$file->[0]", $file) if $config_repo;
+if (!$cmdline_no_delete) {
+ @files = sort {$a->[0] cmp $b->[0]} values %files;
+ for my $file (grep {!$syncfiles{$_->[0]}} reverse @files) {
+ recvlog_print("- $file->[0]");
+ if ($file->[2] =~ /^0/) {
+ rmdir("$basedir/$file->[0]") || die("rmdir $basedir/$file->[0]: $!\n");
+ } else {
+ unlink("$basedir/$file->[0]") || die("unlink $basedir/$file->[0]: $!\n");
+ repo_del("$basedir/$file->[0]", $file) if $config_repo;
+ }
+ dirchanged($file->[0]);
+ delete $files{$file->[0]};
}
- dirchanged($file->[0]);
- delete $files{$file->[0]};
}
# part 6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/makedeltarpm.c new/deltarpm-3.6.2/makedeltarpm.c
--- old/deltarpm-3.6.1/makedeltarpm.c 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/makedeltarpm.c 2019-06-13 15:28:26.000000000 +0200
@@ -575,6 +575,8 @@
return CFILE_COMP_LZMA;
if (!strcmp(comp, "xz"))
return CFILE_COMP_XZ;
+ if (!strcmp(comp, "zstd"))
+ return CFILE_COMP_ZSTD;
if (!strcmp(comp, "uncompressed"))
return CFILE_COMP_UN;
fprintf(stderr, "unknown compression type: %s\n", comp);
@@ -1088,7 +1090,7 @@
targetcomp = newbz->comp;
if ((payloadflags = headstring(d.h, TAG_PAYLOADFLAGS)) != 0)
if (*payloadflags >= '1' && *payloadflags <= '9')
- targetcomp = cfile_setlevel(targetcomp, *payloadflags - '0');
+ targetcomp = cfile_setlevel(targetcomp, atoi(payloadflags));
if (paycomp == CFILE_COMP_XX)
paycomp = targetcomp;
if (addblkcomp == CFILE_COMP_XX)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/perl/Makefile.PL new/deltarpm-3.6.2/perl/Makefile.PL
--- old/deltarpm-3.6.1/perl/Makefile.PL 1970-01-01 01:00:00.000000000 +0100
+++ new/deltarpm-3.6.2/perl/Makefile.PL 2019-06-13 15:28:26.000000000 +0200
@@ -0,0 +1,17 @@
+use ExtUtils::MakeMaker;
+
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+my $libs = "" . `pkg-config --libs liblzma`;
+chomp $libs;
+WriteMakefile(
+ 'NAME' => 'deltarpm',
+ 'OPTIMIZE' => '-Wno-declaration-after-statement -Wall',
+ 'VERSION_FROM' => 'deltarpm.pm',
+ 'OBJECT' => 'deltarpm.o ../readdeltarpm.o ../rpmhead.o ../util.o ../md5.o ../cfile.o',
+ 'LIBS' => $libs,
+ 'DEFINE' => '-DPACKAGE_NAME=\"deltarpm\"',
+ 'INC' => "-I.. `pkg-config --cflags rpm`", # -I.. for deltarpm
+ 'XSPROTOARG' => '-noprototypes',
+ 'TYPEMAPS' => [ '../perlobject.map' ],
+);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/perl/deltarpm.pm new/deltarpm-3.6.2/perl/deltarpm.pm
--- old/deltarpm-3.6.1/perl/deltarpm.pm 1970-01-01 01:00:00.000000000 +0100
+++ new/deltarpm-3.6.2/perl/deltarpm.pm 2019-06-13 15:28:26.000000000 +0200
@@ -0,0 +1,59 @@
+package deltarpm;
+# Copyright 2012 Thierry Vignaud for Mageia
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself, or under GPL or BSD license.
+
+
+use strict;
+use warnings;
+use DynaLoader;
+
+our @ISA = qw(DynaLoader);
+our $VERSION = '0.1';
+
+deltarpm->bootstrap($VERSION);
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+deltarpm - Manipulate delta RPM files
+
+=head1 SYNOPSIS
+
+ use deltarpm;
+ use Data::Dumper;
+
+ my $d = deltarpm::read("libreoffice-writer-3.5.5.3-0.3.mga2.x86_64.drpm");
+ warn Dumper $d;
+
+=head1 DESCRIPTION
+
+The deltarpm module allows you to manipulate delta RPM files.
+It will be used by the C<genhdlist2> utility to generate meta-data aware of delta rpms so that L<urpmi> can perform updates with smaller deltarpms.
+
+=head2 Functions
+
+=over
+
+=item readDeltaRPM($filename)
+
+Return an hash containing information about the deltarpm file.
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2012, Mageia
+
+Thierry Vignaud
+
+This library is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/perl/deltarpm.xs new/deltarpm-3.6.2/perl/deltarpm.xs
--- old/deltarpm-3.6.1/perl/deltarpm.xs 1970-01-01 01:00:00.000000000 +0100
+++ new/deltarpm-3.6.2/perl/deltarpm.xs 2019-06-13 15:28:26.000000000 +0200
@@ -0,0 +1,97 @@
+/* Copyright (c) 2012 Thierry Vignaud for Mageia
+ * This program is free software; you can redistribute it and/or
+ * modify it under the same terms as Perl itself, or under GPL or BSD license.
+ */
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include "cfile.h"
+#include "deltarpm.h"
+
+#include
+#include
+#include
+
+char *seq_to_string(unsigned int seql, unsigned char *seq) {
+ char *tmp = calloc(seql * 2 + 1, sizeof(char));
+ int i;
+ for (i = 0; i < seql; i++) {
+ char buff[3];
+ snprintf(buff, 3, "%02x", seq[i]);
+ strcat(tmp, buff);
+ }
+ return tmp;
+}
+
+HV* ReadObjectFromFile(FILE *file) {
+ HV * rh;
+
+ char *src_nevr, *target_nevr, *seq;
+ int nb;
+ unsigned int seql;
+ char buf[BUFSIZ];
+ fgets(buf, BUFSIZ, file);
+ nb = sscanf(buf, "srcnevr=%as targetnevr=%as seql=%d, seq=%as\n", &src_nevr, &target_nevr, &seql, &seq);
+ if (nb != 4)
+ croak("unable to get deltarpm info");
+
+ rh = newHV();
+ hv_store(rh, "src_nevr", 8, newSVpv(src_nevr, 0), 0);
+ hv_store(rh, "target_nevr", 11, newSVpv(target_nevr, 0), 0);
+ /* Sequence */
+ if (seq)
+ hv_store(rh, "seq", 3, newSVpv(seq, 0), 0);
+ free(seq);
+ free(src_nevr);
+ free(target_nevr);
+ return rh;
+}
+
+
+MODULE = deltarpm PACKAGE = deltarpm PREFIX = delta_
+
+SV*
+delta_read(filename)
+ char *filename;
+ PREINIT:
+ struct deltarpm d;
+ int pid;
+ int ipcpipe[2];
+
+ CODE:
+ /* The delta rpm code does not expect to be used in its way. Its error handling
+ * consists of 'printf' and 'exit'. So, dirty hacks abound.
+ * Also it's leaky.
+ */
+ if (pipe(ipcpipe) == -1)
+ croak("unable to create pipe");
+
+ if ((pid = fork())) {
+ FILE *readend = fdopen(ipcpipe[0], "r");
+ int rc, status;
+
+ rc = waitpid(pid, &status, 0);
+ if (rc == -1 || (WIFEXITED(status) && WEXITSTATUS(status) != 0))
+ croak("unable to read deltarpm file %s (status=%d)", filename, status);
+
+
+ RETVAL = sv_2mortal((SV*)SvREFCNT_inc(newRV_noinc((SV *)ReadObjectFromFile(readend))));
+ fclose(readend);
+ } else {
+ char *tmp;
+ FILE *writend = fdopen(ipcpipe[1], "w");
+
+ readdeltarpm(filename, &d, NULL);
+ if (d.seql)
+ tmp = seq_to_string(d.seql, d.seq);
+ fprintf(writend, "srcnevr=%s targetnevr=%s seql=%d, seq=%s\n", d.nevr, d.targetnevr, d.seql,
+ d.seql ? tmp : "");
+ fclose(writend);
+ free(tmp);
+ _exit(0);
+ }
+ close(ipcpipe[1]);
+OUTPUT:
+RETVAL
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/deltarpm-3.6.1/rpmoffs.c new/deltarpm-3.6.2/rpmoffs.c
--- old/deltarpm-3.6.1/rpmoffs.c 2015-01-12 14:39:47.000000000 +0100
+++ new/deltarpm-3.6.2/rpmoffs.c 2019-06-13 15:28:26.000000000 +0200
@@ -327,7 +327,7 @@
level = 0;
payloadflags = headstring(h, TAG_PAYLOADFLAGS);
if (payloadflags && *payloadflags >= '1' && *payloadflags <= '9')
- level = *payloadflags - '0';
+ level = atoi(payloadflags);
free(h);