summaryrefslogtreecommitdiff
path: root/cmd/btrfs-rec/inspect_lstrees.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-11 21:10:54 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-11 21:17:09 -0600
commit839dfa5d0aeadee9cb0f8581341922138f9595f0 (patch)
tree42130616613f57f0b9d40a7490a0f576aa94f35a /cmd/btrfs-rec/inspect_lstrees.go
parent0f853e1ead10347be8c5715d6bb797dd5e643e2f (diff)
Move all of the small-ish tools to be part of btrfs-rec
Diffstat (limited to 'cmd/btrfs-rec/inspect_lstrees.go')
-rw-r--r--cmd/btrfs-rec/inspect_lstrees.go68
1 files changed, 68 insertions, 0 deletions
diff --git a/cmd/btrfs-rec/inspect_lstrees.go b/cmd/btrfs-rec/inspect_lstrees.go
new file mode 100644
index 0000000..976514f
--- /dev/null
+++ b/cmd/btrfs-rec/inspect_lstrees.go
@@ -0,0 +1,68 @@
+// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package main
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+ "text/tabwriter"
+
+ "github.com/datawire/ocibuild/pkg/cliutil"
+ "github.com/spf13/cobra"
+
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsutil"
+ "git.lukeshu.com/btrfs-progs-ng/lib/util"
+)
+
+func init() {
+ inspectors = append(inspectors, subcommand{
+ Command: cobra.Command{
+ Use: "ls-trees",
+ Short: "A brief view what types of items are in each tree",
+ Args: cliutil.WrapPositionalArgs(cobra.NoArgs),
+ },
+ RunE: func(fs *btrfs.FS, _ *cobra.Command, _ []string) error {
+ var treeErrCnt int
+ var treeItemCnt map[btrfsitem.Type]int
+ btrfsutil.WalkAllTrees(fs, btrfsutil.WalkAllTreesHandler{
+ PreTree: func(name string, treeID btrfs.ObjID) {
+ treeErrCnt = 0
+ treeItemCnt = make(map[btrfsitem.Type]int)
+ fmt.Printf("tree id=%v name=%q\n", treeID, name)
+ },
+ Err: func(_ error) {
+ treeErrCnt++
+ },
+ TreeWalkHandler: btrfs.TreeWalkHandler{
+ Item: func(_ btrfs.TreePath, item btrfs.Item) error {
+ typ := item.Head.Key.ItemType
+ treeItemCnt[typ] = treeItemCnt[typ] + 1
+ return nil
+ },
+ },
+ PostTree: func(_ string, _ btrfs.ObjID) {
+ totalItems := 0
+ for _, cnt := range treeItemCnt {
+ totalItems += cnt
+ }
+ numWidth := len(strconv.Itoa(util.Max(treeErrCnt, totalItems)))
+
+ table := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)
+ fmt.Fprintf(table, " errors\t% *s\n", numWidth, strconv.Itoa(treeErrCnt))
+ for _, typ := range util.SortedMapKeys(treeItemCnt) {
+ fmt.Fprintf(table, " %v items\t% *s\n", typ, numWidth, strconv.Itoa(treeItemCnt[typ]))
+ }
+ fmt.Fprintf(table, " total items\t% *s\n", numWidth, strconv.Itoa(totalItems))
+ table.Flush()
+ },
+ })
+
+ return nil
+ },
+ })
+}