summaryrefslogtreecommitdiffstats
path: root/vendor/gopkg.in/editorconfig
diff options
context:
space:
mode:
authorThomas Boerger <thomas@webhippie.de>2016-11-03 23:16:01 +0100
committerThomas Boerger <thomas@webhippie.de>2016-11-04 08:43:11 +0100
commit1ebb35b98889ff77299f24d82da426b434b0cca0 (patch)
tree6dcb814d6df4d11c7e7a0ba6da8a6945628e2c5d /vendor/gopkg.in/editorconfig
parent78f86abba45cb35018c58b8bd5f4c48a86cc8634 (diff)
downloadgitea-1ebb35b98889ff77299f24d82da426b434b0cca0.tar.gz
gitea-1ebb35b98889ff77299f24d82da426b434b0cca0.zip
Added all required dependencies
Diffstat (limited to 'vendor/gopkg.in/editorconfig')
-rw-r--r--vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/LICENSE8
-rw-r--r--vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/README.md121
-rw-r--r--vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/editorconfig.go277
3 files changed, 406 insertions, 0 deletions
diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/LICENSE b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/LICENSE
new file mode 100644
index 0000000000..4a30d56440
--- /dev/null
+++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/LICENSE
@@ -0,0 +1,8 @@
+MIT License
+Copyright (c) 2016 The Editorconfig Team
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/README.md b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/README.md
new file mode 100644
index 0000000000..4a57ec133d
--- /dev/null
+++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/README.md
@@ -0,0 +1,121 @@
+[![GoDoc](https://godoc.org/gopkg.in/editorconfig/editorconfig-core-go.v1?status.svg)](https://godoc.org/gopkg.in/editorconfig/editorconfig-core-go.v1)
+[![Go Report Card](https://goreportcard.com/badge/gopkg.in/editorconfig/editorconfig-core-go.v1)](https://goreportcard.com/report/gopkg.in/editorconfig/editorconfig-core-go.v1)
+
+# Editorconfig Core Go
+
+A [Editorconfig][editorconfig] file parser and manipulator for Go.
+
+> This package is already working, but still under testing.
+
+## Installing
+
+We recommend the use of [gopkg.in][gopkg] for this package:
+
+```bash
+go get -u gopkg.in/editorconfig/editorconfig-core-go.v1
+```
+
+Import by the same path. Tha package name you will use to access it is
+`editorconfig`.
+
+```go
+import (
+ "gopkg.in/editorconfig/editorconfig-core-go.v1"
+)
+```
+
+## Usage
+
+### Parse from file
+
+```go
+editorConfig, err := editorconfig.ParseFile("path/to/.editorconfig")
+if err != nil {
+ log.Fatal(err)
+}
+```
+
+### Parse from slice of bytes
+
+```go
+data := []byte("...")
+editorConfig, err := editorconfig.ParseBytes(data)
+if err != nil {
+ log.Fatal(err)
+}
+```
+
+### Get definition to a given filename
+
+This method builds a definition to a given filename.
+This definition is a merge of the properties with selectors that matched the
+given filename.
+The lasts sections of the file have preference over the priors.
+
+```go
+def := editorConfig.GetDefinitionForFilename("my/file.go")
+```
+
+This definition have the following properties:
+
+```go
+type Definition struct {
+ Selector string
+
+ Charset string
+ IndentStyle string
+ IndentSize string
+ TabWidth int
+ EndOfLine string
+ TrimTrailingWhitespace bool
+ InsertFinalNewline bool
+}
+```
+
+#### Automatic search for `.editorconfig` files
+
+If you want a definition of a file without having to manually
+parse the `.editorconfig` files, you can then use the static version
+of `GetDefinitionForFilename`:
+
+```go
+def, err := editorconfig.GetDefinitionForFilename("foo/bar/baz/my-file.go")
+```
+
+In the example above, the package will automatically search for
+`.editorconfig` files on:
+
+- `foo/bar/baz/.editorconfig`
+- `foo/baz/.editorconfig`
+- `foo/.editorconfig`
+
+Until it reaches a file with `root = true` or the root of the filesystem.
+
+### Generating a .editorconfig file
+
+You can easily convert a Editorconfig struct to a compatible INI file:
+
+```go
+// serialize to slice of bytes
+data, err := editorConfig.Serialize()
+if err != nil {
+ log.Fatal(err)
+}
+
+// save directly to file
+err := editorConfig.Save("path/to/.editorconfig")
+if err != nil {
+ log.Fatal(err)
+}
+```
+
+## Contributing
+
+To run the tests:
+
+```bash
+go test -v
+```
+
+[editorconfig]: http://editorconfig.org/
+[gopkg]: https://gopkg.in
diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/editorconfig.go b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/editorconfig.go
new file mode 100644
index 0000000000..6291af5759
--- /dev/null
+++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/editorconfig.go
@@ -0,0 +1,277 @@
+// Package editorconfig can be used to parse and generate editorconfig files.
+// For more information about editorconfig, see http://editorconfig.org/
+package editorconfig
+
+import (
+ "bytes"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strconv"
+ "strings"
+
+ "gopkg.in/ini.v1"
+)
+
+// IndentStyle possible values
+const (
+ IndentStyleTab = "tab"
+ IndentStyleSpaces = "space"
+)
+
+// EndOfLine possible values
+const (
+ EndOfLineLf = "lf"
+ EndOfLineCr = "cr"
+ EndOfLineCrLf = "crlf"
+)
+
+// Charset possible values
+const (
+ CharsetLatin1 = "latin1"
+ CharsetUTF8 = "utf-8"
+ CharsetUTF16BE = "utf-16be"
+ CharsetUTF16LE = "utf-16le"
+)
+
+// Definition represents a definition inside the .editorconfig file.
+// E.g. a section of the file.
+// The definition is composed of the selector ("*", "*.go", "*.{js.css}", etc),
+// plus the properties of the selected files.
+type Definition struct {
+ Selector string `ini:"-" json:"-"`
+
+ Charset string `ini:"charset" json:"charset,omitempty"`
+ IndentStyle string `ini:"indent_style" json:"indent_style,omitempty"`
+ IndentSize string `ini:"indent_size" json:"indent_size,omitempty"`
+ TabWidth int `ini:"tab_width" json:"tab_width,omitempty"`
+ EndOfLine string `ini:"end_of_line" json:"end_of_line,omitempty"`
+ TrimTrailingWhitespace bool `ini:"trim_trailing_whitespace" json:"trim_trailing_whitespace,omitempty"`
+ InsertFinalNewline bool `ini:"insert_final_newline" json:"insert_final_newline,omitempty"`
+}
+
+// Editorconfig represents a .editorconfig file.
+// It is composed by a "root" property, plus the definitions defined in the
+// file.
+type Editorconfig struct {
+ Root bool
+ Definitions []*Definition
+}
+
+// ParseBytes parses from a slice of bytes.
+func ParseBytes(data []byte) (*Editorconfig, error) {
+ iniFile, err := ini.Load(data)
+ if err != nil {
+ return nil, err
+ }
+
+ editorConfig := &Editorconfig{}
+ editorConfig.Root = iniFile.Section(ini.DEFAULT_SECTION).Key("root").MustBool(false)
+ for _, sectionStr := range iniFile.SectionStrings() {
+ if sectionStr == ini.DEFAULT_SECTION {
+ continue
+ }
+ var (
+ iniSection = iniFile.Section(sectionStr)
+ definition = &Definition{}
+ )
+ err := iniSection.MapTo(&definition)
+ if err != nil {
+ return nil, err
+ }
+
+ // tab_width defaults to indent_size:
+ // https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#tab_width
+ if definition.TabWidth <= 0 {
+ if num, err := strconv.Atoi(definition.IndentSize); err == nil {
+ definition.TabWidth = num
+ }
+ }
+
+ definition.Selector = sectionStr
+ editorConfig.Definitions = append(editorConfig.Definitions, definition)
+ }
+ return editorConfig, nil
+}
+
+// ParseFile parses from a file.
+func ParseFile(f string) (*Editorconfig, error) {
+ data, err := ioutil.ReadFile(f)
+ if err != nil {
+ return nil, err
+ }
+
+ return ParseBytes(data)
+}
+
+var (
+ regexpBraces = regexp.MustCompile("{.*}")
+)
+
+func filenameMatches(pattern, name string) bool {
+ // basic match
+ matched, _ := filepath.Match(pattern, name)
+ if matched {
+ return true
+ }
+ // foo/bar/main.go should match main.go
+ matched, _ = filepath.Match(pattern, filepath.Base(name))
+ if matched {
+ return true
+ }
+ // foo should match foo/main.go
+ matched, _ = filepath.Match(filepath.Join(pattern, "*"), name)
+ if matched {
+ return true
+ }
+ // *.{js,go} should match main.go
+ if str := regexpBraces.FindString(pattern); len(str) > 0 {
+ // remote initial "{" and final "}"
+ str = strings.TrimPrefix(str, "{")
+ str = strings.TrimSuffix(str, "}")
+
+ // testing for empty brackets: "{}"
+ if len(str) == 0 {
+ patt := regexpBraces.ReplaceAllString(pattern, "*")
+ matched, _ = filepath.Match(patt, filepath.Base(name))
+ return matched
+ }
+
+ for _, patt := range strings.Split(str, ",") {
+ patt = regexpBraces.ReplaceAllString(pattern, patt)
+ matched, _ = filepath.Match(patt, filepath.Base(name))
+ if matched {
+ return true
+ }
+ }
+ }
+ return false
+}
+
+func (d *Definition) merge(md *Definition) {
+ if len(d.Charset) == 0 {
+ d.Charset = md.Charset
+ }
+ if len(d.IndentStyle) == 0 {
+ d.IndentStyle = md.IndentStyle
+ }
+ if len(d.IndentSize) == 0 {
+ d.IndentSize = md.IndentSize
+ }
+ if d.TabWidth <= 0 {
+ d.TabWidth = md.TabWidth
+ }
+ if len(d.EndOfLine) == 0 {
+ d.EndOfLine = md.EndOfLine
+ }
+ if !d.TrimTrailingWhitespace {
+ d.TrimTrailingWhitespace = md.TrimTrailingWhitespace
+ }
+ if !d.InsertFinalNewline {
+ d.InsertFinalNewline = md.InsertFinalNewline
+ }
+}
+
+// GetDefinitionForFilename returns a definition for the given filename.
+// The result is a merge of the selectors that matched the file.
+// The last section has preference over the priors.
+func (e *Editorconfig) GetDefinitionForFilename(name string) *Definition {
+ def := &Definition{}
+ for i := len(e.Definitions) - 1; i >= 0; i-- {
+ actualDef := e.Definitions[i]
+ if filenameMatches(actualDef.Selector, name) {
+ def.merge(actualDef)
+ }
+ }
+ return def
+}
+
+func boolToString(b bool) string {
+ if b {
+ return "true"
+ }
+ return "false"
+}
+
+// Serialize converts the Editorconfig to a slice of bytes, containing the
+// content of the file in the INI format.
+func (e *Editorconfig) Serialize() ([]byte, error) {
+ var (
+ iniFile = ini.Empty()
+ buffer = bytes.NewBuffer(nil)
+ )
+ iniFile.Section(ini.DEFAULT_SECTION).Comment = "http://editorconfig.org"
+ if e.Root {
+ iniFile.Section(ini.DEFAULT_SECTION).Key("root").SetValue(boolToString(e.Root))
+ }
+ for _, d := range e.Definitions {
+ iniSec := iniFile.Section(d.Selector)
+ if len(d.Charset) > 0 {
+ iniSec.Key("charset").SetValue(d.Charset)
+ }
+ if len(d.IndentStyle) > 0 {
+ iniSec.Key("indent_style").SetValue(d.IndentStyle)
+ }
+ if len(d.IndentSize) > 0 {
+ iniSec.Key("indent_size").SetValue(d.IndentSize)
+ }
+ if d.TabWidth > 0 && strconv.Itoa(d.TabWidth) != d.IndentSize {
+ iniSec.Key("tab_width").SetValue(strconv.Itoa(d.TabWidth))
+ }
+ if len(d.EndOfLine) > 0 {
+ iniSec.Key("end_of_line").SetValue(d.EndOfLine)
+ }
+ if d.TrimTrailingWhitespace {
+ iniSec.Key("trim_trailing_whitespace").SetValue(boolToString(d.TrimTrailingWhitespace))
+ }
+ if d.InsertFinalNewline {
+ iniSec.Key("insert_final_newline").SetValue(boolToString(d.InsertFinalNewline))
+ }
+ }
+ _, err := iniFile.WriteTo(buffer)
+ if err != nil {
+ return nil, err
+ }
+ return buffer.Bytes(), nil
+}
+
+// Save saves the Editorconfig to a compatible INI file.
+func (e *Editorconfig) Save(filename string) error {
+ data, err := e.Serialize()
+ if err != nil {
+ return err
+ }
+ return ioutil.WriteFile(filename, data, 0666)
+}
+
+// GetDefinitionForFilename given a filename, searches
+// for .editorconfig files, starting from the file folder,
+// walking through the previous folders, until it reaches a
+// folder with `root = true`, and returns the right editorconfig
+// definition for the given file.
+func GetDefinitionForFilename(filename string) (*Definition, error) {
+ abs, err := filepath.Abs(filename)
+ if err != nil {
+ return nil, err
+ }
+ definition := &Definition{}
+
+ dir := abs
+ for dir != filepath.Dir(dir) {
+ dir = filepath.Dir(dir)
+ ecFile := filepath.Join(dir, ".editorconfig")
+ if _, err := os.Stat(ecFile); os.IsNotExist(err) {
+ continue
+ }
+ ec, err := ParseFile(ecFile)
+ if err != nil {
+ return nil, err
+ }
+ definition.merge(ec.GetDefinitionForFilename(filename))
+ if ec.Root {
+ break
+ }
+ }
+ return definition, nil
+}