Explorar el Código

report warnings&errors consistently in edit-sources

After editing the sources it is a good idea to (re)built the caches as
they will be out-of-date and doing so helps in reporting higherlevel
errors like duplicates sources.list entries, too, instead of just
general parsing errors as before.
David Kalnischkies hace 10 años
padre
commit
503c7d5941
Se han modificado 3 ficheros con 42 adiciones y 26 borrados
  1. 36 18
      apt-private/private-sources.cc
  2. 4 4
      apt-private/private-utils.cc
  3. 2 4
      apt-private/private-utils.h

+ 36 - 18
apt-private/private-sources.cc

@@ -7,6 +7,7 @@
 #include <apt-pkg/cmndline.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/fileutl.h>
+#include <apt-pkg/cachefile.h>
 
 #include <apt-private/private-output.h>
 #include <apt-private/private-sources.h>
@@ -20,17 +21,19 @@
 #include <apti18n.h>
 
 /* Interface discussion with donkult (for the future):
-  apt [add-{archive,release,component}|edit|change-release|disable]-sources 
+  apt [add-{archive,release,component}|edit|change-release|disable]-sources
  and be clever and work out stuff from the Release file
 */
 
-// EditSource - EditSourcesList         			        /*{{{*/
-// ---------------------------------------------------------------------
+// EditSource - EditSourcesList						/*{{{*/
+class APT_HIDDEN ScopedGetLock {
+public:
+   int fd;
+   ScopedGetLock(std::string const &filename) : fd(GetLock(filename)) {}
+   ~ScopedGetLock() { close(fd); }
+};
 bool EditSources(CommandLine &CmdL)
 {
-   bool res;
-   pkgSourceList sl;
-
    std::string sourceslist;
    if (CmdL.FileList[1] != NULL)
    {
@@ -44,30 +47,45 @@ bool EditSources(CommandLine &CmdL)
    if (FileExists(sourceslist))
        before.FromFile(sourceslist);
 
-   int lockfd = GetLock(sourceslist);
-   if (lockfd < 0)
+   ScopedGetLock lock(sourceslist);
+   if (lock.fd < 0)
       return false;
 
+   bool res;
+   bool file_changed = false;
    do {
-      EditFileInSensibleEditor(sourceslist);
-      _error->PushToStack();
-      res = sl.Read(sourceslist);
-      if (!res) {
+      if (EditFileInSensibleEditor(sourceslist) == false)
+	 return false;
+      if (FileExists(sourceslist) && !before.VerifyFile(sourceslist))
+      {
+	 file_changed = true;
+	 pkgCacheFile::RemoveCaches();
+      }
+      pkgCacheFile CacheFile;
+      res = CacheFile.BuildCaches(nullptr);
+      if (res == false || _error->empty(GlobalError::WARNING) == false) {
 	 std::string outs;
 	 strprintf(outs, _("Failed to parse %s. Edit again? "), sourceslist.c_str());
          // FIXME: should we add a "restore previous" option here?
-         res = !YnPrompt(outs.c_str(), true);
+         if (YnPrompt(outs.c_str(), true) == false)
+	 {
+	    if (res == false && _error->PendingError() == false)
+	    {
+	       CacheFile.Close();
+	       pkgCacheFile::RemoveCaches();
+	       res = CacheFile.BuildCaches(nullptr);
+	    }
+	    break;
+	 }
       }
-      _error->RevertToStack();
    } while (res == false);
-   close(lockfd);
 
-   if (FileExists(sourceslist) && !before.VerifyFile(sourceslist)) {
+   if (res == true && file_changed == true)
+   {
       ioprintf(
          std::cout, _("Your '%s' file changed, please run 'apt-get update'."),
          sourceslist.c_str());
    }
-
-   return true;
+   return res;
 }
 									/*}}}*/

+ 4 - 4
apt-private/private-utils.cc

@@ -9,7 +9,7 @@
 #include <unistd.h>
 
 // DisplayFileInPager - Display File with pager				/*{{{*/
-void DisplayFileInPager(std::string const &filename)
+bool DisplayFileInPager(std::string const &filename)
 {
    pid_t Process = ExecFork();
    if (Process == 0)
@@ -39,11 +39,11 @@ void DisplayFileInPager(std::string const &filename)
    }
 
    // Wait for the subprocess
-   ExecWait(Process, "pager", false);
+   return ExecWait(Process, "pager", false);
 }
 									/*}}}*/
 // EditFileInSensibleEditor - Edit File with editor			/*{{{*/
-void EditFileInSensibleEditor(std::string const &filename)
+bool EditFileInSensibleEditor(std::string const &filename)
 {
    pid_t Process = ExecFork();
    if (Process == 0)
@@ -71,6 +71,6 @@ void EditFileInSensibleEditor(std::string const &filename)
    }
 
    // Wait for the subprocess
-   ExecWait(Process, "editor", false);
+   return ExecWait(Process, "editor", false);
 }
 									/*}}}*/

+ 2 - 4
apt-private/private-utils.h

@@ -1,11 +1,9 @@
 #ifndef APT_PRIVATE_UTILS_H
 #define APT_PRIVATE_UTILS_H
 
-#include <apt-pkg/macros.h>
-
 #include <string>
 
-APT_PUBLIC void DisplayFileInPager(std::string const &filename);
-APT_PUBLIC void EditFileInSensibleEditor(std::string const &filename);
+bool DisplayFileInPager(std::string const &filename);
+bool EditFileInSensibleEditor(std::string const &filename);
 
 #endif