]> git.saurik.com Git - apt.git/commitdiff
report warnings&errors consistently in edit-sources
authorDavid Kalnischkies <david@kalnischkies.de>
Fri, 22 Jul 2016 10:33:45 +0000 (12:33 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Fri, 22 Jul 2016 14:05:09 +0000 (16:05 +0200)
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.

apt-private/private-sources.cc
apt-private/private-utils.cc
apt-private/private-utils.h

index 5f61a23abff1a74234a7374c2bbc93cf685be8a0..7e64d5d7f4e001c00a445f57d3c1a53c6abf24ea 100644 (file)
@@ -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>
 #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;
 }
                                                                        /*}}}*/
index 34af83c0858afca0008b2091a453ab980aa105c9..775bf7e799331e3d287f476474531793c26b5539 100644 (file)
@@ -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);
 }
                                                                        /*}}}*/
index 8ba480bd4030b1d6d3109d516ccdba1c52cce4ba..b3b2496898d6c3d1e80bfd6b1a6950246cf318d9 100644 (file)
@@ -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