From cbbf9282b5dc47218caa4a2545a06a6eae069ebc Mon Sep 17 00:00:00 2001
From: lewis <747342561@qq.com>
Date: Fri, 5 Nov 2021 10:01:32 +0800
Subject: [PATCH 01/27] add contributors route
---
routers/repo/view.go | 120 +++++++++++++++++++++++++++------------
routers/routes/routes.go | 1 +
templates/repo/contributors.tmpl | 6 ++
3 files changed, 92 insertions(+), 35 deletions(-)
mode change 100644 => 100755 routers/repo/view.go
create mode 100755 templates/repo/contributors.tmpl
diff --git a/routers/repo/view.go b/routers/repo/view.go
old mode 100644
new mode 100755
index 9477b27dd..a8b2f239d
--- a/routers/repo/view.go
+++ b/routers/repo/view.go
@@ -12,6 +12,7 @@ import (
"fmt"
gotemplate "html/template"
"io/ioutil"
+ "net/http"
"net/url"
"path"
"strings"
@@ -31,11 +32,12 @@ import (
)
const (
- tplRepoEMPTY base.TplName = "repo/empty"
- tplRepoHome base.TplName = "repo/home"
- tplWatchers base.TplName = "repo/watchers"
- tplForks base.TplName = "repo/forks"
- tplMigrating base.TplName = "repo/migrating"
+ tplRepoEMPTY base.TplName = "repo/empty"
+ tplRepoHome base.TplName = "repo/home"
+ tplWatchers base.TplName = "repo/watchers"
+ tplForks base.TplName = "repo/forks"
+ tplMigrating base.TplName = "repo/migrating"
+ tplContributors base.TplName = "repo/contributors"
)
type namedBlob struct {
@@ -570,19 +572,20 @@ func safeURL(address string) string {
}
type ContributorInfo struct {
- UserInfo *models.User // nil for contributor who is not a registered user
- Email string
+ UserInfo *models.User // nil for contributor who is not a registered user
+ Email string
CommitCnt int
}
-func getContributorInfo(contributorInfos []*ContributorInfo, email string) *ContributorInfo{
+func getContributorInfo(contributorInfos []*ContributorInfo, email string) *ContributorInfo {
for _, c := range contributorInfos {
- if strings.Compare(c.Email,email) == 0 {
+ if strings.Compare(c.Email, email) == 0 {
return c
}
}
return nil
}
+
// Home render repository home page
func Home(ctx *context.Context) {
if len(ctx.Repo.Units) > 0 {
@@ -591,34 +594,34 @@ func Home(ctx *context.Context) {
if err == nil && contributors != nil {
startTime := time.Now()
var contributorInfos []*ContributorInfo
- contributorInfoHash:= make(map[string]*ContributorInfo)
+ contributorInfoHash := make(map[string]*ContributorInfo)
for _, c := range contributors {
- if strings.Compare(c.Email,"") == 0 {
+ if strings.Compare(c.Email, "") == 0 {
continue
}
// get user info from committer email
user, err := models.GetUserByActivateEmail(c.Email)
if err == nil {
// committer is system user, get info through user's primary email
- if existedContributorInfo,ok:=contributorInfoHash[user.Email];ok {
+ if existedContributorInfo, ok := contributorInfoHash[user.Email]; ok {
// existed: same primary email, different committer name
existedContributorInfo.CommitCnt += c.CommitCnt
- }else{
+ } else {
// new committer info
var newContributor = &ContributorInfo{
- user, user.Email,c.CommitCnt,
+ user, user.Email, c.CommitCnt,
}
- contributorInfos = append(contributorInfos, newContributor )
+ contributorInfos = append(contributorInfos, newContributor)
contributorInfoHash[user.Email] = newContributor
}
} else {
// committer is not system user
- if existedContributorInfo,ok:=contributorInfoHash[c.Email];ok {
+ if existedContributorInfo, ok := contributorInfoHash[c.Email]; ok {
// existed: same primary email, different committer name
existedContributorInfo.CommitCnt += c.CommitCnt
- }else{
+ } else {
var newContributor = &ContributorInfo{
- user, c.Email,c.CommitCnt,
+ user, c.Email, c.CommitCnt,
}
contributorInfos = append(contributorInfos, newContributor)
contributorInfoHash[c.Email] = newContributor
@@ -627,7 +630,7 @@ func Home(ctx *context.Context) {
}
ctx.Data["ContributorInfo"] = contributorInfos
var duration = time.Since(startTime)
- log.Info("getContributorInfo cost: %v seconds",duration.Seconds())
+ log.Info("getContributorInfo cost: %v seconds", duration.Seconds())
}
if ctx.Repo.Repository.IsBeingCreated() {
task, err := models.GetMigratingTask(ctx.Repo.Repository.ID)
@@ -694,13 +697,13 @@ func renderLicense(ctx *context.Context) {
log.Error("failed to get license content: %v, err:%v", f, err)
continue
}
- if bytes.Compare(buf,license) == 0 {
- log.Info("got matched license:%v",f)
+ if bytes.Compare(buf, license) == 0 {
+ log.Info("got matched license:%v", f)
ctx.Data["LICENSE"] = f
return
}
}
- log.Info("not found matched license,repo:%v",ctx.Repo.Repository.Name)
+ log.Info("not found matched license,repo:%v", ctx.Repo.Repository.Name)
}
func renderLanguageStats(ctx *context.Context) {
@@ -801,31 +804,31 @@ func renderCode(ctx *context.Context) {
baseGitRepo, err := git.OpenRepository(ctx.Repo.Repository.BaseRepo.RepoPath())
defer baseGitRepo.Close()
if err != nil {
- log.Error("error open baseRepo:%s",ctx.Repo.Repository.BaseRepo.RepoPath())
+ log.Error("error open baseRepo:%s", ctx.Repo.Repository.BaseRepo.RepoPath())
ctx.Data["FetchUpstreamCnt"] = -1 // minus value indicates error
- }else{
- if _,error:= baseGitRepo.GetBranch(ctx.Repo.BranchName);error==nil{
+ } else {
+ if _, error := baseGitRepo.GetBranch(ctx.Repo.BranchName); error == nil {
//base repo has the same branch, then compare between current repo branch and base repo's branch
- compareUrl := ctx.Repo.BranchName + "..." + ctx.Repo.Repository.BaseRepo.OwnerName + "/" + ctx.Repo.Repository.BaseRepo.Name + ":" + ctx.Repo.BranchName
- ctx.SetParams("*",compareUrl)
+ compareUrl := ctx.Repo.BranchName + "..." + ctx.Repo.Repository.BaseRepo.OwnerName + "/" + ctx.Repo.Repository.BaseRepo.Name + ":" + ctx.Repo.BranchName
+ ctx.SetParams("*", compareUrl)
ctx.Data["UpstreamSameBranchName"] = true
- }else{
+ } else {
//else, compare between current repo branch and base repo's default branch
- compareUrl := ctx.Repo.BranchName + "..." + ctx.Repo.Repository.BaseRepo.OwnerName + "/" + ctx.Repo.Repository.BaseRepo.Name + ":" + ctx.Repo.Repository.BaseRepo.DefaultBranch
- ctx.SetParams("*",compareUrl)
+ compareUrl := ctx.Repo.BranchName + "..." + ctx.Repo.Repository.BaseRepo.OwnerName + "/" + ctx.Repo.Repository.BaseRepo.Name + ":" + ctx.Repo.Repository.BaseRepo.DefaultBranch
+ ctx.SetParams("*", compareUrl)
ctx.Data["UpstreamSameBranchName"] = false
}
_, _, headGitRepo, compareInfo, _, _ := ParseCompareInfo(ctx)
defer headGitRepo.Close()
- if compareInfo!= nil {
- if compareInfo.Commits!=nil {
- log.Info("compareInfoCommits数量:%d",compareInfo.Commits.Len())
+ if compareInfo != nil {
+ if compareInfo.Commits != nil {
+ log.Info("compareInfoCommits数量:%d", compareInfo.Commits.Len())
ctx.Data["FetchUpstreamCnt"] = compareInfo.Commits.Len()
- }else{
+ } else {
log.Info("compareInfo nothing different")
ctx.Data["FetchUpstreamCnt"] = 0
}
- }else{
+ } else {
ctx.Data["FetchUpstreamCnt"] = -1 // minus value indicates error
}
}
@@ -893,3 +896,50 @@ func Forks(ctx *context.Context) {
ctx.HTML(200, tplForks)
}
+
+func Contributors(ctx *context.Context) {
+ //get repo contributors info
+ contributors, err := git.GetContributors(ctx.Repo.Repository.RepoPath())
+ if err == nil && contributors != nil {
+ startTime := time.Now()
+ var contributorInfos []*ContributorInfo
+ contributorInfoHash := make(map[string]*ContributorInfo)
+ for _, c := range contributors {
+ if strings.Compare(c.Email, "") == 0 {
+ continue
+ }
+ // get user info from committer email
+ user, err := models.GetUserByActivateEmail(c.Email)
+ if err == nil {
+ // committer is system user, get info through user's primary email
+ if existedContributorInfo, ok := contributorInfoHash[user.Email]; ok {
+ // existed: same primary email, different committer name
+ existedContributorInfo.CommitCnt += c.CommitCnt
+ } else {
+ // new committer info
+ var newContributor = &ContributorInfo{
+ user, user.Email, c.CommitCnt,
+ }
+ contributorInfos = append(contributorInfos, newContributor)
+ contributorInfoHash[user.Email] = newContributor
+ }
+ } else {
+ // committer is not system user
+ if existedContributorInfo, ok := contributorInfoHash[c.Email]; ok {
+ // existed: same primary email, different committer name
+ existedContributorInfo.CommitCnt += c.CommitCnt
+ } else {
+ var newContributor = &ContributorInfo{
+ user, c.Email, c.CommitCnt,
+ }
+ contributorInfos = append(contributorInfos, newContributor)
+ contributorInfoHash[c.Email] = newContributor
+ }
+ }
+ }
+ ctx.Data["ContributorInfo"] = contributorInfos
+ var duration= time.Since(startTime)
+ log.Info("getContributorInfo cost: %v seconds", duration.Seconds())
+ }
+ ctx.HTML(http.StatusOK, tplContributors)
+}
diff --git a/routers/routes/routes.go b/routers/routes/routes.go
index 7e7d0642a..c8dad85a2 100755
--- a/routers/routes/routes.go
+++ b/routers/routes/routes.go
@@ -789,6 +789,7 @@ func RegisterRoutes(m *macaron.Macaron) {
// Grouping for those endpoints not requiring authentication
m.Group("/:username/:reponame", func() {
+ m.Get("/contributors", repo.Contributors)
m.Group("/milestone", func() {
m.Get("/:id", repo.MilestoneIssuesAndPulls)
}, reqRepoIssuesOrPullsReader, context.RepoRef())
diff --git a/templates/repo/contributors.tmpl b/templates/repo/contributors.tmpl
new file mode 100755
index 000000000..235ebf23b
--- /dev/null
+++ b/templates/repo/contributors.tmpl
@@ -0,0 +1,6 @@
+{{template "base/head" .}}
+
+ {{template "repo/header" .}}
+ {{template "repo/user_cards" .}}
+
+{{template "base/footer" .}}
From c571409ecfdc50d50356706ffd68669353a6425f Mon Sep 17 00:00:00 2001
From: zhoupzh
Date: Fri, 5 Nov 2021 16:37:00 +0800
Subject: [PATCH 02/27] fix issue
---
options/locale/locale_en-US.ini | 1 +
options/locale/locale_zh-CN.ini | 2 +
templates/repo/contributors.tmpl | 97 ++++++++++++++++++++++++++++++++++++-
templates/repo/home.tmpl | 12 ++---
web_src/js/features/letteravatar.js | 74 ++++++++++++++++++++++++++++
web_src/js/index.js | 2 +-
6 files changed, 180 insertions(+), 8 deletions(-)
create mode 100644 web_src/js/features/letteravatar.js
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 7fa8c7a4f..759583242 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -218,6 +218,7 @@ show_only_private = Showing only private
show_only_public = Showing only public
issues.in_your_repos = In your repositories
+contributors = Contributors
[explore]
repos = Repositories
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index 81b4a8459..b01626b2b 100755
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -220,6 +220,8 @@ show_only_public=只显示公开的
issues.in_your_repos=属于该用户项目的
+contributors=贡献者
+
[explore]
repos=项目
users=用户
diff --git a/templates/repo/contributors.tmpl b/templates/repo/contributors.tmpl
index 235ebf23b..4412c1942 100755
--- a/templates/repo/contributors.tmpl
+++ b/templates/repo/contributors.tmpl
@@ -1,6 +1,101 @@
{{template "base/head" .}}
+
{{template "repo/header" .}}
- {{template "repo/user_cards" .}}
+
+
+
+
+
+ {{range .ContributorInfo}}
+
+ {{if .UserInfo}}
+

+ {{else if .Email}}
+
![]()
+ {{end}}
+
+
+
+ Commits: {{.CommitCnt}}
+
+
+
+
+ {{end}}
+
+
+
+ {{template "base/paginate" .}}
+
+
+
+
+
+
{{template "base/footer" .}}
diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl
index 8648b8b59..cbba6f3ee 100644
--- a/templates/repo/home.tmpl
+++ b/templates/repo/home.tmpl
@@ -331,7 +331,7 @@
@@ -353,10 +353,10 @@
{{template "base/footer" .}}
diff --git a/web_src/js/features/letteravatar.js b/web_src/js/features/letteravatar.js
new file mode 100644
index 000000000..9ec12b60f
--- /dev/null
+++ b/web_src/js/features/letteravatar.js
@@ -0,0 +1,74 @@
+/**
+ * LetterAvatar
+ *
+ * Artur Heinze
+ * Create Letter avatar based on Initials
+ * based on https://gist.github.com/leecrossley/6027780
+ */
+(function(w, d){
+ function LetterAvatar (name, size, color) {
+ name = name || '';
+ size = size || 60;
+ var colours = [
+ "#1abc9c", "#2ecc71", "#3498db", "#9b59b6", "#34495e", "#16a085", "#27ae60", "#2980b9", "#8e44ad", "#2c3e50",
+ "#f1c40f", "#e67e22", "#e74c3c", "#00bcd4", "#95a5a6", "#f39c12", "#d35400", "#c0392b", "#bdc3c7", "#7f8c8d"
+ ],
+ nameSplit = String(name).split(' '),
+ initials, charIndex, colourIndex, canvas, context, dataURI;
+ if (nameSplit.length == 1) {
+ initials = nameSplit[0] ? nameSplit[0].charAt(0):'?';
+ } else {
+ initials = nameSplit[0].charAt(0) + nameSplit[1].charAt(0);
+ }
+ if (w.devicePixelRatio) {
+ size = (size * w.devicePixelRatio);
+ }
+
+ charIndex = (initials == '?' ? 72 : initials.charCodeAt(0)) - 64;
+ colourIndex = charIndex % 20;
+ canvas = d.createElement('canvas');
+ canvas.width = size;
+ canvas.height = size;
+ context = canvas.getContext("2d");
+
+ context.fillStyle = color ? color : colours[colourIndex - 1];
+ context.fillRect (0, 0, canvas.width, canvas.height);
+ context.font = Math.round(canvas.width/2)+"px 'Microsoft Yahei'";
+ context.textAlign = "center";
+ context.fillStyle = "#FFF";
+ context.fillText(initials, size / 2, size / 1.5);
+ dataURI = canvas.toDataURL();
+ canvas = null;
+ return dataURI;
+ }
+ LetterAvatar.transform = function() {
+ Array.prototype.forEach.call(d.querySelectorAll('img[avatar]'), function(img, name, color) {
+ name = img.getAttribute('avatar');
+ color = img.getAttribute('color');
+ img.src = LetterAvatar(name, img.getAttribute('width'), color);
+ img.removeAttribute('avatar');
+ img.setAttribute('alt', name);
+ });
+ };
+ // AMD support
+ if (typeof define === 'function' && define.amd) {
+
+ define(function () { return LetterAvatar; });
+
+ // CommonJS and Node.js module support.
+ } else if (typeof exports !== 'undefined') {
+
+ // Support Node.js specific `module.exports` (which can be a function)
+ if (typeof module != 'undefined' && module.exports) {
+ exports = module.exports = LetterAvatar;
+ }
+ // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)
+ exports.LetterAvatar = LetterAvatar;
+ } else {
+
+ window.LetterAvatar = LetterAvatar;
+ d.addEventListener('DOMContentLoaded', function(event) {
+ LetterAvatar.transform();
+ });
+ }
+})(window, document);
\ No newline at end of file
diff --git a/web_src/js/index.js b/web_src/js/index.js
index 5c6ff188a..a117ee73d 100755
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -4,7 +4,7 @@
import './publicpath.js';
import './polyfills.js';
-
+import './features/letteravatar.js'
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
From 3c4a436f310c3881af6b2a9dbc231356eb5cc20e Mon Sep 17 00:00:00 2001
From: zhoupzh
Date: Fri, 5 Nov 2021 16:44:51 +0800
Subject: [PATCH 03/27] fix issue
---
templates/repo/contributors.tmpl | 54 ----------------------------------------
web_src/less/openi.less | 42 +++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 54 deletions(-)
diff --git a/templates/repo/contributors.tmpl b/templates/repo/contributors.tmpl
index 4412c1942..a31ebb3d4 100755
--- a/templates/repo/contributors.tmpl
+++ b/templates/repo/contributors.tmpl
@@ -1,59 +1,5 @@
{{template "base/head" .}}
diff --git a/web_src/less/openi.less b/web_src/less/openi.less
index 56234586e..9f59e678d 100644
--- a/web_src/less/openi.less
+++ b/web_src/less/openi.less
@@ -243,4 +243,46 @@ footer .column{margin-bottom:0!important; padding-bottom:0!important;}
display: inline-block;
width: 100%;
}
+.git-user-content{
+ margin-bottom: 16px;
+ word-break: break-all;
+}
+.row.git-user-content .ui.avatar.s16.image {
+ width: 50px !important;
+ height: 50px !important;
+ vertical-align: middle;
+ border-radius: 500rem;}
+.user-list-item {
+ padding: 0.3em 0px !important;
+ margin: 15px 0 !important;
+ width: 220px !important;
+}
+.row.git-user-content .content {
+ margin-left: 6px;
+ display: inline-block;
+ vertical-align: top !important;
+ overflow: hidden;
+}
+.row.git-user-content .content .header {
+ font-weight: bold;
+}
+.item.user-list-item .header {
+ line-height: 23px !important;
+ font-size: 16px !important;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ width: 145px;
+
+ white-space:nowrap;
+
+}
+.item.user-list-item .header a {
+ color: #587284 !important;
+}
+.row.git-user-content .content .commit-btn {
+ margin-top: 6px;
+ float: left;
+ font-size: 11px;
+ color: #40485b !important;
+}
From 232bddf24e3d41c78ed86ba7e1bdb3418d447e89 Mon Sep 17 00:00:00 2001
From: zhoupzh
Date: Fri, 5 Nov 2021 17:17:03 +0800
Subject: [PATCH 04/27] fix issue
---
templates/repo/contributors.tmpl | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/templates/repo/contributors.tmpl b/templates/repo/contributors.tmpl
index a31ebb3d4..71b706331 100755
--- a/templates/repo/contributors.tmpl
+++ b/templates/repo/contributors.tmpl
@@ -8,7 +8,12 @@
{{range .ContributorInfo}}
@@ -39,9 +44,6 @@
{{template "base/paginate" .}}
-
-
-
{{template "base/footer" .}}
From 350b1d5229cc26e191d0bb04df95e2c338ee5a6b Mon Sep 17 00:00:00 2001
From: lewis <747342561@qq.com>
Date: Mon, 8 Nov 2021 15:30:51 +0800
Subject: [PATCH 05/27] add contributors
---
modules/setting/setting.go | 28 +++++++++++++++-------------
routers/repo/view.go | 21 ++++++++++++++++++++-
2 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index abe406de8..2d469b638 100755
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -163,6 +163,7 @@ var (
// UI settings
UI = struct {
ExplorePagingNum int
+ ContributorPagingNum int
IssuePagingNum int
RepoSearchPagingNum int
MembersPagingNum int
@@ -203,19 +204,20 @@ var (
Keywords string
} `ini:"ui.meta"`
}{
- ExplorePagingNum: 20,
- IssuePagingNum: 10,
- RepoSearchPagingNum: 10,
- MembersPagingNum: 20,
- FeedMaxCommitNum: 5,
- GraphMaxCommitNum: 100,
- CodeCommentLines: 4,
- ReactionMaxUserNum: 10,
- ThemeColorMetaTag: `#6cc644`,
- MaxDisplayFileSize: 8388608,
- DefaultTheme: `gitea`,
- Themes: []string{`gitea`, `arc-green`},
- Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
+ ExplorePagingNum: 20,
+ ContributorPagingNum: 50,
+ IssuePagingNum: 10,
+ RepoSearchPagingNum: 10,
+ MembersPagingNum: 20,
+ FeedMaxCommitNum: 5,
+ GraphMaxCommitNum: 100,
+ CodeCommentLines: 4,
+ ReactionMaxUserNum: 10,
+ ThemeColorMetaTag: `#6cc644`,
+ MaxDisplayFileSize: 8388608,
+ DefaultTheme: `gitea`,
+ Themes: []string{`gitea`, `arc-green`},
+ Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
Notification: struct {
MinTimeout time.Duration
TimeoutStep time.Duration
diff --git a/routers/repo/view.go b/routers/repo/view.go
index a8b2f239d..cc33302e9 100755
--- a/routers/repo/view.go
+++ b/routers/repo/view.go
@@ -898,13 +898,24 @@ func Forks(ctx *context.Context) {
}
func Contributors(ctx *context.Context) {
+ page := ctx.QueryInt("page")
+ if page <= 0 {
+ page = 1
+ }
+ pageSize := setting.UI.ContributorPagingNum
+ start := (page-1) * pageSize
+ end := page * pageSize
+ count := 0
//get repo contributors info
contributors, err := git.GetContributors(ctx.Repo.Repository.RepoPath())
if err == nil && contributors != nil {
startTime := time.Now()
var contributorInfos []*ContributorInfo
contributorInfoHash := make(map[string]*ContributorInfo)
- for _, c := range contributors {
+ for i, c := range contributors {
+ if i < start || i >= end {
+ continue
+ }
if strings.Compare(c.Email, "") == 0 {
continue
}
@@ -937,9 +948,17 @@ func Contributors(ctx *context.Context) {
}
}
}
+ count ++
ctx.Data["ContributorInfo"] = contributorInfos
var duration= time.Since(startTime)
log.Info("getContributorInfo cost: %v seconds", duration.Seconds())
+ } else {
+ ctx.ServerError("GetContributors failed", err)
+ return
}
+
+ pager := context.NewPagination(count, pageSize, page, 5)
+ ctx.Data["Page"] = pager
+ ctx.Data["Total"] = count
ctx.HTML(http.StatusOK, tplContributors)
}
From b452434a782f161f91dc220f432fb84eb634123c Mon Sep 17 00:00:00 2001
From: zhoupzh
Date: Mon, 8 Nov 2021 17:21:50 +0800
Subject: [PATCH 06/27] change show contributors nums
---
templates/repo/home.tmpl | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl
index cbba6f3ee..34c3a3121 100644
--- a/templates/repo/home.tmpl
+++ b/templates/repo/home.tmpl
@@ -4,7 +4,7 @@
font-size: 1.0em;
margin-bottom: 1.0rem;
}
-#contributorInfo > a:nth-child(n+25){
+#contributorInfo > a:nth-child(n+26){
display:none;
}
#contributorInfo > a{
@@ -329,7 +329,13 @@