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
94 lines
1.5 KiB
Go
94 lines
1.5 KiB
Go
package compiler
|
|
|
|
import (
|
|
"archive/tar"
|
|
"compress/gzip"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
type urlLoader struct {
|
|
*Repository
|
|
}
|
|
|
|
func (l *urlLoader) loadTarball(r io.Reader) {
|
|
gzf, err := gzip.NewReader(r)
|
|
if err != nil {
|
|
l.Fail(err)
|
|
return
|
|
}
|
|
defer gzf.Close()
|
|
|
|
tarReader := tar.NewReader(gzf)
|
|
for true {
|
|
header, err := tarReader.Next()
|
|
|
|
if err != nil {
|
|
if err != io.EOF {
|
|
l.Fail(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
if isValidGrammar(header.Name, header.FileInfo()) {
|
|
data, err := ioutil.ReadAll(tarReader)
|
|
if err != nil {
|
|
l.Fail(err)
|
|
return
|
|
}
|
|
|
|
ext := filepath.Ext(header.Name)
|
|
rule, unknown, err := ConvertProto(ext, data)
|
|
if err != nil {
|
|
l.Fail(&ConversionError{header.Name, err})
|
|
continue
|
|
}
|
|
|
|
if _, ok := l.Files[rule.ScopeName]; ok {
|
|
continue
|
|
}
|
|
|
|
l.AddFile(header.Name, rule, unknown)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (l *urlLoader) load() {
|
|
res, err := http.Get(l.Source)
|
|
if err != nil {
|
|
l.Fail(err)
|
|
return
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
if strings.HasSuffix(l.Source, ".tar.gz") {
|
|
l.loadTarball(res.Body)
|
|
return
|
|
}
|
|
|
|
data, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
l.Fail(err)
|
|
return
|
|
}
|
|
|
|
ext := filepath.Ext(l.Source)
|
|
filename := filepath.Base(l.Source)
|
|
rule, unknown, err := ConvertProto(ext, data)
|
|
if err != nil {
|
|
l.Fail(&ConversionError{filename, err})
|
|
return
|
|
}
|
|
|
|
l.AddFile(filename, rule, unknown)
|
|
}
|
|
|
|
func LoadFromURL(src string) *Repository {
|
|
loader := urlLoader{newRepository(src)}
|
|
loader.load()
|
|
return loader.Repository
|
|
}
|