mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
* grammars: Update several grammars with compat issues * [WIP] Add new grammar conversion tools * Wrap in a Docker script * Proper Dockerfile support * Add Javadoc grammar * Remove NPM package.json * Remove superfluous test This is now always checked by the grammars compiler * Update JSyntax grammar to new submodule * Approve Javadoc license * grammars: Remove checked-in dependencies * grammars: Add regex checks to the compiler * grammars: Point Oz to its actual submodule * grammars: Refactor compiler to group errors by repo * grammars: Cleanups to error reporting
81 lines
1.4 KiB
Go
81 lines
1.4 KiB
Go
package compiler
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
type fsLoader struct {
|
|
*Repository
|
|
abspath string
|
|
}
|
|
|
|
func (l *fsLoader) findGrammars() (files []string, err error) {
|
|
err = filepath.Walk(l.abspath,
|
|
func(path string, info os.FileInfo, err error) error {
|
|
if err == nil && isValidGrammar(path, info) {
|
|
files = append(files, path)
|
|
}
|
|
return nil
|
|
})
|
|
return
|
|
}
|
|
|
|
func (l *fsLoader) load() {
|
|
grammars, err := l.findGrammars()
|
|
if err != nil {
|
|
l.Fail(err)
|
|
return
|
|
}
|
|
|
|
for _, path := range grammars {
|
|
data, err := ioutil.ReadFile(path)
|
|
if err != nil {
|
|
l.Fail(err)
|
|
continue
|
|
}
|
|
|
|
if rel, err := filepath.Rel(l.abspath, path); err == nil {
|
|
path = rel
|
|
}
|
|
|
|
rule, unknown, err := ConvertProto(filepath.Ext(path), data)
|
|
if err != nil {
|
|
l.Fail(&ConversionError{path, err})
|
|
continue
|
|
}
|
|
|
|
if _, ok := l.Files[rule.ScopeName]; ok {
|
|
continue
|
|
}
|
|
|
|
l.AddFile(path, rule, unknown)
|
|
}
|
|
}
|
|
|
|
func gitRemoteName(path string) (string, error) {
|
|
remote, err := exec.Command("git", "-C", path, "remote", "get-url", "origin").Output()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return strings.TrimSpace(string(remote)), nil
|
|
}
|
|
|
|
func LoadFromFilesystem(root, src string) *Repository {
|
|
loader := fsLoader{
|
|
Repository: newRepository(src),
|
|
abspath: path.Join(root, src),
|
|
}
|
|
loader.load()
|
|
|
|
if ups, err := gitRemoteName(loader.abspath); err == nil {
|
|
loader.Repository.Upstream = ups
|
|
}
|
|
|
|
return loader.Repository
|
|
}
|