Skip to content

Commit

Permalink
layers work
Browse files Browse the repository at this point in the history
  • Loading branch information
remorses committed Apr 1, 2024
1 parent e460bb2 commit f074476
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 41 deletions.
83 changes: 50 additions & 33 deletions go-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"bytes"

"net/url"
"sort"

Expand All @@ -14,6 +15,7 @@ import (
"github.com/sirupsen/logrus"
"github.com/wagoodman/dive/dive"
"github.com/wagoodman/dive/dive/filetree"
"github.com/wagoodman/dive/dive/image"
)

func main() {
Expand Down Expand Up @@ -63,6 +65,8 @@ func imageAnalyzerHandler(w http.ResponseWriter, r *http.Request) {

}

var imgCache = make(map[string]*image.Image)

func analyzeImage(userImage string) (*JsonOutput, error) {
// Get the "image" parameter from the URL path
sourceStr := "docker"
Expand All @@ -80,54 +84,67 @@ func analyzeImage(userImage string) (*JsonOutput, error) {

return nil, errors.Wrap(err, "unable to determine image provider")
}
img, err := imageResolver.Fetch(imageStr)
if err != nil {
return nil, fmt.Errorf("unable to fetch image: %v", err)
var img *image.Image = imgCache[userImage]
if img == nil {
img, err = imageResolver.Fetch(imageStr)
if err != nil {
return nil, errors.Wrap(err, "unable to resolve image")
}
imgCache[userImage] = img
}

result, err := img.Analyze()
if err != nil {
return nil, fmt.Errorf("unable to analyze: %v", err)
}

treeStack, failedPaths, err := filetree.StackTreeRange(result.RefTrees, 0, len(result.RefTrees)-1)
if len(failedPaths) > 0 {
return nil, fmt.Errorf("expected no filepath errors, got %d", len(failedPaths))
}
if err != nil {
return nil, fmt.Errorf("unable to stack trees: %v", err)
}
node := RemoveCycles(treeStack.Root)

// create a map from file path to layer index
filePathToLayerIndex := make(map[string]int)

// sort layers by command
sort.Slice(result.Layers, func(i, j int) bool {
return result.Layers[i].Index < result.Layers[j].Index
})

for i, layer := range result.Layers {
layer.Tree.VisitDepthChildFirst(func(node *filetree.FileNode) error {

// cache := filetree.NewComparer(result.RefTrees)
// errors := cache.BuildCache()
// if len(errors) > 0 {
// return nil, fmt.Errorf("unable to build cache: %d errors", len(errors))
// }

newTree, pathErrors, err := filetree.StackTreeRange(result.RefTrees, 0, len(result.RefTrees)-1)

pathsToLayersIndex := make(map[string]int)

for idx := 1; idx < len(result.RefTrees)-1; idx++ {
// mergedTree.VisitDepthChildFirst(func(node *filetree.FileNode) error {
// node.Data.DiffType = filetree.Unmodified
// return nil
// }, nil)
mergedTree, pathErrors, err := filetree.StackTreeRange(result.RefTrees, 0, idx-1)
markPathErrors, err := mergedTree.CompareAndMark(result.RefTrees[idx])
pathErrors = append(pathErrors, markPathErrors...)
if err != nil {
logrus.Errorf("error while building tree: %+v", err)
return nil, err
}
mergedTree.VisitDepthChildFirst(func(node *filetree.FileNode) error {
if node.Data.DiffType == filetree.Added {
filePathToLayerIndex[node.Path()] = i
pathsToLayersIndex[node.Path()] = idx
}
return nil
},
func(fn *filetree.FileNode) bool {
return true
})

}, nil)
}
if len(pathErrors) > 0 {
return nil, fmt.Errorf("expected no filepath errors, got %d", len(pathErrors))
}
// if err != nil {
// return nil, fmt.Errorf("unable to stack trees: %v", err)
// }
node := RemoveCycles(newTree.Root)

allNodes := bfs(node)
for _, node := range allNodes {
// mark each node with the layer it belongs to
if node.Path != "" {
node.Layer = filePathToLayerIndex[node.Path]
if idx, ok := pathsToLayersIndex[node.Path]; ok {
node.Layer = idx
}
}
// sort layers by command
sort.Slice(result.Layers, func(i, j int) bool {
return result.Layers[i].Index < result.Layers[j].Index
})

layers := make([]Layer, len(result.Layers))
for i, layer := range result.Layers {
layers[i] = Layer{
Expand Down
9 changes: 8 additions & 1 deletion pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions website/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"dependencies": {
"@types/d3": "^7.4.3",
"@types/d3-hierarchy": "^3.1.7",
"@types/d3-scale-chromatic": "^3.0.3",
"@visx/group": "latest",
"@visx/hierarchy": "latest",
"@visx/mock-data": "latest",
Expand Down
27 changes: 20 additions & 7 deletions website/src/app/visx.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
'use client'
import { schemeSet1 } from 'd3-scale-chromatic'
import {
schemeSet1,
schemeSet2,
schemeSet3,
schemeBlues,
} from 'd3-scale-chromatic'

import { scaleOrdinal } from '@visx/scale'

Expand Down Expand Up @@ -68,12 +73,16 @@ export function TreemapDemo({ data, layers, margin = defaultMargin }) {

const treemapElem = treemap(zoomedNode as any)

console.log({ schemeSet1: schemeSet1.length, layers: layers.length })
const colorScale = scaleOrdinal({
domain: layers?.map((l, i) => i),
range: schemeSet1,
domain: layers.map((l, i) => i),
range: [...schemeSet1, ...schemeSet1, ...schemeSet1].slice(
0,
layers.length,
),
})

console.log(zoomedNode.depth, zoomedNode)
const totalSize = zoomedNode.value || 0
return width < 10 ? null : (
<div>
<div>
Expand All @@ -90,7 +99,8 @@ export function TreemapDemo({ data, layers, margin = defaultMargin }) {
.descendants()

// .reverse()
.filter((node) => node.depth < zoomedNode.depth + 4)
// .filter((node) => node.value >= totalSize / 200)

.map((node, i) => {
const nodeWidth = node.x1 - node.x0
const nodeHeight = node.y1 - node.y0
Expand All @@ -113,7 +123,9 @@ export function TreemapDemo({ data, layers, margin = defaultMargin }) {
// .domain([0, 2, 6])
// .range([1, 1, 0])(node.depth)}
strokeWidth={2}
fill={colorScale(node.value || 0)}
fill={colorScale(
node.data.layer || 0,
)}
/>
{nodeWidth > 50 && nodeHeight > 9 && (
<Text
Expand All @@ -128,7 +140,8 @@ export function TreemapDemo({ data, layers, margin = defaultMargin }) {
verticalAnchor='start'
pointerEvents='none'
>
{node.data.name}
{node.data.name}{' '}
{node.data.layer}
</Text>
)}
</Group>
Expand Down

0 comments on commit f074476

Please sign in to comment.