...
1
2
3
4
5 package buildutil
6
7 import (
8 "fmt"
9 "go/build"
10 "io"
11 "os"
12 "path"
13 "path/filepath"
14 "sort"
15 "strings"
16 "time"
17 )
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 func FakeContext(pkgs map[string]map[string]string) *build.Context {
33 clean := func(filename string) string {
34 f := path.Clean(filepath.ToSlash(filename))
35
36
37 if f == "/go/src" {
38 return ""
39 }
40 return strings.TrimPrefix(f, "/go/src/")
41 }
42
43 ctxt := build.Default
44 ctxt.GOROOT = "/go"
45 ctxt.GOPATH = ""
46 ctxt.Compiler = "gc"
47 ctxt.IsDir = func(dir string) bool {
48 dir = clean(dir)
49 if dir == "" {
50 return true
51 }
52 return pkgs[dir] != nil
53 }
54 ctxt.ReadDir = func(dir string) ([]os.FileInfo, error) {
55 dir = clean(dir)
56 var fis []os.FileInfo
57 if dir == "" {
58
59 for importPath := range pkgs {
60 fis = append(fis, fakeDirInfo(importPath))
61 }
62 } else {
63
64 for basename := range pkgs[dir] {
65 fis = append(fis, fakeFileInfo(basename))
66 }
67 }
68 sort.Sort(byName(fis))
69 return fis, nil
70 }
71 ctxt.OpenFile = func(filename string) (io.ReadCloser, error) {
72 filename = clean(filename)
73 dir, base := path.Split(filename)
74 content, ok := pkgs[path.Clean(dir)][base]
75 if !ok {
76 return nil, fmt.Errorf("file not found: %s", filename)
77 }
78 return io.NopCloser(strings.NewReader(content)), nil
79 }
80 ctxt.IsAbsPath = func(path string) bool {
81 path = filepath.ToSlash(path)
82
83
84 return strings.HasPrefix(path, "/")
85 }
86 return &ctxt
87 }
88
89 type byName []os.FileInfo
90
91 func (s byName) Len() int { return len(s) }
92 func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
93 func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() }
94
95 type fakeFileInfo string
96
97 func (fi fakeFileInfo) Name() string { return string(fi) }
98 func (fakeFileInfo) Sys() interface{} { return nil }
99 func (fakeFileInfo) ModTime() time.Time { return time.Time{} }
100 func (fakeFileInfo) IsDir() bool { return false }
101 func (fakeFileInfo) Size() int64 { return 0 }
102 func (fakeFileInfo) Mode() os.FileMode { return 0644 }
103
104 type fakeDirInfo string
105
106 func (fd fakeDirInfo) Name() string { return string(fd) }
107 func (fakeDirInfo) Sys() interface{} { return nil }
108 func (fakeDirInfo) ModTime() time.Time { return time.Time{} }
109 func (fakeDirInfo) IsDir() bool { return true }
110 func (fakeDirInfo) Size() int64 { return 0 }
111 func (fakeDirInfo) Mode() os.FileMode { return 0755 }
112
View as plain text