Browse Source

Bindata is optional and over-writable on restart (#354)

* Moved conf assets into options folder

* Dropped old bindata

* Started to integrate options bindata and accessors

* Do not enforce a builtin app.ini

* Replaced bindata calls with options

* Dropped bindata task from makefile, it's the generate task now

* Always embedd app.ini to provide sane config defaults

* Use sane defaults for the configuration

* Defined default value for SSH_KEYGEN_PATH

* Dropped "NEVER EVER MODIFY THIS FILE" header from app.ini

* Fixed new paths in latest test additions

* Drop bindata with make clean task

* Set more proper default values
tags/v1.0.0
Thomas Boerger 3 years ago
parent
commit
b33078fa33
100 changed files with 292 additions and 5404 deletions
  1. 1
    0
      .gitignore
  2. 3
    19
      Makefile
  3. 17
    10
      cmd/web.go
  4. 0
    3
      conf/README.md
  5. 0
    3
      conf/app.ini
  6. 16
    5
      models/repo.go
  7. 1
    1
      modules/base/tool_test.go
  8. 0
    5353
      modules/bindata/bindata.go
  9. 94
    0
      modules/options/dynamic.go
  10. 51
    0
      modules/options/options.go
  11. 84
    0
      modules/options/static.go
  12. 25
    10
      modules/setting/setting.go
  13. 0
    0
      options/gitignore/Actionscript
  14. 0
    0
      options/gitignore/Ada
  15. 0
    0
      options/gitignore/Agda
  16. 0
    0
      options/gitignore/Android
  17. 0
    0
      options/gitignore/Anjuta
  18. 0
    0
      options/gitignore/AppEngine
  19. 0
    0
      options/gitignore/AppceleratorTitanium
  20. 0
    0
      options/gitignore/ArchLinuxPackages
  21. 0
    0
      options/gitignore/Archives
  22. 0
    0
      options/gitignore/Autotools
  23. 0
    0
      options/gitignore/BricxCC
  24. 0
    0
      options/gitignore/C
  25. 0
    0
      options/gitignore/C Sharp
  26. 0
    0
      options/gitignore/C++
  27. 0
    0
      options/gitignore/CFWheels
  28. 0
    0
      options/gitignore/CMake
  29. 0
    0
      options/gitignore/CUDA
  30. 0
    0
      options/gitignore/CVS
  31. 0
    0
      options/gitignore/CakePHP
  32. 0
    0
      options/gitignore/ChefCookbook
  33. 0
    0
      options/gitignore/Cloud9
  34. 0
    0
      options/gitignore/CodeIgniter
  35. 0
    0
      options/gitignore/CodeKit
  36. 0
    0
      options/gitignore/CommonLisp
  37. 0
    0
      options/gitignore/Composer
  38. 0
    0
      options/gitignore/Concrete5
  39. 0
    0
      options/gitignore/Coq
  40. 0
    0
      options/gitignore/CraftCMS
  41. 0
    0
      options/gitignore/DM
  42. 0
    0
      options/gitignore/Dart
  43. 0
    0
      options/gitignore/DartEditor
  44. 0
    0
      options/gitignore/Delphi
  45. 0
    0
      options/gitignore/Dreamweaver
  46. 0
    0
      options/gitignore/Drupal
  47. 0
    0
      options/gitignore/EPiServer
  48. 0
    0
      options/gitignore/Eagle
  49. 0
    0
      options/gitignore/Eclipse
  50. 0
    0
      options/gitignore/EiffelStudio
  51. 0
    0
      options/gitignore/Elisp
  52. 0
    0
      options/gitignore/Elixir
  53. 0
    0
      options/gitignore/Emacs
  54. 0
    0
      options/gitignore/Ensime
  55. 0
    0
      options/gitignore/Erlang
  56. 0
    0
      options/gitignore/Espresso
  57. 0
    0
      options/gitignore/ExpressionEngine
  58. 0
    0
      options/gitignore/ExtJs
  59. 0
    0
      options/gitignore/Fancy
  60. 0
    0
      options/gitignore/Finale
  61. 0
    0
      options/gitignore/FlexBuilder
  62. 0
    0
      options/gitignore/ForceDotCom
  63. 0
    0
      options/gitignore/FuelPHP
  64. 0
    0
      options/gitignore/GWT
  65. 0
    0
      options/gitignore/Gcov
  66. 0
    0
      options/gitignore/GitBook
  67. 0
    0
      options/gitignore/Go
  68. 0
    0
      options/gitignore/Gradle
  69. 0
    0
      options/gitignore/Grails
  70. 0
    0
      options/gitignore/Haskell
  71. 0
    0
      options/gitignore/IGORPro
  72. 0
    0
      options/gitignore/IPythonNotebook
  73. 0
    0
      options/gitignore/Idris
  74. 0
    0
      options/gitignore/JDeveloper
  75. 0
    0
      options/gitignore/Java
  76. 0
    0
      options/gitignore/Jboss
  77. 0
    0
      options/gitignore/Jekyll
  78. 0
    0
      options/gitignore/JetBrains
  79. 0
    0
      options/gitignore/Joomla
  80. 0
    0
      options/gitignore/KDevelop4
  81. 0
    0
      options/gitignore/Kate
  82. 0
    0
      options/gitignore/KiCAD
  83. 0
    0
      options/gitignore/Kohana
  84. 0
    0
      options/gitignore/LabVIEW
  85. 0
    0
      options/gitignore/Laravel
  86. 0
    0
      options/gitignore/Lazarus
  87. 0
    0
      options/gitignore/Leiningen
  88. 0
    0
      options/gitignore/LemonStand
  89. 0
    0
      options/gitignore/LibreOffice
  90. 0
    0
      options/gitignore/Lilypond
  91. 0
    0
      options/gitignore/Linux
  92. 0
    0
      options/gitignore/Lithium
  93. 0
    0
      options/gitignore/Lua
  94. 0
    0
      options/gitignore/LyX
  95. 0
    0
      options/gitignore/Magento
  96. 0
    0
      options/gitignore/Matlab
  97. 0
    0
      options/gitignore/Maven
  98. 0
    0
      options/gitignore/Mercurial
  99. 0
    0
      options/gitignore/Mercury
  100. 0
    0
      options/gitignore/MetaProgrammingSystem

+ 1
- 0
.gitignore View File

@@ -28,6 +28,7 @@ _testmain.go

coverage.out

/modules/options/bindata.go
/modules/public/bindata.go
/modules/templates/bindata.go


+ 3
- 19
Makefile View File

@@ -2,10 +2,7 @@ DIST := dist
EXECUTABLE := gitea
IMPORT := code.gitea.io/gitea

SHA := $(shell git rev-parse --short HEAD)
DATE := $(shell date -u '+%Y-%m-%d %I:%M:%S %Z')

BINDATA := $(shell find conf | sed 's/ /\\ /g')
BINDATA := modules/{options,public,templates}/bindata.go
STYLESHEETS := $(wildcard public/less/index.less public/less/_*.less)
JAVASCRIPTS :=

@@ -33,7 +30,7 @@ all: build
.PHONY: clean
clean:
go clean -i ./...
rm -rf $(EXECUTABLE) $(DIST)
rm -rf $(EXECUTABLE) $(DIST) $(BINDATA)

.PHONY: fmt
fmt:
@@ -119,19 +116,6 @@ release-copy:
release-check:
cd $(DIST)/release; $(foreach file,$(wildcard $(DIST)/release/$(EXECUTABLE)-*),sha256sum $(notdir $(file)) > $(notdir $(file)).sha256;)

.PHONY: bindata
bindata: modules/bindata/bindata.go

.IGNORE: modules/bindata/bindata.go
modules/bindata/bindata.go: $(BINDATA)
@which go-bindata > /dev/null; if [ $$? -ne 0 ]; then \
go get -u github.com/jteeuwen/go-bindata/...; \
fi
go-bindata -o=$@ -ignore="\\.go|README.md|TRANSLATORS" -pkg=bindata conf/...
go fmt $@
sed -i.bak 's/confLocaleLocale_/confLocaleLocale/' $@
rm $@.bak

.PHONY: javascripts
javascripts: public/js/index.js

@@ -147,4 +131,4 @@ public/css/index.css: $(STYLESHEETS)
lessc $< $@

.PHONY: assets
assets: bindata javascripts stylesheets
assets: javascripts stylesheets

+ 17
- 10
cmd/web.go View File

@@ -16,9 +16,9 @@ import (

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/bindata"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/options"
"code.gitea.io/gitea/modules/public"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/templates"
@@ -99,22 +99,29 @@ func newMacaron() *macaron.Macaron {
m.Use(templates.Renderer())
models.InitMailRender(templates.Mailer())

localeNames, err := bindata.AssetDir("conf/locale")
localeNames, err := options.Dir("locale")

if err != nil {
log.Fatal(4, "Fail to list locale files: %v", err)
}

localFiles := make(map[string][]byte)

for _, name := range localeNames {
localFiles[name] = bindata.MustAsset("conf/locale/" + name)
localFiles[name], err = options.Locale(name)

if err != nil {
log.Fatal(4, "Failed to load %s locale file. %v", name, err)
}
}

m.Use(i18n.I18n(i18n.Options{
SubURL: setting.AppSubURL,
Files: localFiles,
CustomDirectory: path.Join(setting.CustomPath, "conf/locale"),
Langs: setting.Langs,
Names: setting.Names,
DefaultLang: "en-US",
Redirect: true,
SubURL: setting.AppSubURL,
Files: localFiles,
Langs: setting.Langs,
Names: setting.Names,
DefaultLang: "en-US",
Redirect: true,
}))
m.Use(cache.Cacher(cache.Options{
Adapter: setting.CacheAdapter,

+ 0
- 3
conf/README.md View File

@@ -1,3 +0,0 @@
Execute following command in ROOT directory when anything is changed:

$ make bindata

+ 0
- 3
conf/app.ini View File

@@ -1,6 +1,3 @@
# NEVER EVER MODIFY THIS FILE
# PLEASE MAKE CHANGES ON CORRESPONDING CUSTOM CONFIG FILE

; App name that shows on every page title
APP_NAME = Gitea: Git with a cup of tea
; Change it if you run locally

+ 16
- 5
models/repo.go View File

@@ -20,9 +20,9 @@ import (
"time"

"code.gitea.io/git"
"code.gitea.io/gitea/modules/bindata"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markdown"
"code.gitea.io/gitea/modules/options"
"code.gitea.io/gitea/modules/process"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/sync"
@@ -80,11 +80,11 @@ func LoadRepoConfig() {
types := []string{"gitignore", "license", "readme", "label"}
typeFiles := make([][]string, 4)
for i, t := range types {
files, err := bindata.AssetDir("conf/" + t)
files, err := options.Dir(t)
if err != nil {
log.Fatal(4, "Fail to get %s files: %v", t, err)
}
customPath := path.Join(setting.CustomPath, "conf", t)
customPath := path.Join(setting.CustomPath, "options", t)
if com.IsDir(customPath) {
customFiles, err := com.StatDir(customPath)
if err != nil {
@@ -827,14 +827,25 @@ type CreateRepoOptions struct {
}

func getRepoInitFile(tp, name string) ([]byte, error) {
relPath := path.Join("conf", tp, strings.TrimLeft(name, "./"))
cleanedName := strings.TrimLeft(name, "./")
relPath := path.Join("options", tp, cleanedName)

// Use custom file when available.
customPath := path.Join(setting.CustomPath, relPath)
if com.IsFile(customPath) {
return ioutil.ReadFile(customPath)
}
return bindata.Asset(relPath)

switch tp {
case "readme":
return options.Readme(cleanedName)
case "gitignore":
return options.Gitignore(cleanedName)
case "license":
return options.License(cleanedName)
default:
return []byte{}, fmt.Errorf("Invalid init file type")
}
}

func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRepoOptions) error {

+ 1
- 1
modules/base/tool_test.go View File

@@ -25,7 +25,7 @@ const (
func TestMain(m *testing.M) {
// setup
macaroni18n.I18n(macaroni18n.Options{
Directory: "../../conf/locale/",
Directory: "../../options/locale/",
DefaultLang: "en-US",
Langs: []string{"en-US"},
Names: []string{"english"},

+ 0
- 5353
modules/bindata/bindata.go
File diff suppressed because it is too large
View File


+ 94
- 0
modules/options/dynamic.go View File

@@ -0,0 +1,94 @@
// +build !bindata

// Copyright 2016 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package options

import (
"fmt"
"io/ioutil"
"path"

"code.gitea.io/gitea/modules/setting"
"github.com/Unknwon/com"
)

var (
directories = make(directorySet)
)

// Dir returns all files from static or custom directory.
func Dir(name string) ([]string, error) {
if directories.Filled(name) {
return directories.Get(name), nil
}

var (
result []string
)

customDir := path.Join(setting.CustomPath, "options", name)

if com.IsDir(customDir) {
files, err := com.StatDir(customDir, true)

if err != nil {
return []string{}, fmt.Errorf("Failed to read custom directory. %v", err)
}

result = append(result, files...)
}

staticDir := path.Join(setting.StaticRootPath, "options", name)

if com.IsDir(staticDir) {
files, err := com.StatDir(staticDir, true)

if err != nil {
return []string{}, fmt.Errorf("Failed to read static directory. %v", err)
}

result = append(result, files...)
}

return directories.AddAndGet(name, result), nil
}

// Locale reads the content of a specific locale from static or custom path.
func Locale(name string) ([]byte, error) {
return fileFromDir(path.Join("locale", name))
}

// Readme reads the content of a specific readme from static or custom path.
func Readme(name string) ([]byte, error) {
return fileFromDir(path.Join("readme", name))
}

// Gitignore reads the content of a specific gitignore from static or custom path.
func Gitignore(name string) ([]byte, error) {
return fileFromDir(path.Join("gitignore", name))
}

// License reads the content of a specific license from static or custom path.
func License(name string) ([]byte, error) {
return fileFromDir(path.Join("license", name))
}

// fileFromDir is a helper to read files from static or custom path.
func fileFromDir(name string) ([]byte, error) {
customPath := path.Join(setting.CustomPath, "options", name)

if com.IsFile(customPath) {
return ioutil.ReadFile(customPath)
}

staticPath := path.Join(setting.StaticRootPath, "options", name)

if com.IsFile(staticPath) {
return ioutil.ReadFile(staticPath)
}

return []byte{}, fmt.Errorf("Asset file does not exist: %s", name)
}

+ 51
- 0
modules/options/options.go View File

@@ -0,0 +1,51 @@
// Copyright 2016 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package options

//go:generate go-bindata -tags "bindata" -ignore "TRANSLATORS" -pkg "options" -o "bindata.go" ../../options/...
//go:generate go fmt bindata.go
//go:generate sed -i.bak s/..\/..\/options\/// bindata.go
//go:generate rm -f bindata.go.bak

type directorySet map[string][]string

func (s directorySet) Add(key string, value []string) {
_, ok := s[key]

if !ok {
s[key] = make([]string, 0, len(value))
}

s[key] = append(s[key], value...)
}

func (s directorySet) Get(key string) []string {
_, ok := s[key]

if ok {
result := []string{}
seen := map[string]string{}

for _, val := range s[key] {
if _, ok := seen[val]; !ok {
result = append(result, val)
seen[val] = val
}
}

return result
}

return []string{}
}

func (s directorySet) AddAndGet(key string, value []string) []string {
s.Add(key, value)
return s.Get(key)
}

func (s directorySet) Filled(key string) bool {
return len(s[key]) > 0
}

+ 84
- 0
modules/options/static.go View File

@@ -0,0 +1,84 @@
// +build bindata

// Copyright 2016 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package options

import (
"fmt"
"io/ioutil"
"path"

"code.gitea.io/gitea/modules/setting"
"github.com/Unknwon/com"
)

var (
directories = make(directorySet)
)

// Dir returns all files from bindata or custom directory.
func Dir(name string) ([]string, error) {
if directories.Filled(name) {
return directories.Get(name), nil
}

var (
result []string
)

customDir := path.Join(setting.CustomPath, "options", name)

if com.IsDir(customDir) {
files, err := com.StatDir(customDir, true)

if err != nil {
return []string{}, fmt.Errorf("Failed to read custom directory. %v", err)
}

result = append(result, files...)
}

files, err := AssetDir(path.Join("..", "..", "options", name))

if err != nil {
return []string{}, fmt.Errorf("Failed to read embedded directory. %v", err)
}

result = append(result, files...)

return directories.AddAndGet(name, result), nil
}

// Locale reads the content of a specific locale from bindata or custom path.
func Locale(name string) ([]byte, error) {
return fileFromDir(path.Join("locale", name))
}

// Readme reads the content of a specific readme from bindata or custom path.
func Readme(name string) ([]byte, error) {
return fileFromDir(path.Join("readme", name))
}

// Gitignore reads the content of a gitignore locale from bindata or custom path.
func Gitignore(name string) ([]byte, error) {
return fileFromDir(path.Join("gitignore", name))
}

// License reads the content of a specific license from bindata or custom path.
func License(name string) ([]byte, error) {
return fileFromDir(path.Join("license", name))
}

// fileFromDir is a helper to read files from bindata or custom path.
func fileFromDir(name string) ([]byte, error) {
customPath := path.Join(setting.CustomPath, "options", name)

if com.IsFile(customPath) {
return ioutil.ReadFile(customPath)
}

return Asset(name)
}

+ 25
- 10
modules/setting/setting.go View File

@@ -17,6 +17,8 @@ import (
"strings"
"time"

"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/user"
"github.com/Unknwon/com"
_ "github.com/go-macaron/cache/memcache" // memcache plugin for cache
_ "github.com/go-macaron/cache/redis"
@@ -25,10 +27,6 @@ import (
_ "github.com/kardianos/minwinsvc" // import minwinsvc for windows services
"gopkg.in/ini.v1"
"strk.kbt.io/projects/go/libravatar"

"code.gitea.io/gitea/modules/bindata"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/user"
)

// Scheme describes protocol types
@@ -349,9 +347,10 @@ func NewContext() {
log.Fatal(4, "Fail to get work directory: %v", err)
}

Cfg, err = ini.Load(bindata.MustAsset("conf/app.ini"))
Cfg = ini.Empty()

if err != nil {
log.Fatal(4, "Fail to parse 'conf/app.ini': %v", err)
log.Fatal(4, "Fail to parse 'app.ini': %v", err)
}

CustomPath = os.Getenv("GITEA_CUSTOM")
@@ -444,6 +443,10 @@ please consider changing to GITEA_CUSTOM`)
if err = Cfg.Section("server").MapTo(&SSH); err != nil {
log.Fatal(4, "Fail to map SSH settings: %v", err)
}

SSH.KeygenPath = sec.Key("SSH_KEYGEN_PATH").MustString("ssh-keygen")
SSH.Port = sec.Key("SSH_PORT").MustInt(22)

// When disable SSH, start builtin server value is ignored.
if SSH.Disabled {
SSH.StartBuiltinServer = false
@@ -502,7 +505,7 @@ please consider changing to GITEA_CUSTOM`)
"StampNano": time.StampNano,
}[Cfg.Section("time").Key("FORMAT").MustString("RFC1123")]

RunUser = Cfg.Section("").Key("RUN_USER").String()
RunUser = Cfg.Section("").Key("RUN_USER").MustString(user.CurrentUsername())
// Does not check run user when the install lock is off.
if InstallLock {
currentUser, match := IsRunUserMatchCurrentUser(RunUser)
@@ -593,7 +596,17 @@ please consider changing to GITEA_CUSTOM`)
}

Langs = Cfg.Section("i18n").Key("LANGS").Strings(",")
if len(Langs) == 0 {
Langs = []string{
"en-US",
}
}
Names = Cfg.Section("i18n").Key("NAMES").Strings(",")
if len(Names) == 0 {
Names = []string{
"English",
}
}
dateLangs = Cfg.Section("i18n.datelang").KeysHash()

ShowFooterBranding = Cfg.Section("other").Key("SHOW_FOOTER_BRANDING").MustBool()
@@ -639,16 +652,18 @@ var logLevels = map[string]string{
}

func newLogService() {
log.Info("%s %s", AppName, AppVer)
log.Info("Gitea v%s", AppVer)

// Get and check log mode.
LogModes = strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",")
LogConfigs = make([]string, len(LogModes))

for i, mode := range LogModes {
mode = strings.TrimSpace(mode)

sec, err := Cfg.GetSection("log." + mode)

if err != nil {
log.Fatal(4, "Unknown log mode: %s", mode)
sec, _ = Cfg.NewSection("log." + mode)
}

validLevels := []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"}

conf/gitignore/Actionscript → options/gitignore/Actionscript View File


conf/gitignore/Ada → options/gitignore/Ada View File


conf/gitignore/Agda → options/gitignore/Agda View File


conf/gitignore/Android → options/gitignore/Android View File


conf/gitignore/Anjuta → options/gitignore/Anjuta View File


conf/gitignore/AppEngine → options/gitignore/AppEngine View File


conf/gitignore/AppceleratorTitanium → options/gitignore/AppceleratorTitanium View File


conf/gitignore/ArchLinuxPackages → options/gitignore/ArchLinuxPackages View File


conf/gitignore/Archives → options/gitignore/Archives View File


conf/gitignore/Autotools → options/gitignore/Autotools View File


conf/gitignore/BricxCC → options/gitignore/BricxCC View File


conf/gitignore/C → options/gitignore/C View File


conf/gitignore/C Sharp → options/gitignore/C Sharp View File


conf/gitignore/C++ → options/gitignore/C++ View File


conf/gitignore/CFWheels → options/gitignore/CFWheels View File


conf/gitignore/CMake → options/gitignore/CMake View File


conf/gitignore/CUDA → options/gitignore/CUDA View File


conf/gitignore/CVS → options/gitignore/CVS View File


conf/gitignore/CakePHP → options/gitignore/CakePHP View File


conf/gitignore/ChefCookbook → options/gitignore/ChefCookbook View File


conf/gitignore/Cloud9 → options/gitignore/Cloud9 View File


conf/gitignore/CodeIgniter → options/gitignore/CodeIgniter View File


conf/gitignore/CodeKit → options/gitignore/CodeKit View File


conf/gitignore/CommonLisp → options/gitignore/CommonLisp View File


conf/gitignore/Composer → options/gitignore/Composer View File


conf/gitignore/Concrete5 → options/gitignore/Concrete5 View File


conf/gitignore/Coq → options/gitignore/Coq View File


conf/gitignore/CraftCMS → options/gitignore/CraftCMS View File


conf/gitignore/DM → options/gitignore/DM View File


conf/gitignore/Dart → options/gitignore/Dart View File


conf/gitignore/DartEditor → options/gitignore/DartEditor View File


conf/gitignore/Delphi → options/gitignore/Delphi View File


conf/gitignore/Dreamweaver → options/gitignore/Dreamweaver View File


conf/gitignore/Drupal → options/gitignore/Drupal View File


conf/gitignore/EPiServer → options/gitignore/EPiServer View File


conf/gitignore/Eagle → options/gitignore/Eagle View File


conf/gitignore/Eclipse → options/gitignore/Eclipse View File


conf/gitignore/EiffelStudio → options/gitignore/EiffelStudio View File


conf/gitignore/Elisp → options/gitignore/Elisp View File


conf/gitignore/Elixir → options/gitignore/Elixir View File


conf/gitignore/Emacs → options/gitignore/Emacs View File


conf/gitignore/Ensime → options/gitignore/Ensime View File


conf/gitignore/Erlang → options/gitignore/Erlang View File


conf/gitignore/Espresso → options/gitignore/Espresso View File


conf/gitignore/ExpressionEngine → options/gitignore/ExpressionEngine View File


conf/gitignore/ExtJs → options/gitignore/ExtJs View File


conf/gitignore/Fancy → options/gitignore/Fancy View File


conf/gitignore/Finale → options/gitignore/Finale View File


conf/gitignore/FlexBuilder → options/gitignore/FlexBuilder View File


conf/gitignore/ForceDotCom → options/gitignore/ForceDotCom View File


conf/gitignore/FuelPHP → options/gitignore/FuelPHP View File


conf/gitignore/GWT → options/gitignore/GWT View File


conf/gitignore/Gcov → options/gitignore/Gcov View File


conf/gitignore/GitBook → options/gitignore/GitBook View File


conf/gitignore/Go → options/gitignore/Go View File


conf/gitignore/Gradle → options/gitignore/Gradle View File


conf/gitignore/Grails → options/gitignore/Grails View File


conf/gitignore/Haskell → options/gitignore/Haskell View File


conf/gitignore/IGORPro → options/gitignore/IGORPro View File


conf/gitignore/IPythonNotebook → options/gitignore/IPythonNotebook View File


conf/gitignore/Idris → options/gitignore/Idris View File


conf/gitignore/JDeveloper → options/gitignore/JDeveloper View File


conf/gitignore/Java → options/gitignore/Java View File


conf/gitignore/Jboss → options/gitignore/Jboss View File


conf/gitignore/Jekyll → options/gitignore/Jekyll View File


conf/gitignore/JetBrains → options/gitignore/JetBrains View File


conf/gitignore/Joomla → options/gitignore/Joomla View File


conf/gitignore/KDevelop4 → options/gitignore/KDevelop4 View File


conf/gitignore/Kate → options/gitignore/Kate View File


conf/gitignore/KiCAD → options/gitignore/KiCAD View File


conf/gitignore/Kohana → options/gitignore/Kohana View File


conf/gitignore/LabVIEW → options/gitignore/LabVIEW View File


conf/gitignore/Laravel → options/gitignore/Laravel View File


conf/gitignore/Lazarus → options/gitignore/Lazarus View File


conf/gitignore/Leiningen → options/gitignore/Leiningen View File


conf/gitignore/LemonStand → options/gitignore/LemonStand View File


conf/gitignore/LibreOffice → options/gitignore/LibreOffice View File


conf/gitignore/Lilypond → options/gitignore/Lilypond View File


conf/gitignore/Linux → options/gitignore/Linux View File


conf/gitignore/Lithium → options/gitignore/Lithium View File


conf/gitignore/Lua → options/gitignore/Lua View File


conf/gitignore/LyX → options/gitignore/LyX View File


conf/gitignore/Magento → options/gitignore/Magento View File


conf/gitignore/Matlab → options/gitignore/Matlab View File


conf/gitignore/Maven → options/gitignore/Maven View File


conf/gitignore/Mercurial → options/gitignore/Mercurial View File


conf/gitignore/Mercury → options/gitignore/Mercury View File


conf/gitignore/MetaProgrammingSystem → options/gitignore/MetaProgrammingSystem View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save