summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2024-04-15 17:51:26 +0200
committerJulian Andres Klode <julian.klode@canonical.com>2024-04-19 20:49:05 +0200
commitae1ff72fbee8b3f5d063e8baa86a64e3da11aeb2 (patch)
treeca9a0f28ae4063ddeb7b50552769be3b68f2de48
parent3f5e368ba800f823b36931ced783d450ec621264 (diff)
show: Highlight field names and colorize package name
We should pass this properly to the TagSection.write()
-rw-r--r--apt-pkg/tagfile.cc32
-rw-r--r--apt-pkg/tagfile.h8
-rw-r--r--apt-private/private-output.cc2
-rw-r--r--apt-private/private-show.cc10
-rw-r--r--doc/examples/configure-index2
5 files changed, 40 insertions, 14 deletions
diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc
index 95ae4a483..934a89d59 100644
--- a/apt-pkg/tagfile.cc
+++ b/apt-pkg/tagfile.cc
@@ -12,6 +12,7 @@
// Include Files /*{{{*/
#include <config.h>
+#include <apt-pkg/configuration.h>
#include <apt-pkg/error.h>
#include <apt-pkg/fileutl.h>
#include <apt-pkg/string_view.h>
@@ -30,8 +31,9 @@
#include <apti18n.h>
/*}}}*/
-using std::string;
using APT::StringView;
+using APT::Configuration::color;
+using std::string;
class APT_HIDDEN pkgTagFilePrivate /*{{{*/
{
@@ -972,19 +974,23 @@ pkgTagSection::Tag pkgTagSection::Tag::Rewrite(std::string const &Name, std::str
else
return Tag(REWRITE, Name, Data);
}
-static bool WriteTag(FileFd &File, std::string Tag, StringView Value)
+static bool WriteTag(FileFd &File, std::string Tag, StringView Value, pkgTagSection::WriteFlags flags)
{
if (Value.empty() || isspace_ascii(Value[0]) != 0)
Tag.append(":");
else
Tag.append(": ");
+
+ if (flags & pkgTagSection::WRITE_HUMAN)
+ Tag = color("Show::Field", Tag);
+
Tag.append(Value.data(), Value.length());
Tag.append("\n");
return File.Write(Tag.c_str(), Tag.length());
}
-static bool RewriteTags(FileFd &File, pkgTagSection const * const This, char const * const Tag,
- std::vector<pkgTagSection::Tag>::const_iterator &R,
- std::vector<pkgTagSection::Tag>::const_iterator const &REnd)
+static bool RewriteTags(FileFd &File, pkgTagSection const *const This, char const *const Tag,
+ std::vector<pkgTagSection::Tag>::const_iterator &R,
+ std::vector<pkgTagSection::Tag>::const_iterator const &REnd, pkgTagSection::WriteFlags flags)
{
size_t const TagLen = strlen(Tag);
for (; R != REnd; ++R)
@@ -1002,19 +1008,23 @@ static bool RewriteTags(FileFd &File, pkgTagSection const * const This, char con
else
continue;
- return WriteTag(File, Tag, data);
+ return WriteTag(File, Tag, data, flags);
}
return true;
}
bool pkgTagSection::Write(FileFd &File, char const * const * const Order, std::vector<Tag> const &Rewrite) const
{
+ return Write(File, WRITE_DEFAULT, Order, Rewrite);
+}
+bool pkgTagSection::Write(FileFd &File, pkgTagSection::WriteFlags flags, char const *const *const Order, std::vector<Tag> const &Rewrite) const
+{
// first pass: Write everything we have an order for
if (Order != NULL)
{
for (unsigned int I = 0; Order[I] != 0; ++I)
{
std::vector<Tag>::const_iterator R = Rewrite.begin();
- if (RewriteTags(File, this, Order[I], R, Rewrite.end()) == false)
+ if (RewriteTags(File, this, Order[I], R, Rewrite.end(), flags) == false)
return false;
if (R != Rewrite.end())
continue;
@@ -1022,7 +1032,7 @@ bool pkgTagSection::Write(FileFd &File, char const * const * const Order, std::v
if (Exists(Order[I]) == false)
continue;
- if (WriteTag(File, Order[I], FindRaw(Order[I])) == false)
+ if (WriteTag(File, Order[I], FindRaw(Order[I]), flags) == false)
return false;
}
}
@@ -1047,12 +1057,12 @@ bool pkgTagSection::Write(FileFd &File, char const * const * const Order, std::v
std::string const name(fieldname, fieldnamelen);
std::vector<Tag>::const_iterator R = Rewrite.begin();
- if (RewriteTags(File, this, name.c_str(), R, Rewrite.end()) == false)
+ if (RewriteTags(File, this, name.c_str(), R, Rewrite.end(), flags) == false)
return false;
if (R != Rewrite.end())
continue;
- if (WriteTag(File, name, FindRaw(name)) == false)
+ if (WriteTag(File, name, FindRaw(name), flags) == false)
return false;
}
}
@@ -1076,7 +1086,7 @@ bool pkgTagSection::Write(FileFd &File, char const * const * const Order, std::v
continue;
}
- if (WriteTag(File, name, ((R->Action == Tag::RENAME) ? FindRaw(R->Name) : R->Data)) == false)
+ if (WriteTag(File, name, ((R->Action == Tag::RENAME) ? FindRaw(R->Name) : R->Data), flags) == false)
return false;
}
return true;
diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h
index 0020d284b..45529c9f5 100644
--- a/apt-pkg/tagfile.h
+++ b/apt-pkg/tagfile.h
@@ -166,6 +166,14 @@ class APT_PUBLIC pkgTagSection
* @return \b true if successful, otherwise \b false
*/
bool Write(FileFd &File, char const * const * const Order = NULL, std::vector<Tag> const &Rewrite = std::vector<Tag>()) const;
+#ifdef APT_COMPILING_APT
+ enum WriteFlags
+ {
+ WRITE_DEFAULT = 0,
+ WRITE_HUMAN = (1 << 0), /* write human readable output, may include highlighting */
+ };
+ bool Write(FileFd &File, WriteFlags flags, char const *const *const Order = NULL, std::vector<Tag> const &Rewrite = std::vector<Tag>()) const;
+#endif
};
diff --git a/apt-private/private-output.cc b/apt-private/private-output.cc
index d5720f41a..5d83a04f4 100644
--- a/apt-private/private-output.cc
+++ b/apt-private/private-output.cc
@@ -112,6 +112,8 @@ bool InitOutput(std::basic_streambuf<char> * const out) /*{{{*/
_config->CndSet("APT::Color::Action::Install-Dependencies", "green");
_config->CndSet("APT::Color::Action::Downgrade", "yellow");
_config->CndSet("APT::Color::Action::Remove", "red");
+ _config->CndSet("APT::Color::Show::Field", "\x1B[1m");
+ _config->CndSet("APT::Color::Show::Package", "\x1B[32m");
}
return true;
diff --git a/apt-private/private-show.cc b/apt-private/private-show.cc
index cefbd9b67..4ae043071 100644
--- a/apt-private/private-show.cc
+++ b/apt-private/private-show.cc
@@ -1,6 +1,7 @@
// Includes /*{{{*/
#include <config.h>
+#include <apt-pkg/aptconfiguration.h>
#include <apt-pkg/cachefile.h>
#include <apt-pkg/cacheset.h>
#include <apt-pkg/cmndline.h>
@@ -33,6 +34,8 @@
#include <apti18n.h>
/*}}}*/
+using APT::Configuration::color;
+
pkgRecords::Parser &LookupParser(pkgRecords &Recs, pkgCache::VerIterator const &V, pkgCache::VerFileIterator &Vf) /*{{{*/
{
Vf = V.FileList();
@@ -271,7 +274,8 @@ static bool DisplayRecordV2(pkgCacheFile &CacheFile, pkgRecords &Recs, /*{{{*/
RW.push_back(pkgTagSection::Tag::Remove("Description"));
RW.push_back(pkgTagSection::Tag::Remove("Description-md5"));
// improve
- RW.push_back(pkgTagSection::Tag::Rewrite("Package", V.ParentPkg().FullName(true)));
+ RW.push_back(pkgTagSection::Tag::Rewrite("Package", color("Show::Package", V.ParentPkg().FullName(true))));
+
RW.push_back(pkgTagSection::Tag::Rewrite("Installed-Size", installed_size));
RW.push_back(pkgTagSection::Tag::Remove("Size"));
RW.push_back(pkgTagSection::Tag::Rewrite("Download-Size", package_size));
@@ -282,7 +286,7 @@ static bool DisplayRecordV2(pkgCacheFile &CacheFile, pkgRecords &Recs, /*{{{*/
FileFd stdoutfd;
if (stdoutfd.OpenDescriptor(STDOUT_FILENO, FileFd::WriteOnly, false) == false ||
- Tags.Write(stdoutfd, TFRewritePackageOrder, RW) == false || stdoutfd.Close() == false)
+ Tags.Write(stdoutfd, pkgTagSection::WRITE_HUMAN, TFRewritePackageOrder, RW) == false || stdoutfd.Close() == false)
return _error->Error("Internal Error, Unable to parse a package record");
// write the description
@@ -291,7 +295,7 @@ static bool DisplayRecordV2(pkgCacheFile &CacheFile, pkgRecords &Recs, /*{{{*/
if (Desc.end() == false)
{
pkgRecords::Parser &P = Recs.Lookup(Desc.FileList());
- out << "Description: " << P.LongDesc();
+ out << color("Show::Field", "Description: ") << P.LongDesc();
}
// write a final newline (after the description)
diff --git a/doc/examples/configure-index b/doc/examples/configure-index
index 8a064fc21..48b7a72c2 100644
--- a/doc/examples/configure-index
+++ b/doc/examples/configure-index
@@ -888,6 +888,8 @@ Rred::Compress "<STRING>";
APT::Internal::OpProgress::Absolute "<BOOL>";
APT::Internal::OpProgress::EraseLines "<BOOL>";
APT::Color "<BOOL>";
+APT::Color::Show::Field "<STRING>";
+APT::Color::Show::Package "<STRING>";
update-manager::always-include-phased-updates "<BOOL>";
update-manager::never-include-phased-updates "<BOOL>";