]> err.no Git - dpkg/commitdiff
Add initial support for the Breaks field, by parsing but rejecting it.
authorGuillem Jover <guillem@debian.org>
Tue, 8 Aug 2006 01:43:22 +0000 (01:43 +0000)
committerGuillem Jover <guillem@debian.org>
Tue, 8 Aug 2006 01:43:22 +0000 (01:43 +0000)
Thanks to Ian Jackson <iwj@ubuntu.com>. Closes: #375703

ChangeLog
debian/changelog
lib/dpkg-db.h
lib/fields.c
lib/parse.c
src/depcon.c
src/packages.c
src/processarc.c

index 020ed1dc1e7f50ba11e75e15de51f523c5b27807..09f72e4b00b293bb3c5fce711e80b9e7108d669d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2006-08-08  Ian Jackson  <iwj@ubuntu.com>
+
+       * lib/dpkg-db.h (deptype): Add dep_breaks.
+       * lib/fields.c (f_dependency): Bail out if the Breaks field has an
+       alternative through a '|'.
+       * lib/parse.c (fieldinfos): Add support for the Breaks field when
+       parsing them as a depedency field.
+       * src/depcon.c (describedepcon): Support displaying the Breaks
+       relationship.
+       (depisok): Ignore the Breaks field by adding dep_breaks to the assert
+       and returning as succeeded.
+       * src/processarc.c (process_archive): Print a message stating that
+       current dpkg does not support the Breaks field. Do not bail out in
+       case the Breaks references packages to ignore for dependency handling.
+       * src/packages.c (dependencies_ok): Add a place holder comment to
+       be replaced by the code to prevent configuration of Broken packages.
+
 2006-07-07  Nicolas François  <nicolas.francois@centraliens.net>
 
        * dpkg-deb/build.c: Specify --null before the -T option to avoid
index ddd238870dddb577a3f04ac2bda5039cea61497d..d1de123f2894b10a49f109d4dfedd6f76ab4b86e 100644 (file)
@@ -1,5 +1,9 @@
 dpkg (1.13.23~) UNRELEASED; urgency=low
 
+  [ Guillem Jover ]
+  * Add initial support for the Breaks field, by parsing but rejecting it.
+    Thanks to Ian Jackson <iwj@ubuntu.com>. Closes: #375703
+
   [ Added dpkg Translations ]
   * Dzongkha (Kinley Tshering)
 
index 763c695696dc3928041a4498d9174623c7bd3079..3c0e5ffe9aa8c6fe20afb67e9b77f6bb94cb3506 100644 (file)
@@ -38,6 +38,7 @@ enum deptype {
   dep_recommends,
   dep_depends,
   dep_predepends,
+  dep_breaks,
   dep_conflicts,
   dep_provides,
   dep_replaces,
index ec35e5ac3648f07e9ab10aca4944638f9d145559..aa01b27799e3d6e73b781d0d04254f060108e792 100644 (file)
@@ -439,6 +439,7 @@ void f_dependency(struct pkginfo *pigp, struct pkginfoperfile *pifp,
                  " error after reference to package `%.255s'"),
                  fip->name, dop->ed->name);
       if (fip->integer == dep_conflicts ||
+          fip->integer == dep_breaks ||
           fip->integer == dep_provides ||
           fip->integer == dep_replaces)
         parseerr(NULL,filename,lno, warnto,warncount,pigp,0,
index 1925e860760905a766d6abd6d699a8fc67199ac5..1a95cf9663517d838acbc4507510e8ebd107243d 100644 (file)
@@ -61,6 +61,7 @@ const struct fieldinfo fieldinfos[]= {
   { "Pre-Depends",      f_dependency,      w_dependency,     dep_predepends           },
   { "Recommends",       f_dependency,      w_dependency,     dep_recommends           },
   { "Suggests",         f_dependency,      w_dependency,     dep_suggests             },
+  { "Breaks",           f_dependency,      w_dependency,     dep_breaks               },
   { "Conflicts",        f_dependency,      w_dependency,     dep_conflicts            },
   { "Enhances",         f_dependency,      w_dependency,     dep_enhances             },
   { "Conffiles",        f_conffiles,       w_conffiles                                },
index 38530fab9cad08ef7f09e5e8da072b9f4bbe52b8..835c90ccace00880f7c0183c61e9be551e839811 100644 (file)
@@ -153,6 +153,7 @@ void describedepcon(struct varbuf *addto, struct dependency *dep) {
   case dep_depends:     varbufaddstr(addto, _(" depends on "));     break;
   case dep_predepends:  varbufaddstr(addto, _(" pre-depends on ")); break;
   case dep_recommends:  varbufaddstr(addto, _(" recommends "));     break;
+  case dep_breaks:      varbufaddstr(addto, _(" breaks "));         break;
   case dep_conflicts:   varbufaddstr(addto, _(" conflicts with ")); break;
   case dep_suggests:    varbufaddstr(addto, _(" suggests ")); break;
   case dep_enhances:    varbufaddstr(addto, _(" enhances "));       break;
@@ -185,8 +186,9 @@ int depisok(struct dependency *dep, struct varbuf *whynot,
   char linebuf[1024];
 
   assert(dep->type == dep_depends || dep->type == dep_predepends ||
-         dep->type == dep_conflicts || dep->type == dep_recommends ||
-        dep->type == dep_suggests || dep->type == dep_enhances );
+        dep->type == dep_breaks || dep->type == dep_conflicts ||
+        dep->type == dep_recommends || dep->type == dep_suggests ||
+        dep->type == dep_enhances);
   
   /* The dependency is always OK if we're trying to remove the depend*ing*
    * package.
@@ -212,6 +214,16 @@ int depisok(struct dependency *dep, struct varbuf *whynot,
     internerr("unknown istobe depending");
   }
 
+  if (dep->type == dep_breaks)
+    /* We don't implement this and we can only be in this state
+     * if either a Breaks-ignorant or a Breaks-supporting dpkg
+     * installed the package.  In both cases it's probably too
+     * late to do anything useful about it now in this version
+     * so we just ignore it and hope.
+     * FIXME: implement Breaks
+     */
+    return 1;
+
   /* Describe the dependency, in case we have to moan about it. */
   varbufreset(whynot);
   varbufaddc(whynot, ' ');
index 2706dd3f955b67b4351de40560da0de6bcf17099..8e5a77b54492536462f8aedcd2b638f327f9b05b 100644 (file)
@@ -352,6 +352,9 @@ int dependencies_ok(struct pkginfo *pkg, struct pkginfo *removing,
   debug(dbg_depcon,"checking dependencies of %s (- %s)",
         pkg->name, removing ? removing->name : "<none>");
   assert(pkg->installed.valid);
+  /* To implement Breaks we need to add code here which prevents
+   * configuration of Broken packages.
+   * FIXME: implement Breaks */
   for (dep= pkg->installed.depends; dep; dep= dep->next) {
     if (dep->type != dep_depends && dep->type != dep_predepends) continue;
     debug(dbg_depcondetail,"  checking group ...");
index d8d6d0235cdc166e6d6f047025c9b50e68168379..537a0ecde7ebc090a414528e9b12ea6d4e50a96e 100644 (file)
@@ -252,6 +252,16 @@ void process_archive(const char *filename) {
         }
       }
       break;
+    case dep_breaks:
+      fprintf(stderr, _("dpkg: regarding %s containing %s:\n"
+                       " package uses Breaks; not supported in this dpkg\n"),
+             pfilename, pkg->name);
+      if (!force_depends(dsearch->list))
+       ohshit(_("unsupported dependency problem - not installing %.250s"),
+              pkg->name);
+      fprintf(stderr, _("dpkg: warning - ignoring Breaks !\n"));
+      /* FIXME: implement Breaks */
+      break;
     case dep_suggests:
     case dep_recommends:
     case dep_depends: