X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/b917917067e757c4479a344a263ef7cf43c00866..ea606ec43a364a8e471fd9502d79fe2dfeb6e4ba:/apt-private/private-output.cc diff --git a/apt-private/private-output.cc b/apt-private/private-output.cc index 659975476..32f27a3dd 100644 --- a/apt-private/private-output.cc +++ b/apt-private/private-output.cc @@ -7,15 +7,23 @@ #include #include #include +#include +#include +#include +#include +#include + +#include +#include +#include +#include #include #include -#include #include #include - -#include "private-output.h" -#include "private-cachefile.h" +#include +#include #include /*}}}*/ @@ -26,11 +34,29 @@ std::ostream c0out(0); std::ostream c1out(0); std::ostream c2out(0); std::ofstream devnull("/dev/null"); -unsigned int ScreenWidth = 80 - 1; /* - 1 for the cursor */ -bool InitOutput() +unsigned int ScreenWidth = 80 - 1; /* - 1 for the cursor */ + +// SigWinch - Window size change signal handler /*{{{*/ +// --------------------------------------------------------------------- +/* */ +static void SigWinch(int) { + // Riped from GNU ls +#ifdef TIOCGWINSZ + struct winsize ws; + + if (ioctl(1, TIOCGWINSZ, &ws) != -1 && ws.ws_col >= 5) + ScreenWidth = ws.ws_col - 1; +#endif +} + /*}}}*/ +bool InitOutput() /*{{{*/ +{ + if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1) + _config->Set("quiet","1"); + c0out.rdbuf(cout.rdbuf()); c1out.rdbuf(cout.rdbuf()); c2out.rdbuf(cout.rdbuf()); @@ -39,6 +65,10 @@ bool InitOutput() if (_config->FindI("quiet",0) > 1) c1out.rdbuf(devnull.rdbuf()); + // deal with window size changes + signal(SIGWINCH,SigWinch); + SigWinch(0); + if(!isatty(1)) { _config->Set("APT::Color", "false"); @@ -60,8 +90,8 @@ bool InitOutput() return true; } - -std::string GetArchiveSuite(pkgCacheFile &CacheFile, pkgCache::VerIterator ver) + /*}}}*/ +static std::string GetArchiveSuite(pkgCacheFile &/*CacheFile*/, pkgCache::VerIterator ver) /*{{{*/ { std::string suite = ""; if (ver && ver.FileList() && ver.FileList()) @@ -69,16 +99,18 @@ std::string GetArchiveSuite(pkgCacheFile &CacheFile, pkgCache::VerIterator ver) pkgCache::VerFileIterator VF = ver.FileList(); for (; VF.end() == false ; ++VF) { - // XXX: how to figure out the relevant suite? if its in multiple ones? - suite = suite + "," + VF.File().Archive(); + if(VF.File() == NULL || VF.File().Archive() == NULL) + suite = suite + "," + _("unknown"); + else + suite = suite + "," + VF.File().Archive(); //suite = VF.File().Archive(); } suite = suite.erase(0, 1); } return suite; } - -std::string GetFlagsStr(pkgCacheFile &CacheFile, pkgCache::PkgIterator P) + /*}}}*/ +static std::string GetFlagsStr(pkgCacheFile &CacheFile, pkgCache::PkgIterator P)/*{{{*/ { pkgDepCache *DepCache = CacheFile.GetDepCache(); pkgDepCache::StateCache &state = (*DepCache)[P]; @@ -94,32 +126,34 @@ std::string GetFlagsStr(pkgCacheFile &CacheFile, pkgCache::PkgIterator P) flags_str = "-"; return flags_str; } - -std::string GetCandidateVersion(pkgCacheFile &CacheFile, pkgCache::PkgIterator P) + /*}}}*/ +static std::string GetCandidateVersion(pkgCacheFile &CacheFile, pkgCache::PkgIterator P)/*{{{*/ { pkgPolicy *policy = CacheFile.GetPolicy(); pkgCache::VerIterator cand = policy->GetCandidateVer(P); return cand ? cand.VerStr() : "(none)"; } - -std::string GetInstalledVersion(pkgCacheFile &CacheFile, pkgCache::PkgIterator P) + /*}}}*/ +static std::string GetInstalledVersion(pkgCacheFile &/*CacheFile*/, pkgCache::PkgIterator P)/*{{{*/ { pkgCache::VerIterator inst = P.CurrentVer(); return inst ? inst.VerStr() : "(none)"; } - -std::string GetVersion(pkgCacheFile &CacheFile, pkgCache::VerIterator V) + /*}}}*/ +static std::string GetVersion(pkgCacheFile &/*CacheFile*/, pkgCache::VerIterator V)/*{{{*/ { pkgCache::PkgIterator P = V.ParentPkg(); if (V == P.CurrentVer()) { + std::string inst_str = DeNull(V.VerStr()); +#if 0 // FIXME: do we want this or something like this? pkgDepCache *DepCache = CacheFile.GetDepCache(); pkgDepCache::StateCache &state = (*DepCache)[P]; - std::string inst_str = DeNull(V.VerStr()); if (state.Upgradable()) return "**"+inst_str; +#endif return inst_str; } @@ -127,17 +161,21 @@ std::string GetVersion(pkgCacheFile &CacheFile, pkgCache::VerIterator V) return DeNull(V.VerStr()); return "(none)"; } - -std::string GetArchitecture(pkgCacheFile &CacheFile, pkgCache::PkgIterator P) + /*}}}*/ +static std::string GetArchitecture(pkgCacheFile &CacheFile, pkgCache::PkgIterator P)/*{{{*/ { pkgPolicy *policy = CacheFile.GetPolicy(); pkgCache::VerIterator inst = P.CurrentVer(); pkgCache::VerIterator cand = policy->GetCandidateVer(P); - + + // this may happen for packages in dpkg "deinstall ok config-file" state + if (inst.IsGood() == false && cand.IsGood() == false) + return P.VersionList().Arch(); + return inst ? inst.Arch() : cand.Arch(); } - -std::string GetShortDescription(pkgCacheFile &CacheFile, pkgRecords &records, pkgCache::PkgIterator P) + /*}}}*/ +static std::string GetShortDescription(pkgCacheFile &CacheFile, pkgRecords &records, pkgCache::PkgIterator P)/*{{{*/ { pkgPolicy *policy = CacheFile.GetPolicy(); @@ -157,9 +195,10 @@ std::string GetShortDescription(pkgCacheFile &CacheFile, pkgRecords &records, pk } return ShortDescription; } - -void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, - pkgCache::VerIterator V, std::ostream &out) + /*}}}*/ +void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, /*{{{*/ + pkgCache::VerIterator V, std::ostream &out, + bool include_summary) { pkgCache::PkgIterator P = V.ParentPkg(); @@ -186,52 +225,53 @@ void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, // raring/linux-kernel version [upradable: new-version] // description pkgPolicy *policy = CacheFile.GetPolicy(); - out << std::setiosflags(std::ios::left) - << _config->Find("APT::Color::Highlight", "") - << name_str - << _config->Find("APT::Color::Neutral", "") - << "/" << suite - << " "; + std::string VersionStr = GetVersion(CacheFile, V); + std::string CandidateVerStr = GetCandidateVersion(CacheFile, P); + std::string InstalledVerStr = GetInstalledVersion(CacheFile, P); + std::string StatusStr; if(P.CurrentVer() == V && state.Upgradable()) { - out << GetVersion(CacheFile, V) - << " " - << "[" << _("installed,upgradable to: ") - << GetCandidateVersion(CacheFile, P) << "]"; + strprintf(StatusStr, _("[installed,upgradable to: %s]"), + CandidateVerStr.c_str()); } else if (P.CurrentVer() == V) { - out << GetVersion(CacheFile, V) - << " "; if(!V.Downloadable()) - out << _("[installed,local]"); + StatusStr = _("[installed,local]"); else if(V.Automatic() && state.Garbage) - out << _("[installed,auto-removable]"); + StatusStr = _("[installed,auto-removable]"); else if (state.Flags & pkgCache::Flag::Auto) - out << _("[installed,automatic]"); + StatusStr = _("[installed,automatic]"); else - out << _("[installed]"); + StatusStr = _("[installed]"); } else if (P.CurrentVer() && policy->GetCandidateVer(P) == V && state.Upgradable()) { - out << GetVersion(CacheFile, V) - << " " - << _("[upgradable from: ") - << GetInstalledVersion(CacheFile, P) << "]"; + strprintf(StatusStr, _("[upgradable from: %s]"), + InstalledVerStr.c_str()); } else { if (V.ParentPkg()->CurrentState == pkgCache::State::ConfigFiles) - out << GetVersion(CacheFile, V) - << " " - << _("[residual-config]"); + StatusStr = _("[residual-config]"); else - out << GetVersion(CacheFile, V); + StatusStr = ""; + } + out << std::setiosflags(std::ios::left) + << _config->Find("APT::Color::Highlight", "") + << name_str + << _config->Find("APT::Color::Neutral", "") + << "/" << suite + << " " + << VersionStr << " " + << GetArchitecture(CacheFile, P); + if (StatusStr != "") + out << " " << StatusStr; + if (include_summary) + { + out << std::endl + << " " << GetShortDescription(CacheFile, records, P) + << std::endl; } - out << " " << GetArchitecture(CacheFile, P) << " "; - out << std::endl - << " " << GetShortDescription(CacheFile, records, P) - << std::endl; } } - - + /*}}}*/ // ShowList - Show a list /*{{{*/ // --------------------------------------------------------------------- /* This prints out a string of space separated words with a title and