From cfacba5230f2e6bb88a1949505843ac22ed342d5 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 25 Nov 2013 08:36:57 +0100 Subject: add basic "edit-sources" command --- apt-private/makefile | 2 +- apt-private/private-utils.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++ apt-private/private-utils.h | 11 ++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 apt-private/private-utils.cc create mode 100644 apt-private/private-utils.h (limited to 'apt-private') diff --git a/apt-private/makefile b/apt-private/makefile index 1d179f0b2..b3d764097 100644 --- a/apt-private/makefile +++ b/apt-private/makefile @@ -17,7 +17,7 @@ MAJOR=0.0 MINOR=0 SLIBS=$(PTHREADLIB) -lapt-pkg -PRIVATES=list install download output cachefile cacheset update upgrade cmndline moo search show main +PRIVATES=list install download output cachefile cacheset update upgrade cmndline moo search show main utils SOURCE += $(foreach private, $(PRIVATES), private-$(private).cc) HEADERS += $(foreach private, $(PRIVATES), private-$(private).h) diff --git a/apt-private/private-utils.cc b/apt-private/private-utils.cc new file mode 100644 index 000000000..813f19329 --- /dev/null +++ b/apt-private/private-utils.cc @@ -0,0 +1,50 @@ +#include + +#include +#include +#include "private-utils.h" + + +// DisplayFileInPager - Display File with pager /*{{{*/ +void DisplayFileInPager(std::string filename) +{ + std::string pager = _config->Find("Dir::Bin::Pager", + "/usr/bin/sensible-pager"); + + pid_t Process = ExecFork(); + if (Process == 0) + { + const char *Args[3]; + Args[0] = pager.c_str(); + Args[1] = filename.c_str(); + Args[2] = 0; + execvp(Args[0],(char **)Args); + exit(100); + } + + // Wait for the subprocess + ExecWait(Process, "sensible-pager", false); +} + /*}}}*/ + +// EditFileInSensibleEditor - Edit File with editor /*{{{*/ +void EditFileInSensibleEditor(std::string filename) +{ + std::string editor = _config->Find("Dir::Bin::Editor", + "/usr/bin/sensible-editor"); + + pid_t Process = ExecFork(); + if (Process == 0) + { + const char *Args[3]; + Args[0] = editor.c_str(); + Args[1] = filename.c_str(); + Args[2] = 0; + execvp(Args[0],(char **)Args); + exit(100); + } + + // Wait for the subprocess + ExecWait(Process, "sensible-editor", false); +} + /*}}}*/ diff --git a/apt-private/private-utils.h b/apt-private/private-utils.h new file mode 100644 index 000000000..258dd06a8 --- /dev/null +++ b/apt-private/private-utils.h @@ -0,0 +1,11 @@ +#ifndef APT_PRIVATE_UTILS_H +#define APT_PRIVATE_UTILS_H + +#include + +void DisplayFileInPager(std::string filename); +void EditFileInSensibleEditor(std::string filename); + + + +#endif -- cgit v1.2.3-70-g09d2 From 500347df3c544b1633215477d485d43103732743 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 25 Nov 2013 16:35:02 +0100 Subject: do not show summary in "apt list" --- apt-private/private-list.cc | 2 +- apt-private/private-output.cc | 12 ++++++++---- apt-private/private-output.h | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) (limited to 'apt-private') diff --git a/apt-private/private-list.cc b/apt-private/private-list.cc index 8c61fcae8..6993cd797 100644 --- a/apt-private/private-list.cc +++ b/apt-private/private-list.cc @@ -149,7 +149,7 @@ bool List(CommandLine &Cmd) output_map.insert(std::make_pair( V.ParentPkg().Name(), outs.str())); } else { - ListSingleVersion(CacheFile, records, V, outs); + ListSingleVersion(CacheFile, records, V, outs, false); output_map.insert(std::make_pair( V.ParentPkg().Name(), outs.str())); } diff --git a/apt-private/private-output.cc b/apt-private/private-output.cc index 6fadf7274..91d13f31b 100644 --- a/apt-private/private-output.cc +++ b/apt-private/private-output.cc @@ -158,7 +158,8 @@ std::string GetShortDescription(pkgCacheFile &CacheFile, pkgRecords &records, pk } /*}}}*/ void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, /*{{{*/ - pkgCache::VerIterator V, std::ostream &out) + pkgCache::VerIterator V, std::ostream &out, + bool include_summary) { pkgCache::PkgIterator P = V.ParentPkg(); @@ -224,9 +225,12 @@ void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, /*{{{*/ out << GetVersion(CacheFile, V); } out << " " << GetArchitecture(CacheFile, P) << " "; - out << std::endl - << " " << GetShortDescription(CacheFile, records, P) - << std::endl; + if (include_summary) + { + out << std::endl + << " " << GetShortDescription(CacheFile, records, P) + << std::endl; + } } } /*}}}*/ diff --git a/apt-private/private-output.h b/apt-private/private-output.h index 9283e39ab..c3c76bb92 100644 --- a/apt-private/private-output.h +++ b/apt-private/private-output.h @@ -24,7 +24,8 @@ extern unsigned int ScreenWidth; bool InitOutput(); void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, - pkgCache::VerIterator V, std::ostream &out); + pkgCache::VerIterator V, std::ostream &out, + bool include_summary=true); -- cgit v1.2.3-70-g09d2 From e1dc051a11c2860abebf626df0470a5feb03677a Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 26 Nov 2013 08:17:29 +0100 Subject: add APT::Cmd::List-Include-Summary --- apt-private/private-cmndline.cc | 1 + apt-private/private-list.cc | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'apt-private') diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc index 8ba6629a8..b73227924 100644 --- a/apt-private/private-cmndline.cc +++ b/apt-private/private-cmndline.cc @@ -223,6 +223,7 @@ bool addArgumentsAPT(std::vector &Args, char const * const Cm addArg(0,"installed","APT::Cmd::Installed",0); addArg(0,"upgradable","APT::Cmd::Upgradable",0); addArg('a', "all-versions", "APT::Cmd::AllVersions", 0); + addArg('v', "verbose", "APT::Cmd::List-Include-Summary", 0); } else if (addArgumentsAPTGet(Args, Cmd) || addArgumentsAPTCache(Args, Cmd)) { diff --git a/apt-private/private-list.cc b/apt-private/private-list.cc index 6993cd797..08851eb7e 100644 --- a/apt-private/private-list.cc +++ b/apt-private/private-list.cc @@ -132,6 +132,8 @@ bool List(CommandLine &Cmd) std::map output_map; std::map::const_iterator K; + bool includeSummary = _config->FindB("APT::Cmd::List-Include-Summary"); + PackageNameMatcher matcher(patterns); LocalitySortedVersionSet bag; OpTextProgress progress; @@ -149,7 +151,7 @@ bool List(CommandLine &Cmd) output_map.insert(std::make_pair( V.ParentPkg().Name(), outs.str())); } else { - ListSingleVersion(CacheFile, records, V, outs, false); + ListSingleVersion(CacheFile, records, V, outs, includeSummary); output_map.insert(std::make_pair( V.ParentPkg().Name(), outs.str())); } -- cgit v1.2.3-70-g09d2 From c1a61d1ca91e0a0a79b8c1be3fe04bcfa12cf0dc Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 26 Nov 2013 09:04:48 +0100 Subject: rename APT::Cmd::AllVersions -> APT::Cmd::All-Versions, APT::Cmd::UseRegexp -> APT::Cmd::Use-Regexp --- apt-private/private-cmndline.cc | 2 +- apt-private/private-list.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'apt-private') diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc index 8ba6629a8..35d61f318 100644 --- a/apt-private/private-cmndline.cc +++ b/apt-private/private-cmndline.cc @@ -222,7 +222,7 @@ bool addArgumentsAPT(std::vector &Args, char const * const Cm { addArg(0,"installed","APT::Cmd::Installed",0); addArg(0,"upgradable","APT::Cmd::Upgradable",0); - addArg('a', "all-versions", "APT::Cmd::AllVersions", 0); + addArg('a', "all-versions", "APT::Cmd::All-Versions", 0); } else if (addArgumentsAPTGet(Args, Cmd) || addArgumentsAPTCache(Args, Cmd)) { diff --git a/apt-private/private-list.cc b/apt-private/private-list.cc index 6993cd797..680a9a535 100644 --- a/apt-private/private-list.cc +++ b/apt-private/private-list.cc @@ -69,7 +69,7 @@ class PackageNameMatcher : public Matcher /*{{{*/ cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern); #else APT::CacheFilter::PackageMatcher *cachefilter = NULL; - if(_config->FindB("APT::Cmd::UseRegexp", false) == true) + if(_config->FindB("APT::Cmd::Use-Regexp", false) == true) cachefilter = new APT::CacheFilter::PackageNameMatchesRegEx(pattern); else cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern); @@ -143,7 +143,7 @@ bool List(CommandLine &Cmd) for (LocalitySortedVersionSet::iterator V = bag.begin(); V != bag.end(); V++) { std::stringstream outs; - if(_config->FindB("APT::Cmd::AllVersions", false) == true) + if(_config->FindB("APT::Cmd::All-Versions", false) == true) { ListAllVersions(CacheFile, records, V.ParentPkg(), outs); output_map.insert(std::make_pair( -- cgit v1.2.3-70-g09d2 From 9e6b13f3751f8a1287ff79861980afb7792a5f9e Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 28 Nov 2013 12:15:47 +0100 Subject: move EditSources into its own file --- apt-private/makefile | 2 +- apt-private/private-sources.cc | 45 ++++++++++++++++++++++++++++++++++++++++++ apt-private/private-sources.h | 3 +++ cmdline/apt.cc | 38 +---------------------------------- 4 files changed, 50 insertions(+), 38 deletions(-) create mode 100644 apt-private/private-sources.cc create mode 100644 apt-private/private-sources.h (limited to 'apt-private') diff --git a/apt-private/makefile b/apt-private/makefile index b3d764097..728890b9b 100644 --- a/apt-private/makefile +++ b/apt-private/makefile @@ -17,7 +17,7 @@ MAJOR=0.0 MINOR=0 SLIBS=$(PTHREADLIB) -lapt-pkg -PRIVATES=list install download output cachefile cacheset update upgrade cmndline moo search show main utils +PRIVATES=list install download output cachefile cacheset update upgrade cmndline moo search show main utils sources SOURCE += $(foreach private, $(PRIVATES), private-$(private).cc) HEADERS += $(foreach private, $(PRIVATES), private-$(private).h) diff --git a/apt-private/private-sources.cc b/apt-private/private-sources.cc new file mode 100644 index 000000000..eb9c5b971 --- /dev/null +++ b/apt-private/private-sources.cc @@ -0,0 +1,45 @@ + +#include +#include + +#include "private-output.h" +#include "private-sources.h" +#include "private-utils.h" + +// EditSource - EditSourcesList /*{{{*/ +// --------------------------------------------------------------------- +bool EditSources(CommandLine &CmdL) +{ + bool res; + pkgSourceList sl; + std::string outs; + + // FIXME: suport CmdL.FileList to specify sources.list.d files + std::string sourceslist = _config->FindFile("Dir::Etc::sourcelist"); + + HashString before; + before.FromFile(sourceslist); + + do { + EditFileInSensibleEditor(sourceslist); + _error->PushToStack(); + res = sl.Read(sourceslist); + if (!res) { + strprintf(outs, _("Failed to parse %s. Edit again? "), + sourceslist.c_str()); + std::cout << outs; + res = !YnPrompt(true); + } + _error->RevertToStack(); + } while (res == false); + + if (!before.VerifyFile(sourceslist)) { + strprintf( + outs, _("Your '%s' file changed, please run 'apt-get update'."), + sourceslist.c_str()); + std::cout << outs << std::endl; + } + + return true; +} + /*}}}*/ diff --git a/apt-private/private-sources.h b/apt-private/private-sources.h new file mode 100644 index 000000000..b394622be --- /dev/null +++ b/apt-private/private-sources.h @@ -0,0 +1,3 @@ +#include + +bool EditSources(CommandLine &CmdL); diff --git a/cmdline/apt.cc b/cmdline/apt.cc index 47187fac2..4bcae0aba 100644 --- a/cmdline/apt.cc +++ b/cmdline/apt.cc @@ -56,45 +56,9 @@ #include #include #include +#include /*}}}*/ -// EditSource - EditSourcesList /*{{{*/ -// --------------------------------------------------------------------- -bool EditSources(CommandLine &CmdL) -{ - bool res; - pkgSourceList sl; - std::string outs; - - // FIXME: suport CmdL.FileList to specify sources.list.d files - std::string sourceslist = _config->FindFile("Dir::Etc::sourcelist"); - - HashString before; - before.FromFile(sourceslist); - - do { - EditFileInSensibleEditor(sourceslist); - _error->PushToStack(); - res = sl.Read(sourceslist); - if (!res) { - strprintf(outs, _("Failed to parse %s. Edit again? "), - sourceslist.c_str()); - std::cout << outs; - res = !YnPrompt(true); - } - _error->RevertToStack(); - } while (res == false); - - if (!before.VerifyFile(sourceslist)) { - strprintf( - outs, _("Your '%s' file changed, please run 'apt-get update'."), - sourceslist.c_str()); - std::cout << outs << std::endl; - } - - return true; -} - /*}}}*/ bool ShowHelp(CommandLine &CmdL) -- cgit v1.2.3-70-g09d2 From e4e5d47b0e66ae7bedafbdbb685114c404381204 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 28 Nov 2013 16:50:20 +0100 Subject: fix "apt-get --purge build-dep" (closes: #720597) --- apt-private/private-cmndline.cc | 1 + debian/changelog | 7 +++++++ 2 files changed, 8 insertions(+) (limited to 'apt-private') diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc index 8ba6629a8..b6f257bcb 100644 --- a/apt-private/private-cmndline.cc +++ b/apt-private/private-cmndline.cc @@ -149,6 +149,7 @@ bool addArgumentsAPTGet(std::vector &Args, char const * const else if (CmdMatches("build-dep")) { addArg('a', "host-architecture", "APT::Get::Host-Architecture", CommandLine::HasArg); + addArg(0, "purge", "APT::Get::Purge", 0); addArg(0, "solver", "APT::Solver", CommandLine::HasArg); } else if (CmdMatches("clean", "autoclean", "check", "download", "changelog") || diff --git a/debian/changelog b/debian/changelog index ebcc7399d..7447628db 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +apt (0.9.13.1) unstable; urgency=low + + [ Colin Watson ] + * fix "apt-get --purge build-dep" (closes: #720597) + + -- Michael Vogt Thu, 28 Nov 2013 16:49:31 +0100 + apt (0.9.13) unstable; urgency=low [ TJ Guthrie ] -- cgit v1.2.3-70-g09d2 From c872ac503156caff9d0e33306c4121dd667a6567 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 28 Nov 2013 19:45:44 +0100 Subject: add "-f" option to "build-dep" as sbuild is using it to fix regression with cross-building (LP: #1255806) --- apt-private/private-cmndline.cc | 3 +++ debian/changelog | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'apt-private') diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc index b6f257bcb..718a7ce6a 100644 --- a/apt-private/private-cmndline.cc +++ b/apt-private/private-cmndline.cc @@ -151,6 +151,9 @@ bool addArgumentsAPTGet(std::vector &Args, char const * const addArg('a', "host-architecture", "APT::Get::Host-Architecture", CommandLine::HasArg); addArg(0, "purge", "APT::Get::Purge", 0); addArg(0, "solver", "APT::Solver", CommandLine::HasArg); + // this has no effect *but* sbuild is using it (see LP: #1255806) + // once sbuild is fixed, this option can be removed + addArg('f', "fix-broken", "APT::Get::Fix-Broken", 0); } else if (CmdMatches("clean", "autoclean", "check", "download", "changelog") || CmdMatches("markauto", "unmarkauto")) // deprecated commands diff --git a/debian/changelog b/debian/changelog index 92b9635dd..ca6bb4406 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,12 @@ -apt (0.9.13.1) unstable; urgency=low +apt (0.9.13.1) UNRELEASED; urgency=low [ Colin Watson ] * fix "apt-get --purge build-dep" (closes: #720597) * fix regression that APT::Keep-Fds is not honored (closes: #730490) + + [ Michael Vogt ] + * add "-f" option to "build-dep" as sbuild is using it to fix + regression with cross-building (LP: #1255806) -- Michael Vogt Thu, 28 Nov 2013 16:49:31 +0100 -- cgit v1.2.3-70-g09d2 From a8f671c17a7f34e80a49bf367bceaa009551b066 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 29 Nov 2013 08:17:44 +0100 Subject: add support for "apt edit-source foo" sources.list.d component editing --- apt-private/private-sources.cc | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'apt-private') diff --git a/apt-private/private-sources.cc b/apt-private/private-sources.cc index eb9c5b971..37b0534bd 100644 --- a/apt-private/private-sources.cc +++ b/apt-private/private-sources.cc @@ -6,6 +6,11 @@ #include "private-sources.h" #include "private-utils.h" +/* Interface discussion with donkult (for the future): + apt [add-{archive,release,component}|edit|change-release|disable]-sources + and be clever and work out stuff from the Release file +*/ + // EditSource - EditSourcesList /*{{{*/ // --------------------------------------------------------------------- bool EditSources(CommandLine &CmdL) @@ -14,17 +19,22 @@ bool EditSources(CommandLine &CmdL) pkgSourceList sl; std::string outs; - // FIXME: suport CmdL.FileList to specify sources.list.d files - std::string sourceslist = _config->FindFile("Dir::Etc::sourcelist"); + std::string sourceslist; + if (CmdL.FileList[1] != NULL) + sourceslist = _config->FindDir("Dir::Etc::sourceparts") + CmdL.FileList[1] + ".list"; + else + sourceslist = _config->FindFile("Dir::Etc::sourcelist"); HashString before; - before.FromFile(sourceslist); + if (FileExists(sourceslist)) + before.FromFile(sourceslist); do { EditFileInSensibleEditor(sourceslist); _error->PushToStack(); res = sl.Read(sourceslist); if (!res) { + _error->DumpErrors(); strprintf(outs, _("Failed to parse %s. Edit again? "), sourceslist.c_str()); std::cout << outs; @@ -33,7 +43,7 @@ bool EditSources(CommandLine &CmdL) _error->RevertToStack(); } while (res == false); - if (!before.VerifyFile(sourceslist)) { + if (FileExists(sourceslist) && !before.VerifyFile(sourceslist)) { strprintf( outs, _("Your '%s' file changed, please run 'apt-get update'."), sourceslist.c_str()); -- cgit v1.2.3-70-g09d2 From cf993341c2067ee091cfd51e5da0e237babce171 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 29 Nov 2013 08:35:05 +0100 Subject: add "APT::String::Endswith" and automatic adding of ".list" in apt edit-source --- apt-pkg/contrib/strutl.cc | 8 ++++++++ apt-pkg/contrib/strutl.h | 1 + apt-private/private-sources.cc | 10 +++++++--- test/libapt/strutil_test.cc | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) (limited to 'apt-private') diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index 9f794927d..962112854 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -49,6 +49,14 @@ std::string Strip(const std::string &s) size_t end = s.find_last_not_of(" \t\n"); return s.substr(start, end-start+1); } + +bool Endswith(const std::string &s, const std::string &end) +{ + if (end.size() > s.size()) + return false; + return (s.substr(s.size() - end.size(), s.size()) == end); +} + } } /*}}}*/ diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h index c8fc317c0..8d746f10e 100644 --- a/apt-pkg/contrib/strutl.h +++ b/apt-pkg/contrib/strutl.h @@ -36,6 +36,7 @@ using std::ostream; namespace APT { namespace String { std::string Strip(const std::string &s); + bool Endswith(const std::string &s, const std::string &ending); }; }; diff --git a/apt-private/private-sources.cc b/apt-private/private-sources.cc index 37b0534bd..65706e785 100644 --- a/apt-private/private-sources.cc +++ b/apt-private/private-sources.cc @@ -21,10 +21,13 @@ bool EditSources(CommandLine &CmdL) std::string sourceslist; if (CmdL.FileList[1] != NULL) - sourceslist = _config->FindDir("Dir::Etc::sourceparts") + CmdL.FileList[1] + ".list"; - else + { + sourceslist = _config->FindDir("Dir::Etc::sourceparts") + CmdL.FileList[1]; + if (!APT::String::Endswith(sourceslist, ".list")) + sourceslist += ".list"; + } else { sourceslist = _config->FindFile("Dir::Etc::sourcelist"); - + } HashString before; if (FileExists(sourceslist)) before.FromFile(sourceslist); @@ -38,6 +41,7 @@ bool EditSources(CommandLine &CmdL) strprintf(outs, _("Failed to parse %s. Edit again? "), sourceslist.c_str()); std::cout << outs; + // FIXME: should we add a "restore previous" option here? res = !YnPrompt(true); } _error->RevertToStack(); diff --git a/test/libapt/strutil_test.cc b/test/libapt/strutil_test.cc index 110a20d27..8215654d0 100644 --- a/test/libapt/strutil_test.cc +++ b/test/libapt/strutil_test.cc @@ -69,5 +69,23 @@ int main(int argc,char *argv[]) result = StringSplit(input, ""); equals(result.size(), 0); + // endswith + bool b; + input = "abcd"; + b = APT::String::Endswith(input, "d"); + equals(b, true); + + b = APT::String::Endswith(input, "cd"); + equals(b, true); + + b = APT::String::Endswith(input, "abcd"); + equals(b, true); + + b = APT::String::Endswith(input, "x"); + equals(b, false); + + b = APT::String::Endswith(input, "abcndefg"); + equals(b, false); + return 0; } -- cgit v1.2.3-70-g09d2 From 2f5ed336109d11e06d08bedef6b37d6597c4c09c Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 29 Nov 2013 17:10:35 +0100 Subject: fix crash when SetCandidateRelease is used --- apt-pkg/depcache.cc | 2 +- apt-private/private-install.h | 3 ++ .../test-bug-709560-set-candidate-release | 36 ++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100755 test/integration/test-bug-709560-set-candidate-release (limited to 'apt-private') diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index a06789cdf..f9c891c86 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -1522,7 +1522,7 @@ bool pkgDepCache::SetCandidateRelease(pkgCache::VerIterator TargetVer, if (itsFine == false) { // change the candidate - Changed.push_back(make_pair(oldCand, TargetVer)); + Changed.push_back(make_pair(V, TargetVer)); if (SetCandidateRelease(V, TargetRel, Changed) == false) { if (stillOr == false) diff --git a/apt-private/private-install.h b/apt-private/private-install.h index 439c89712..2187146d3 100644 --- a/apt-private/private-install.h +++ b/apt-private/private-install.h @@ -95,6 +95,9 @@ struct TryToInstall { Cache->GetDepCache()->SetCandidateVersion(s->first); bool Success = true; + // the Changed list contains: + // first: "new version" + // second: "what-caused the change" std::list > Changed; for (std::list >::const_iterator s = start.begin(); s != start.end(); ++s) diff --git a/test/integration/test-bug-709560-set-candidate-release b/test/integration/test-bug-709560-set-candidate-release new file mode 100755 index 000000000..48dc5c382 --- /dev/null +++ b/test/integration/test-bug-709560-set-candidate-release @@ -0,0 +1,36 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' + +insertpackage 'experimental' 'foo' 'all' '2.0' 'Depends: foo-dep (= 2.1)' +insertpackage 'experimental' 'foo-dep' 'all' '2.1' + + +( +cat < rootdir/etc/apt/preferences + + +setupaptarchive + +testequal "Reading package lists... +Building dependency tree... +Selected version '2.0' (experimental [all]) for 'foo' +Selected version '2.1' (experimental [all]) for 'foo-dep' because of 'foo' +The following extra packages will be installed: + foo-dep +The following NEW packages will be installed: + foo foo-dep +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo-dep (2.1 experimental [all]) +Inst foo (2.0 experimental [all]) +Conf foo-dep (2.1 experimental [all]) +Conf foo (2.0 experimental [all])" aptget install -q0 -s foo/experimental -- cgit v1.2.3-70-g09d2