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);