aboutsummaryrefslogtreecommitdiff
path: root/src/nix/progress-bar.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix/progress-bar.cc')
-rw-r--r--src/nix/progress-bar.cc43
1 files changed, 4 insertions, 39 deletions
diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc
index 252d12c5d..e6553c06f 100644
--- a/src/nix/progress-bar.cc
+++ b/src/nix/progress-bar.cc
@@ -23,44 +23,6 @@ static uint64_t getI(const std::vector<Logger::Field> & fields, size_t n)
return fields[n].i;
}
-/* Truncate a string to 'width' printable characters. ANSI escape
- sequences are copied but not included in the character count. Also,
- tabs are expanded to spaces. */
-static std::string ansiTruncate(const std::string & s, int width)
-{
- if (width <= 0) return s;
-
- std::string t;
- size_t w = 0;
- auto i = s.begin();
-
- while (w < (size_t) width && i != s.end()) {
- if (*i == '\e') {
- t += *i++;
- if (i != s.end() && *i == '[') {
- t += *i++;
- while (i != s.end() && (*i < 0x40 || *i > 0x7e)) {
- t += *i++;
- }
- if (i != s.end()) t += *i++;
- }
- }
-
- else if (*i == '\t') {
- t += ' '; w++;
- while (w < (size_t) width && w & 8) {
- t += ' '; w++;
- }
- }
-
- else {
- t += *i++; w++;
- }
- }
-
- return t;
-}
-
class ProgressBar : public Logger
{
private:
@@ -343,7 +305,10 @@ public:
}
}
- writeToStderr("\r" + ansiTruncate(line, getWindowSize().second) + "\e[K");
+ auto width = getWindowSize().second;
+ if (width <= 0) std::numeric_limits<decltype(width)>::max();
+
+ writeToStderr("\r" + filterANSIEscapes(line, width) + "\e[K");
}
std::string getStatus(State & state)