Просмотр исходного кода

remove code duplication for Add & Ident in apt-cdrom

The preparation code to deal with auto-detection and co is the same for
both methods, so not sharing them would be bad. Deals also with the
prevention of side effects triggered by the auto-detection like
disabling mounting for the fallback.

Git-Dch: Ignore
David Kalnischkies лет назад: 12
Родитель
Сommit
b5ee78aec0
1 измененных файлов с 81 добавлено и 121 удалено
  1. 81 121
      cmdline/apt-cdrom.cc

+ 81 - 121
cmdline/apt-cdrom.cc

@@ -34,12 +34,6 @@
 
 
 #include <apti18n.h>
 #include <apti18n.h>
 									/*}}}*/
 									/*}}}*/
-static const char *W_NO_CDROM_FOUND = \
-   N_("No CD-ROM could be auto-detected or found using "
-      "the default mount point.\n"
-      "You may try the --cdrom option to set the CD-ROM mount point. "
-      "See 'man apt-cdrom' for more "
-      "information about the CD-ROM auto-detection and mount point.");
 
 
 using namespace std;
 using namespace std;
 
 
@@ -103,143 +97,111 @@ APT_CONST OpProgress* pkgCdromTextStatus::GetOpProgress()
    return &Progress;
    return &Progress;
 }
 }
 									/*}}}*/
 									/*}}}*/
-// SetupAutoDetect       						/*{{{*/
-static bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i, bool &automounted)
+// AddOrIdent - Add or Ident a CDROM					/*{{{*/
+static bool AddOrIdent(bool const Add)
 {
 {
-   bool Debug =  _config->FindB("Debug::Acquire::cdrom", false);
+   pkgUdevCdromDevices UdevCdroms;
+   pkgCdromTextStatus log;
+   pkgCdrom cdrom;
 
 
-   automounted = false;
+   bool oneSuccessful = false;
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
+   if (AutoDetect == true && UdevCdroms.Dlopen() == true)
+   {
+      bool const Debug = _config->FindB("Debug::Acquire::cdrom", false);
+      std::string const CDMount = _config->Find("Acquire::cdrom::mount");
+      bool const NoMount = _config->FindB("APT::CDROM::NoMount", false);
+      if (NoMount == false)
+	 _config->Set("APT::CDROM::NoMount", true);
+
+      vector<struct CdromDevice> const v = UdevCdroms.Scan();
+      for (std::vector<struct CdromDevice>::const_iterator cd = v.begin(); cd != v.end(); ++cd)
+      {
+	 if (Debug)
+	    clog << "Looking at device:"
+	       << "\tDeviveName: '" << cd->DeviceName << "'"
+	       << "\tIsMounted: '" << cd->Mounted << "'"
+	       << "\tMountPoint: '" << cd->MountPath << "'"
+	       << endl;
+
+	 std::string AptMountPoint;
+	 if (cd->Mounted)
+	    _config->Set("Acquire::cdrom::mount", cd->MountPath);
+	 else if (NoMount == true)
+	    continue;
+	 else
+	 {
+	    AptMountPoint = _config->FindDir("Dir::Media::MountPath");
+	    if (FileExists(AptMountPoint) == false)
+	       mkdir(AptMountPoint.c_str(), 0750);
+	    if(MountCdrom(AptMountPoint, cd->DeviceName) == false)
+	    {
+	       _error->Warning(_("Failed to mount '%s' to '%s'"), cd->DeviceName.c_str(), AptMountPoint.c_str());
+	       continue;
+	    }
+	    _config->Set("Acquire::cdrom::mount", AptMountPoint);
+	 }
 
 
-   vector<struct CdromDevice> v = UdevCdroms.Scan();
-   if (i >= v.size())
-      return false;
+	 _error->PushToStack();
+	 if (Add == true)
+	    oneSuccessful = cdrom.Add(&log);
+	 else
+	 {
+	    std::string id;
+	    oneSuccessful = cdrom.Ident(id, &log);
+	 }
+	 _error->MergeWithStack();
 
 
-   if (Debug)
-      clog << "Looking at devce " << i
-	   << " DeviveName: " << v[i].DeviceName 
-	   << " IsMounted: '" << v[i].Mounted << "'"
-	   << " MountPoint: '" << v[i].MountPath << "'"
-	   << endl;
+	 if (AptMountPoint.empty() == false)
+	    UnmountCdrom(AptMountPoint);
+      }
+      if (NoMount == false)
+	 _config->Set("APT::CDROM::NoMount", NoMount);
+      _config->Set("Acquire::cdrom::mount", CDMount);
+   }
 
 
-   if (v[i].Mounted)
+   // fallback if auto-detect didn't work
+   if (oneSuccessful == false)
    {
    {
-      // set the right options
-      _config->Set("Acquire::cdrom::mount", v[i].MountPath);
-      _config->Set("APT::CDROM::NoMount", true);
-   } else {
-      string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
-      if (!FileExists(AptMountPoint))
-	 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());
+      _error->PushToStack();
+      if (Add == true)
+	 oneSuccessful = cdrom.Add(&log);
       else
       else
-	 automounted = true;
-      _config->Set("Acquire::cdrom::mount", AptMountPoint);
-      _config->Set("APT::CDROM::NoMount", true);
+      {
+	 std::string id;
+	 oneSuccessful = cdrom.Ident(id, &log);
+      }
+      _error->MergeWithStack();
    }
    }
-   i++;
 
 
-   return true;
+   if (oneSuccessful == false)
+      _error->Error("%s", _("No CD-ROM could be auto-detected or found using the default mount point.\n"
+      "You may try the --cdrom option to set the CD-ROM mount point.\n"
+      "See 'man apt-cdrom' for more information about the CD-ROM auto-detection and mount point."));
+   else if (Add == true)
+      cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
+
+   return oneSuccessful;
 }
 }
 									/*}}}*/
 									/*}}}*/
 // DoAdd - Add a new CDROM						/*{{{*/
 // DoAdd - Add a new CDROM						/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* This does the main add bit.. We show some status and things. The
 /* This does the main add bit.. We show some status and things. The
-   sequence is to mount/umount the CD, Ident it then scan it for package 
+   sequence is to mount/umount the CD, Ident it then scan it for package
    files and reduce that list. Then we copy over the package files and
    files and reduce that list. Then we copy over the package files and
    verify them. Then rewrite the database files */
    verify them. Then rewrite the database files */
 static bool DoAdd(CommandLine &)
 static bool DoAdd(CommandLine &)
 {
 {
-   pkgUdevCdromDevices UdevCdroms;
-   pkgCdromTextStatus log;
-   pkgCdrom cdrom;
-   bool res = true;
-
-   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, 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 (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;
+   return AddOrIdent(true);
 }
 }
 									/*}}}*/
 									/*}}}*/
 // DoIdent - Ident a CDROM						/*{{{*/
 // DoIdent - Ident a CDROM						/*{{{*/
-// ---------------------------------------------------------------------
-/* */
 static bool DoIdent(CommandLine &)
 static bool DoIdent(CommandLine &)
 {
 {
-   pkgUdevCdromDevices UdevCdroms;
-   string ident;
-   pkgCdromTextStatus log;
-   pkgCdrom cdrom;
-   bool res = true;
-
-   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, 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;
+   return AddOrIdent(false);
 }
 }
 									/*}}}*/
 									/*}}}*/
 // ShowHelp - Show the help screen					/*{{{*/
 // ShowHelp - Show the help screen					/*{{{*/
-// ---------------------------------------------------------------------
-/* */
 static bool ShowHelp(CommandLine &)
 static bool ShowHelp(CommandLine &)
 {
 {
    ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
    ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
@@ -306,14 +268,12 @@ int main(int argc,const char *argv[])					/*{{{*/
       _config->Set("quiet","1");
       _config->Set("quiet","1");
    
    
    // Match the operation
    // Match the operation
-   CmdL.DispatchArg(Cmds);
+   bool returned = CmdL.DispatchArg(Cmds);
 
 
-   // Print any errors or warnings found during parsing
-   bool const Errors = _error->PendingError();
    if (_config->FindI("quiet",0) > 0)
    if (_config->FindI("quiet",0) > 0)
       _error->DumpErrors();
       _error->DumpErrors();
    else
    else
       _error->DumpErrors(GlobalError::DEBUG);
       _error->DumpErrors(GlobalError::DEBUG);
-   return Errors == true ? 100 : 0;
+   return returned == true ? 0 : 100;
 }
 }
 									/*}}}*/
 									/*}}}*/