From 8794f159de255bb0705bf9bf2167bd4428c39d5b Mon Sep 17 00:00:00 2001
From: Will Murphy <willmurphyscode@gmail.com>
Date: Thu, 24 May 2018 20:44:08 -0400
Subject: [PATCH] print trees in order

---
 tar-read.go | 56 +++++++++++++++++++++++++++++++++++++----------------
 tree.go     |  1 +
 2 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/tar-read.go b/tar-read.go
index ac20b1d..98b5333 100644
--- a/tar-read.go
+++ b/tar-read.go
@@ -6,7 +6,6 @@ import (
 	"crypto/md5"
 	"encoding/json"
 	"fmt"
-	"hash"
 	"io"
 	"os"
 	"strings"
@@ -29,6 +28,7 @@ func main() {
 	tarReader := tar.NewReader(f)
 	targetName := "manifest.json"
 	var m Manifest
+	var trees []*Tree
 	for {
 		header, err := tarReader.Next()
 
@@ -50,13 +50,17 @@ func main() {
 		case tar.TypeDir:
 			continue
 		case tar.TypeReg:
-			fmt.Println("File: ", name)
+			//fmt.Println("File: ", name)
 			if strings.HasSuffix(name, "layer.tar") {
 				fmt.Println("Containing:")
-				printFilesInTar(tarReader, header)
+				tree := NewTree()
+				tree.name = strings.TrimSuffix(name, "layer.tar")
+				fileInfos := getFileList(tarReader, header)
+				for _, element := range fileInfos {
+					tree.AddPath(element.path, element)
+				}
+				trees = append(trees, tree)
 			}
-			// show the contents
-			// io.Copy(os.Stdout, tarReader)
 		default:
 			fmt.Printf("%s : %c %s %s\n",
 				"hmmm?",
@@ -67,10 +71,11 @@ func main() {
 		}
 	}
 	fmt.Printf("%+v\n", m)
+	fmt.Printf("%+v\n", trees)
 }
 
-func printFilesInTar(parentReader *tar.Reader, h *tar.Header) {
-	hasher := md5.New
+func getFileList(parentReader *tar.Reader, h *tar.Header) []FileChangeInfo {
+	var files []FileChangeInfo
 	size := h.Size
 	tarredBytes := make([]byte, size)
 	_, err := parentReader.Read(tarredBytes)
@@ -95,14 +100,12 @@ func printFilesInTar(parentReader *tar.Reader, h *tar.Header) {
 
 		switch header.Typeflag {
 		case tar.TypeDir:
-			fmt.Println("	Directory: ", name)
-			continue
+			files = append(files, makeEntry(tarReader, header, name))
 		case tar.TypeReg:
-			fmt.Println("	File: ", name)
-			// show the contents
-			// io.Copy(os.Stdout, tarReader)
+			files = append(files, makeEntry(tarReader, header, name))
+			continue
 		case tar.TypeSymlink:
-			fmt.Println("	SymLink", name)
+			files = append(files, makeEntry(tarReader, header, name))
 		default:
 			fmt.Printf("%s : %c %s %s\n",
 				"hmmm?",
@@ -112,16 +115,35 @@ func printFilesInTar(parentReader *tar.Reader, h *tar.Header) {
 			)
 		}
 	}
+	return files
 }
 
-func makeEntry(r *tar.Reader, h *tar.Header, hasher *hash.Hash) FileChangeInfo {
+func makeEntry(r *tar.Reader, h *tar.Header, path string) FileChangeInfo {
+	if h.Typeflag == tar.TypeDir {
+		return FileChangeInfo{
+			path:     path,
+			typeflag: h.Typeflag,
+			md5sum:   zeros,
+		}
+	}
 	fileBytes := make([]byte, h.Size)
-
+	_, err := r.Read(fileBytes)
+	if err != nil && err != io.EOF {
+		panic(err)
+	}
+	hash := md5.Sum(fileBytes)
+	return FileChangeInfo{
+		path:     path,
+		typeflag: h.Typeflag,
+		md5sum:   hash,
+	}
 }
 
+var zeros = [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+
 type FileChangeInfo struct {
-	fileName string
-	typeflag int
+	path     string
+	typeflag byte
 	md5sum   [16]byte
 }
 
diff --git a/tree.go b/tree.go
index 4a2e005..584f803 100644
--- a/tree.go
+++ b/tree.go
@@ -16,6 +16,7 @@ const (
 type Tree struct {
 	root Node
 	size int
+	name string
 }
 
 type Node struct {