Quellcode durchsuchen

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 vor 14 Jahren
Ursprung
Commit
0790f370e7
6 geänderte Dateien mit 78 neuen und 17 gelöschten Zeilen
  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