From a36b94320aff35bffba856eb1bb6d1156ab1074b Mon Sep 17 00:00:00 2001 From: Adrien Delorme Date: Wed, 6 Nov 2019 10:22:27 +0100 Subject: [PATCH] virtualbox: simplify ParseSnapshotData --- builder/virtualbox/common/snapshot.go | 70 ++++++++++++---------- builder/virtualbox/common/snapshot_test.go | 7 +++ 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/builder/virtualbox/common/snapshot.go b/builder/virtualbox/common/snapshot.go index bb55ade41..b1e1a34d8 100644 --- a/builder/virtualbox/common/snapshot.go +++ b/builder/virtualbox/common/snapshot.go @@ -29,43 +29,47 @@ func ParseSnapshotData(snapshotData string) (*VBoxSnapshot, error) { for scanner.Scan() { txt := scanner.Text() - idx := strings.Index(txt, "=") - if idx > 0 { - if strings.HasPrefix(txt, "Current") { - node.IsCurrent = true + if !strings.Contains(txt, "=") { + log.Printf("Invalid key,value pair [%s]", txt) + continue + } + if strings.HasPrefix(txt, "Current") { + node.IsCurrent = true + continue + } + matches := SnapshotNamePartsRe.FindStringSubmatch(txt) + if len(matches) < 2 { + continue + } + + switch matches[1] { + case "UUID": + node.UUID = matches[4] + case "Name": + if nil == rootNode { + node = new(VBoxSnapshot) + rootNode = node + currentIndicator = matches[2] } else { - matches := SnapshotNamePartsRe.FindStringSubmatch(txt) - if len(matches) >= 2 && matches[1] == "Name" { - if nil == rootNode { - node = new(VBoxSnapshot) - rootNode = node - currentIndicator = matches[2] - } else { - pathLenCur := strings.Count(currentIndicator, "-") - pathLen := strings.Count(matches[2], "-") - if pathLen > pathLenCur { - currentIndicator = matches[2] - parentStack.Push(node) - } else if pathLen < pathLenCur { - currentIndicator = matches[2] - for i := 0; i < pathLenCur-pathLen; i++ { - parentStack.Pop() - } - } - node = new(VBoxSnapshot) - parent := parentStack.Peek().(*VBoxSnapshot) - if nil != parent { - node.Parent = parent - parent.Children = append(parent.Children, node) - } + pathLenCur := strings.Count(currentIndicator, "-") + pathLen := strings.Count(matches[2], "-") + if pathLen > pathLenCur { + currentIndicator = matches[2] + parentStack.Push(node) + } else if pathLen < pathLenCur { + currentIndicator = matches[2] + for i := 0; i < pathLenCur-pathLen; i++ { + parentStack.Pop() } - node.Name = matches[4] - } else if matches[1] == "UUID" { - node.UUID = matches[4] + } + node = new(VBoxSnapshot) + parent := parentStack.Peek().(*VBoxSnapshot) + if nil != parent { + node.Parent = parent + parent.Children = append(parent.Children, node) } } - } else { - log.Printf("Invalid key,value pair [%s]", txt) + node.Name = matches[4] } } return rootNode, nil diff --git a/builder/virtualbox/common/snapshot_test.go b/builder/virtualbox/common/snapshot_test.go index 5b3ab78de..96ea6703e 100644 --- a/builder/virtualbox/common/snapshot_test.go +++ b/builder/virtualbox/common/snapshot_test.go @@ -134,3 +134,10 @@ func TestSnapshot_EnsureParents(t *testing.T) { } } } + +func TestSnapshot_WrongSnapshot(t *testing.T) { + rootNode, err := ParseSnapshotData(`Potato= + `) + assert.Nil(t, err) + assert.Nil(t, rootNode) +}