Skip to content

Commit 9d4d109

Browse files
committed
diff-closures: print sizes with dynamic unit
1 parent bef3c37 commit 9d4d109

File tree

5 files changed

+9
-8
lines changed

5 files changed

+9
-8
lines changed

src/libutil-tests/util.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ TEST(renderSize, misc)
158158
ASSERT_EQ(renderSize(972, true), " 0.9 KiB");
159159
ASSERT_EQ(renderSize(973, true), " 1.0 KiB"); // FIXME: should round down
160160
ASSERT_EQ(renderSize(1024, true), " 1.0 KiB");
161+
ASSERT_EQ(renderSize(-1024, true), " -1.0 KiB");
161162
ASSERT_EQ(renderSize(1024 * 1024, true), "1024.0 KiB");
162163
ASSERT_EQ(renderSize(1100 * 1024, true), " 1.1 MiB");
163164
ASSERT_EQ(renderSize(2ULL * 1024 * 1024 * 1024, true), " 2.0 GiB");

src/libutil/include/nix/util/util.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ N string2IntWithUnitPrefix(std::string_view s)
104104
* GiB`. If `align` is set, the number will be right-justified by
105105
* padding with spaces on the left.
106106
*/
107-
std::string renderSize(uint64_t value, bool align = false);
107+
std::string renderSize(int64_t value, bool align = false);
108108

109109
/**
110110
* Parse a string into a float.

src/libutil/util.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,16 @@ std::optional<N> string2Float(const std::string_view s)
132132
template std::optional<double> string2Float<double>(const std::string_view s);
133133
template std::optional<float> string2Float<float>(const std::string_view s);
134134

135-
std::string renderSize(uint64_t value, bool align)
135+
std::string renderSize(int64_t value, bool align)
136136
{
137137
static const std::array<char, 9> prefixes{{'K', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'}};
138138
size_t power = 0;
139-
double res = value;
140-
while (res > 1024 && power < prefixes.size()) {
139+
double abs_value = std::abs(value);
140+
while (abs_value > 1024 && power < prefixes.size()) {
141141
++power;
142-
res /= 1024;
142+
abs_value /= 1024;
143143
}
144+
double res = (double) value / std::pow(1024.0, power);
144145
return fmt(align ? "%6.1f %ciB" : "%.1f %ciB", power == 0 ? res / 1024 : res, prefixes.at(power));
145146
}
146147

src/nix/diff-closures.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,7 @@ void printClosureDiff(
107107
if (!removed.empty() || !added.empty())
108108
items.push_back(fmt("%s → %s", showVersions(removed), showVersions(added)));
109109
if (showDelta)
110-
items.push_back(
111-
fmt("%s%+.1f KiB" ANSI_NORMAL, sizeDelta > 0 ? ANSI_RED : ANSI_GREEN, sizeDelta / 1024.0));
110+
items.push_back(fmt("%s%s" ANSI_NORMAL, sizeDelta > 0 ? ANSI_RED : ANSI_GREEN, renderSize(sizeDelta)));
112111
logger->cout("%s%s: %s", indent, name, concatStringsSep(", ", items));
113112
}
114113
}

src/nix/path-info.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ struct CmdPathInfo : StorePathsCommand, MixJSON
141141
void printSize(std::ostream & str, uint64_t value)
142142
{
143143
if (humanReadable)
144-
str << fmt("\t%s", renderSize(value, true));
144+
str << fmt("\t%s", renderSize((int64_t) value, true));
145145
else
146146
str << fmt("\t%11d", value);
147147
}

0 commit comments

Comments
 (0)