...
1
2
3
4
5 package vcs
6
7 import (
8 "encoding/xml"
9 "fmt"
10 "io"
11 "strings"
12 )
13
14
15
16
17
18
19
20 func charsetReader(charset string, input io.Reader) (io.Reader, error) {
21 switch strings.ToLower(charset) {
22 case "ascii":
23 return input, nil
24 default:
25 return nil, fmt.Errorf("can't decode XML document using charset %q", charset)
26 }
27 }
28
29
30
31
32
33
34 func parseMetaGoImports(r io.Reader) (imports []metaImport, err error) {
35 d := xml.NewDecoder(r)
36 d.CharsetReader = charsetReader
37 d.Strict = false
38 var t xml.Token
39 for {
40 t, err = d.RawToken()
41 if err != nil {
42 if err == io.EOF || len(imports) > 0 {
43 err = nil
44 }
45 return
46 }
47 if e, ok := t.(xml.StartElement); ok && strings.EqualFold(e.Name.Local, "body") {
48 return
49 }
50 if e, ok := t.(xml.EndElement); ok && strings.EqualFold(e.Name.Local, "head") {
51 return
52 }
53 e, ok := t.(xml.StartElement)
54 if !ok || !strings.EqualFold(e.Name.Local, "meta") {
55 continue
56 }
57 if attrValue(e.Attr, "name") != "go-import" {
58 continue
59 }
60 if f := strings.Fields(attrValue(e.Attr, "content")); len(f) == 3 {
61
62 if f[1] == "mod" {
63 continue
64 }
65 imports = append(imports, metaImport{
66 Prefix: f[0],
67 VCS: f[1],
68 RepoRoot: f[2],
69 })
70 }
71 }
72 }
73
74
75
76 func attrValue(attrs []xml.Attr, name string) string {
77 for _, a := range attrs {
78 if strings.EqualFold(a.Name.Local, name) {
79 return a.Value
80 }
81 }
82 return ""
83 }
84
View as plain text