summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/CMakeLists.txt3
-rw-r--r--apt-pkg/algorithms.h3
-rw-r--r--apt-pkg/algorithms.mm (renamed from apt-pkg/algorithms.cc)138
-rw-r--r--apt-pkg/deb/deblistparser.h2
-rw-r--r--apt-pkg/deb/debmetaindex.cc4
-rw-r--r--apt-pkg/edsp.cc9
-rw-r--r--apt-private/CMakeLists.txt4
-rw-r--r--apt-private/private-output.mm (renamed from apt-private/private-output.cc)284
-rw-r--r--cmdline/CMakeLists.txt7
-rw-r--r--cmdline/sileo-solver.cc214
-rw-r--r--methods/CMakeLists.txt20
-rw-r--r--methods/nshttp.h40
-rw-r--r--methods/nshttp.mm196
13 files changed, 482 insertions, 442 deletions
diff --git a/apt-pkg/CMakeLists.txt b/apt-pkg/CMakeLists.txt
index 64709ce34..09c82d7e6 100644
--- a/apt-pkg/CMakeLists.txt
+++ b/apt-pkg/CMakeLists.txt
@@ -32,7 +32,7 @@ set(APT_PKG_MAJOR ${MAJOR} PARENT_SCOPE) # exporting for methods/CMakeLists.txt
# Definition of the C++ files used to build the library - note that this
# is expanded at CMake time, so you have to rerun cmake if you add or remove
# a file (you can just run cmake . in the build directory)
-file(GLOB_RECURSE library "*.cc" "${CMAKE_CURRENT_BINARY_DIR}/tagfile-keys.cc")
+file(GLOB_RECURSE library "*.cc" "*.mm" "${CMAKE_CURRENT_BINARY_DIR}/tagfile-keys.cc")
file(GLOB_RECURSE headers "*.h")
# Create a library using the C++ files
@@ -59,6 +59,7 @@ target_link_libraries(apt-pkg
$<$<BOOL:${ZSTD_FOUND}>:${ZSTD_LIBRARIES}>
$<$<BOOL:${UDEV_FOUND}>:${UDEV_LIBRARIES}>
${ICONV_LIBRARIES}
+ "-framework Foundation"
)
set_target_properties(apt-pkg PROPERTIES VERSION ${MAJOR}.${MINOR})
set_target_properties(apt-pkg PROPERTIES SOVERSION ${MAJOR})
diff --git a/apt-pkg/algorithms.h b/apt-pkg/algorithms.h
index c5c9f4c69..7637f6d1d 100644
--- a/apt-pkg/algorithms.h
+++ b/apt-pkg/algorithms.h
@@ -87,6 +87,9 @@ public:
private:
APT_HIDDEN void ShortBreaks();
APT_HIDDEN void Describe(PkgIterator iPkg,std::ostream &out,bool Current,bool Candidate);
+#if ENABLE_SILEO
+ APT_HIDDEN NSMutableDictionary * DescribeSileo(PkgIterator iPkg,bool Current,bool Candidate);
+#endif
APT_HIDDEN bool RealInstall(PkgIterator Pkg,std::string File);
APT_HIDDEN bool RealConfigure(PkgIterator Pkg);
APT_HIDDEN bool RealRemove(PkgIterator Pkg,bool Purge);
diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.mm
index 4c34e5989..be0acb178 100644
--- a/apt-pkg/algorithms.cc
+++ b/apt-pkg/algorithms.mm
@@ -15,6 +15,9 @@
// Include Files /*{{{*/
#include <config.h>
+#define ENABLE_SILEO 1
+#include <Foundation/Foundation.h>
+
#include <apt-pkg/algorithms.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/depcache.h>
@@ -73,32 +76,6 @@ pkgSimulate::~pkgSimulate()
Parameter Candidate == true displays the candidate package version */
void pkgSimulate::Describe(PkgIterator Pkg,ostream &out,bool Current,bool Candidate)
{
- bool forSileo = _config->FindB("APT::Format::for-sileo", false);
- if (forSileo){
- VerIterator Ver(Sim);
-
- out << "\"Package\":\"" << Pkg.FullName(true) << "\"";
-
- if (Current == true)
- {
- Ver = Pkg.CurrentVer();
- if (Ver.end() == false)
- out << ",\"Version\":\"" << Ver.VerStr() << '"';
- }
-
- if (Candidate == true)
- {
- Ver = Sim[Pkg].CandidateVerIter(Sim);
- if (Ver.end() == true)
- return;
-
- out << ",\"Version\":\"" << Ver.VerStr() << '"';
- out << ",\"Release\":\"" << Ver.RelStr() << '"';
- }
- out << "}";
- return;
- }
-
VerIterator Ver(Sim);
out << Pkg.FullName(true);
@@ -120,6 +97,37 @@ void pkgSimulate::Describe(PkgIterator Pkg,ostream &out,bool Current,bool Candid
}
}
/*}}}*/
+// Simulate::DescribeSileo - Describe a package /*{{{*/
+// ---------------------------------------------------------------------
+/* Parameter Current == true displays the current package version,
+ Parameter Candidate == true displays the candidate package version */
+NSMutableDictionary * pkgSimulate::DescribeSileo(PkgIterator Pkg,bool Current,bool Candidate)
+{
+ VerIterator Ver(Sim);
+
+ NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
+ [dictionary setObject:[NSString stringWithUTF8String:Pkg.FullName(true).c_str()] forKey:@"Package"];
+
+ if (Current == true)
+ {
+ Ver = Pkg.CurrentVer();
+ if (Ver.end() == false){
+ [dictionary setObject:[NSString stringWithUTF8String:Ver.VerStr()] forKey:@"Version"];
+ }
+ }
+
+ if (Candidate == true)
+ {
+ Ver = Sim[Pkg].CandidateVerIter(Sim);
+ if (Ver.end() == true)
+ return dictionary;
+ [dictionary setObject:[NSString stringWithUTF8String:Ver.VerStr()] forKey:@"Version"];
+ [dictionary setObject:[NSString stringWithUTF8String:Ver.RelStr().c_str()] forKey:@"Release"];
+ }
+
+ return dictionary;
+}
+ /*}}}*/
// Simulate::Install - Simulate unpacking of a package /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -137,39 +145,41 @@ bool pkgSimulate::RealInstall(PkgIterator iPkg,string /*File*/)
// Adapt the iterator
PkgIterator Pkg = Sim.FindPkg(iPkg.Name(), iPkg.Arch());
Flags[Pkg->ID] = 1;
-
- cout << "{\"Type\":\"Inst\",";
- Describe(Pkg,cout,true,true);
+
+ NSMutableDictionary *package = DescribeSileo(Pkg, true, true);
+ [package setObject:@"Inst" forKey:@"Type"];
+
+ cout << flush;
+
+ NSData *data = [NSJSONSerialization dataWithJSONObject:package options:0 error:nil];
+ NSFileHandle *stdout = [NSFileHandle fileHandleWithStandardOutput];
+ [stdout writeData:data];
+
+ cout << endl;
+
Sim.MarkInstall(Pkg,false);
// Look for broken conflicts+predepends.
for (PkgIterator I = Sim.PkgBegin(); I.end() == false; ++I)
{
if (Sim[I].InstallVer == 0)
- continue;
-
+ continue;
+
for (DepIterator D = Sim[I].InstVerIter(Sim).DependsList(); D.end() == false;)
{
- DepIterator Start;
- DepIterator End;
- D.GlobOr(Start,End);
- if (Start.IsNegative() == true ||
- End->Type == pkgCache::Dep::PreDepends)
+ DepIterator Start;
+ DepIterator End;
+ D.GlobOr(Start,End);
+ if (Start.IsNegative() == true || End->Type == pkgCache::Dep::PreDepends)
{
- if ((Sim[End] & pkgDepCache::DepGInstall) == 0)
- {
- cout << " [" << I.FullName(false) << " on " << Start.TargetPkg().FullName(false) << ']';
- if (Start->Type == pkgCache::Dep::Conflicts)
- _error->Error("Fatal, conflicts violated %s",I.FullName(false).c_str());
- }
- }
+ if ((Sim[End] & pkgDepCache::DepGInstall) == 0)
+ {
+ if (Start->Type == pkgCache::Dep::Conflicts)
+ _error->Error("Fatal, conflicts violated %s",I.FullName(false).c_str());
+ }
+ }
}
}
-
- if (Sim.BrokenCount() != 0)
- ShortBreaks();
- else
- cout << endl;
return true;
}
@@ -227,6 +237,7 @@ bool pkgSimulate::Configure(PkgIterator iPkg)
bool pkgSimulate::RealConfigure(PkgIterator iPkg)
{
bool forSileo = _config->FindB("APT::Format::for-sileo", false);
+
// Adapt the iterator
PkgIterator Pkg = Sim.FindPkg(iPkg.Name(), iPkg.Arch());
@@ -264,12 +275,12 @@ bool pkgSimulate::RealConfigure(PkgIterator iPkg)
cout << "Conf ";
Describe(Pkg,cout,false,true);
}
- }
- if (Sim.BrokenCount() != 0)
- ShortBreaks();
- else if (!forSileo)
- cout << endl;
+ if (Sim.BrokenCount() != 0)
+ ShortBreaks();
+ else
+ cout << endl;
+ }
return true;
}
@@ -287,7 +298,7 @@ bool pkgSimulate::Remove(PkgIterator iPkg,bool Purge)
bool pkgSimulate::RealRemove(PkgIterator iPkg,bool Purge)
{
bool forSileo = _config->FindB("APT::Format::for-sileo", false);
-
+
// Adapt the iterator
PkgIterator Pkg = Sim.FindPkg(iPkg.Name(), iPkg.Arch());
if (Pkg.end() == true)
@@ -300,25 +311,30 @@ bool pkgSimulate::RealRemove(PkgIterator iPkg,bool Purge)
Sim.MarkDelete(Pkg);
if (forSileo){
+ NSMutableDictionary *package = DescribeSileo(Pkg, true, false);
if (Purge == true)
- cout << "{\"Type\":\"Purg\",";
+ [package setObject:@"Purg" forKey:@"Type"];
else
- cout << "{\"Type\":\"Remv\",";
+ [package setObject:@"Remv" forKey:@"Type"];
+
+ cout << flush;
+
+ NSData *data = [NSJSONSerialization dataWithJSONObject:package options:0 error:nil];
+ NSFileHandle *stdout = [NSFileHandle fileHandleWithStandardOutput];
+ [stdout writeData:data];
+
+ cout << endl;
} else {
if (Purge == true)
cout << "Purg ";
else
cout << "Remv ";
- }
- Describe(Pkg,cout,true,false);
+ Describe(Pkg,cout,true,false);
- if (!forSileo){
if (Sim.BrokenCount() != 0)
ShortBreaks();
else
cout << endl;
- } else {
- cout << endl;
}
return true;
diff --git a/apt-pkg/deb/deblistparser.h b/apt-pkg/deb/deblistparser.h
index 4cde9f56f..f02252d58 100644
--- a/apt-pkg/deb/deblistparser.h
+++ b/apt-pkg/deb/deblistparser.h
@@ -52,8 +52,6 @@ class APT_HIDDEN debListParser : public pkgCacheListParser
pkgTagSection Section;
map_filesize_t iOffset;
- std::string Arch;
-
virtual bool ParseStatus(pkgCache::PkgIterator &Pkg,pkgCache::VerIterator &Ver);
bool ParseDepends(pkgCache::VerIterator &Ver, pkgTagSection::Key Key,
unsigned int Type);
diff --git a/apt-pkg/deb/debmetaindex.cc b/apt-pkg/deb/debmetaindex.cc
index 98bac7a70..f88076abf 100644
--- a/apt-pkg/deb/debmetaindex.cc
+++ b/apt-pkg/deb/debmetaindex.cc
@@ -565,10 +565,6 @@ bool debReleaseIndex::Load(std::string const &Filename, std::string * const Erro
if (CheckValidUntil == true)
{
-
- if (Date == 0)
- strprintf(*ErrorText, _("Invalid '%s' entry in Release file %s"), "Date", Filename.c_str());
-
std::string const StrValidUntil = Section.FindS("Valid-Until");
// if we have a Valid-Until header in the Release file, use it as default
diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc
index 9879fd8b3..2e39be377 100644
--- a/apt-pkg/edsp.cc
+++ b/apt-pkg/edsp.cc
@@ -661,15 +661,6 @@ bool EDSP::ReadResponse(int const input, pkgDepCache &Cache, OpProgress *Progres
_error->Error("External solver failed with: %s", msg.substr(0,msg.find('\n')).c_str());
if (Progress != nullptr)
Progress->Done();
-
- bool forSileo = _config->FindB("APT::Format::for-sileo", false);
- if (forSileo){
- std::cerr << "SOLVERR: " << section.FindS("Error") << std::endl;
- std::cerr << "SOLVINFO:" << std::endl;
- std::cerr << msg << std::endl << std::endl;
- return false;
- }
-
std::cerr << "The solver encountered an error of type: " << section.FindS("Error") << std::endl;
std::cerr << "The following information might help you to understand what is wrong:" << std::endl;
std::cerr << msg << std::endl << std::endl;
diff --git a/apt-private/CMakeLists.txt b/apt-private/CMakeLists.txt
index 88a8f97fe..4a6ea51b8 100644
--- a/apt-private/CMakeLists.txt
+++ b/apt-private/CMakeLists.txt
@@ -5,14 +5,14 @@ set(MINOR 0)
# Definition of the C++ files used to build the library - note that this
# is expanded at CMake time, so you have to rerun cmake if you add or remove
# a file (you can just run cmake . in the build directory)
-file(GLOB_RECURSE library "*.cc")
+file(GLOB_RECURSE library "*.cc" "*.mm")
file(GLOB_RECURSE headers "*.h")
# Create a library using the C++ files
add_library(apt-private SHARED ${library})
# Link the library and set the SONAME
-target_link_libraries(apt-private PUBLIC apt-pkg)
+target_link_libraries(apt-private PUBLIC apt-pkg "-framework Foundation")
set_target_properties(apt-private PROPERTIES VERSION ${MAJOR}.${MINOR})
set_target_properties(apt-private PROPERTIES SOVERSION ${MAJOR})
set_target_properties(apt-private PROPERTIES CXX_VISIBILITY_PRESET hidden)
diff --git a/apt-private/private-output.cc b/apt-private/private-output.mm
index 3c7e38c0e..2e9d0fd0f 100644
--- a/apt-private/private-output.cc
+++ b/apt-private/private-output.mm
@@ -1,6 +1,8 @@
// Include files /*{{{*/
#include <config.h>
+#include <Foundation/Foundation.h>
+
#include <apt-pkg/cachefile.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/depcache.h>
@@ -328,126 +330,17 @@ void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, /*{{{*/
Depends: libldap2 (>= 2.0.2-2) but it is not going to be installed
Depends: libsasl7 but it is not going to be installed
*/
-static bool ShowBrokenPackage(ostream &out, pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg, bool const Now, bool const DisplaySeparator)
+static void ShowBrokenPackage(ostream &out, pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg, bool const Now)
{
if (Now == true)
{
if ((*Cache)[Pkg].NowBroken() == false)
- return false;
+ return;
}
else
{
if ((*Cache)[Pkg].InstBroken() == false)
- return false;
- }
-
- bool useJSON = _config->FindB("APT::Format::for-sileo", false);
- if (useJSON){
- if (DisplaySeparator)
- out << ",";
-
- // Print out each package and the failed dependencies
- out << "\"" << Pkg.FullName(true) << "\":[";
- bool First = true;
- pkgCache::VerIterator Ver;
-
- if (Now == true)
- Ver = Pkg.CurrentVer();
- else
- Ver = (*Cache)[Pkg].InstVerIter(*Cache);
-
- if (Ver.end() == true)
- {
- out << "]" << endl;
- return true;
- }
-
- for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false;)
- {
- // Compute a single dependency element (glob or)
- pkgCache::DepIterator Start;
- pkgCache::DepIterator End;
- D.GlobOr(Start,End); // advances D
-
- if ((*Cache)->IsImportantDep(End) == false)
- continue;
-
- if (Now == true)
- {
- if (((*Cache)[End] & pkgDepCache::DepGNow) == pkgDepCache::DepGNow)
- continue;
- }
- else
- {
- if (((*Cache)[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
- continue;
- }
-
- bool FirstOr = true;
- while (1)
- {
- if (!First)
- out << ",";
-
- First = false;
-
- if (FirstOr == false)
- {
- out << ",";
- }
- else
- out << "[";
- out << "{\"Type\":\"" << End.DepType() << "\"";
- FirstOr = false;
-
- out << ",\"Package\":\"" << Start.TargetPkg().FullName(true) << "\"";
-
- // Show a quick summary of the version requirements
- if (Start.TargetVer() != 0)
- out << ",\"VersionSummary\":\"" << Start.CompType() << " " << Start.TargetVer() << "\"";
-
- /* Show a summary of the target package if possible. In the case
- of virtual packages we show nothing */
- pkgCache::PkgIterator Targ = Start.TargetPkg();
- if (Targ->ProvidesList == 0)
- {
- pkgCache::VerIterator Ver = (*Cache)[Targ].InstVerIter(*Cache);
- if (Now == true)
- Ver = Targ.CurrentVer();
-
- if (Ver.end() == false)
- {
- if (Now == true)
- ioprintf(out,_(",\"Reason\":\"%s is installed\""),Ver.VerStr());
- else
- ioprintf(out,_(",\"Reason\":\"%s is to be installed\""),Ver.VerStr());
- }
- else
- {
- if ((*Cache)[Targ].CandidateVerIter(*Cache).end() == true)
- {
- if (Targ->ProvidesList == 0)
- out << _(",\"Reason\":\"it is not installable\"");
- else
- out << _(",\"Reason\":\"it is a virtual package\"");
- }
- else
- out << (Now?_(",\"Reason\":\"it is not installed\""):_(",\"Reason\":\"it is not going to be installed\""));
- }
- }
-
- out << "}";
-
- if (Start == End){
- out << "]";
- break;
- }
- ++Start;
- }
- }
- out << "]";
-
- return true;
+ return;
}
// Print out each package and the failed dependencies
@@ -464,7 +357,7 @@ static bool ShowBrokenPackage(ostream &out, pkgCacheFile * const Cache, pkgCache
if (Ver.end() == true)
{
out << endl;
- return true;
+ return;
}
for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false;)
@@ -551,8 +444,119 @@ static bool ShowBrokenPackage(ostream &out, pkgCacheFile * const Cache, pkgCache
++Start;
}
}
- return true;
}
+
+static NSMutableDictionary * SileoBrokenPackage(ostream &out, pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg, bool const Now)
+{
+ if (Now == true)
+ {
+ if ((*Cache)[Pkg].NowBroken() == false)
+ return nil;
+ }
+ else
+ {
+ if ((*Cache)[Pkg].InstBroken() == false)
+ return nil;
+ }
+
+ NSMutableDictionary *packages = [NSMutableDictionary dictionary];
+
+ NSMutableArray *deps = [NSMutableArray array];
+
+ // Print out each package and the failed dependencies
+ [packages setObject:deps forKey:[NSString stringWithUTF8String:Pkg.FullName(true).c_str()]];
+
+ pkgCache::VerIterator Ver;
+
+ if (Now == true)
+ Ver = Pkg.CurrentVer();
+ else
+ Ver = (*Cache)[Pkg].InstVerIter(*Cache);
+
+ if (Ver.end() == true)
+ {
+ return packages;
+ }
+
+ for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false;)
+ {
+ // Compute a single dependency element (glob or)
+ pkgCache::DepIterator Start;
+ pkgCache::DepIterator End;
+ D.GlobOr(Start,End); // advances D
+
+ if ((*Cache)->IsImportantDep(End) == false)
+ continue;
+
+ if (Now == true)
+ {
+ if (((*Cache)[End] & pkgDepCache::DepGNow) == pkgDepCache::DepGNow)
+ continue;
+ }
+ else
+ {
+ if (((*Cache)[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
+ continue;
+ }
+
+ NSMutableArray *orDependencies = [NSMutableArray array];
+ [deps addObject:orDependencies];
+
+ while (1)
+ {
+
+ NSMutableDictionary *dependency = [NSMutableDictionary dictionary];
+ [orDependencies addObject:dependency];
+ [dependency setObject:[NSString stringWithUTF8String:End.DepType()] forKey:@"Type"];
+
+ [dependency setObject:[NSString stringWithUTF8String:Start.TargetPkg().FullName(true).c_str()] forKey:@"Package"];
+
+ // Show a quick summary of the version requirements
+ if (Start.TargetVer() != 0)
+ [dependency setObject:[NSString stringWithFormat:@"%s %s", Start.CompType(), Start.TargetVer()] forKey:@"VersionSummary"];
+
+ /* Show a summary of the target package if possible. In the case
+ of virtual packages we show nothing */
+ pkgCache::PkgIterator Targ = Start.TargetPkg();
+ if (Targ->ProvidesList == 0)
+ {
+ pkgCache::VerIterator Ver = (*Cache)[Targ].InstVerIter(*Cache);
+ if (Now == true)
+ Ver = Targ.CurrentVer();
+
+ if (Ver.end() == false)
+ {
+ if (Now == true)
+ [dependency setObject:[NSString stringWithFormat:@"%s is installed",Ver.VerStr()] forKey:@"Reason"];
+ else
+ [dependency setObject:[NSString stringWithFormat:@"%s is to be installed",Ver.VerStr()] forKey:@"Reason"];
+ }
+ else
+ {
+ if ((*Cache)[Targ].CandidateVerIter(*Cache).end() == true)
+ {
+ if (Targ->ProvidesList == 0)
+ [dependency setObject:@"it is not installable" forKey:@"Reason"];
+ else
+ [dependency setObject:@"it is a virtual package" forKey:@"Reason"];
+ }
+ else {
+ if (Now)
+ [dependency setObject:@"it is not installed" forKey:@"Reason"];
+ else
+ [dependency setObject:@"it is not going to be installed" forKey:@"Reason"];
+ }
+ }
+ }
+
+ if (Start == End)
+ break;
+ ++Start;
+ }
+ }
+ return packages;
+}
+
void ShowBroken(ostream &out, CacheFile &Cache, bool const Now)
{
if (Cache->BrokenCount() == 0)
@@ -561,19 +565,25 @@ void ShowBroken(ostream &out, CacheFile &Cache, bool const Now)
out << _("The following packages have unmet dependencies:") << endl;
bool useJSON = _config->FindB("APT::Format::for-sileo", false);
- if (useJSON)
- out << "{";
-
- bool DisplaySeparator = false;
SortedPackageUniverse Universe(Cache);
- for (auto const &Pkg: Universe){
- if (ShowBrokenPackage(out, &Cache, Pkg, Now, DisplaySeparator))
- DisplaySeparator = true;
- }
- if (useJSON)
- out << "}";
+ if (useJSON){
+ NSMutableDictionary *packages = [NSMutableDictionary dictionary];
+ for (auto const &Pkg: Universe){
+ NSMutableDictionary *package = SileoBrokenPackage(out, &Cache, Pkg, Now);
+ [packages addEntriesFromDictionary:package];
+ }
+
+ cout << flush;
+
+ NSData *data = [NSJSONSerialization dataWithJSONObject:packages options:0 error:nil];
+ NSFileHandle *stdout = [NSFileHandle fileHandleWithStandardOutput];
+ [stdout writeData:data];
+ } else {
+ for (auto const &Pkg: Universe)
+ ShowBrokenPackage(out, &Cache, Pkg, Now);
+ }
}
void ShowBroken(ostream &out, pkgCacheFile &Cache, bool const Now)
{
@@ -583,19 +593,25 @@ void ShowBroken(ostream &out, pkgCacheFile &Cache, bool const Now)
out << _("The following packages have unmet dependencies:") << endl;
bool useJSON = _config->FindB("APT::Format::for-sileo", false);
- if (useJSON)
- out << "{";
-
- bool DisplaySeparator = false;
APT::PackageUniverse Universe(Cache);
- for (auto const &Pkg: Universe){
- if (ShowBrokenPackage(out, &Cache, Pkg, Now, DisplaySeparator))
- DisplaySeparator = true;
- }
- if (useJSON)
- out << "}";
+ if (useJSON){
+ NSMutableDictionary *packages = [NSMutableDictionary dictionary];
+ for (auto const &Pkg: Universe){
+ NSMutableDictionary *package = SileoBrokenPackage(out, &Cache, Pkg, Now);
+ [packages addEntriesFromDictionary:package];
+ }
+
+ cout << flush;
+
+ NSData *data = [NSJSONSerialization dataWithJSONObject:packages options:0 error:nil];
+ NSFileHandle *stdout = [NSFileHandle fileHandleWithStandardOutput];
+ [stdout writeData:data];
+ } else {
+ for (auto const &Pkg: Universe)
+ ShowBrokenPackage(out, &Cache, Pkg, Now);
+ }
}
/*}}}*/
// ShowNew - Show packages to newly install /*{{{*/
diff --git a/cmdline/CMakeLists.txt b/cmdline/CMakeLists.txt
index dd66b843c..8977b45d1 100644
--- a/cmdline/CMakeLists.txt
+++ b/cmdline/CMakeLists.txt
@@ -9,7 +9,6 @@ add_executable(apt-helper apt-helper.cc)
add_executable(apt-sortpkgs apt-sortpkgs.cc)
add_executable(apt-extracttemplates apt-extracttemplates.cc)
add_executable(apt-internal-solver apt-internal-solver.cc)
-add_executable(sileo-solver sileo-solver.cc)
add_executable(apt-dump-solver apt-dump-solver.cc)
add_executable(apt-internal-planner apt-internal-planner.cc)
add_vendor_file(OUTPUT apt-key
@@ -32,7 +31,6 @@ target_link_libraries(apt-mark apt-pkg apt-private)
target_link_libraries(apt-sortpkgs apt-pkg apt-private)
target_link_libraries(apt-extracttemplates apt-pkg apt-inst apt-private)
target_link_libraries(apt-internal-solver apt-pkg apt-inst apt-private)
-target_link_libraries(sileo-solver apt-pkg apt-inst apt-private)
target_link_libraries(apt-dump-solver apt-pkg apt-inst apt-private)
target_link_libraries(apt-internal-planner apt-pkg apt-inst apt-private)
@@ -42,9 +40,6 @@ set_target_properties(apt-dump-solver
set_target_properties(apt-internal-solver
PROPERTIES RUNTIME_OUTPUT_DIRECTORY solvers
RUNTIME_OUTPUT_NAME apt)
-set_target_properties(sileo-solver
- PROPERTIES RUNTIME_OUTPUT_DIRECTORY solvers
- RUNTIME_OUTPUT_NAME sileo)
set_target_properties(apt-internal-planner
PROPERTIES RUNTIME_OUTPUT_DIRECTORY planners
RUNTIME_OUTPUT_NAME apt)
@@ -55,7 +50,7 @@ install(TARGETS apt apt-cache apt-get apt-config apt-cdrom apt-mark apt-sortpkgs
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS apt-helper RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/)
-install(TARGETS apt-dump-solver apt-internal-solver sileo-solver RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/solvers)
+install(TARGETS apt-dump-solver apt-internal-solver RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/solvers)
install(TARGETS apt-internal-planner RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/planners)
add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/planners ../solvers/dump planners/dump)
diff --git a/cmdline/sileo-solver.cc b/cmdline/sileo-solver.cc
deleted file mode 100644
index 0bc516c41..000000000
--- a/cmdline/sileo-solver.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-// -*- mode: cpp; mode: fold -*-
-// Description /*{{{*/
-/* #####################################################################
-
- cover around the internal solver to be able to run it like an external
-
- ##################################################################### */
- /*}}}*/
-// Include Files /*{{{*/
-#include <config.h>
-
-#include <apt-pkg/algorithms.h>
-#include <apt-pkg/cachefile.h>
-#include <apt-pkg/cacheset.h>
-#include <apt-pkg/cmndline.h>
-#include <apt-pkg/configuration.h>
-#include <apt-pkg/depcache.h>
-#include <apt-pkg/edsp.h>
-#include <apt-pkg/error.h>
-#include <apt-pkg/fileutl.h>
-#include <apt-pkg/init.h>
-#include <apt-pkg/pkgcache.h>
-#include <apt-pkg/pkgsystem.h>
-#include <apt-pkg/strutl.h>
-#include <apt-pkg/upgrade.h>
-
-#include <apt-private/private-cmndline.h>
-#include <apt-private/private-main.h>
-#include <apt-private/private-output.h>
-
-#include <cstdio>
-#include <iostream>
-#include <list>
-#include <sstream>
-#include <string>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <apti18n.h>
- /*}}}*/
-
-static bool ShowHelp(CommandLine &) /*{{{*/
-{
- std::cout <<
- _("Usage: sileo-solver\n"
- "\n"
- "sileo-solver is an interface to use the internal\n"
- "resolver for the APT family for Sileo.\n");
- return true;
-}
- /*}}}*/
-APT_NORETURN static void DIE(std::string const &message) { /*{{{*/
- std::cerr << "ERROR: " << message << std::endl;
- _error->DumpErrors(std::cerr);
- exit(EXIT_FAILURE);
-}
- /*}}}*/
-static std::vector<aptDispatchWithHelp> GetCommands() /*{{{*/
-{
- return {};
-}
- /*}}}*/
-static bool WriteSolution(pkgDepCache &Cache, FileFd &output) /*{{{*/
-{
- bool Okay = output.Failed() == false;
- for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false && likely(Okay); ++Pkg)
- {
- std::string action;
- if (Cache[Pkg].Delete() == true)
- Okay &= EDSP::WriteSolutionStanza(output, "Remove", Pkg.CurrentVer());
- else if (Cache[Pkg].NewInstall() == true || Cache[Pkg].Upgrade() == true)
- Okay &= EDSP::WriteSolutionStanza(output, "Install", Cache.GetCandidateVersion(Pkg));
- else if (Cache[Pkg].Garbage == true)
- Okay &= EDSP::WriteSolutionStanza(output, "Autoremove", Pkg.CurrentVer());
- }
- return Okay;
-}
- /*}}}*/
-int main(int argc,const char *argv[]) /*{{{*/
-{
- // we really don't need anything
- DropPrivileges();
-
- CommandLine CmdL;
- ParseCommandLine(CmdL, APT_CMD::APT_INTERNAL_SOLVER, &_config, NULL, argc, argv, &ShowHelp, &GetCommands);
-
- _config->Set("APT::Format::for-sileo",true);
-
- if (CmdL.FileList[0] != 0 && strcmp(CmdL.FileList[0], "scenario") == 0)
- {
- if (pkgInitSystem(*_config,_system) == false) {
- std::cerr << "System could not be initialized!" << std::endl;
- return 1;
- }
- pkgCacheFile CacheFile;
- CacheFile.Open(NULL, false);
- APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList + 1);
- FileFd output;
- if (output.OpenDescriptor(STDOUT_FILENO, FileFd::WriteOnly | FileFd::BufferedWrite, true) == false)
- return 2;
- if (pkgset.empty() == true)
- EDSP::WriteScenario(CacheFile, output);
- else
- {
- std::vector<bool> pkgvec(CacheFile->Head().PackageCount, false);
- for (auto const &p: pkgset)
- pkgvec[p->ID] = true;
- EDSP::WriteLimitedScenario(CacheFile, output, pkgvec);
- }
- output.Close();
- _error->DumpErrors(std::cerr);
- return 0;
- }
-
- // Deal with stdout not being a tty
- if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
- _config->Set("quiet","1");
-
- if (_config->FindI("quiet", 0) < 1)
- _config->Set("Debug::EDSP::WriteSolution", true);
-
- _config->Set("APT::System", "Debian APT solver interface");
- _config->Set("APT::Solver", "internal");
- _config->Set("edsp::scenario", "/nonexistent/stdin");
- _config->Clear("Dir::Log");
- FileFd output;
- if (output.OpenDescriptor(STDOUT_FILENO, FileFd::WriteOnly | FileFd::BufferedWrite, true) == false)
- DIE("stdout couldn't be opened");
- int const input = STDIN_FILENO;
- SetNonBlock(input, false);
-
- EDSP::WriteProgress(0, "Start up solver…", output);
-
- if (pkgInitSystem(*_config,_system) == false)
- DIE("System could not be initialized!");
-
- EDSP::WriteProgress(1, "Read request…", output);
-
- if (WaitFd(input, false, 5) == false)
- DIE("WAIT timed out in the resolver");
-
- std::list<std::string> install, remove;
- unsigned int flags;
- if (EDSP::ReadRequest(input, install, remove, flags) == false)
- DIE("Parsing the request failed!");
-
- EDSP::WriteProgress(5, "Read scenario…", output);
-
- pkgCacheFile CacheFile;
- if (CacheFile.Open(NULL, false) == false)
- DIE("Failed to open CacheFile!");
-
- EDSP::WriteProgress(50, "Apply request on scenario…", output);
-
- if (EDSP::ApplyRequest(install, remove, CacheFile) == false)
- DIE("Failed to apply request to depcache!");
-
- pkgProblemResolver Fix(CacheFile);
- for (std::list<std::string>::const_iterator i = remove.begin();
- i != remove.end(); ++i) {
- pkgCache::PkgIterator P = CacheFile->FindPkg(*i);
- Fix.Clear(P);
- Fix.Protect(P);
- Fix.Remove(P);
- }
-
- for (std::list<std::string>::const_iterator i = install.begin();
- i != install.end(); ++i) {
- pkgCache::PkgIterator P = CacheFile->FindPkg(*i);
- Fix.Clear(P);
- Fix.Protect(P);
- }
-
- for (std::list<std::string>::const_iterator i = install.begin();
- i != install.end(); ++i)
- CacheFile->MarkInstall(CacheFile->FindPkg(*i), true);
-
- EDSP::WriteProgress(60, "Call problemresolver on current scenario…", output);
-
- std::string failure;
- if (flags & EDSP::Request::UPGRADE_ALL) {
- int upgrade_flags = APT::Upgrade::ALLOW_EVERYTHING;
- if (flags & EDSP::Request::FORBID_NEW_INSTALL)
- upgrade_flags |= APT::Upgrade::FORBID_INSTALL_NEW_PACKAGES;
- if (flags & EDSP::Request::FORBID_REMOVE)
- upgrade_flags |= APT::Upgrade::FORBID_REMOVE_PACKAGES;
-
- if (APT::Upgrade::Upgrade(CacheFile, upgrade_flags))
- ;
- else if (upgrade_flags == APT::Upgrade::ALLOW_EVERYTHING)
- failure = "ERR_UNSOLVABLE_FULL_UPGRADE";
- else
- failure = "ERR_UNSOLVABLE_UPGRADE";
- } else if (Fix.Resolve() == false)
- failure = "ERR_UNSOLVABLE";
-
- if (failure.empty() == false) {
- std::ostringstream broken;
- ShowBroken(broken, CacheFile, false);
- EDSP::WriteError(failure.c_str(), broken.str(), output);
- return 0;
- }
-
- EDSP::WriteProgress(95, "Write solution…", output);
-
- if (WriteSolution(CacheFile, output) == false)
- DIE("Failed to output the solution!");
-
- EDSP::WriteProgress(100, "Done", output);
-
- return DispatchCommandLine(CmdL, {});
-}
- /*}}}*/
diff --git a/methods/CMakeLists.txt b/methods/CMakeLists.txt
index c4a32b4f5..14689bbfe 100644
--- a/methods/CMakeLists.txt
+++ b/methods/CMakeLists.txt
@@ -2,32 +2,34 @@
include_directories($<$<BOOL:${SECCOMP_FOUND}>:${SECCOMP_INCLUDE_DIR}>)
link_libraries(apt-pkg $<$<BOOL:${SECCOMP_FOUND}>:${SECCOMP_LIBRARIES}>)
-add_library(connectlib OBJECT connect.cc rfc2553emu.cc)
+#add_library(connectlib OBJECT connect.cc rfc2553emu.cc)
add_executable(file file.cc)
add_executable(copy copy.cc)
add_executable(store store.cc)
add_executable(gpgv gpgv.cc)
add_executable(cdrom cdrom.cc)
-add_executable(http http.cc basehttp.cc $<TARGET_OBJECTS:connectlib>)
+#add_executable(http http.cc basehttp.cc $<TARGET_OBJECTS:connectlib>)
+add_executable(https nshttp.mm)
add_executable(mirror mirror.cc)
-add_executable(ftp ftp.cc $<TARGET_OBJECTS:connectlib>)
+#add_executable(ftp ftp.cc $<TARGET_OBJECTS:connectlib>)
add_executable(rred rred.cc)
add_executable(rsh rsh.cc)
-target_compile_definitions(connectlib PRIVATE ${GNUTLS_DEFINITIONS})
-target_include_directories(connectlib PRIVATE ${GNUTLS_INCLUDE_DIR})
+#target_compile_definitions(connectlib PRIVATE ${GNUTLS_DEFINITIONS})
+#target_include_directories(connectlib PRIVATE ${GNUTLS_INCLUDE_DIR})
# Additional libraries to link against for networked stuff
-target_link_libraries(http ${GNUTLS_LIBRARIES})
-target_link_libraries(ftp ${GNUTLS_LIBRARIES})
+#target_link_libraries(http ${GNUTLS_LIBRARIES})
+target_link_libraries(https "-framework Foundation")
+#target_link_libraries(ftp ${GNUTLS_LIBRARIES})
# Install the library
-install(TARGETS file copy store gpgv cdrom http ftp rred rsh mirror
+install(TARGETS file copy store https gpgv cdrom rred rsh mirror
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/apt/methods)
add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods mirror mirror+ftp mirror+http mirror+https mirror+file mirror+copy)
add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods rsh ssh)
-add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods http https)
+#add_slaves(${CMAKE_INSTALL_LIBEXECDIR}/apt/methods http https)
diff --git a/methods/nshttp.h b/methods/nshttp.h
new file mode 100644
index 000000000..d0a7c8c31
--- /dev/null
+++ b/methods/nshttp.h
@@ -0,0 +1,40 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* ######################################################################
+
+ HTTP method - Transfer files via rsh compatible program
+
+ ##################################################################### */
+ /*}}}*/
+#ifndef APT_NSHTTP_H
+#define APT_NSHTTP_H
+
+#include <string>
+#include <time.h>
+
+#include <apt-pkg/strutl.h>
+#include <Foundation/Foundation.h>
+
+class Hashes;
+class FileFd;
+
+#include "aptmethod.h"
+
+class HttpMethod : public aptMethod
+{
+ virtual bool Fetch(FetchItem *Itm) APT_OVERRIDE;
+ virtual bool Configuration(std::string Message) APT_OVERRIDE;
+
+ NSURLSession *session;
+
+ static std::string FailFile;
+ static int FailFd;
+ static time_t FailTime;
+ static APT_NORETURN void SigTerm(int);
+
+ public:
+
+ explicit HttpMethod(std::string &&Prog);
+};
+
+#endif
diff --git a/methods/nshttp.mm b/methods/nshttp.mm
new file mode 100644
index 000000000..4f4e438b0
--- /dev/null
+++ b/methods/nshttp.mm
@@ -0,0 +1,196 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* ######################################################################
+
+ RSH method - Transfer files via rsh compatible program
+
+ Written by Ben Collins <bcollins@debian.org>, Copyright (c) 2000
+ Licensed under the GNU General Public License v2 [no exception clauses]
+
+ ##################################################################### */
+ /*}}}*/
+// Include Files /*{{{*/
+#include <config.h>
+
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/hashes.h>
+#include <apt-pkg/strutl.h>
+
+#include "nshttp.h"
+#include <errno.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#include <apti18n.h>
+
+unsigned long TimeOut = 30;
+Configuration::Item const *HttpOptions = 0;
+time_t HttpMethod::FailTime = 0;
+
+// HttpMethod::HttpMethod - Constructor /*{{{*/
+HttpMethod::HttpMethod(std::string &&pProg) : aptMethod(std::move(pProg),"1.0",SendConfig)
+{
+ signal(SIGTERM,SigTerm);
+ signal(SIGINT,SigTerm);
+}
+ /*}}}*/
+// HttpMethod::Configuration - Handle a configuration message /*{{{*/
+// ---------------------------------------------------------------------
+bool HttpMethod::Configuration(std::string Message)
+{
+ // enabling privilege dropping for this method requires configuration…
+ // … which is otherwise lifted straight from root, so use it by default.
+ _config->Set(std::string("Binary::") + Binary + "::APT::Sandbox::User", "");
+
+ if (aptMethod::Configuration(Message) == false)
+ return false;
+
+ std::string const timeconf = std::string("Acquire::") + Binary + "::Timeout";
+ TimeOut = _config->FindI(timeconf, TimeOut);
+ std::string const optsconf = std::string("Acquire::") + Binary + "::Options";
+ HttpOptions = _config->Tree(optsconf.c_str());
+
+ return true;
+}
+ /*}}}*/
+// HttpMethod::SigTerm - Clean up and timestamp the files on exit /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void HttpMethod::SigTerm(int)
+{
+ _exit(100);
+}
+ /*}}}*/
+// HttpMethod::Fetch - Fetch a URI /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool HttpMethod::Fetch(FetchItem *Itm)
+{
+ URI Get = Itm->Uri;
+ std::string cppGet = Get;
+ NSURL *URL = [NSURL URLWithString:[NSString stringWithUTF8String:cppGet.c_str()]];
+ __block FetchResult Res;
+ Res.Filename = Itm->DestFile;
+ Res.IMSHit = false;
+
+ __block BOOL success = NO;
+
+ dispatch_semaphore_t sem = dispatch_semaphore_create(0);
+
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TimeOut];
+ [request setHTTPMethod:@"HEAD"];
+ [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *, NSURLResponse *response, NSError *error){
+ NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
+ if (httpResponse.statusCode >= 200){
+ if (httpResponse.expectedContentLength != NSURLResponseUnknownLength)
+ Res.Size = httpResponse.expectedContentLength;
+ NSString *dateModified = httpResponse.allHeaderFields[@"Date"];
+ if (dateModified){
+ NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
+ [formatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en"]];
+ [formatter setDateFormat:@"EEEE, dd LLL yyyy HH:mm:ss zzz"];
+ NSDate *date = [formatter dateFromString:dateModified];
+ this->FailTime = [date timeIntervalSince1970];
+ [formatter release];
+ }
+ success = YES;
+ } else {
+ success = NO;
+ }
+ dispatch_semaphore_signal(sem);
+ }] resume];
+
+ Status(_("Connecting to %s"), Get.Host.c_str());
+ dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, TimeOut * NSEC_PER_SEC));
+
+ // Get the files information
+ if (!success)
+ {
+ return false;
+ }
+
+ // See if it is an IMS hit
+ if (Itm->LastModified == FailTime) {
+ Res.Size = 0;
+ Res.IMSHit = true;
+ URIDone(Res);
+ return true;
+ }
+
+ // See if the file exists
+ struct stat Buf;
+ if (stat(Itm->DestFile.c_str(),&Buf) == 0) {
+ if (Res.Size == (unsigned long long)Buf.st_size && FailTime == Buf.st_mtime) {
+ Res.Size = Buf.st_size;
+ Res.LastModified = Buf.st_mtime;
+ Res.ResumePoint = Buf.st_size;
+ URIDone(Res);
+ return true;
+ }
+
+ // Resume?
+ if (FailTime == Buf.st_mtime && Res.Size > (unsigned long long)Buf.st_size)
+ Res.ResumePoint = Buf.st_size;
+ }
+
+ // Open the file
+ Hashes Hash(Itm->ExpectedHashes);
+ {
+ [request setHTTPMethod:@"GET"];
+
+ success = NO;
+
+ NSURLSessionDownloadTask *task = [[NSURLSession sharedSession] downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error){
+ NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
+ if (httpResponse.statusCode == 200 && !error){
+ NSString *destFile = [NSString stringWithUTF8String:Itm->DestFile.c_str()];
+ [[NSFileManager defaultManager] removeItemAtPath:destFile error:nil];
+ success = [[NSFileManager defaultManager] moveItemAtPath:location.path toPath:destFile error:&error];
+ if (error){
+ success = NO;
+ }
+ }
+ dispatch_semaphore_signal(sem);
+ }];
+ [task resume];
+ dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, TimeOut * NSEC_PER_SEC));
+
+ if (!success){
+ Fail(true);
+ return true;
+ }
+
+ FileFd Fd(Itm->DestFile,FileFd::WriteExists);
+ Hash.AddFD(Fd,Hashes::UntilEOF);
+
+ URIStart(Res);
+
+ Res.Size = Fd.Size();
+ struct timeval times[2];
+ times[0].tv_sec = FailTime;
+ times[1].tv_sec = FailTime;
+ times[0].tv_usec = times[1].tv_usec = 0;
+ utimes(Fd.Name().c_str(), times);
+ }
+
+ Res.LastModified = FailTime;
+ Res.TakeHashes(Hash);
+
+ URIDone(Res);
+
+ return true;
+}
+ /*}}}*/
+
+int main(int, const char *argv[])
+{
+ return HttpMethod(flNotDir(argv[0])).Run();
+}