| 99 | ) |
| 100 | |
| 101 | func parseProvidesRequires(fi os.FileInfo, path string, f io.Reader) (provides, requires []string, err error) { |
| 102 | mt := fi.ModTime() |
| 103 | depCacheMu.Lock() |
| 104 | defer depCacheMu.Unlock() |
| 105 | if ci, found := depCache[path]; found && ci.modTime.Equal(mt) { |
| 106 | return ci.provides, ci.requires, nil |
| 107 | } |
| 108 | |
| 109 | scanner := bufio.NewScanner(f) |
| 110 | for scanner.Scan() { |
| 111 | l := scanner.Text() |
| 112 | if !strings.HasPrefix(l, "goog.") { |
| 113 | continue |
| 114 | } |
| 115 | m := provReqRx.FindStringSubmatch(l) |
| 116 | if m != nil { |
| 117 | if m[1] == "provide" { |
| 118 | provides = append(provides, m[2]) |
| 119 | } else { |
| 120 | requires = append(requires, m[2]) |
| 121 | } |
| 122 | } |
| 123 | } |
| 124 | if err := scanner.Err(); err != nil { |
| 125 | return nil, nil, err |
| 126 | } |
| 127 | depCache[path] = depCacheItem{provides: provides, requires: requires, modTime: mt} |
| 128 | return provides, requires, nil |
| 129 | } |
| 130 | |
| 131 | // jsList prints a list of strings as JavaScript list. |
| 132 | type jsList []string |