Explorar o código

dpkg-deb: Add new --deb-format option and base --new and --old on it

The named options are not future-proof, as they will not allow to easily
create packages with specific formats once a future new version gets
introduced. The new option will also allow to request specific minor
revision of a major format, for testing purposes for example.

This also makes the code more explicit as it now refers to specific
format versions when building it.
Guillem Jover %!s(int64=14) %!d(string=hai) anos
pai
achega
0790f370e7
Modificáronse 6 ficheiros con 78 adicións e 17 borrados
  1. 3 0
      debian/changelog
  2. 9 0
      doc/README.feature-removal-schedule
  3. 4 3
      dpkg-deb/build.c
  4. 6 1
      dpkg-deb/dpkg-deb.h
  5. 44 4
      dpkg-deb/main.c
  6. 12 9
      man/dpkg-deb.1

+ 3 - 0
debian/changelog

@@ -69,6 +69,9 @@ dpkg (1.17.0) UNRELEASED; urgency=low
   * Activate file triggers on removal more accurately, only when we know
     we are inevitably removing things.
   * Change dir to / before executing maintainer scripts. Closes: #686782
+  * Add new dpkg-deb --deb-format option and base --new and --old on it,
+    as the latter are not future-proof, and neither can be guaranteed to
+    produce a reliable output file format.
 
  -- Guillem Jover <guillem@debian.org>  Fri, 03 Aug 2012 13:21:00 +0200
 

+ 9 - 0
doc/README.feature-removal-schedule

@@ -62,6 +62,15 @@ Warning: man page
  --control-show, which are a better interface as they do not rely on any
  specific database layout.
 
+What: --new, --old (dpkg-deb options)
+Status: deprecated
+When: 1.18.x
+Warning: program
+Why:
+ These options are not future-proof, and do not give the caller any
+ guarantee of what exact format version will be used to produce the
+ output file. They have been replaced with a new --deb-format option.
+
 History of feature removals
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

+ 4 - 3
dpkg-deb/build.c

@@ -4,6 +4,7 @@
  *
  * Copyright © 1994,1995 Ian Jackson <ian@chiark.greenend.org.uk>
  * Copyright © 2000,2001 Wichert Akkerman <wakkerma@debian.org>
+ * Copyright © 2007-2012 Guillem Jover <guillem@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -495,7 +496,7 @@ do_build(const char *const *argv)
 
   /* We have our first file for the ar-archive. Write a header for it
    * to the package and insert it. */
-  if (oldformatflag) {
+  if (deb_format.major == 0) {
     struct stat controlstab;
     char versionbuf[40];
 
@@ -518,7 +519,7 @@ do_build(const char *const *argv)
   close(gzfd);
 
   /* Control is done, now we need to archive the data. */
-  if (oldformatflag) {
+  if (deb_format.major == 0) {
     /* In old format, the data member is just concatenated after the
      * control member, so we do not need a temporary file and can use
      * the compression file descriptor. */
@@ -595,7 +596,7 @@ do_build(const char *const *argv)
   subproc_wait_check(c2, _("<compress> from tar -cf"), 0);
   subproc_wait_check(c1, "tar -cf", 0);
   /* Okay, we have data.tar as well now, add it to the ar wrapper. */
-  if (!oldformatflag) {
+  if (deb_format.major == 2) {
     char datamember[16 + 1];
 
     sprintf(datamember, "%s%s", DATAMEMBER,

+ 6 - 1
dpkg-deb/dpkg-deb.h

@@ -3,6 +3,7 @@
  * dpkg-deb.h - external definitions for this program
  *
  * Copyright © 1994,1995 Ian Jackson <ian@chiark.greenend.org.uk>
+ * Copyright © 2006-2012 Guillem Jover <guillem@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,6 +22,8 @@
 #ifndef DPKG_DEB_H
 #define DPKG_DEB_H
 
+#include <dpkg/deb-version.h>
+
 action_func do_build;
 action_func do_contents;
 action_func do_control;
@@ -33,7 +36,9 @@ action_func do_raw_extract;
 action_func do_fsystarfile;
 
 extern int opt_verbose;
-extern int debugflag, nocheckflag, oldformatflag;
+extern int debugflag, nocheckflag;
+
+extern struct deb_version deb_format;
 
 enum dpkg_tar_options {
 	/** Output the tar file directly, without any processing. */

+ 44 - 4
dpkg-deb/main.c

@@ -102,7 +102,10 @@ usage(const struct cmdinfo *cip, const char *value)
 "  --showformat=<format>            Use alternative format for --show.\n"
 "  -v, --verbose                    Enable verbose output.\n"
 "  -D, --debug                      Enable debugging output.\n"
-"  --old, --new                     Select archive format.\n"
+"      --deb-format=<format>        Select archive format.\n"
+"                                     Allowed values: 0.939000, 2.0 (default).\n"
+"      --old                        Legacy alias for '--deb-format=0.939000'.\n"
+"      --new                        Legacy alias for '--deb-format=2.0'.\n"
 "  --nocheck                        Suppress control file check (build bad\n"
 "                                     packages).\n"
 "  -z#                              Set the compression level when building.\n"
@@ -138,8 +141,44 @@ static const char printforhelp[] =
 
 int debugflag = 0;
 int nocheckflag = 0;
-int oldformatflag = 0;
 int opt_verbose = 0;
+
+struct deb_version deb_format = DEB_VERSION(2, 0);
+
+static void
+set_deb_format(const struct cmdinfo *cip, const char *value)
+{
+  const char *err;
+
+  err = deb_version_parse(&deb_format, value);
+  if (err)
+    badusage(_("invalid deb format version: %s"), err);
+
+  if ((deb_format.major == 2 && deb_format.minor == 0) ||
+      (deb_format.major == 0 && deb_format.minor == 939000))
+    return;
+  else
+    badusage(_("unknown deb format version: %s"), value);
+}
+
+static void
+set_deb_old(const struct cmdinfo *cip, const char *value)
+{
+  deb_format = DEB_VERSION(0, 939000);
+
+  warning(_("obsolete option '--%s'; please use '--%s' instead"),
+          cip->olong, "deb-format=0.939000");
+}
+
+static void
+set_deb_new(const struct cmdinfo *cip, const char *value)
+{
+  deb_format = DEB_VERSION(2, 0);
+
+  warning(_("obsolete option '--%s'; please use '--%s' instead"),
+          cip->olong, "deb-format=2.0");
+}
+
 struct compress_params compress_params = {
   .type = compressor_type_gzip,
   .strategy = compressor_strategy_none,
@@ -193,8 +232,9 @@ static const struct cmdinfo cmdinfos[]= {
   ACTION("fsys-tarfile",  0,   0, do_fsystarfile),
   ACTION("show",          'W', 0, do_showinfo),
 
-  { "new",           0,   0, &oldformatflag, NULL,         NULL,          0 },
-  { "old",           0,   0, &oldformatflag, NULL,         NULL,          1 },
+  { "deb-format",    0,   1, NULL,           NULL,         set_deb_format   },
+  { "new",           0,   0, NULL,           NULL,         set_deb_new      },
+  { "old",           0,   0, NULL,           NULL,         set_deb_old      },
   { "debug",         'D', 0, &debugflag,     NULL,         NULL,          1 },
   { "verbose",       'v', 0, &opt_verbose,   NULL,         NULL,          1 },
   { "nocheck",       0,   0, &nocheckflag,   NULL,         NULL,          1 },

+ 12 - 9
man/dpkg-deb.1

@@ -231,18 +231,21 @@ Specify which compression type to use when building a package. Allowed
 values are \fIgzip\fP, \fIxz\fP, \fIbzip2\fP, \fIlzma\fP, and \fInone\fP
 (default is \fIgzip\fP).
 .TP
+.BI \-\-deb\-format= format
+Set the archive format version used when building (since dpkg 1.17.0).
+Allowed values are \fI2.0\fP for the new format, and \fI0.939000\fP
+for the old one (default is \fI2.0\fP).
+
+The old archive format is less easily parsed by non-Debian tools and is
+now obsolete; its only use is when building packages to be parsed by
+versions of dpkg older than 0.93.76 (September 1995), which was released
+as i386 a.out only.
+.TP
 .BR \-\-new
-Ensures that
-.B dpkg\-deb
-builds a `new' format archive. This is the default.
+This is a legacy alias for \fB\-\-deb\-format=2.0\fP.
 .TP
 .BR \-\-old
-Forces
-.B dpkg\-deb
-to build an `old' format archive. This old archive format is less
-easily parsed by non-Debian tools and is now obsolete; its only use is
-when building packages to be parsed by versions of dpkg older than
-0.93.76 (September 1995), which was released as i386 a.out only.
+This is a legacy alias for \fB\-\-deb\-format=0.939000\fP.
 .TP
 .BR \-\-nocheck
 Inhibits