From 503c7d594125f963b92047ad2d9d0644f39136c7 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 22 Jul 2016 12:33:45 +0200 Subject: 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. --- apt-private/private-sources.cc | 54 ++++++++++++++++++++++++++++-------------- apt-private/private-utils.cc | 8 +++---- apt-private/private-utils.h | 6 ++--- 3 files changed, 42 insertions(+), 26 deletions(-) (limited to 'apt-private') 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 #include #include +#include #include #include @@ -20,17 +21,19 @@ #include /* 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 // 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 - #include -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 -- cgit v1.2.3