summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/btrfs-rec/inspect_visualizenodes.go15
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildnodes/visualizenodes.go30
-rwxr-xr-xscripts/main.sh4
3 files changed, 23 insertions, 26 deletions
diff --git a/cmd/btrfs-rec/inspect_visualizenodes.go b/cmd/btrfs-rec/inspect_visualizenodes.go
index 4c31100..89c8ad6 100644
--- a/cmd/btrfs-rec/inspect_visualizenodes.go
+++ b/cmd/btrfs-rec/inspect_visualizenodes.go
@@ -5,6 +5,9 @@
package main
import (
+ "bufio"
+ "os"
+
"github.com/datawire/dlib/dlog"
"github.com/datawire/ocibuild/pkg/cliutil"
"github.com/spf13/cobra"
@@ -16,8 +19,8 @@ import (
func init() {
inspectors = append(inspectors, subcommand{
Command: cobra.Command{
- Use: "visualize-nodes NODESCAN.json OUTPUT_DIR",
- Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(2)),
+ Use: "visualize-nodes NODESCAN.json",
+ Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)),
},
RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) (err error) {
ctx := cmd.Context()
@@ -29,7 +32,13 @@ func init() {
}
dlog.Infof(ctx, "... done reading %q", args[0])
- return rebuildnodes.VisualizeNodes(ctx, args[1], fs, nodeScanResults)
+ buffer := bufio.NewWriter(os.Stdout)
+ defer func() {
+ if _err := buffer.Flush(); err == nil && _err != nil {
+ err = _err
+ }
+ }()
+ return rebuildnodes.VisualizeNodes(ctx, buffer, fs, nodeScanResults)
},
})
}
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/visualizenodes.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/visualizenodes.go
index c3784bb..3096b46 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/visualizenodes.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/visualizenodes.go
@@ -5,14 +5,13 @@
package rebuildnodes
import (
- "bufio"
+ "archive/zip"
"context"
"errors"
"fmt"
"html"
+ "io"
iofs "io/fs"
- "os"
- "path/filepath"
"strings"
"github.com/datawire/dlib/dlog"
@@ -57,7 +56,7 @@ func getCliqueID(cliques map[btrfsprim.ObjID]*containers.Set[btrfsprim.ObjID], t
return maps.SortedKeys(*clique)[0]
}
-func VisualizeNodes(ctx context.Context, dir string, fs *btrfs.FS, nodeScanResults btrfsinspect.ScanDevicesResult) error {
+func VisualizeNodes(ctx context.Context, out io.Writer, fs *btrfs.FS, nodeScanResults btrfsinspect.ScanDevicesResult) error {
uuidMap, err := buildUUIDMap(ctx, fs, nodeScanResults)
if err != nil {
return err
@@ -200,31 +199,17 @@ func VisualizeNodes(ctx context.Context, dir string, fs *btrfs.FS, nodeScanResul
////////////////////////////////////////////////////////////////////////////////////////////
- dlog.Infof(ctx, "Writing graphviz output to %q...", dir)
+ dlog.Info(ctx, "Writing graphviz output...")
cliqueIDs := maps.SortedKeys(edges)
- if err := os.MkdirAll(dir, 0777); err != nil {
- return err
- }
+ zw := zip.NewWriter(out)
for _, cliqueID := range cliqueIDs {
if err := func() (err error) {
- maybeSetErr := func(_err error) {
- if err == nil && _err != nil {
- err = _err
- }
- }
- fh, err := os.OpenFile(filepath.Join(dir, fmt.Sprintf("%d.dot", cliqueID)), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
+ buf, err := zw.Create(fmt.Sprintf("%d.dot", cliqueID))
if err != nil {
return err
}
- defer func() {
- maybeSetErr(fh.Close())
- }()
- buf := bufio.NewWriter(fh)
- defer func() {
- maybeSetErr(buf.Flush())
- }()
if _, err := fmt.Fprintf(buf, "digraph clique%d {\n", cliqueID); err != nil {
return err
@@ -257,6 +242,9 @@ func VisualizeNodes(ctx context.Context, dir string, fs *btrfs.FS, nodeScanResul
return err
}
}
+ if err := zw.Close(); err != nil {
+ return err
+ }
dlog.Info(ctx, "... done writing")
diff --git a/scripts/main.sh b/scripts/main.sh
index 0635e49..dde5671 100755
--- a/scripts/main.sh
+++ b/scripts/main.sh
@@ -23,9 +23,9 @@ gen $b.gen/0.scandevices.json \
gen $b.gen/1.mappings.json \
./btrfs-rec --pv=$b.img \
inspect rebuild-mappings $b.gen/0.scandevices.json
-gen $b.gen/2.nodes.gv-o \
+gen $b.gen/2.nodes.zip \
./btrfs-rec --pv=$b.img --mappings=$b.gen/1.mappings.json \
- inspect visualize-nodes $b.gen/0.scandevices.json $b.gen/2.nodes.gv-d
+ inspect visualize-nodes $b.gen/0.scandevices.json
# gen $b.gen/2.nodes.json \
# ./btrfs-rec --pv=$b.img --mappings=$b.gen/1.mappings.json \
# inspect rebuild-nodes $b.gen/0.scandevices.json