]> err.no Git - dpkg/commitdiff
dpkg (1.1.6); priority=MEDIUM
authorIan Jackson <ian@chiark.chu.cam.ac.uk>
Tue, 30 Apr 1996 23:47:22 +0000 (00:47 +0100)
committerIan Jackson <ian@chiark.chu.cam.ac.uk>
Tue, 30 Apr 1996 23:47:22 +0000 (00:47 +0100)
  * Check virtual dependencies when removing (ouch! - thanks SDE.)
  * Fixed bug in internal database validity management that could
    make dselect and dpkg dump core.  (Bug#2613.)
  * Fixed two coredumping bugs when using local diversions.  (Bug#2804.)
  * Fixed disappearance of overwritten packages.  (Bug#2696.)
  * install-info won't modify dir file before start of menu.
  * install-info will create Miscellaneous heading if no sections yet.

  * Only alphanums and +-. allowed in package names - enforced by
    dpkg-deb --build and documented in Guidelines.
  * dselect doesn't display packages unless they are installed, selected
    or available.
  * dselect doesn't show spurious section and priority headings.
  * dselect has a few extra keybindings (from Lee Olds).
  * --force message changed to `--force enabled' so that default is OK.

  * dpkg-name now includes architecture component in .deb filename,
    and translates - in package name to _.
  * .deb file has architecture component in filename.

  * Guidelines changed to say Pre-Depends is for experts only.
  * Guidelines say to provide a unidiff (-u) rather than an old context diff.
  * Guidelines say 755 root.root for shared libraries.

 -- Ian Jackson <ian@chiark.chu.cam.ac.uk>  Wed, 1 May 1996 00:47:22 +0100

25 files changed:
TODO
debian.Changelog
debian.rules
doc/guidelines.info-1
doc/guidelines.texi
dpkg-deb/build.c
dselect/helpmsgs.src
dselect/methkeys.cc
dselect/pkgkeys.cc
dselect/pkglist.cc
include/dpkg-db.h
lib/database.c
lib/dump.c
main/archives.c
main/archives.h
main/enquiry.c
main/errors.c
main/packages.c
main/processarc.c
main/remove.c
scripts/dpkg-name.1
scripts/dpkg-name.sh
scripts/install-info.8
scripts/install-info.pl
version.h

diff --git a/TODO b/TODO
index 3341868730e63bd8593e6eecdf7d43a8a5f00452..47165981532a5fdd2a17a44f94a388068c5533dc 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,17 +1,9 @@
 Here are some currently-known inadequacies:
 
 urgent
- * Pre-Depends installation ordering
-
-done
- * a.out version
- * uncomment ELF preinst modification
- * Replaces (auto-deselect for conflicts)
- * Replaces (don't overwrite otherwise)
- * compile with ELF GCC out of the box
- * dpkg --print-architecture
- * Architecture field check
- * symlink rename change
+ * Conflicts << installation ordering
+ * Version numbers in pre-depends stuff
+ * Search for all pre-depends things at once, bomb out if any not found
 
 bugs that need to be fixed quickly
  * version numbers not starting digit early.
@@ -32,9 +24,11 @@ bugs that need to be fixed quickly
  * remove old docs from /usr/doc/dpkg.
 
 other stuff unlikely to get done soon
+ * md5sum component in new .deb files
+ * version number comparison option
+ * diversions list as control archive entry
  * single maintainer script, and new package getting there first
  * dpkg -s show something for virtual packages
- * dpkg --listfiles should do better for multi-package files  (pkg, pkg: ...)
  * settable defaults for update-rc.d
  * local conffiles
  * hooks
@@ -55,3 +49,15 @@ other stuff unlikely to get done soon
  * `fake' or `null' packages
  * --purge remove empty directories which used too contain conffiles
  * conffiles handling options, including `replace removed files'
+
+done
+ * Pre-Depends installation ordering
+ * a.out version
+ * uncomment ELF preinst modification
+ * Replaces (auto-deselect for conflicts)
+ * Replaces (don't overwrite otherwise)
+ * compile with ELF GCC out of the box
+ * dpkg --print-architecture
+ * Architecture field check
+ * symlink rename change
+ * dpkg --listfiles should do better for multi-package files  (pkg, pkg: ...)
index f024177acfd34e406e440ba7a8f6d2e4eccf3aaa..4985617e47648940f9a7302ba32731e256735abd 100644 (file)
@@ -1,8 +1,37 @@
+dpkg (1.1.6); priority=MEDIUM
+
+  * Check virtual dependencies when removing (ouch! - thanks SDE.)
+  * Fixed bug in internal database validity management that could
+    make dselect and dpkg dump core.  (Bug#2613.)
+  * Fixed two coredumping bugs when using local diversions.  (Bug#2804.)
+  * Fixed disappearance of overwritten packages.  (Bug#2696.)
+  * install-info won't modify dir file before start of menu.
+  * install-info will create Miscellaneous heading if no sections yet.
+
+  * Only alphanums and +-. allowed in package names - enforced by
+    dpkg-deb --build and documented in Guidelines.
+  * dselect doesn't display packages unless they are installed, selected
+    or available.
+  * dselect doesn't show spurious section and priority headings.
+  * dselect has a few extra keybindings (from Lee Olds).
+  * --force message changed to `--force enabled' so that default is OK.
+
+  * dpkg-name now includes architecture component in .deb filename,
+    and translates - in package name to _.
+  * .deb file has architecture component in filename.
+
+  * Guidelines changed to say Pre-Depends is for experts only.
+  * Guidelines say to provide a unidiff (-u) rather than an old context diff.
+  * Guidelines say 755 root.root for shared libraries.
+
+ -- Ian Jackson <ian@chiark.chu.cam.ac.uk>  Wed, 1 May 1996 00:47:22 +0100
+
 dpkg (1.1.5); priority=MEDIUM (HIGH for diversions users)
 
   * Fixed coredump when using diversions.  (Bug#2603.)
   * Fixed typo in dpkg-divert which could lose diversions.  (Bug#2662.)
 
+  * --force-overwrite is the default.
   * diversions.text provides better examples.
 
  -- Ian Jackson <ian@chiark.chu.cam.ac.uk>  Wed, 10 Apr 1996 13:59:30 +0100
index 49ffb0894536ea2e404130cad2852bb3bf2fe683..4b671c06f84e3d3b1c8177dadf41ead56f027223 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/make -f
 
 package=dpkg
-version=1.1.5
+version=1.1.6
 
 archi=$(shell dpkg --print-architecture)
 DIR:=$(shell pwd)
@@ -58,11 +58,11 @@ binary:
        rm debian-tmp/var/lib/dpkg/{status,available}
        dpkg --build debian-tmp
        if file main/dpkg | grep -q ELF; then \
-               mv debian-tmp.deb ../dpkg-$(version)elf.deb ; \
+               mv debian-tmp.deb ../dpkg-$(version)elf.$(archi).deb ; \
                mv ../dpkg-$(version).nondebbin.tar.gz \
                   ../dpkg-$(version)elf.nondebbin.tar.gz ; \
        else \
-               mv debian-tmp.deb ../dpkg-$(version).deb ; \
+               mv debian-tmp.deb ../dpkg-$(version).$(archi).deb ; \
        fi
 
 define checkdir
index ac9171445f5f75d0b5ad677b8eae5373903f2c78..c69a3348248e74b4e5a4a1690da169f8f4c002fd 100644 (file)
@@ -218,8 +218,9 @@ the guidelines below.
      course, owned by the appropriate group.
 
    * Library files should generally be mode 644 and owned by
-     `root.root'.  If the package requires different permissions or
-     ownerships to function correctly, they should be used instead.
+     `root.root'; shared libraries should be mode 755.  If the package
+     requires different permissions or ownerships to function
+     correctly, they should be used instead.
 
    * Manual pages should be mode 644 and owned by `root.root'.  The
      `nroff' source must be installed.  You should *not* install a
@@ -471,8 +472,8 @@ for the existence of a file in the source directory.
      `<package>-<original_version>' (again, see the section below on
      version numbering).
 
-   * Create the context diff against the original package using `diff
-     -cNr', and use `gzip -9' to compress it.  Context diffs should be
+   * Create the unified context diff against the original package using
+     `diff -uNr', and use `gzip -9' to compress it.  Diffs should be
      named in the form <package>-<version>.diff.gz--for example,
      `fileutils-3.9-3.diff.gz'.
 
@@ -628,9 +629,9 @@ installation tools.
 
    The value of `Package' should be the name of the package.  Package
 names must start with an alphanumeric, must be at least two characters,
-and may contain only alphanumerics and the characters - + . @ : = % _
-(that is, hyphen, plus, stop, at, colon, equals, percent and
-underscore).  They are not case sensitive.
+and may contain only alphanumerics and the characters - + . (that is,
+hyphen, plus, stop) (1).  They are sort of case sensitive - please try
+to get the case right first time.
 
    The `Maintainer' field should be in the form
 
@@ -694,7 +695,8 @@ reluctant to downgrade packages.
 
 `Pre-Depends'
      Used by base packages to ensure that (for example) shared
-     libraries are present befoore they are upgraded.
+     libraries are present before they are upgraded.  This feature is
+     for expert use only.
 
 `Source'
      Gives the name of the source package when several binary packages
@@ -732,6 +734,12 @@ the reasons described in `dependency-ordering.txt', and the others
 because older versions of those packages do not have the appropriate
 `Provides' field.
 
+   ---------- Footnotes ----------
+
+   (1)  The characters @ : = % _ (at, colon, equals, percent and
+underscore) used to be legal and are still accepted when found in a
+package file, but may not be used in new packages
+
 \1f
 File: guidelines.info,  Node: conffiles,  Next: Installation and Removal Scripts,  Prev: control,  Up: Control Files
 
index 78662e4d48912881ddea562e67a3d32c23adf5bc..21c5d9f57e11575e305b0d82ab69dab7a66353b8 100644 (file)
@@ -234,8 +234,9 @@ owned by the appropriate group.
 
 @item
 Library files should generally be mode 644 and owned by
-@code{root.root}.  If the package requires different permissions
-or ownerships to function correctly, they should be used instead.
+@code{root.root}; shared libraries should be mode 755.  If the package
+requires different permissions or ownerships to function correctly, they
+should be used instead.
 
 @item
 Manual pages should be mode 644 and owned by @code{root.root}.  The
@@ -529,9 +530,9 @@ but the tarfile should unpack into a directory named
 below on version numbering).
 
 @item
-Create the context diff against the original package using @file{diff
--cNr}, and use @file{gzip -9} to compress it.  Context diffs should be
-named in the form <@i{package}>-<@i{version}>.diff.gz---for example,
+Create the unified context diff against the original package using
+@file{diff -uNr}, and use @file{gzip -9} to compress it.  Diffs should
+be named in the form <@i{package}>-<@i{version}>.diff.gz---for example,
 @file{fileutils-3.9-3.diff.gz}.
 @end itemize
 
@@ -684,11 +685,14 @@ The version number in the format
    Each field has a particular format and meaning for the package
 installation tools.
 
-The value of @file{Package} should be the name of the package.
-Package names must start with an alphanumeric, must be at least two
-characters, and may contain only alphanumerics and the characters
-- + . @@ : = % _ (that is, hyphen, plus, stop, at, colon, equals,
-percent and underscore).  They are not case sensitive.
+The value of @file{Package} should be the name of the package.  Package
+names must start with an alphanumeric, must be at least two characters,
+and may contain only alphanumerics and the characters - + . (that is,
+hyphen, plus, stop) @footnote{The characters @@ : = % _ (at, colon,
+equals, percent and underscore) used to be legal and are still accepted
+when found in a package file, but may not be used in new packages}.
+They are sort of case sensitive - please try to get the case right first
+time.
 
    The @code{Maintainer} field should be in the form
 
@@ -752,7 +756,7 @@ used as a location for the package in the distribution.
 A boolean field used by the base packages.
 @item Pre-Depends
 Used by base packages to ensure that (for example) shared libraries are
-present befoore they are upgraded.
+present before they are upgraded.  This feature is for expert use only.
 @item Source
 Gives the name of the source package when several binary packages are
 generated from a single source tree.
index 79e9f364e7dc2d4599fd3956d5ddbc3e452f8ad9..7be355a8f0f5dd8d72e2dbd571bf33850e72a0ff 100644 (file)
@@ -93,6 +93,10 @@ void do_build(const char *const *argv) {
     parsedb(controlfile, pdb_recordavailable|pdb_rejectstatus,
             &checkedinfo, stderr, &warns);
     assert(checkedinfo->available.valid);
+    if (strspn(checkedinfo->name,
+               "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-.")
+        != strlen(checkedinfo->name))
+      ohshit("package name has characters that aren't alphanums or `-+.'");
     if (checkedinfo->priority == pri_other) {
       fprintf(stderr, "warning, `%s' contains user-defined Priority value `%s'\n",
               controlfile, checkedinfo->otherpriority);
index db0fd6a75542542b29d968936cef1e6bf7d14753..2bcf149473ac20981cd0701a904960cbe41340a7 100644 (file)
@@ -1,7 +1,7 @@
 @@@ listkeys Keystrokes
 
 Motion keys: Next/Previous, Top/End, Up/Down, Backwards/Forwards:
-  n, Down-arrow         p, Up-arrow             move highlight
+  n, Down-arrow, j      p, Up-arrow, k          move highlight
   N, Page-down, Space   P, Page-up, Backspace   scroll list by 1 page
   ^n                    ^p                      scroll list by 1 line
   t, Home               e, End                  jump to top/end of list
@@ -18,7 +18,7 @@ Package states - selection:                    Package states - hold flag:
 Quit, exit, overwrite (note capitals!):         ? request help (also Help, F1)
  Return  Confirm and quit (check dependencies)  i toggle/cycle info displays      
    Q     Confirm and quit (override dep.s)      o cycle through sort orders       
  X     eXit, abandoning any changes made      v toggle verbose status display   
X, Esc  eXit, abandoning any changes made      v toggle verbose status display   
    R     Revert to state before this list      ^l redraw display                  
    U     set all to sUggested state             / search (hit Return to cancel)
    D     set all to Directly selected state     \\ repeat last search             
index eef8104b85527a41512b1007705defe2f64f9f3f..c62947cb1f2daae41cac178929c5400f8cea54eb 100644 (file)
@@ -62,14 +62,18 @@ const keybindings::interpretation methodlist_kinterps[] = {
 #define C(x) ((x)-'a'+1)
 
 const keybindings::orgbinding methodlist_korgbindings[]= {
+  { 'j',            "down"           }, // vi style
   { 'n',            "down"           },
   { KEY_DOWN,       "down"           },
+  { 'k',            "up"             }, // vi style
   { 'p',            "up"             },
   { KEY_UP,         "up"             },
   
+  { C('f'),         "scrollon"       }, // vi style
   { 'N',            "scrollon"       },
   { KEY_NPAGE,      "scrollon"       },
   { ' ',            "scrollon"       },
+  { C('b'),         "scrollback"     }, // vi style
   { 'P',            "scrollback"     },
   { KEY_PPAGE,      "scrollback"     },
   { KEY_BACKSPACE,  "scrollback"     },
@@ -105,6 +109,7 @@ const keybindings::orgbinding methodlist_korgbindings[]= {
 
   { KEY_ENTER,      "select-and-quit"  },
   { '\r',           "select-and-quit"  },
+  { 27,             "abort"            }, // esc
   { 'x',            "abort"            },
   { 'X',            "abort"            },
   
index 5e47a9312443f534b4f0ba7710ad35b002b8cc92..41a9bfb45d9d5144e804f4484eb2225491669277 100644 (file)
@@ -75,8 +75,10 @@ const keybindings::interpretation packagelist_kinterps[] = {
 #define C(x) ((x)-'a'+1)
 
 const keybindings::orgbinding packagelist_korgbindings[]= {
+  { 'j',            "down"           }, // vi style
   { 'n',            "down"           },
   { KEY_DOWN,       "down"           },
+  { 'k',            "up"             }, // vi style
   { 'p',            "up"             },
   { KEY_UP,         "up"             },
   
@@ -86,7 +88,7 @@ const keybindings::orgbinding packagelist_korgbindings[]= {
   { 'P',            "scrollback"     },
   { KEY_PPAGE,      "scrollback"     },
   { KEY_BACKSPACE,  "scrollback"     },
-  { 0177,/*DEL*/    "scrollback"     },
+  { 0177,           "scrollback"     }, // ASCII DEL
   { C('h'),         "scrollback"     },
   { C('n'),         "scrollon1"      },
   { C('p'),         "scrollback1"    },
@@ -130,6 +132,8 @@ const keybindings::orgbinding packagelist_korgbindings[]= {
   { KEY_ENTER,      "quitcheck"      },
   { '\r',           "quitcheck"      },
   { 'Q',            "quitnocheck"    },
+  { 27,             "abortnocheck"   }, // esc
+  { 'x',            "abortnocheck"   },
   { 'X',            "abortnocheck"   },
   { 'R',            "revert"         },
   { 'U',            "revertsuggest"  },
index f619a75e9ed838d2d51f19e668a1a1ebbbf9b6a8..f995e96c258e7b5c3612daf3d76f60e3de650a1b 100644 (file)
@@ -43,7 +43,7 @@ int packagelist::compareentries(struct perpackagestate *a,
     !asection || !bsection ?
       (!bsection) - (!asection) :
     !*asection || !*bsection ?
-      (!asection) - (!bsection) :
+      (!*asection) - (!*bsection) :
     strcasecmp(asection,bsection);
   int c_priority=
     a->pkg->priority - b->pkg->priority;
@@ -95,6 +95,7 @@ void packagelist::addheading(pkginfo::pkgpriority priority,
     nallocated += nallocated+50;
     struct perpackagestate **newtable= new struct perpackagestate*[nallocated];
     memcpy(newtable,table,nallocated*sizeof(struct perpackagestate*));
+    delete[] table;
     table= newtable;
   }
   
@@ -233,10 +234,7 @@ packagelist::packagelist(keybindings *kb) : baselist(kb) {
        ) {
     struct perpackagestate *state= &datatable[nitems];
     state->pkg= pkg;
-    if (!informativeperfile(&pkg->available) &&
-        pkg->status == pkginfo::stat_notinstalled &&
-        pkg->priority == pkginfo::pri_unknown &&
-        !(pkg->section && *pkg->section) &&
+    if (pkg->status == pkginfo::stat_notinstalled &&
         !pkg->files &&
         pkg->want != pkginfo::want_install) {
       pkg->clientdata= 0; continue;
index 591885884a1875172de155dd292480f5b2aee8ca..202c07fc663713468e88237d31fe66218ffd9775 100644 (file)
@@ -150,8 +150,7 @@ extern char *statusfile, *availablefile; /* initialised by modstatdb_init */
 struct pkginfo *findpackage(const char *name);
 void blankpackage(struct pkginfo *pp);
 void blankpackageperfile(struct pkginfoperfile *pifp);
-int informative(struct pkginfo *info);
-int informativeperfile(struct pkginfoperfile *info);
+int informative(struct pkginfo *pkg, struct pkginfoperfile *info);
 int countpackages(void);
 void resetpackages(void);
 
index 9561a0fdef2a1c95101d00be7027842dc4d9504f..71250e7eea01d2392cbf3d337180a63736ff4922 100644 (file)
@@ -132,8 +132,20 @@ void blankpackageperfile(struct pkginfoperfile *pifp) {
 
 static int nes(const char *s) { return s && *s; }
 
-int informativeperfile(struct pkginfoperfile *info) {
-  /* Used by dselect as an aid to decide whether to display things. */
+int informative(struct pkginfo *pkg, struct pkginfoperfile *info) {
+  /* Used by dselect and dpkg query options as an aid to decide
+   * whether to display things, and by dump to decide whether to write them
+   * out.
+   */
+  if (info == &pkg->installed ?
+      ((pkg->want != want_unknown && pkg->want != want_purge) ||
+       pkg->eflag != eflagv_ok ||
+       pkg->status != stat_notinstalled ||
+       pkg->files)
+      :
+      (nes(pkg->section) ||
+       pkg->priority != pri_unknown))
+    return 1;
   if (!info->valid) return 0;
   if (info->depends ||
       nes(info->description) ||
@@ -147,15 +159,6 @@ int informativeperfile(struct pkginfoperfile *info) {
   return 0;
 }
 
-int informative(struct pkginfo *pkg) {
-  return ((pkg->want != want_unknown && pkg->want != want_purge) ||
-          pkg->eflag != eflagv_ok ||
-          pkg->status != stat_notinstalled ||
-          nes(pkg->section) ||
-          pkg->files ||
-          pkg->priority != pri_unknown);
-}
-
 struct pkginfo *findpackage(const char *name) {
   struct pkginfo **pointerp, *newpkg;
 
index 97d5c4304f8041ce1956c11ea6c62ead63a509de..fb9aa765c0fabbb3004d0e8f32c171199fb4c35e 100644 (file)
@@ -238,6 +238,7 @@ void writedb(const char *filename, int available, int mustsync) {
   
   struct pkgiterator *it;
   struct pkginfo *pigp;
+  struct pkginfoperfile *pifp;
   char *oldfn, *newfn;
   const char *which;
   FILE *file;
@@ -258,12 +259,11 @@ void writedb(const char *filename, int available, int mustsync) {
 
   it= iterpkgstart();
   while ((pigp= iterpkgnext(it)) != 0) {
-    if (!(informative(pigp) ||
-          informativeperfile(&pigp->available) ||
-          informativeperfile(&pigp->installed)))
-      /* Don't dump records which have no useful content. */
-      continue;
-    varbufrecord(&vb, pigp, available ? &pigp->available : &pigp->installed);
+    pifp= available ? &pigp->available : &pigp->installed;
+    /* Don't dump records which have no useful content. */
+    if (!informative(pigp,pifp)) continue;
+    if (!pifp->valid) blankpackageperfile(pifp);
+    varbufrecord(&vb,pigp,pifp);
     varbufaddc(&vb,'\n'); varbufaddc(&vb,0);
     if (!fputs(vb.buf,file))
       ohshite("failed to write %s record about `%.50s' to `%.250s'",
index bfe8de48a906d4efa1925417c7a2d125296f10a7..7b17e2081df83621acf996996fb812f3c3f4eb98 100644 (file)
 #include "main.h"
 #include "archives.h"
 
+int filesavespackage(struct fileinlist *file, struct pkginfo *pkgtobesaved,
+                     struct pkginfo *pkgbeinginstalled) {
+  struct pkginfo *divpkg, *thirdpkg;
+  struct filepackages *packageslump;
+  int i;
+  
+  debug(dbg_eachfiledetail,"filesavespackage file `%s' package %s",
+        file->namenode->name,pkgtobesaved->name);
+  /* A package can only be saved by a file or directory which is part
+   * only of itself - it must be neither part of the new package being
+   * installed nor part of any 3rd package (this is important so that
+   * shared directories don't stop packages from disappearing).
+   */
+  /* Is the file in the package being installed ?  If so then it can't save.
+   */
+  if (file->namenode->flags & fnnf_new_inarchive) {
+    debug(dbg_eachfiledetail,"filesavespackage ... in new archive -- no save");
+    return 0;
+  }
+  /* If the file is a contended one and it's overridden by either
+   * the package we're considering disappearing or the package
+   * we're installing then they're not actually the same file, so
+   * we can't disappear the package - it is saved by this file.
+   */
+  if (file->namenode->divert && file->namenode->divert->useinstead) {
+    divpkg= file->namenode->divert->pkg;
+    if (divpkg == pkgtobesaved || divpkg == pkgbeinginstalled) {
+      debug(dbg_eachfiledetail,"filesavespackage ... diverted -- save!");
+      return 1;
+    }
+  }
+  /* Look for a 3rd package which can take over the file (in case
+   * it's a directory which is shared by many packages.
+   */
+  for (packageslump= file->namenode->packages;
+       packageslump;
+       packageslump= packageslump->more) {
+    for (i=0; i < PERFILEPACKAGESLUMP && packageslump->pkgs[i]; i++) {
+      thirdpkg= packageslump->pkgs[i];
+      debug(dbg_eachfiledetail, "filesavespackage ... also in %s",
+            thirdpkg->name);
+      /* Is this not the package being installed or the one being
+       * checked for disappearance ?
+       */
+      if (thirdpkg == pkgbeinginstalled || thirdpkg == pkgtobesaved) continue;
+      /* If !fileslistvalid then we've already disappeared this one, so
+       * we shouldn't try to make it take over this shared directory.
+       */
+      debug(dbg_eachfiledetail,"filesavespackage ...  is 3rd package");
+
+      if (!thirdpkg->clientdata->fileslistvalid) {
+        debug(dbg_eachfiledetail,
+              "process_archive ...  already disappeared !");
+        continue;
+      }
+      /* We've found a package that can take this file. */
+      debug(dbg_eachfiledetail, "filesavespackage ...  taken -- no save");
+      return 0;
+    }
+  }
+  debug(dbg_eachfiledetail, "filesavespackage ... not taken -- save !");
+  return 1;
+}
+
 void cu_pathname(int argc, void **argv) {
   ensure_pathname_nonexisting((char*)(argv[0]));
 } 
@@ -269,7 +333,8 @@ int tarobject(struct TarInfo *ti) {
            * check for both being the diverting package, obviously).
            */
           divpkg= nifd->namenode->divert->pkg;
-          debug(dbg_eachfile, "tarobject ... diverted, divpkg=%s\n",divpkg->name);
+          debug(dbg_eachfile, "tarobject ... diverted, divpkg=%s",
+                divpkg ? divpkg->name : "<none>");
           if (otherpkg == divpkg || tc->pkg == divpkg) continue;
         }
         /* Nope ?  Hmm, file conflict, perhaps.  Check Replaces. */
index 00babbee0ec2fd2ac8486673266fd209fe0e42f7..90f028c1b75ead9b39b77fe91dfff129c0414573 100644 (file)
@@ -57,6 +57,9 @@ int unlinkorrmdir(const char *filename);
 int tarobject(struct TarInfo *ti);
 int tarfileread(void *ud, char *buf, int len);
 
+int filesavespackage(struct fileinlist*, struct pkginfo*,
+                     struct pkginfo *pkgbeinginstalled);
+
 void check_conflict(struct dependency *dep, struct pkginfo *pkg,
                     const char *pfilename, struct pkginfo **conflictorp);
 
index 43302bf8835b996017883fba3e83218c94436617..c49e9a426e90f0e24ed689c28bad0fa2e2129cf1 100644 (file)
@@ -385,7 +385,7 @@ void enqperpackage(const char *const *argv) {
           !(pkg->section && *pkg->section) &&
           !pkg->files &&
           pkg->want == want_unknown &&
-          !informativeperfile(&pkg->installed)) {
+          !informative(pkg,&pkg->installed)) {
         printf("Package `%s' is not installed and no info is available.\n",pkg->name);
         failures++;
       } else {
index b4064b2d93d17db2b7d4c5ffc6263b3a931d0572..797c8a84797f8a6abfbf8e9cba91195e0c5a0307 100644 (file)
@@ -101,7 +101,7 @@ void forcibleerr(int forceflag, const char *fmt, ...) {
   va_list al;
   va_start(al,fmt);
   if (forceflag) {
-    fputs(DPKG " - warning, overriding problem because you used --force:\n ",stderr);
+    fputs(DPKG " - warning, overriding problem because --force enabled:\n ",stderr);
     vfprintf(stderr,fmt,al);
     fputc('\n',stderr);
   } else {
index 1db2db03c1754f10cde835b760133d622f202723..c49547124ca8a0cf3482c613470e68c3a5568456 100644 (file)
@@ -246,6 +246,7 @@ void process_queue(void) {
 static int deppossi_ok_found(struct pkginfo *possdependee,
                              struct pkginfo *requiredby,
                              struct pkginfo *removing,
+                             struct pkginfo *providing,
                              int *matched,
                              struct deppossi *checkversion,
                              int *interestingwarnings,
@@ -260,6 +261,10 @@ static int deppossi_ok_found(struct pkginfo *possdependee,
   if (possdependee == removing) {
     varbufaddstr(oemsgs,"  Package ");
     varbufaddstr(oemsgs,possdependee->name);
+    if (providing) {
+      varbufaddstr(oemsgs," which provides ");
+      varbufaddstr(oemsgs,providing->name);
+    }
     varbufaddstr(oemsgs," is to be removed.\n");
     *matched= 1;
     if (fc_depends) thisf= (dependtry >= 4) ? 2 : 1;
@@ -300,6 +305,10 @@ static int deppossi_ok_found(struct pkginfo *possdependee,
     } else {
       varbufaddstr(oemsgs,"  Package ");
       varbufaddstr(oemsgs,possdependee->name);
+      if (providing) {
+        varbufaddstr(oemsgs," which provides ");
+        varbufaddstr(oemsgs,providing->name);
+      }
       varbufaddstr(oemsgs," is not configured yet.\n");
       if (fc_depends) thisf= (dependtry >= 4) ? 2 : 1;
       debug(dbg_depcondetail,"      not configured/able - returning %d",thisf);
@@ -309,6 +318,10 @@ static int deppossi_ok_found(struct pkginfo *possdependee,
   default:
     varbufaddstr(oemsgs,"  Package ");
     varbufaddstr(oemsgs,possdependee->name);
+    if (providing) {
+      varbufaddstr(oemsgs," which provides ");
+      varbufaddstr(oemsgs,providing->name);
+    }
     varbufaddstr(oemsgs," is not installed.\n");
     if (fc_depends) thisf= (dependtry >= 4) ? 2 : 1;
     debug(dbg_depcondetail,"      not installed - returning %d",thisf);
@@ -341,7 +354,7 @@ int dependencies_ok(struct pkginfo *pkg, struct pkginfo *removing,
         debug(dbg_depcondetail,"      break cycle so ok and found");
         found= 3; break;
       }
-      thisf= deppossi_ok_found(possi->ed,pkg,removing,
+      thisf= deppossi_ok_found(possi->ed,pkg,removing,0,
                                &matched,possi,&interestingwarnings,&oemsgs);
       if (thisf > found) found= thisf;
       if (found != 3 && possi->verrel == dvr_none) {
@@ -351,7 +364,7 @@ int dependencies_ok(struct pkginfo *pkg, struct pkginfo *removing,
                provider= provider->nextrev) {
             if (provider->up->type != dep_provides) continue;
             debug(dbg_depcondetail,"     checking provider %s",provider->up->up->name);
-            thisf= deppossi_ok_found(provider->up->up,pkg,removing,
+            thisf= deppossi_ok_found(provider->up->up,pkg,removing,possi->ed,
                                      &matched,0,&interestingwarnings,&oemsgs);
             if (thisf > found) found= thisf;
           }
index 2df3d0d667aca2238a55df014c25cd15b051dfa9..4df46c3136c7416e1aaa734d772a703c8944f515 100644 (file)
@@ -793,22 +793,9 @@ void process_archive(const char *filename) {
       continue;
     }
     for (cfile= otherpkg->clientdata->files;
-         cfile;
-         cfile= cfile->next) {
-      if (!(cfile->namenode->flags & fnnf_new_inarchive)) break;
-      if (cfile->namenode->divert && cfile->namenode->divert->useinstead) {
-        /* If the file is a contended one and it's overridden by either the package
-         * we're considering disappearing or the package we're installing then
-         * they're not actually the same file, so we can't disappear the package.
-         */
-        divpkg= cfile->namenode->divert->pkg;
-        if (divpkg == pkg || divpkg == otherpkg) break;
-      }
-    }
-    if (cfile) {
-      debug(dbg_stupidlyverbose, "process_archive saved by `%s'",cfile->namenode->name);
-      continue;
-    }
+         cfile && !filesavespackage(cfile,otherpkg,pkg);
+         cfile= cfile->next);
+    if (cfile) continue;
 
     /* So dependency things will give right answers ... */
     otherpkg->clientdata->istobe= itb_remove; 
@@ -924,7 +911,7 @@ void process_archive(const char *filename) {
       } else {
         debug(dbg_eachfile,
               "process_archive looking for overwriting `%s' (overridden by %s)",
-              cfile->namenode->name, divpkg->name);
+              cfile->namenode->name, divpkg ? divpkg->name : "<local>");
       }        
     } else {
       divpkg= 0;
index 94199da8bfcfb05e6f93433ce406d70f0fec7520..87cfbecc4c7a475d01c72eb72ba31da4343aa8a6 100644 (file)
 #include "filesdb.h"
 #include "main.h"
 
+static void checkforremoval(struct pkginfo *pkgtoremove,
+                            struct pkginfo *pkgdepcheck, /* may be virtual pkg */
+                            int *rokp, struct varbuf *raemsgs) {
+  struct deppossi *possi;
+  struct pkginfo *depender;
+  int before, ok;
+  
+  for (possi= pkgdepcheck->installed.depended; possi; possi= possi->nextrev) {
+    if (possi->up->type != dep_depends && possi->up->type != dep_predepends) continue;
+    depender= possi->up->up;
+    debug(dbg_depcon,"checking depending package `%s'",depender->name);
+    if (depender->status != stat_installed) continue;
+    if (ignore_depends(depender)) {
+      debug(dbg_depcon,"ignoring depending package `%s'\n",depender->name);
+      continue;
+    }
+    if (dependtry > 1) { if (findbreakcycle(pkgdepcheck,0)) sincenothing= 0; }
+    before= raemsgs->used;
+    ok= dependencies_ok(depender,pkgtoremove,raemsgs);
+    if (ok == 0 && depender->clientdata->istobe == itb_remove) ok= 1;
+    if (ok == 1) raemsgs->used= before; /* Don't burble about reasons for deferral */
+    if (ok < *rokp) *rokp= ok;
+  }
+}
+
 void deferred_remove(struct pkginfo *pkg) {
   struct varbuf raemsgs;
-  int rok, before, ok;
-  struct deppossi *dep;
-  struct pkginfo *depender;
+  int rok;
+  struct dependency *dep;
 
   debug(dbg_general,"deferred_remove package %s",pkg->name);
   
@@ -77,22 +101,13 @@ void deferred_remove(struct pkginfo *pkg) {
   debug(dbg_general,"checking dependencies for remove `%s'",pkg->name);
   varbufinit(&raemsgs);
   rok= 2;
-  for (dep= pkg->installed.depended; dep; dep= dep->nextrev) {
-    if (dep->up->type != dep_depends && dep->up->type != dep_predepends) continue;
-    depender= dep->up->up;
-    debug(dbg_depcon,"checking depending package `%s'",depender->name);
-    if (depender->status != stat_installed) continue;
-    if (ignore_depends(depender)) {
-      debug(dbg_depcon,"ignoring depending package `%s'\n",depender->name);
-      continue;
-    }
-    if (dependtry > 1) { if (findbreakcycle(pkg,0)) sincenothing= 0; }
-    before= raemsgs.used;
-    ok= dependencies_ok(depender,pkg,&raemsgs);
-    if (ok == 0 && depender->clientdata->istobe == itb_remove) ok= 1;
-    if (ok == 1) raemsgs.used= before; /* Don't burble about reasons for deferral */
-    if (ok < rok) rok= ok;
+  checkforremoval(pkg,pkg,&rok,&raemsgs);
+  for (dep= pkg->installed.depends; dep; dep= dep->next) {
+    if (dep->type != dep_provides) continue;
+    debug(dbg_depcon,"checking virtual package `%s'",dep->list->ed->name);
+    checkforremoval(pkg,dep->list->ed,&rok,&raemsgs);
   }
+
   if (rok == 1) {
     varbuffree(&raemsgs);
     pkg->clientdata->istobe= itb_remove;
index b474feb8d4271c0d753443b9849ca06a60794492..f052b28176d4b229812d2b08dbbcb8fbec69ca1e 100644 (file)
@@ -3,11 +3,11 @@
 .\"
 .\" This is free software; see the GNU General Public Licence version 2
 .\" or later for copying conditions.  There is NO warranty.
-.TH dpkg-name 1 "January 1996" "Debian Project" "Debian GNU/Linux"
+.TH dpkg-name 1 "April 1996" "Debian Project" "Debian Linux"
 .SH NAME
 dpkg\-name \- rename Debian packages to full package names
 .SH SYNOPSIS
-.B dpkg\-name [\-h|\-\-help] [\-V|\-\-version] [\-L|\-\-license] [--] [files]
+.B dpkg\-name [\-h|\-\-help] [\-v|\-\-version] [\-l|\-\-license] [--] [files]
 .SH DESCRIPTION
 .PP
 This manual page documents the
@@ -15,12 +15,13 @@ This manual page documents the
 sh script which provides an easy way to rename
 .B Debian
 packages into their full package names. A full package name consists
-of <package>-<version>[-<revision>].deb as specified in the control
-file of the package.
+of <package>-<version>.<architecture>.deb as specified in the control
+file of the package (<version> is
+<mainstream-version>-<debian-revision>).
 .SH EXAMPLES
 .TP
 .B dpkg-name toedeledokie
-The file `toedeledokie' will be renamed to emacs-19.29-4.deb or
+The file `toedeledokie' will be renamed to emacs-19.29-4.i386.deb or
 something similar (depending on whatever information is in the control
 part of `toedeledokie').
 .TP
@@ -40,9 +41,9 @@ Print copyright information and (a reference to GNU) license
 information and exit successfully.
 .SH BUGS?
 Successfully tested on
-.B Debian GNU/Linux 
+.B Debian Linux 
 systems only. Some packages don't follow the name structure
-<package>-<version>[-<revision>].deb. Packages renamed by dpkg-name
+<package>-<version>.<architecture>.deb. Packages renamed by dpkg-name
 will follow this structure. Generally this will have no impact on how
 packages are installed by dselect/dpkg.
 .SH SEE ALSO
index 294010aa9aed8c619b8196d2bff2a86641feca6f..660d0c0f9cf33ec43d9ca956b6d15dee5e39f4cb 100755 (executable)
@@ -3,12 +3,12 @@
 set -e
 
 prog="`basename \"${0}\"`"
-version="0.11"; # This line modified by Makefile
+version="1.1.5"; # This line modified by Makefile
 purpose="rename Debian packages to full package names"
 
 license () {
 echo "# ${prog} ${version} -- ${purpose}
-# Copyright (C) 1995,1996 Erick Branderhorst <branderhorst@heel.fgg.eur.nl>.
+# Copyright (C) 1995,1996 Erick Branderhorst <branderh@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 the
@@ -32,7 +32,7 @@ show_version () {
 usage () {
        echo "Usage: ${prog} file[s]
   ${purpose}
-  file.deb changes to <package>-<version>[-<revision>].deb
+  file.deb changes to <package>-<version>.<architecture>.deb
   -h|--help|-v|--version|-l|--license  Show help/version/license"
 }
 
@@ -51,8 +51,14 @@ rename () {
                        then
                                p=$p-$r;
                        fi
-                       p=`echo $p|sed 's/ //g'`
-                       p=`dirname "$1"`"/"$p.deb       
+                       a=`dpkg-deb -f -- "$1" architecture`;
+                       if [ -z "$a" ];
+                       then
+                               a=`dpkg --print-architecture`;
+                               stderr "assuming "$a" architecture for \`"$1"'";
+                       fi                              
+                       p=`echo \"$p\"|tr -ds -- '- ' _`
+                       p=`dirname "$1"`"/"$p.$a.deb
                        if [ $p -ef "$1" ];                                                                     # same device and inode numbers
                        then
                                stderr "skipping \`"$1"'";
@@ -91,4 +97,3 @@ exit 0;
 # Local variables:
 # tab-width: 2
 # End:
-
index 2d88179823dd26ca8c40434c46fb941e353eeb46..2b976f4ffdf266aff80131f58877832cd9a06e0b 100644 (file)
@@ -118,6 +118,12 @@ replaced in situ with the new entry.
 
 If a section is specified when removing an entry the section is
 ignored and a warning is issued.
+
+If a section is requested when adding an entry but the file contains
+no section headings at all then
+.B install-info
+will create both the requested section and a Miscellaneous section at
+the end of the file.
 .TP
 .BI \-\-infodir= infodir
 Specifies that the
index 0455ab1a3fed9cfe9b3bf7cf6b508a89c269cdb8..6ca1566904eeade6997476709279a62703342157 100755 (executable)
@@ -216,6 +216,12 @@ eof(OLD) || &ulquit("$name: read $infodir/dir: $!\n");
 close(OLD) || &ulquit("$name: close $infodir/dir after read: $!\n");
 while ($work[$#work] !~ m/\S/) { $#work--; }
 
+do {
+    last if !@work;
+    $_= shift(@work);
+    push(@head,$_);
+} until (m/^\*\s*Menu:/i);
+
 if (!$remove) {
 
     for ($i=0; $i<=$#work; $i++) {
@@ -249,9 +255,15 @@ if (!$remove) {
         if ($mss < 0) {
             print "$name: creating new section \`$sectiontitle'\n" unless $quiet;
             for ($i= $#work; $i>=0 && $work[$i] =~ m/\S/; $i--) { }
-            $i >= 0 || &ulquit("$name: nowhere to create new section - giving up\n");
-            @work= (@work[0..$i], "$sectiontitle\n", "\n", @work[$i+1..$#work]);
-            $mss= $i+1;
+            if ($i <= 0) { # We ran off the top, make this section and Misc.
+                print "$name: no sections yet, creating Miscellaneous section too.\n"
+                    unless $quiet;
+                @work= ("\n", "$sectiontitle\n", "\n", "Miscellaneous:", @work);
+                $mss= 1;
+            } else {
+                @work= (@work[0..$i], "$sectiontitle\n", "\n", @work[$i+1..$#work]);
+                $mss= $i+1;
+            }
         }
         while ($mss <= $#work) {
             $work[$mss] =~ m/\S/ || last;
@@ -316,7 +328,7 @@ END
 
 if (!$nowrite) {
     open(NEW,"> $infodir/dir.new") || &ulquit("$name: create $infodir/dir.new: $!\n");
-    print(NEW @work) || &ulquit("$name: write $infodir/dir.new: $!\n");
+    print(NEW @head,@work) || &ulquit("$name: write $infodir/dir.new: $!\n");
     close(NEW) || &ulquit("$name: close $infodir/dir.new: $!\n");
 
     unlink("$infodir/dir.old");
index 8c7a769d891bdd323eb15718f2e5dcaa75cb96d3..f3d8a8408ccd1cf810f2b9572f21fbd9ab351e63 100644 (file)
--- a/version.h
+++ b/version.h
@@ -1 +1 @@
-#define DPKG_VERSION "1.1.5" /* This line modified by Makefile */
+#define DPKG_VERSION "1.1.6" /* This line modified by Makefile */