aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Nering <andrey.nering@gmail.com>2016-08-11 21:07:09 -0300
committer无闻 <u@gogs.io>2016-08-11 17:07:09 -0700
commitdbed39ba05fd498dad6cd3bf127c1f68056bf2ab (patch)
tree5f57a18ecdb444bbf52e583894fc38f2d8d50280
parentaa1fc30b898a928ddafbfd0fddc47547c04f96e5 (diff)
downloadgitea-dbed39ba05fd498dad6cd3bf127c1f68056bf2ab.tar.gz
gitea-dbed39ba05fd498dad6cd3bf127c1f68056bf2ab.zip
On showing diff/file, use the tab_width specified on .editorconfig, if any (#3241)
Closes #3182
-rw-r--r--modules/context/repo.go24
-rw-r--r--modules/template/template.go10
-rw-r--r--public/css/gogs.css64
-rw-r--r--public/less/_repository.less10
-rw-r--r--routers/repo/commit.go7
-rw-r--r--routers/repo/pull.go14
-rw-r--r--routers/repo/view.go6
-rw-r--r--templates/repo/diff_box.tmpl2
-rw-r--r--templates/repo/view_file.tmpl2
9 files changed, 137 insertions, 2 deletions
diff --git a/modules/context/repo.go b/modules/context/repo.go
index af18881486..2f6a5de7a1 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -6,10 +6,12 @@ package context
import (
"fmt"
+ "io/ioutil"
"path"
"strings"
"github.com/Unknwon/com"
+ "gopkg.in/editorconfig/editorconfig-core-go.v1"
"gopkg.in/macaron.v1"
"github.com/gogits/git-module"
@@ -69,6 +71,28 @@ func (r *Repository) HasAccess() bool {
return r.AccessMode >= models.ACCESS_MODE_READ
}
+// GetEditorconfig returns the .editorconfig definition if found in the
+// HEAD of the default repo branch.
+func (r *Repository) GetEditorconfig() (*editorconfig.Editorconfig, error) {
+ commit, err := r.GitRepo.GetBranchCommit(r.Repository.DefaultBranch)
+ if err != nil {
+ return nil, err
+ }
+ treeEntry, err := commit.GetTreeEntryByPath(".editorconfig")
+ if err != nil {
+ return nil, err
+ }
+ reader, err := treeEntry.Blob().Data()
+ if err != nil {
+ return nil, err
+ }
+ data, err := ioutil.ReadAll(reader)
+ if err != nil {
+ return nil, err
+ }
+ return editorconfig.ParseBytes(data)
+}
+
func RetrieveBaseRepo(ctx *Context, repo *models.Repository) {
// Non-fork repository will not return error in this method.
if err := repo.GetBaseRepo(); err != nil {
diff --git a/modules/template/template.go b/modules/template/template.go
index 6e9b15b9be..1b5e0a11ad 100644
--- a/modules/template/template.go
+++ b/modules/template/template.go
@@ -17,6 +17,7 @@ import (
"golang.org/x/net/html/charset"
"golang.org/x/text/transform"
+ "gopkg.in/editorconfig/editorconfig-core-go.v1"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/base"
@@ -109,6 +110,15 @@ func NewFuncMap() []template.FuncMap {
mimeType := mime.TypeByExtension(filepath.Ext(filename))
return strings.HasPrefix(mimeType, "image/")
},
+ "TabSizeClass": func(ec *editorconfig.Editorconfig, filename string) string {
+ if ec != nil {
+ def := ec.GetDefinitionForFilename(filename)
+ if def.TabWidth > 0 {
+ return fmt.Sprintf("tab-size-%d", def.TabWidth)
+ }
+ }
+ return "tab-size-8"
+ },
}}
}
diff --git a/public/css/gogs.css b/public/css/gogs.css
index c39c52ca22..b40ed0855d 100644
--- a/public/css/gogs.css
+++ b/public/css/gogs.css
@@ -2312,6 +2312,70 @@ footer .ui.language .menu {
#delete-repo-modal .ui.message {
width: 100%!important;
}
+.tab-size-1 {
+ tab-size: 1 !important;
+ -moz-tab-size: 1 !important;
+}
+.tab-size-2 {
+ tab-size: 2 !important;
+ -moz-tab-size: 2 !important;
+}
+.tab-size-3 {
+ tab-size: 3 !important;
+ -moz-tab-size: 3 !important;
+}
+.tab-size-4 {
+ tab-size: 4 !important;
+ -moz-tab-size: 4 !important;
+}
+.tab-size-5 {
+ tab-size: 5 !important;
+ -moz-tab-size: 5 !important;
+}
+.tab-size-6 {
+ tab-size: 6 !important;
+ -moz-tab-size: 6 !important;
+}
+.tab-size-7 {
+ tab-size: 7 !important;
+ -moz-tab-size: 7 !important;
+}
+.tab-size-8 {
+ tab-size: 8 !important;
+ -moz-tab-size: 8 !important;
+}
+.tab-size-9 {
+ tab-size: 9 !important;
+ -moz-tab-size: 9 !important;
+}
+.tab-size-10 {
+ tab-size: 10 !important;
+ -moz-tab-size: 10 !important;
+}
+.tab-size-11 {
+ tab-size: 11 !important;
+ -moz-tab-size: 11 !important;
+}
+.tab-size-12 {
+ tab-size: 12 !important;
+ -moz-tab-size: 12 !important;
+}
+.tab-size-13 {
+ tab-size: 13 !important;
+ -moz-tab-size: 13 !important;
+}
+.tab-size-14 {
+ tab-size: 14 !important;
+ -moz-tab-size: 14 !important;
+}
+.tab-size-15 {
+ tab-size: 15 !important;
+ -moz-tab-size: 15 !important;
+}
+.tab-size-16 {
+ tab-size: 16 !important;
+ -moz-tab-size: 16 !important;
+}
.organization {
padding-top: 15px;
padding-bottom: 80px;
diff --git a/public/less/_repository.less b/public/less/_repository.less
index 0fdc23df24..0eea2d778a 100644
--- a/public/less/_repository.less
+++ b/public/less/_repository.less
@@ -1360,3 +1360,13 @@
width: 100%!important;
}
}
+
+// generate .tab-size-{i} from 1 to 16
+.generate-tab-size(16);
+.generate-tab-size(@n, @i: 1) when (@i =< @n) {
+ .tab-size-@{i} {
+ tab-size: @i !important;
+ -moz-tab-size: @i !important;
+ }
+ .generate-tab-size(@n, (@i + 1));
+}
diff --git a/routers/repo/commit.go b/routers/repo/commit.go
index 4eb37e6bdb..c102ceae41 100644
--- a/routers/repo/commit.go
+++ b/routers/repo/commit.go
@@ -174,6 +174,13 @@ func Diff(ctx *context.Context) {
}
}
+ ec, err := ctx.Repo.GetEditorconfig()
+ if err != nil && !git.IsErrNotExist(err) {
+ ctx.Handle(500, "ErrGettingEditorconfig", err)
+ return
+ }
+ ctx.Data["Editorconfig"] = ec
+
ctx.Data["CommitID"] = commitID
ctx.Data["IsSplitStyle"] = ctx.Query("style") == "split"
ctx.Data["Username"] = userName
diff --git a/routers/repo/pull.go b/routers/repo/pull.go
index 8fb7ae1831..77ee4bd348 100644
--- a/routers/repo/pull.go
+++ b/routers/repo/pull.go
@@ -371,6 +371,13 @@ func ViewPullFiles(ctx *context.Context) {
return
}
+ ec, err := ctx.Repo.GetEditorconfig()
+ if err != nil && !git.IsErrNotExist(err) {
+ ctx.Handle(500, "ErrGettingEditorconfig", err)
+ return
+ }
+ ctx.Data["Editorconfig"] = ec
+
headTarget := path.Join(pull.HeadUserName, pull.HeadRepo.Name)
ctx.Data["IsSplitStyle"] = ctx.Query("style") == "split"
ctx.Data["Username"] = pull.HeadUserName
@@ -623,6 +630,13 @@ func CompareAndPullRequest(ctx *context.Context) {
}
}
+ ec, err := ctx.Repo.GetEditorconfig()
+ if err != nil && !git.IsErrNotExist(err) {
+ ctx.Handle(500, "ErrGettingEditorconfig", err)
+ return
+ }
+ ctx.Data["Editorconfig"] = ec
+
ctx.HTML(200, COMPARE_PULL)
}
diff --git a/routers/repo/view.go b/routers/repo/view.go
index 9c495b701c..e685597a55 100644
--- a/routers/repo/view.go
+++ b/routers/repo/view.go
@@ -225,6 +225,12 @@ func Home(ctx *context.Context) {
ctx.Data["Username"] = userName
ctx.Data["Reponame"] = repoName
+ ec, err := ctx.Repo.GetEditorconfig()
+ if err != nil && !git.IsErrNotExist(err) {
+ ctx.Handle(500, "ErrGettingEditorconfig", err)
+ return
+ }
+ ctx.Data["Editorconfig"] = ec
var treenames []string
paths := make([]string, 0)
diff --git a/templates/repo/diff_box.tmpl b/templates/repo/diff_box.tmpl
index 76a414d23e..fefca9b60d 100644
--- a/templates/repo/diff_box.tmpl
+++ b/templates/repo/diff_box.tmpl
@@ -53,7 +53,7 @@
</div>
{{else}}
{{$highlightClass := $file.GetHighlightClass}}
- <div class="diff-file-box diff-box file-content" id="diff-{{.Index}}">
+ <div class="diff-file-box diff-box file-content {{TabSizeClass $.Editorconfig $file.Name}}" id="diff-{{.Index}}">
<h4 class="ui top attached normal header">
<div class="diff-counter count ui left">
{{if $file.IsBin}}
diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl
index 0f42df4925..76175334d2 100644
--- a/templates/repo/view_file.tmpl
+++ b/templates/repo/view_file.tmpl
@@ -1,4 +1,4 @@
-<div id="file-content">
+<div id="file-content" class="{{TabSizeClass .Editorconfig .FileName}}">
<h4 class="ui top attached header" id="{{if .ReadmeExist}}repo-readme{{else}}repo-read-file{{end}}">
{{if .ReadmeExist}}
<i class="book icon ui left"></i>