This commit is contained in:
Alex Goodman 2019-10-07 18:25:53 -04:00
parent 2640bdced8
commit fcb5ec01ef
No known key found for this signature in database
GPG key ID: 98AF011C5C78EB7E
13 changed files with 52 additions and 59 deletions

View file

@ -49,7 +49,7 @@ func NewFileInfo(realPath, path string, info os.FileInfo) FileInfo {
var linkName string
var size int64
if info.Mode() & os.ModeSymlink != 0 {
if info.Mode()&os.ModeSymlink != 0 {
fileType = tar.TypeSymlink
linkName, err = os.Readlink(realPath)
@ -83,9 +83,9 @@ func NewFileInfo(realPath, path string, info os.FileInfo) FileInfo {
Size: size,
Mode: info.Mode(),
// todo: support UID/GID
Uid: -1,
Gid: -1,
IsDir: info.IsDir(),
Uid: -1,
Gid: -1,
IsDir: info.IsDir(),
}
}

View file

@ -12,14 +12,14 @@ import (
)
type ImageArchive struct {
manifest manifest
config config
layerMap map[string]*filetree.FileTree
manifest manifest
config config
layerMap map[string]*filetree.FileTree
}
func NewImageArchive(tarFile io.ReadCloser) (*ImageArchive, error) {
img := &ImageArchive{
layerMap: make(map[string]*filetree.FileTree),
layerMap: make(map[string]*filetree.FileTree),
}
tarReader := tar.NewReader(tarFile)
@ -179,9 +179,8 @@ func (img *ImageArchive) ToImage() (*image.Image, error) {
layers = append(layers, dockerLayer.ToLayer())
}
return &image.Image{
Trees: trees,
Trees: trees,
Layers: layers,
}, nil

View file

@ -26,12 +26,12 @@ func analysisFromImageTar(t *testing.T, path string) *image.AnalysisResult {
func Test_Analysis(t *testing.T) {
table := map[string]struct {
efficiency float64
sizeBytes uint64
userSizeBytes uint64
wastedBytes uint64
wastedPercent float64
path string
efficiency float64
sizeBytes uint64
userSizeBytes uint64
wastedBytes uint64
wastedPercent float64
path string
}{
"docker-image": {0.9844212134184309, 1220598, 66237, 32025, 0.4834911001404049, "../../../.data/test-docker-image.tar"},
}

View file

@ -14,7 +14,6 @@ type layer struct {
tree *filetree.FileTree
}
// String represents a layer in a columnar format.
func (l *layer) ToLayer() *image.Layer {
id := strings.Split(l.tree.Name, "/")[0]
@ -25,7 +24,7 @@ func (l *layer) ToLayer() *image.Layer {
Size: l.history.Size,
Tree: l.tree,
// todo: query docker api for tags
Names: []string{"(unavailable)"},
Digest: l.history.ID,
Names: []string{"(unavailable)"},
Digest: l.history.ID,
}
}

View file

@ -13,7 +13,7 @@ import (
"golang.org/x/net/context"
)
type resolver struct {}
type resolver struct{}
func NewResolver() *resolver {
return &resolver{}
@ -100,4 +100,3 @@ func (r *resolver) fetchArchive(id string) (io.ReadCloser, error) {
return readCloser, nil
}

View file

@ -11,13 +11,13 @@ const (
)
type Layer struct {
Id string
Index int
Id string
Index int
Command string
Size uint64
Tree *filetree.FileTree
Names []string
Digest string
Size uint64
Tree *filetree.FileTree
Names []string
Digest string
}
func (l *Layer) ShortId() string {

View file

@ -20,8 +20,8 @@ type ImageDirectoryRef struct {
func NewImageDirectoryRef(img *podmanImage.Image) (*ImageDirectoryRef, error) {
imgDirRef := &ImageDirectoryRef{
layerOrder: make([]string, 0),
treeMap: make(map[string]*filetree.FileTree),
layerMap: make(map[string]*podmanImage.Image),
treeMap: make(map[string]*filetree.FileTree),
layerMap: make(map[string]*podmanImage.Image),
}
ctx := context.TODO()
@ -41,7 +41,7 @@ func NewImageDirectoryRef(img *podmanImage.Image) (*ImageDirectoryRef, error) {
if !exists {
return nil, fmt.Errorf("graph has no upper dir")
}
if _, err := os.Stat(rootDir); os.IsNotExist(err) {
return nil, fmt.Errorf("graph root dir does not exist: %s", rootDir)
}
@ -67,7 +67,7 @@ func NewImageDirectoryRef(img *podmanImage.Image) (*ImageDirectoryRef, error) {
return imgDirRef, nil
}
func processLayer(name, rootDir string) (*filetree.FileTree, error) {
func processLayer(name, rootDir string) (*filetree.FileTree, error) {
tree := filetree.NewFileTree()
tree.Name = name
@ -76,7 +76,7 @@ func processLayer(name, rootDir string) (*filetree.FileTree, error) {
return err
}
// add this file to the tree...
relativeImagePath := "/"+strings.TrimPrefix(strings.TrimPrefix(path, rootDir), "/")
relativeImagePath := "/" + strings.TrimPrefix(strings.TrimPrefix(path, rootDir), "/")
fileInfo := filetree.NewFileInfo(path, relativeImagePath, info)
tree.FileSize += uint64(fileInfo.Size)
@ -111,15 +111,15 @@ func (img *ImageDirectoryRef) ToImage() (*image.Image, error) {
// as you iterate chronologically through history (ignoring history items that have no layer contents)
// Note: history is not required metadata in an OCI image!
podmanLayer := layer{
obj: img.layerMap[id],
index: layerIdx,
tree: trees[layerIdx],
obj: img.layerMap[id],
index: layerIdx,
tree: trees[layerIdx],
}
layers = append(layers, podmanLayer.ToLayer())
}
return &image.Image{
Trees: trees,
Trees: trees,
Layers: layers,
}, nil

View file

@ -11,10 +11,10 @@ import (
// Layer represents a Docker image layer and metadata
type layer struct {
obj *podmanImage.Image
history *podmanImage.History
index int
tree *filetree.FileTree
obj *podmanImage.Image
history *podmanImage.History
index int
tree *filetree.FileTree
}
func (l *layer) getHistory() (*podmanImage.History, error) {

View file

@ -11,7 +11,7 @@ import (
"os"
)
type resolver struct {}
type resolver struct{}
func NewResolver() *resolver {
return &resolver{}
@ -25,7 +25,6 @@ func (r *resolver) Build(args []string) (*image.Image, error) {
return r.Fetch(id)
}
func (r *resolver) Fetch(id string) (*image.Image, error) {
img, err := r.resolveFromDisk(id)
if err == nil {
@ -57,18 +56,18 @@ func (r *resolver) resolveFromDisk(id string) (*image.Image, error) {
return nil, err
}
ImageLoop:
for _, candidateImage := range images {
for _, name := range candidateImage.Names() {
if name == id {
img, err = NewImageDirectoryRef(candidateImage)
if err != nil {
return nil, err
}
break ImageLoop
ImageLoop:
for _, candidateImage := range images {
for _, name := range candidateImage.Names() {
if name == id {
img, err = NewImageDirectoryRef(candidateImage)
if err != nil {
return nil, err
}
break ImageLoop
}
}
}
if img == nil {
return nil, fmt.Errorf("could not find image by name: '%s'", id)
@ -108,7 +107,7 @@ func (r *resolver) fetchDockerArchive(id string) (string, error) {
return "", err
}
for _, item:= range images {
for _, item := range images {
for _, name := range item.Names() {
if name == id {
file, err := ioutil.TempFile(os.TempDir(), "dive-resolver-tar")

View file

@ -14,10 +14,10 @@ type export struct {
func NewExport(analysis *diveImage.AnalysisResult) *export {
data := export{
Layer: make([]layer, len(analysis.Layers)),
Image: image {
Image: image{
InefficientFiles: make([]fileReference, len(analysis.Inefficiencies)),
SizeBytes: analysis.SizeBytes,
EfficiencyScore: analysis.Efficiency,
SizeBytes: analysis.SizeBytes,
EfficiencyScore: analysis.Efficiency,
InefficientBytes: analysis.WastedBytes,
},
}

View file

@ -134,7 +134,7 @@ func (controller *DetailsController) Render() error {
if currentLayer.Names != nil && len(currentLayer.Names) > 0 {
lines = append(lines, Formatting.Header("Tags: ")+strings.Join(currentLayer.Names, ", "))
} else {
lines = append(lines, Formatting.Header("Tags: ")+ "(none)")
lines = append(lines, Formatting.Header("Tags: ")+"(none)")
}
lines = append(lines, Formatting.Header("Id: ")+currentLayer.Id)
lines = append(lines, Formatting.Header("Digest: ")+currentLayer.Digest)

View file

@ -72,8 +72,6 @@ func assertTestData(t *testing.T, actualBytes []byte) {
helperCheckDiff(t, expectedBytes, actualBytes)
}
func initializeTestViewModel(t *testing.T) *FileTreeViewModel {
result := docker.TestAnalysisFromArchive(t, "../../.data/test-docker-image.tar")

View file

@ -131,7 +131,6 @@ func toggleFilterView(g *gocui.Gui, v *gocui.View) error {
return err
}
return nil
}