]> err.no Git - dpkg/commitdiff
Support extracting lzma compressed source and binary packages,
authorGuillem Jover <guillem@debian.org>
Fri, 24 Nov 2006 04:11:35 +0000 (04:11 +0000)
committerGuillem Jover <guillem@debian.org>
Fri, 24 Nov 2006 04:11:35 +0000 (04:11 +0000)
and add a Suggests on package lzma. Closes: #347715

ChangeLog
debian/changelog
debian/control
dpkg-deb/dpkg-deb.h
dpkg-deb/extract.c
lib/compression.c
lib/dpkg.h
scripts/dpkg-source.pl

index c309f8931eced83005d4b558047edf72067d1f01..e7fe0a0453fd9037a3a3c9a53bc2606e9c59b09a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2006-11-24  Guillem Jover  <guillem@debian.org>
+
+       * scripts/dpkg-source.pl: Add lzma extracting support.
+       (checkdiff): Likewise.
+       (forkgzipread): Likewise.
+       * lib/dpkg.h (LZMA): New macro.
+       (compression_type): Add compress_type_lzma.
+       * lib/compression.c (decompress_cat): Handle compress_type_lzma
+       decompression.
+       * dpkg-deb/dpkg-deb.h (DATAMEMBER_LZMA): New macro.
+       (DATAMEMBER_COMPAT_LZMA): Likewise.
+       * dpkg-deb/extract.c (extracthalf): Handle DATAMEMBER_LZMA and
+       DATAMEMBER_COMPAT_LZMA members.
+
 2006-11-24  Brendan O'Dea  <bod@debian.org>
 
        * scripts/controllib.pl (subprocerr): Require POSIX for WIFEXITED,
index a3d51bc04be39ecfe9e6948fc555b13c5d2961db..149010e179fd9c82c98862989a16130bcfc88390 100644 (file)
@@ -8,6 +8,8 @@ dpkg (1.13.25~) UNRELEASED; urgency=low
     Thanks to Tomas Pospisek <tpo_deb@sourcepole.ch>.
   * Require POSIX inside subprocerr in controllib.pl. Closes: #390636
     Thanks to Brendan O'Dea <bod@debian.org>.
+  * Support extracting lzma compressed source and binary packages,
+    and add a Suggests on package lzma. Closes: #347715
 
   [ Updated dpkg translations ]
   * Chinese (Traditional, Asho Yeh)
index ab825e84c9ef1e7c971d3e9564fc4d2d3efbc2fc..6cb3f0eca6866a27405bc9753b4fe64d87df5665 100644 (file)
@@ -18,7 +18,7 @@ Conflicts: sysvinit (<< 2.82-1), dpkg-iasearch (<< 0.11), dpkg-static,
  dpkg-dev (<< 1.10)
 Replaces: dpkg-doc-ja, dpkg-static, manpages-de (<= 0.4-3),
  manpages-pl (<= 20051117-1)
-Suggests: apt
+Suggests: apt, lzma
 Description: package maintenance system for Debian
  This package contains the low-level commands for handling the installation
  and removal of packages on your system.
index 585c6368881128def61e6ee8211f352964457562..daa9c74c0fc570a7f76770a3e5236e9da0203a82 100644 (file)
@@ -45,6 +45,8 @@ extern enum compression_type compress_type;
 #define DATAMEMBER_COMPAT_GZ   "data.tar.gz/    "
 #define DATAMEMBER_BZ2         "data.tar.bz2    "
 #define DATAMEMBER_COMPAT_BZ2          "data.tar.bz2/   "
+#define DATAMEMBER_LZMA                "data.tar.lzma   "
+#define DATAMEMBER_COMPAT_LZMA "data.tar.lzma/  "
 #define DATAMEMBER_CAT         "data.tar        "
 #define DATAMEMBER_COMPAT_CAT          "data.tar/       "
 
index e886a7f9780dcd404188af7cb7c9f46659cffd59..4db9eb7eecc18da2a592a957f184ebdb708cc4f9 100644 (file)
@@ -157,6 +157,10 @@ void extracthalf(const char *debar, const char *directory,
                     !memcmp(arh.ar_name,DATAMEMBER_COMPAT_BZ2,sizeof(arh.ar_name))) {
            adminmember= 0;
            compress_type= BZ2;
+         } else if (!memcmp(arh.ar_name, DATAMEMBER_LZMA, sizeof(arh.ar_name)) ||
+                    !memcmp(arh.ar_name, DATAMEMBER_COMPAT_LZMA, sizeof(arh.ar_name))) {
+           adminmember = 0;
+           compress_type = compress_type_lzma;
          } else if (!memcmp(arh.ar_name,DATAMEMBER_CAT,sizeof(arh.ar_name)) ||
                     !memcmp(arh.ar_name,DATAMEMBER_COMPAT_CAT,sizeof(arh.ar_name))) {
            adminmember= 0;
index 3e6571e800428c40ba4d5c4b4ec5f7b0c9131b64..7b305e357cb2580d37cc00ad792e24e25313f03e 100644 (file)
@@ -90,6 +90,17 @@ void decompress_cat(enum compression_type type, int fd_in, int fd_out, char *des
       }
       execlp(BZIP2,"bzip2","-dc",(char*)0); ohshite(_("%s: failed to exec bzip2 -dc"), v.buf);
 #endif
+    case compress_type_lzma:
+      if (fd_in != 0) {
+        m_dup2(fd_in, 0);
+        close(fd_in);
+      }
+      if (fd_out != 1) {
+        m_dup2(fd_out, 1);
+        close(fd_out);
+      }
+      execlp(LZMA, "lzma", "-dc", (char *)0);
+      ohshite(_("%s: failed to exec %s"), v.buf, "lzma -dc");
     case CAT:
       fd_fd_copy(fd_in, fd_out, -1, _("%s: decompression"), v.buf);
       exit(0);
index a12e637cba2540abef4e974318964ae9baeb787a..46c5e432c80af5d5b3212c19a7e08e9ed3e95fd2 100644 (file)
 #define TAR            "tar"
 #define GZIP           "gzip"
 #define BZIP2          "bzip2"
+#define LZMA           "lzma"
 #define RM             "rm"
 #define FIND           "find"
 #define SHELL          "sh"
@@ -373,7 +374,7 @@ int cisalpha(int c);
 
 /*** from compression.c ***/
 
-enum compression_type { CAT, GZ, BZ2 };
+enum compression_type { CAT, GZ, BZ2, compress_type_lzma };
 
 void decompress_cat(enum compression_type type, int fd_in, int fd_out, char *desc, ...) NONRETURNING;
 void compress_cat(enum compression_type type, int fd_in, int fd_out, const char *compression, char *desc, ...) NONRETURNING;
index 351825a0ee6db4b4972fc4205f8c704223f7ef2e..b2ee7ff4766c7c5cd9cd4bfa360300e1353950f5 100755 (executable)
@@ -680,7 +680,7 @@ if ($opmode eq 'build') {
 
        &error(sprintf(_g("Files field contains invalid filename `%s'"), $file))
            unless s/^\Q$sourcepackage\E_\Q$baseversion\E(?=[.-])// and
-                  s/\.(gz|bz2)$//;
+                  s/\.(gz|bz2|lzma)$//;
        s/^-\Q$revision\E(?=\.)// if length $revision;
 
        &error(sprintf(_g("repeated file type - files `%s' and `%s'"), $seen{$_}, $file)) if $seen{$_};
@@ -835,7 +835,7 @@ if ($opmode eq 'build') {
 
     for my $patch (@patches) {
        printf(_g("%s: applying %s")."\n", $progname, $patch);
-       if ($patch =~ /\.(gz|bz2)$/) {
+       if ($patch =~ /\.(gz|bz2|lzma)$/) {
            &forkgzipread($patch);
            *DIFF = *GZIP;
        } else {
@@ -855,7 +855,7 @@ if ($opmode eq 'build') {
         $c2 == waitpid($c2,0) || &syserr(_g("wait for patch"));
         $? && subprocerr("patch");
 
-       &reapgzip if $patch =~ /\.(gz|bz2)$/;
+       &reapgzip if $patch =~ /\.(gz|bz2|lzma)$/;
     }
 
     my $now = time;
@@ -1138,7 +1138,7 @@ no strict 'vars';
 sub checkdiff
 {
     my $diff = shift;
-    if ($diff =~ /\.(gz|bz2)$/) {
+    if ($diff =~ /\.(gz|bz2|lzma)$/) {
        &forkgzipread($diff);
        *DIFF = *GZIP;
     } else {
@@ -1212,7 +1212,7 @@ sub checkdiff
     }
     close(DIFF);
     
-    &reapgzip if $diff =~ /\.(gz|bz2)$/;
+    &reapgzip if $diff =~ /\.(gz|bz2|lzma)$/;
 }
 
 sub extracttar {
@@ -1307,7 +1307,18 @@ sub forkgzipwrite {
 
 sub forkgzipread {
     local $SIG{PIPE} = 'DEFAULT';
-    my $prog = $_[0] =~ /\.gz$/ ? 'gunzip' : 'bunzip2';
+    my $prog;
+
+    if ($_[0] =~ /\.gz$/) {
+      $prog = 'gunzip';
+    } elsif ($_[0] =~ /\.bz2$/) {
+      $prog = 'bunzip2';
+    } elsif ($_[0] =~ /\.lzma$/) {
+      $prog = 'unlzma';
+    } else {
+      &error(sprintf(_g("unknown compression type on file %s"), $_[0]));
+    }
+
     open(GZIPFILE,"< $_[0]") || &syserr(sprintf(_g("read file %s"), $_[0]));
     pipe(GZIP,GZIPWRITE) || &syserr(sprintf(_g("pipe for %s"), $prog));
     defined($cgz= fork) || &syserr(sprintf(_g("fork for %s"), $prog));