diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | URPM.xs | 33 | ||||
-rw-r--r-- | t/synthesis.t | 18 |
3 files changed, 37 insertions, 15 deletions
@@ -1,3 +1,4 @@ +- enable to read xz & bzip2 compressed synthesis - internal cleanups - ranges_overlap(): use rpm to compute whether it overlaps or not @@ -20,7 +20,6 @@ #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> -#include <zlib.h> #include <libintl.h> // fix compiling (error: conflicting types for ‘fflush’): @@ -2845,12 +2844,13 @@ Urpm_parse_synthesis__XS(urpm, filename, ...) if (depslist != NULL) { char buff[65536]; - char *p, *eol; + char *p, *eol, *t; int buff_len; struct s_Package pkg; - gzFile f; + FD_t f = NULL; int start_id = 1 + av_len(depslist); SV *callback = NULL; + rpmCompressedMagic compressed = COMPRESSED_OTHER; if (items > 2) { int i; @@ -2864,12 +2864,25 @@ Urpm_parse_synthesis__XS(urpm, filename, ...) } PUTBACK; - if ((f = gzopen(filename, "rb")) != NULL) { + int rc = rpmFileIsCompressed(filename, &compressed); + + switch (compressed) { + case COMPRESSED_BZIP2: t = "r.bzip2"; break; + case COMPRESSED_LZMA: + case COMPRESSED_XZ: + t = "r.xz"; break; + case COMPRESSED_OTHER: + default: + t = "r.gzip"; break; + } + f = Fopen(filename, "r.fdio"); + + if (!rc && (f = Fdopen(f, t)) != NULL && !Ferror(f)) { memset(&pkg, 0, sizeof(struct s_Package)); buff[sizeof(buff)-1] = 0; p = buff; int ok = 1; - while ((buff_len = gzread(f, p, sizeof(buff)-1-(p-buff))) >= 0 && + while ((buff_len = Fread(p, sizeof(buff)-1-(p-buff), 1, f)) >= 0 && (buff_len += p-buff)) { buff[buff_len] = 0; p = buff; @@ -2888,17 +2901,15 @@ Urpm_parse_synthesis__XS(urpm, filename, ...) ok = 0; break; } - if (gzeof(f)) { - if (!parse_line(depslist, provides, obsoletes, &pkg, p, urpm, callback)) ok = 0; - break; - } else { /* move the remaining non-complete-line at beginning */ memmove(buff, p, buff_len-(p-buff)); /* point to the end of the non-complete-line */ p = &buff[buff_len-(p-buff)]; - } } - if (gzclose(f) != 0) ok = 0; + // EOF: + if (!parse_line(depslist, provides, obsoletes, &pkg, p, urpm, callback)) + ok = 0; + if (Fclose(f) != 0) ok = 0; SPAGAIN; if (ok) { mXPUSHs(newSViv(start_id)); diff --git a/t/synthesis.t b/t/synthesis.t index 6729b3b..8961e2a 100644 --- a/t/synthesis.t +++ b/t/synthesis.t @@ -2,29 +2,39 @@ use strict ; use warnings ; -use Test::More tests => 94; +use Test::More tests => 95; use URPM; chdir 't' if -d 't'; my $file1 = 'synthesis.sample.cz'; +my $file2 = 'synthesis.sample-xz.cz'; -open my $f, "| gzip -9 >$file1"; -print $f <<'EOF'; +my $s = <<'EOF'; @provides@glibc-devel == 6:2.2.4-25mdk @requires@/sbin/install-info@glibc == 2.2.4@kernel-headers@kernel-headers >= 2.2.1@/bin/sh@/bin/sh@/bin/sh@rpmlib(PayloadFilesHavePrefix) <= 4.0-1@rpmlib(CompressedFileNames) <= 3.0.4-1 @conflicts@texinfo < 3.11@gcc < 2.96-0.50mdk @obsoletes@libc-debug@libc-headers@libc-devel@linuxthreads-devel@glibc-debug @info@glibc-devel-2.2.4-25mdk.i586@6@45692097@Development/C EOF +open my $f, "| gzip -9 >$file1"; +print $f $s; +close $f; +open my $f, "| xz -9 >$file2"; +print $f $s; +$s =~ s/-devel//g; +print $f $s; close $f; -END { unlink $file1 } +END { unlink $file1, $file2 } my $a = new URPM; ok($a); my ($first, $end); +($first, $end) = URPM->new->parse_synthesis($file2); +ok($first == 0 && $end == 1, 'parse XZ synthesis'); + ($first, $end) = URPM->new->parse_synthesis('empty_synthesis.cz'); is("$first $end", "0 -1", 'parse empty synthesis'); |