]> git.saurik.com Git - apt.git/commitdiff
apt-cdrom should succeed if any drive succeeds
authorJohn Ogness <john.ogness@linutronix.de>
Fri, 13 Dec 2013 19:59:31 +0000 (20:59 +0100)
committerDavid Kalnischkies <david@kalnischkies.de>
Wed, 12 Feb 2014 01:18:37 +0000 (02:18 +0100)
If there are multiple CD-ROM drives, `apt-cdrom add` will abort with an
error if any of the drives do not contain a Debian CD which is against
the documentation we have saying "a CD-ROM" and also scripts do not
expect it this way.

This patch modifies apt-cdrom to return success if any of the drives
succeeded. If failures occur, apt-cdrom will still continue trying all
the drives and report the last failure (if none of them succeeded).

The 'ident' command was also changed to match the new 'add' behavior.

Closes: 728153
apt-pkg/cdrom.cc
cmdline/apt-cdrom.cc

index a5668a50af55f8ff7538296ee8157d93323fa3b4..f577e3572ffc0515af190ddf15d7c478ffcea523 100644 (file)
@@ -577,8 +577,30 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log)           /*{{{*/
                      CDROM.c_str());
       log->Update(msg.str());
    }
-   if (MountCdrom(CDROM) == false)
-      return _error->Error("Failed to mount the cdrom.");
+
+   // Unmount the CD and get the user to put in the one they want
+   if (_config->FindB("APT::CDROM::NoMount",false) == false)
+   {
+      if(log != NULL)
+        log->Update(_("Unmounting CD-ROM\n"), STEP_UNMOUNT);
+      UnmountCdrom(CDROM);
+
+      if(log != NULL)
+      {
+        log->Update(_("Waiting for disc...\n"), STEP_WAIT);
+        if(!log->ChangeCdrom()) {
+           // user aborted
+           return false;
+        }
+      }
+
+      // Mount the new CDROM
+      if(log != NULL)
+        log->Update(_("Mounting CD-ROM...\n"), STEP_MOUNT);
+
+      if (MountCdrom(CDROM) == false)
+        return _error->Error("Failed to mount the cdrom.");
+   }
 
    // Hash the CD to get an ID
    if (log != NULL)
index 17a60ddcb38d597ec1a4ce35d9df9961acac7e52..20c6e889219d26d0b9ccc30b5f253d878ed414f4 100644 (file)
@@ -111,10 +111,12 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
 };
                                                                        /*}}}*/
 // SetupAutoDetect                                                     /*{{{*/
-bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
+bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i, bool &automounted)
 {
    bool Debug =  _config->FindB("Debug::Acquire::cdrom", false);
 
+   automounted = false;
+
    vector<struct CdromDevice> v = UdevCdroms.Scan();
    if (i >= v.size())
       return false;
@@ -137,6 +139,8 @@ bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
         mkdir(AptMountPoint.c_str(), 0750);
       if(MountCdrom(AptMountPoint, v[i].DeviceName) == false)
         _error->Warning(_("Failed to mount '%s' to '%s'"), v[i].DeviceName.c_str(), AptMountPoint.c_str());
+      else
+        automounted = true;
       _config->Set("Acquire::cdrom::mount", AptMountPoint);
       _config->Set("APT::CDROM::NoMount", true);
    }
@@ -160,17 +164,35 @@ bool DoAdd(CommandLine &)
 
    bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
    unsigned int count = 0;
+   string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
+   bool automounted = false;
    if (AutoDetect && UdevCdroms.Dlopen())
-      while (AutoDetectCdrom(UdevCdroms, count))
-        res &= cdrom.Add(&log);
-   if (count == 0) {
-      res = cdrom.Add(&log);
-      if (res == false) {
-         _error->Error("%s", _(W_NO_CDROM_FOUND));
+      while (AutoDetectCdrom(UdevCdroms, count, automounted)) {
+        if (count == 1) {
+           // begin loop with res false to detect any success using OR
+           res = false;
+        }
+
+        // dump any warnings/errors from autodetect
+        if (_error->empty() == false)
+           _error->DumpErrors();
+
+        res |= cdrom.Add(&log);
+
+        if (automounted)
+           UnmountCdrom(AptMountPoint);
+
+        // dump any warnings/errors from add/unmount
+        if (_error->empty() == false)
+           _error->DumpErrors();
       }
-   }
 
-   if(res)
+   if (count == 0)
+      res = cdrom.Add(&log);
+
+   if (res == false)
+      _error->Error("%s", _(W_NO_CDROM_FOUND));
+   else
       cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
 
    return res;
@@ -187,18 +209,38 @@ bool DoIdent(CommandLine &)
    pkgCdrom cdrom;
    bool res = true;
 
-   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
 
    unsigned int count = 0;
+   string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
+   bool automounted = false;
    if (AutoDetect && UdevCdroms.Dlopen())
-      while (AutoDetectCdrom(UdevCdroms, count))
-        res &= cdrom.Ident(ident, &log);
-   if (count == 0) {
-      res = cdrom.Ident(ident, &log);
-      if (res == false) {
-         _error->Error("%s", _(W_NO_CDROM_FOUND));
+      while (AutoDetectCdrom(UdevCdroms, count, automounted)) {
+        if (count == 1) {
+           // begin loop with res false to detect any success using OR
+           res = false;
+        }
+
+        // dump any warnings/errors from autodetect
+        if (_error->empty() == false)
+           _error->DumpErrors();
+
+        res |= cdrom.Ident(ident, &log);
+
+        if (automounted)
+           UnmountCdrom(AptMountPoint);
+
+        // dump any warnings/errors from add/unmount
+        if (_error->empty() == false)
+           _error->DumpErrors();
       }
-   }
+
+   if (count == 0)
+      res = cdrom.Ident(ident, &log);
+
+   if (res == false)
+      _error->Error("%s", _(W_NO_CDROM_FOUND));
+
    return res;
 }
                                                                        /*}}}*/