summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-07-22 12:33:45 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2016-07-22 16:05:09 +0200
commit503c7d594125f963b92047ad2d9d0644f39136c7 (patch)
tree36f0aebed7244ad138cd1705e80a8e05126c90a9
parenta913e64ead6ada2adae6fb5f35212187ad5acd01 (diff)
downloadapt-503c7d594125f963b92047ad2d9d0644f39136c7.tar.gz
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.cc54
-rw-r--r--apt-private/private-utils.cc8
-rw-r--r--apt-private/private-utils.h6
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