aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--forged/internal/humanize/bytes.go35
-rw-r--r--go.mod1
2 files changed, 35 insertions, 1 deletions
diff --git a/forged/internal/humanize/bytes.go b/forged/internal/humanize/bytes.go
new file mode 100644
index 0000000..bea504c
--- /dev/null
+++ b/forged/internal/humanize/bytes.go
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: Copyright (c) 2005-2008 Dustin Sallings <dustin@spy.net>
+// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org>
+
+// Package humanize provides functions to convert numbers into human-readable formats.
+package humanize
+
+import (
+ "fmt"
+ "math"
+)
+
+// IBytes produces a human readable representation of an IEC size.
+func IBytes(s uint64) string {
+ sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"}
+ return humanateBytes(s, 1024, sizes)
+}
+
+func humanateBytes(s uint64, base float64, sizes []string) string {
+ if s < 10 {
+ return fmt.Sprintf("%d B", s)
+ }
+ e := math.Floor(logn(float64(s), base))
+ suffix := sizes[int(e)]
+ val := math.Floor(float64(s)/math.Pow(base, e)*10+0.5) / 10
+ f := "%.0f %s"
+ if val < 10 {
+ f = "%.1f %s"
+ }
+
+ return fmt.Sprintf(f, val, suffix)
+}
+
+func logn(n, b float64) float64 {
+ return math.Log(n) / math.Log(b)
+}
diff --git a/go.mod b/go.mod
index b9eeef9..c16c28d 100644
--- a/go.mod
+++ b/go.mod
@@ -7,7 +7,6 @@ require (
github.com/alecthomas/chroma/v2 v2.16.0
github.com/alexedwards/argon2id v1.0.0
github.com/bluekeyes/go-gitdiff v0.8.1
- github.com/dustin/go-humanize v1.0.1
github.com/emersion/go-message v0.18.2
github.com/emersion/go-smtp v0.21.3
github.com/gliderlabs/ssh v0.3.8