Browse Source

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.
tags/debian/1.3_pre3
David Kalnischkies 5 years ago
parent
commit
503c7d5941
3 changed files with 42 additions and 26 deletions
  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 View 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>
@@ -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 View 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);
}
/*}}}*/

+ 2
- 4
apt-private/private-utils.h View 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

Loading…
Cancel
Save