diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-07-22 12:33:45 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2016-07-22 16:05:09 +0200 |
commit | 503c7d594125f963b92047ad2d9d0644f39136c7 (patch) | |
tree | 36f0aebed7244ad138cd1705e80a8e05126c90a9 | |
parent | a913e64ead6ada2adae6fb5f35212187ad5acd01 (diff) |
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.
-rw-r--r-- | apt-private/private-sources.cc | 54 | ||||
-rw-r--r-- | apt-private/private-utils.cc | 8 | ||||
-rw-r--r-- | apt-private/private-utils.h | 6 |
3 files changed, 42 insertions, 26 deletions
diff --git a/apt-private/private-sources.cc b/apt-private/private-sources.cc index 5f61a23ab..7e64d5d7f 100644 --- a/apt-private/private-sources.cc +++ b/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; } /*}}}*/ diff --git a/apt-private/private-utils.cc b/apt-private/private-utils.cc index 34af83c08..775bf7e79 100644 --- a/apt-private/private-utils.cc +++ b/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); } /*}}}*/ diff --git a/apt-private/private-utils.h b/apt-private/private-utils.h index 8ba480bd4..b3b249689 100644 --- a/apt-private/private-utils.h +++ b/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 |