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 <ngomp...@gmail.com>
+
+- Actually enable zstd compression
+
+-------------------------------------------------------------------
+Thu Jun 13 16:45:13 CEST 2019 - m...@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 <stdint.h>
 #include <unistd.h>
 
-#include <zlib.h>
-#include <bzlib.h>
-#include <lzma.h>
-
 #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 <zlib.h>
 #include <bzlib.h>
 #include <lzma.h>
+#ifdef WITH_ZSTD
+#include <zstd.h>
+#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<oldlen) && (old[scsc+lastoffset] == 
new[scsc]))
                oldscore++;
-               oldscorenum++;
+             oldscorenum++;
            }
        }
       if (len - oldscore >= 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 <t...@mageia.org>
+
+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 <fcntl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+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);
 


Reply via email to