Author: kensmith
Date: Sat Oct 25 01:21:28 2008
New Revision: 184237
URL: http://svn.freebsd.org/changeset/base/184237

Log:
  MFS r184232:
  
  > MFC r183921 and r184180
  > When we notice the INDEX had volume numbers (so the media the packages
  > are coming from has multiple volumes) walk through the dependency tree
  > for the packages selected by the user once for each volume, only
  > installing packages on the current volume.  If we can't install the
  > package because its on a higher volume just note that we have looked
  > at it during the pass for this volume to cut down on time spent checking
  > dependencies.  This stops the excessive disc swapping that users have
  > complained (a lot...) about.
  
  Approved by:    re (kib)

Modified:
  stable/6/usr.sbin/sysinstall/   (props changed)
  stable/6/usr.sbin/sysinstall/config.c
  stable/6/usr.sbin/sysinstall/globals.c
  stable/6/usr.sbin/sysinstall/index.c
  stable/6/usr.sbin/sysinstall/package.c
  stable/6/usr.sbin/sysinstall/sysinstall.h

Modified: stable/6/usr.sbin/sysinstall/config.c
==============================================================================
--- stable/6/usr.sbin/sysinstall/config.c       Sat Oct 25 00:28:24 2008        
(r184236)
+++ stable/6/usr.sbin/sysinstall/config.c       Sat Oct 25 01:21:28 2008        
(r184237)
@@ -785,6 +785,7 @@ configPackages(dialogMenuItem *self)
 
     while (1) {
        int ret, pos, scroll;
+       int current, low, high;
 
        /* Bring up the packages menu */
        pos = scroll = 0;
@@ -799,8 +800,14 @@ configPackages(dialogMenuItem *self)
            else if (DITEM_STATUS(ret) != DITEM_FAILURE) {
                dialog_clear();
                restoreflag = 1;
-               for (tmp = Plist.kids; tmp && tmp->name; tmp = tmp->next)
-                   (void)index_extract(mediaDevice, &Top, tmp, FALSE);
+               if (have_volumes) {
+                   low = low_volume;
+                   high = high_volume;
+               } else
+                   low = high = 0;
+               for (current = low; current <= high; current++)
+                   for (tmp = Plist.kids; tmp && tmp->name; tmp = tmp->next)
+                       (void)index_extract(mediaDevice, &Top, tmp, FALSE, 
current);
                break;
            }
        }

Modified: stable/6/usr.sbin/sysinstall/globals.c
==============================================================================
--- stable/6/usr.sbin/sysinstall/globals.c      Sat Oct 25 00:28:24 2008        
(r184236)
+++ stable/6/usr.sbin/sysinstall/globals.c      Sat Oct 25 01:21:28 2008        
(r184237)
@@ -48,10 +48,13 @@ Boolean             DialogActive;   /* Is libdialog i
 Boolean                ColorDisplay;   /* Are we on a color display? */
 Boolean                OnVTY;          /* Are we on a VTY? */
 Boolean                Restarting;     /* Are we restarting sysinstall? */
+Boolean                have_volumes;   /* Media has more than one volume. */
 Variable       *VarHead;       /* The head of the variable chain */
 Device         *mediaDevice;   /* Where we're installing from */
 int            BootMgr;        /* Which boot manager we're using */
 int            StatusLine;     /* Where to stick our status messages */
+int            low_volume;     /* Lowest volume number */
+int            high_volume;    /* Highest volume number */
 jmp_buf                BailOut;        /* Beam me up, scotty! The natives are 
pissed! */
 
 Chunk          *HomeChunk;

Modified: stable/6/usr.sbin/sysinstall/index.c
==============================================================================
--- stable/6/usr.sbin/sysinstall/index.c        Sat Oct 25 00:28:24 2008        
(r184236)
+++ stable/6/usr.sbin/sysinstall/index.c        Sat Oct 25 01:21:28 2008        
(r184237)
@@ -225,7 +225,17 @@ new_index(char *name, char *pathto, char
     tmp->deps =                _strdup(deps);
     tmp->depc =                0;
     tmp->installed =   package_installed(name);
+    tmp->vol_checked = 0;
     tmp->volume =      volume;
+    if (volume != 0) {
+       have_volumes = TRUE;
+       if (low_volume == 0)
+           low_volume = volume;
+       else if (low_volume > volume)
+           low_volume = volume;
+       if (high_volume < volume)
+           high_volume = volume;
+    }
     return tmp;
 }
 
@@ -681,9 +691,11 @@ recycle:
 }
 
 int
-index_extract(Device *dev, PkgNodePtr top, PkgNodePtr who, Boolean depended)
+index_extract(Device *dev, PkgNodePtr top, PkgNodePtr who, Boolean depended,
+    int current_volume)
 {
     int status = DITEM_SUCCESS;
+    Boolean notyet = FALSE;
     PkgNodePtr tmp2;
     IndexEntryPtr id = who->data;
     WINDOW *w;
@@ -698,7 +710,7 @@ index_extract(Device *dev, PkgNodePtr to
      * a certain faulty INDEX file. 
      */
 
-    if (id->installed == 1)
+    if (id->installed == 1 || (have_volumes && id->vol_checked == 
current_volume))
        return DITEM_SUCCESS;
 
     w = savescr();
@@ -711,9 +723,13 @@ index_extract(Device *dev, PkgNodePtr to
            if ((cp2 = index(cp, ' ')) != NULL)
                *cp2 = '\0';
            if ((tmp2 = index_search(top, cp, NULL)) != NULL) {
-               status = index_extract(dev, top, tmp2, TRUE);
+               status = index_extract(dev, top, tmp2, TRUE, current_volume);
                if (DITEM_STATUS(status) != DITEM_SUCCESS) {
-                   if (variable_get(VAR_NO_CONFIRM))
+                   /* package probably on a future disc volume */
+                   if (status & DITEM_CONTINUE) {
+                       status = DITEM_SUCCESS;
+                       notyet = TRUE;
+                   } else if (variable_get(VAR_NO_CONFIRM))
                        msgNotify("Loading of dependent package %s failed", cp);
                    else
                        msgConfirm("Loading of dependent package %s failed", 
cp);
@@ -731,10 +747,38 @@ index_extract(Device *dev, PkgNodePtr to
                cp = NULL;
        }
     }
-    /* Done with the deps?  Load the real m'coy */
+
+    /*
+     * If iterating through disc volumes one at a time indicate failure if
+     * dependency install failed due to package being on a higher volume
+     * numbered disc, but that we should continue anyway.  Note that this
+     * package has already been processed for this disc volume so we don't
+     * need to do it again.
+     */
+
+    if (notyet) {
+       restorescr(w);
+       id->vol_checked = current_volume;
+       return DITEM_FAILURE | DITEM_CONTINUE;
+    }
+
+    /*
+     * Done with the deps?  Try to load the real m'coy.  If iterating
+     * through a multi-volume disc set fail the install if the package
+     * is on a higher numbered volume to cut down on disc switches the
+     * user needs to do, but indicate caller should continue processing
+     * despite error return.  Note this package was processed for the
+     * current disc being checked.
+     */
+
     if (DITEM_STATUS(status) == DITEM_SUCCESS) {
        /* Prompt user if the package is not available on the current volume. */
        if(mediaDevice->type == DEVICE_TYPE_CDROM) {
+           if (current_volume != 0 && id->volume > current_volume) {
+               restorescr(w);
+               id->vol_checked = current_volume;
+               return DITEM_FAILURE | DITEM_CONTINUE;
+           }
            while (id->volume != dev->volume) {
                if (!msgYesNo("This is disc #%d.  Package %s is on disc #%d\n"
                          "Would you like to switch discs now?\n", dev->volume,
@@ -800,6 +844,8 @@ index_initialize(char *path)
     if (!index_initted) {
        w = savescr();
        dialog_clear_norefresh();
+       have_volumes = FALSE;
+       low_volume = high_volume = 0;
 
        /* Got any media? */
        if (!mediaVerify()) {

Modified: stable/6/usr.sbin/sysinstall/package.c
==============================================================================
--- stable/6/usr.sbin/sysinstall/package.c      Sat Oct 25 00:28:24 2008        
(r184236)
+++ stable/6/usr.sbin/sysinstall/package.c      Sat Oct 25 01:21:28 2008        
(r184237)
@@ -55,7 +55,7 @@ int
 package_add(char *name)
 {
     PkgNodePtr tmp;
-    int i;
+    int i, current, low, high;
 
     if (!mediaVerify())
        return DITEM_FAILURE;
@@ -68,9 +68,16 @@ package_add(char *name)
        return i;
 
     tmp = index_search(&Top, name, &tmp);
-    if (tmp)
-       return index_extract(mediaDevice, &Top, tmp, FALSE);
-    else {
+    if (tmp) {
+       if (have_volumes) {
+           low = low_volume;
+           high = high_volume;
+       } else
+           low = high = 0;
+       for (current = low; current <= high; current++)
+           i = index_extract(mediaDevice, &Top, tmp, FALSE, current);
+       return i;
+    } else {
        msgConfirm("Sorry, package %s was not found in the INDEX.", name);
        return DITEM_FAILURE;
     }

Modified: stable/6/usr.sbin/sysinstall/sysinstall.h
==============================================================================
--- stable/6/usr.sbin/sysinstall/sysinstall.h   Sat Oct 25 00:28:24 2008        
(r184236)
+++ stable/6/usr.sbin/sysinstall/sysinstall.h   Sat Oct 25 01:21:28 2008        
(r184237)
@@ -383,6 +383,7 @@ typedef struct _indexEntry {        /* A single
     char *deps;                        /* packages this depends on     */
     int  depc;                 /* how many depend on me        */
     int  installed;            /* indicates if it is installed */
+    int  vol_checked;          /* disc volume last checked for */
     char *maintainer;          /* maintainer                   */
     unsigned int volume;       /* Volume of package            */
 } IndexEntry;
@@ -415,6 +416,7 @@ extern Boolean              RunningAsInit;          /* Are w
 extern Boolean         DialogActive;           /* Is the dialog() stuff up?    
                */
 extern Boolean         ColorDisplay;           /* Are we on a color display?   
                */
 extern Boolean         OnVTY;                  /* On a syscons VTY?            
                */
+extern Boolean         have_volumes;           /* Media has multiple volumes   
                */
 extern Variable                *VarHead;               /* The head of the 
variable chain               */
 extern Device          *mediaDevice;           /* Where we're getting our 
distribution from    */
 extern unsigned int    Dists;                  /* Which distributions we want  
                */
@@ -477,6 +479,8 @@ extern DMenu                MenuFixit;              /* 
Fixit flopp
 extern int              FixItMode;              /* FixItMode starts shell onc 
urrent device (ie Serial port) */
 extern const char *    StartName;              /* Which name we were started 
as */
 extern int             NCpus;                  /* # cpus on machine */
+extern int             low_volume;             /* Lowest volume number */
+extern int             high_volume;            /* Highest volume number */
 
 /* Important chunks. */
 extern Chunk *HomeChunk;
@@ -668,7 +672,7 @@ void                index_init(PkgNodePtr top, PkgNode
 void           index_node_free(PkgNodePtr top, PkgNodePtr plist);
 void           index_sort(PkgNodePtr top);
 void           index_print(PkgNodePtr top, int level);
-int            index_extract(Device *dev, PkgNodePtr top, PkgNodePtr who, 
Boolean depended);
+int            index_extract(Device *dev, PkgNodePtr top, PkgNodePtr who, 
Boolean depended, int current_volume);
 int            index_initialize(char *path);
 PkgNodePtr     index_search(PkgNodePtr top, char *str, PkgNodePtr *tp);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to