mirror of
https://github.com/NixOS/nix.git
synced 2025-12-09 10:31:02 +01:00
Merge pull request #14701 from NixOS/print-table
Move printTable() into libutil
This commit is contained in:
commit
c7801fc347
5 changed files with 54 additions and 34 deletions
|
|
@ -74,6 +74,7 @@ headers = files(
|
||||||
'strings.hh',
|
'strings.hh',
|
||||||
'suggestions.hh',
|
'suggestions.hh',
|
||||||
'sync.hh',
|
'sync.hh',
|
||||||
|
'table.hh',
|
||||||
'tarfile.hh',
|
'tarfile.hh',
|
||||||
'terminal.hh',
|
'terminal.hh',
|
||||||
'thread-pool.hh',
|
'thread-pool.hh',
|
||||||
|
|
|
||||||
11
src/libutil/include/nix/util/table.hh
Normal file
11
src/libutil/include/nix/util/table.hh
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "nix/util/types.hh"
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
typedef std::vector<std::vector<std::string>> Table;
|
||||||
|
|
||||||
|
void printTable(std::ostream & out, Table & table);
|
||||||
|
|
||||||
|
} // namespace nix
|
||||||
|
|
@ -159,6 +159,7 @@ sources = [ config_priv_h ] + files(
|
||||||
'source-path.cc',
|
'source-path.cc',
|
||||||
'strings.cc',
|
'strings.cc',
|
||||||
'suggestions.cc',
|
'suggestions.cc',
|
||||||
|
'table.cc',
|
||||||
'tarfile.cc',
|
'tarfile.cc',
|
||||||
'tee-logger.cc',
|
'tee-logger.cc',
|
||||||
'terminal.cc',
|
'terminal.cc',
|
||||||
|
|
|
||||||
38
src/libutil/table.cc
Normal file
38
src/libutil/table.cc
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#include "nix/util/table.hh"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
void printTable(std::ostream & out, Table & table)
|
||||||
|
{
|
||||||
|
auto nrColumns = table.size() > 0 ? table.front().size() : 0;
|
||||||
|
|
||||||
|
std::vector<size_t> widths;
|
||||||
|
widths.resize(nrColumns);
|
||||||
|
|
||||||
|
for (auto & i : table) {
|
||||||
|
assert(i.size() == nrColumns);
|
||||||
|
size_t column = 0;
|
||||||
|
for (auto j = i.begin(); j != i.end(); ++j, ++column)
|
||||||
|
if (j->size() > widths[column])
|
||||||
|
widths[column] = j->size();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto & i : table) {
|
||||||
|
size_t column = 0;
|
||||||
|
for (auto j = i.begin(); j != i.end(); ++j, ++column) {
|
||||||
|
std::string s = *j;
|
||||||
|
replace(s.begin(), s.end(), '\n', ' ');
|
||||||
|
out << s;
|
||||||
|
if (column < nrColumns - 1)
|
||||||
|
out << std::string(widths[column] - s.size() + 2, ' ');
|
||||||
|
}
|
||||||
|
out << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nix
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
#include "nix/util/xml-writer.hh"
|
#include "nix/util/xml-writer.hh"
|
||||||
#include "nix/cmd/legacy.hh"
|
#include "nix/cmd/legacy.hh"
|
||||||
#include "nix/expr/eval-settings.hh" // for defexpr
|
#include "nix/expr/eval-settings.hh" // for defexpr
|
||||||
|
#include "nix/util/table.hh"
|
||||||
#include "nix/util/terminal.hh"
|
#include "nix/util/terminal.hh"
|
||||||
#include "man-pages.hh"
|
#include "man-pages.hh"
|
||||||
|
|
||||||
|
|
@ -822,38 +823,6 @@ static bool cmpElemByName(const PackageInfo & a, const PackageInfo & b)
|
||||||
return lexicographical_compare(a_name.begin(), a_name.end(), b_name.begin(), b_name.end(), cmpChars);
|
return lexicographical_compare(a_name.begin(), a_name.end(), b_name.begin(), b_name.end(), cmpChars);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::list<Strings> Table;
|
|
||||||
|
|
||||||
void printTable(Table & table)
|
|
||||||
{
|
|
||||||
auto nrColumns = table.size() > 0 ? table.front().size() : 0;
|
|
||||||
|
|
||||||
std::vector<size_t> widths;
|
|
||||||
widths.resize(nrColumns);
|
|
||||||
|
|
||||||
for (auto & i : table) {
|
|
||||||
assert(i.size() == nrColumns);
|
|
||||||
Strings::iterator j;
|
|
||||||
size_t column;
|
|
||||||
for (j = i.begin(), column = 0; j != i.end(); ++j, ++column)
|
|
||||||
if (j->size() > widths[column])
|
|
||||||
widths[column] = j->size();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto & i : table) {
|
|
||||||
Strings::iterator j;
|
|
||||||
size_t column;
|
|
||||||
for (j = i.begin(), column = 0; j != i.end(); ++j, ++column) {
|
|
||||||
std::string s = *j;
|
|
||||||
replace(s.begin(), s.end(), '\n', ' ');
|
|
||||||
cout << s;
|
|
||||||
if (column < nrColumns - 1)
|
|
||||||
cout << std::string(widths[column] - s.size() + 2, ' ');
|
|
||||||
}
|
|
||||||
cout << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function compares the version of an element against the
|
/* This function compares the version of an element against the
|
||||||
versions in the given set of elements. `cvLess' means that only
|
versions in the given set of elements. `cvLess' means that only
|
||||||
lower versions are in the set, `cvEqual' means that at most an
|
lower versions are in the set, `cvEqual' means that at most an
|
||||||
|
|
@ -1093,7 +1062,7 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* For table output. */
|
/* For table output. */
|
||||||
Strings columns;
|
std::vector<std::string> columns;
|
||||||
|
|
||||||
/* For XML output. */
|
/* For XML output. */
|
||||||
XMLAttrs attrs;
|
XMLAttrs attrs;
|
||||||
|
|
@ -1281,7 +1250,7 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!xmlOutput)
|
if (!xmlOutput)
|
||||||
printTable(table);
|
printTable(std::cout, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void opSwitchProfile(Globals & globals, Strings opFlags, Strings opArgs)
|
static void opSwitchProfile(Globals & globals, Strings opFlags, Strings opArgs)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue