This changeset performs the following: - Updates `masterzen/winrm` vendor to include change from (https://github.com/masterzen/winrm/pull/73). - Removes `masterzen/xmlpath` dependency, as it is licensed under the LGPL license. - Updates `dylanmei/winrmtest` vendor to include change from (https://github.com/dylanmei/winrmtest/pull/4). - Updates `packer-community/winrmcp` vendor to include the removal of the `masterzen/winrm/winrm` sub-class as a result of the `winrm` CLI tool being removed from the `masterzen/winrm` repository. - Updates nested dependencies as a result of the above vendor changes. - Refactors `parallels/driver_9` to use `goxpath` instead of `xmlpath`, as `xmlpath` is licensed under LGPL. - Adds a basic unit test for the refactor work in `parallels/driver_9` to confirm functionality. This should completely remove any LGPL licensed dependencies inside of the Packer project. ``` $ make test /home/jake/src/go/src/github.com/hashicorp/packer/scripts/gofmtcheck.sh $(find . -not -path "./vendor/*" -name "*.go") ==> Checking that code complies with gofmt requirements... Check passed. ok github.com/hashicorp/packer 0.044s ok github.com/hashicorp/packer/builder/alicloud/ecs 0.055s ok github.com/hashicorp/packer/builder/amazon/chroot 0.040s ok github.com/hashicorp/packer/builder/amazon/common 0.021s ok github.com/hashicorp/packer/builder/amazon/ebs 0.016s ok github.com/hashicorp/packer/builder/amazon/ebssurrogate 0.015s ok github.com/hashicorp/packer/builder/amazon/ebsvolume 0.014s ok github.com/hashicorp/packer/builder/amazon/instance 0.058s ok github.com/hashicorp/packer/builder/azure/arm 2.833s ok github.com/hashicorp/packer/builder/azure/common 0.018s ? github.com/hashicorp/packer/builder/azure/common/constants [no test files] ? github.com/hashicorp/packer/builder/azure/common/lin [no test files] ? github.com/hashicorp/packer/builder/azure/common/logutil [no test files] ok github.com/hashicorp/packer/builder/azure/common/template 0.038s ok github.com/hashicorp/packer/builder/azure/pkcs12 0.120s ok github.com/hashicorp/packer/builder/azure/pkcs12/rc2 0.020s ok github.com/hashicorp/packer/builder/cloudstack 0.038s ok github.com/hashicorp/packer/builder/digitalocean 0.015s ok github.com/hashicorp/packer/builder/docker 0.028s ok github.com/hashicorp/packer/builder/file 0.029s ok github.com/hashicorp/packer/builder/googlecompute 3.162s ok github.com/hashicorp/packer/builder/hyperv/common 0.006s ok github.com/hashicorp/packer/builder/hyperv/iso 0.042s ok github.com/hashicorp/packer/builder/null 0.018s ok github.com/hashicorp/packer/builder/oneandone 0.022s ok github.com/hashicorp/packer/builder/openstack 0.052s ok github.com/hashicorp/packer/builder/parallels/common 2.549s ok github.com/hashicorp/packer/builder/parallels/iso 0.050s ok github.com/hashicorp/packer/builder/parallels/pvm 0.033s ok github.com/hashicorp/packer/builder/profitbricks 0.023s ok github.com/hashicorp/packer/builder/qemu 0.039s ok github.com/hashicorp/packer/builder/triton 0.018s ok github.com/hashicorp/packer/builder/virtualbox/common 5.533s ok github.com/hashicorp/packer/builder/virtualbox/iso 0.044s ok github.com/hashicorp/packer/builder/virtualbox/ovf 0.012s ok github.com/hashicorp/packer/builder/vmware/common 5.325s ok github.com/hashicorp/packer/builder/vmware/iso 0.076s ok github.com/hashicorp/packer/builder/vmware/vmx 0.010s ok github.com/hashicorp/packer/command 0.062s ok github.com/hashicorp/packer/common 0.053s ok github.com/hashicorp/packer/common/json 0.003s [no tests to run] ok github.com/hashicorp/packer/common/powershell 0.015s ? github.com/hashicorp/packer/common/powershell/hyperv [no test files] ? github.com/hashicorp/packer/common/ssh [no test files] ok github.com/hashicorp/packer/common/uuid 0.010s ok github.com/hashicorp/packer/communicator/none 0.008s ok github.com/hashicorp/packer/communicator/ssh 0.068s ok github.com/hashicorp/packer/communicator/winrm 0.046s ok github.com/hashicorp/packer/fix 0.005s ok github.com/hashicorp/packer/helper/builder/testing 0.007s ok github.com/hashicorp/packer/helper/communicator 0.013s ok github.com/hashicorp/packer/helper/config 0.004s ? github.com/hashicorp/packer/helper/enumflag [no test files] ok github.com/hashicorp/packer/helper/flag-kv 0.009s ok github.com/hashicorp/packer/helper/flag-slice 0.006s ok github.com/hashicorp/packer/packer 0.219s ok github.com/hashicorp/packer/packer/plugin 0.233s ok github.com/hashicorp/packer/packer/rpc 0.141s ok github.com/hashicorp/packer/plugin/example 0.008s [no tests to run] ? github.com/hashicorp/packer/post-processor/alicloud-import [no test files] ? github.com/hashicorp/packer/post-processor/amazon-import [no test files] ok github.com/hashicorp/packer/post-processor/artifice 0.003s [no tests to run] ok github.com/hashicorp/packer/post-processor/atlas 0.018s ok github.com/hashicorp/packer/post-processor/checksum 0.015s ok github.com/hashicorp/packer/post-processor/compress 0.047s ok github.com/hashicorp/packer/post-processor/docker-import 0.012s ok github.com/hashicorp/packer/post-processor/docker-push 0.012s ok github.com/hashicorp/packer/post-processor/docker-save 0.008s ok github.com/hashicorp/packer/post-processor/docker-tag 0.008s ok github.com/hashicorp/packer/post-processor/googlecompute-export 0.015s [no tests to run] ? github.com/hashicorp/packer/post-processor/manifest [no test files] ok github.com/hashicorp/packer/post-processor/shell-local 0.028s ok github.com/hashicorp/packer/post-processor/vagrant 0.030s ok github.com/hashicorp/packer/post-processor/vagrant-cloud 0.028s ok github.com/hashicorp/packer/post-processor/vsphere 0.014s ok github.com/hashicorp/packer/provisioner 0.011s ok github.com/hashicorp/packer/provisioner/ansible 0.140s ok github.com/hashicorp/packer/provisioner/ansible-local 0.056s ok github.com/hashicorp/packer/provisioner/chef-client 0.050s ok github.com/hashicorp/packer/provisioner/chef-solo 0.061s ok github.com/hashicorp/packer/provisioner/converge 0.018s ok github.com/hashicorp/packer/provisioner/file 0.015s ok github.com/hashicorp/packer/provisioner/powershell 0.168s ok github.com/hashicorp/packer/provisioner/puppet-masterless 0.008s ok github.com/hashicorp/packer/provisioner/puppet-server 0.031s ok github.com/hashicorp/packer/provisioner/salt-masterless 0.010s ok github.com/hashicorp/packer/provisioner/shell 0.010s ok github.com/hashicorp/packer/provisioner/shell-local 0.037s ok github.com/hashicorp/packer/provisioner/windows-restart 0.180s ok github.com/hashicorp/packer/provisioner/windows-shell 0.159s ? github.com/hashicorp/packer/scripts [no test files] ok github.com/hashicorp/packer/template 0.008s ok github.com/hashicorp/packer/template/interpolate 0.004s ? github.com/hashicorp/packer/version [no test files] ```
253 lines
5.8 KiB
Go
253 lines
5.8 KiB
Go
package xmlquery
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/xml"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"golang.org/x/net/html/charset"
|
|
)
|
|
|
|
// A NodeType is the type of a Node.
|
|
type NodeType uint
|
|
|
|
const (
|
|
// DocumentNode is a document object that, as the root of the document tree,
|
|
// provides access to the entire XML document.
|
|
DocumentNode NodeType = iota
|
|
// DeclarationNode is the document type declaration, indicated by the following
|
|
// tag (for example, <!DOCTYPE...> ).
|
|
DeclarationNode
|
|
// ElementNode is an element (for example, <item> ).
|
|
ElementNode
|
|
// TextNode is the text content of a node.
|
|
TextNode
|
|
// CommentNode a comment (for example, <!-- my comment --> ).
|
|
CommentNode
|
|
)
|
|
|
|
// A Node consists of a NodeType and some Data (tag name for
|
|
// element nodes, content for text) and are part of a tree of Nodes.
|
|
type Node struct {
|
|
Parent, FirstChild, LastChild, PrevSibling, NextSibling *Node
|
|
|
|
Type NodeType
|
|
Data string
|
|
Prefix string
|
|
NamespaceURI string
|
|
Attr []xml.Attr
|
|
|
|
level int // node level in the tree
|
|
}
|
|
|
|
// InnerText returns the text between the start and end tags of the object.
|
|
func (n *Node) InnerText() string {
|
|
var output func(*bytes.Buffer, *Node)
|
|
output = func(buf *bytes.Buffer, n *Node) {
|
|
switch n.Type {
|
|
case TextNode:
|
|
buf.WriteString(n.Data)
|
|
return
|
|
case CommentNode:
|
|
return
|
|
}
|
|
for child := n.FirstChild; child != nil; child = child.NextSibling {
|
|
output(buf, child)
|
|
}
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
output(&buf, n)
|
|
return buf.String()
|
|
}
|
|
|
|
func outputXML(buf *bytes.Buffer, n *Node) {
|
|
if n.Type == TextNode || n.Type == CommentNode {
|
|
buf.WriteString(strings.TrimSpace(n.Data))
|
|
return
|
|
}
|
|
buf.WriteString("<" + n.Data)
|
|
for _, attr := range n.Attr {
|
|
if attr.Name.Space != "" {
|
|
buf.WriteString(fmt.Sprintf(` %s:%s="%s"`, attr.Name.Space, attr.Name.Local, attr.Value))
|
|
} else {
|
|
buf.WriteString(fmt.Sprintf(` %s="%s"`, attr.Name.Local, attr.Value))
|
|
}
|
|
}
|
|
buf.WriteString(">")
|
|
for child := n.FirstChild; child != nil; child = child.NextSibling {
|
|
outputXML(buf, child)
|
|
}
|
|
buf.WriteString(fmt.Sprintf("</%s>", n.Data))
|
|
}
|
|
|
|
// OutputXML returns the text that including tags name.
|
|
func (n *Node) OutputXML(self bool) string {
|
|
var buf bytes.Buffer
|
|
if self {
|
|
outputXML(&buf, n)
|
|
} else {
|
|
for n := n.FirstChild; n != nil; n = n.NextSibling {
|
|
outputXML(&buf, n)
|
|
}
|
|
}
|
|
|
|
return buf.String()
|
|
}
|
|
|
|
func addAttr(n *Node, key, val string) {
|
|
var attr xml.Attr
|
|
if i := strings.Index(key, ":"); i > 0 {
|
|
attr = xml.Attr{
|
|
Name: xml.Name{Space: key[:i], Local: key[i+1:]},
|
|
Value: val,
|
|
}
|
|
} else {
|
|
attr = xml.Attr{
|
|
Name: xml.Name{Local: key},
|
|
Value: val,
|
|
}
|
|
}
|
|
|
|
n.Attr = append(n.Attr, attr)
|
|
}
|
|
|
|
func addChild(parent, n *Node) {
|
|
n.Parent = parent
|
|
if parent.FirstChild == nil {
|
|
parent.FirstChild = n
|
|
} else {
|
|
parent.LastChild.NextSibling = n
|
|
n.PrevSibling = parent.LastChild
|
|
}
|
|
|
|
parent.LastChild = n
|
|
}
|
|
|
|
func addSibling(sibling, n *Node) {
|
|
n.Parent = sibling.Parent
|
|
sibling.NextSibling = n
|
|
n.PrevSibling = sibling
|
|
if sibling.Parent != nil {
|
|
sibling.Parent.LastChild = n
|
|
}
|
|
}
|
|
|
|
// LoadURL loads the XML document from the specified URL.
|
|
func LoadURL(url string) (*Node, error) {
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
return parse(resp.Body)
|
|
}
|
|
|
|
func parse(r io.Reader) (*Node, error) {
|
|
var (
|
|
decoder = xml.NewDecoder(r)
|
|
doc = &Node{Type: DocumentNode}
|
|
space2prefix = make(map[string]string)
|
|
level = 0
|
|
)
|
|
decoder.CharsetReader = charset.NewReaderLabel
|
|
prev := doc
|
|
for {
|
|
tok, err := decoder.Token()
|
|
switch {
|
|
case err == io.EOF:
|
|
goto quit
|
|
case err != nil:
|
|
return nil, err
|
|
}
|
|
|
|
switch tok := tok.(type) {
|
|
case xml.StartElement:
|
|
if level == 0 {
|
|
// mising XML declaration
|
|
node := &Node{Type: DeclarationNode, Data: "xml", level: 1}
|
|
addChild(prev, node)
|
|
level = 1
|
|
prev = node
|
|
}
|
|
node := &Node{
|
|
Type: ElementNode,
|
|
Data: tok.Name.Local,
|
|
Prefix: space2prefix[tok.Name.Space],
|
|
NamespaceURI: tok.Name.Space,
|
|
Attr: tok.Attr,
|
|
level: level,
|
|
}
|
|
for _, att := range tok.Attr {
|
|
if att.Name.Space == "xmlns" {
|
|
space2prefix[att.Value] = att.Name.Local
|
|
}
|
|
}
|
|
//fmt.Println(fmt.Sprintf("start > %s : %d", node.Data, level))
|
|
if level == prev.level {
|
|
addSibling(prev, node)
|
|
} else if level > prev.level {
|
|
addChild(prev, node)
|
|
} else if level < prev.level {
|
|
for i := prev.level - level; i > 1; i-- {
|
|
prev = prev.Parent
|
|
}
|
|
addSibling(prev.Parent, node)
|
|
}
|
|
prev = node
|
|
level++
|
|
case xml.EndElement:
|
|
level--
|
|
case xml.CharData:
|
|
node := &Node{Type: TextNode, Data: string(tok), level: level}
|
|
if level == prev.level {
|
|
addSibling(prev, node)
|
|
} else if level > prev.level {
|
|
addChild(prev, node)
|
|
}
|
|
case xml.Comment:
|
|
node := &Node{Type: CommentNode, Data: string(tok), level: level}
|
|
if level == prev.level {
|
|
addSibling(prev, node)
|
|
} else if level > prev.level {
|
|
addChild(prev, node)
|
|
}
|
|
case xml.ProcInst: // Processing Instruction
|
|
if prev.Type != DeclarationNode {
|
|
level++
|
|
}
|
|
node := &Node{Type: DeclarationNode, Data: tok.Target, level: level}
|
|
pairs := strings.Split(string(tok.Inst), " ")
|
|
for _, pair := range pairs {
|
|
pair = strings.TrimSpace(pair)
|
|
if i := strings.Index(pair, "="); i > 0 {
|
|
addAttr(node, pair[:i], strings.Trim(pair[i+1:], `"`))
|
|
}
|
|
}
|
|
if level == prev.level {
|
|
addSibling(prev, node)
|
|
} else if level > prev.level {
|
|
addChild(prev, node)
|
|
}
|
|
prev = node
|
|
case xml.Directive:
|
|
}
|
|
|
|
}
|
|
quit:
|
|
return doc, nil
|
|
}
|
|
|
|
// Parse returns the parse tree for the XML from the given Reader.
|
|
func Parse(r io.Reader) (*Node, error) {
|
|
return parse(r)
|
|
}
|
|
|
|
// ParseXML returns the parse tree for the XML from the given Reader.Deprecated.
|
|
func ParseXML(r io.Reader) (*Node, error) {
|
|
return parse(r)
|
|
}
|