aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--conf/app.ini8
-rw-r--r--gogs.go2
-rw-r--r--models/models.go1
-rw-r--r--modules/base/conf.go35
-rwxr-xr-xpublic/css/gogs.css9
-rw-r--r--public/js/app.js21
-rw-r--r--routers/admin/admin.go3
-rw-r--r--routers/user/user.go12
-rw-r--r--templates/admin/config.tmpl11
-rw-r--r--templates/repo/nav.tmpl30
-rw-r--r--templates/repo/single_bare.tmpl4
-rw-r--r--templates/user/active.tmpl2
13 files changed, 109 insertions, 31 deletions
diff --git a/README.md b/README.md
index e78ce8fe..cbd1f588 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Gogs(Go Git Service) is a GitHub-like clone in the Go Programming Language.
Since we choose to use pure Go implementation of Git manipulation, Gogs certainly supports **ALL platforms** that Go supports, including Linux, Max OS X, and Windows with **ZERO** dependency.
-##### Current version: 0.1.4 Alpha
+##### Current version: 0.1.5 Alpha
## Purpose
diff --git a/conf/app.ini b/conf/app.ini
index 71fe81e8..ecb0d251 100644
--- a/conf/app.ini
+++ b/conf/app.ini
@@ -61,8 +61,14 @@ USER =
PASSWD =
[cache]
+; Either "memory", "redis", or "memcache", default is "memory"
ADAPTER = memory
-CONFIG =
+; For "memory" only, GC interval in seconds, default is 60
+INTERVAL = 60
+; For "redis" and "memcache", connection host address
+; redis: ":6039"
+; memcache: "127.0.0.1:11211"
+HOST =
[log]
; Either "console", "file", "conn" or "smtp", default is "console"
diff --git a/gogs.go b/gogs.go
index a9f7e6b5..41df7928 100644
--- a/gogs.go
+++ b/gogs.go
@@ -20,7 +20,7 @@ import (
// Test that go1.2 tag above is included in builds. main.go refers to this definition.
const go12tag = true
-const APP_VER = "0.1.4.0321"
+const APP_VER = "0.1.5.0321"
func init() {
base.AppVer = APP_VER
diff --git a/models/models.go b/models/models.go
index a4550d72..8713ff28 100644
--- a/models/models.go
+++ b/models/models.go
@@ -35,7 +35,6 @@ func LoadModelsConfig() {
}
func setEngine() {
-
var err error
switch DbCfg.Type {
case "mysql":
diff --git a/modules/base/conf.go b/modules/base/conf.go
index 3962972c..2c3ecd72 100644
--- a/modules/base/conf.go
+++ b/modules/base/conf.go
@@ -133,6 +133,30 @@ func newLogService() {
log.Info("Log Mode: %s(%s)", strings.Title(mode), levelName)
}
+func newCacheService() {
+ CacheAdapter = Cfg.MustValue("cache", "ADAPTER", "memory")
+
+ switch CacheAdapter {
+ case "memory":
+ CacheConfig = fmt.Sprintf(`{"interval":%d}`, Cfg.MustInt("cache", "INTERVAL", 60))
+ case "redis", "memcache":
+ CacheConfig = fmt.Sprintf(`{"conn":"%s"}`, Cfg.MustValue("cache", "HOST"))
+ default:
+ fmt.Printf("Unknown cache adapter: %s\n", CacheAdapter)
+ os.Exit(2)
+ }
+
+ var err error
+ Cache, err = cache.NewCache(CacheAdapter, CacheConfig)
+ if err != nil {
+ fmt.Printf("Init cache system failed, adapter: %s, config: %s, %v\n",
+ CacheAdapter, CacheConfig, err)
+ os.Exit(2)
+ }
+
+ log.Info("Cache Service Enabled")
+}
+
func newMailService() {
// Check mailer setting.
if Cfg.MustBool("mailer", "ENABLED") {
@@ -188,16 +212,6 @@ func NewConfigContext() {
SecretKey = Cfg.MustValue("security", "SECRET_KEY")
RunUser = Cfg.MustValue("", "RUN_USER")
- CacheAdapter = Cfg.MustValue("cache", "ADAPTER")
- CacheConfig = Cfg.MustValue("cache", "CONFIG")
-
- Cache, err = cache.NewCache(CacheAdapter, CacheConfig)
- if err != nil {
- fmt.Printf("Init cache system failed, adapter: %s, config: %s, %v\n",
- CacheAdapter, CacheConfig, err)
- os.Exit(2)
- }
-
// Determine and create root git reposiroty path.
RepoRootPath = Cfg.MustValue("repository", "ROOT")
if err = os.MkdirAll(RepoRootPath, os.ModePerm); err != nil {
@@ -209,6 +223,7 @@ func NewConfigContext() {
func NewServices() {
newService()
newLogService()
+ newCacheService()
newMailService()
newRegisterMailService()
}
diff --git a/public/css/gogs.css b/public/css/gogs.css
index 36d57536..78040bee 100755
--- a/public/css/gogs.css
+++ b/public/css/gogs.css
@@ -575,6 +575,15 @@ html, body {
min-width: 200px;
}
+#gogs-repo-clone .dropdown-menu{
+ width: 400px;
+ padding: 20px;
+}
+
+#gogs-repo-clone .input-group{
+ margin-bottom: 15px;
+}
+
/* #gogs-source */
#gogs-source {
margin-top: -20px;
diff --git a/public/js/app.js b/public/js/app.js
index a264fc94..f179342f 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -63,6 +63,12 @@ var Gogits = {
var $tabs = $('[data-init=tabs]');
$tabs.find("li:eq(0) a").tab("show");
};
+ // fix dropdown inside click
+ Gogits.initDropDown = function(){
+ $('.dropdown-menu').on('click','a,button,input,select',function(e){
+ e.stopPropagation();
+ });
+ };
// render markdown
Gogits.renderMarkdown = function () {
@@ -136,6 +142,7 @@ function initCore() {
Gogits.initPopovers();
Gogits.initTabs();
Gogits.initModals();
+ Gogits.initDropDown();
Gogits.renderMarkdown();
}
@@ -181,18 +188,18 @@ function initUserSetting() {
}
function initRepository() {
- // guide box script
+ // clone group button script
(function () {
- var $guide = $('.guide-box');
- if ($guide.length) {
- var $url = $('#guide-clone-url');
- $guide.find('button[data-link]').on("click",function () {
+ var $clone = $('.clone-group-btn');
+ if ($clone.length) {
+ var $url = $('.clone-group-url');
+ $clone.find('button[data-link]').on("click",function (e) {
var $this = $(this);
if (!$this.hasClass('btn-primary')) {
- $guide.find('.btn-primary').removeClass('btn-primary').addClass("btn-default");
+ $clone.find('.btn-primary').removeClass('btn-primary').addClass("btn-default");
$(this).addClass('btn-primary').removeClass('btn-default');
$url.val($this.data("link"));
- $guide.find('span.clone-url').text($this.data('link'));
+ $clone.find('span.clone-url').text($this.data('link'));
}
}).eq(0).trigger("click");
// todo copy to clipboard
diff --git a/routers/admin/admin.go b/routers/admin/admin.go
index 6d3831a9..d70af3c5 100644
--- a/routers/admin/admin.go
+++ b/routers/admin/admin.go
@@ -67,5 +67,8 @@ func Config(ctx *middleware.Context) {
ctx.Data["Mailer"] = base.MailService
}
+ ctx.Data["CacheAdapter"] = base.CacheAdapter
+ ctx.Data["CacheConfig"] = base.CacheConfig
+
ctx.HTML(200, "admin/config")
}
diff --git a/routers/user/user.go b/routers/user/user.go
index 40b594ab..d38eb1ce 100644
--- a/routers/user/user.go
+++ b/routers/user/user.go
@@ -167,6 +167,10 @@ func SignUp(ctx *middleware.Context, form auth.RegisterForm) {
ctx.Data["Email"] = u.Email
ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
ctx.HTML(200, "user/active")
+
+ if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
+ log.Error("Set cache(MailResendLimit) fail: %v", err)
+ }
return
}
ctx.Redirect("/user/login")
@@ -247,8 +251,12 @@ func Activate(ctx *middleware.Context) {
}
// Resend confirmation e-mail.
if base.Service.RegisterEmailConfirm {
- ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
- mailer.SendActiveMail(ctx.Render, ctx.User)
+ if ctx.Cache.IsExist("MailResendLimit_" + ctx.User.LowerName) {
+ ctx.Data["ResendLimited"] = true
+ } else {
+ ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
+ mailer.SendActiveMail(ctx.Render, ctx.User)
+ }
} else {
ctx.Data["ServiceNotEnabled"] = true
}
diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl
index 7013c201..ad32ec3f 100644
--- a/templates/admin/config.tmpl
+++ b/templates/admin/config.tmpl
@@ -63,6 +63,17 @@
<div><b>User:</b> {{.Mailer.User}}</div>
</div>
</div>
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ Cache Configuration
+ </div>
+
+ <div class="panel-body">
+ <div><b>Cache Adapter:</b> {{.CacheAdapter}}</div>
+ <div><b>Cache Config:</b> <code>{{.CacheConfig}}</code></div>
+ </div>
+ </div>
</div>
</div>
{{template "base/footer" .}} \ No newline at end of file
diff --git a/templates/repo/nav.tmpl b/templates/repo/nav.tmpl
index c61051af..d4a692fd 100644
--- a/templates/repo/nav.tmpl
+++ b/templates/repo/nav.tmpl
@@ -5,13 +5,32 @@
<h3 class="name"><i class="fa fa-book fa-lg"></i><a href="{{.Owner.HomeLink}}">{{.Owner.Name}}</a> / {{.Repository.Name}}</h3>
<p class="desc">{{.Repository.Description}}{{if .Repository.Website}}<a href="{{.Repository.Website}}">{{.Repository.Website}}</a>{{end}}</p>
</div>
- <div class="col-md-6 actions text-right">
+ <div class="col-md-6 actions text-right clone-group-btn">
{{if not .IsBareRepo}}
- <div class="btn-group" id="gogs-repo-clone">
+ <!--<div class="btn-group" id="gogs-repo-clone">
<button type="button" class="btn btn-default"><i class="fa fa-download fa-lg fa-m"></i></button>
<button type="button" class="btn btn-default dropdown-toggle" data-container="body" data-toggle="popover" data-placement="bottom" data-content="<label>SSH:</label><div class='input-group'><input type='text' class='form-control' value='{{.CloneLink.SSH}}'></div>" data-html="1">
<span class="caret"></span>
</button>
+ </div>-->
+ <div class="btn-group" id="gogs-repo-clone">
+ <button type="button" class="btn btn-default"><i class="fa fa-download fa-lg fa-m"></i></button>
+ <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
+ <span class="caret"></span>
+ </button>
+ <div class="dropdown-menu clone-group-btn dropdown-menu-right">
+ <div class="input-group">
+ <span class="input-group-btn">
+ <button class="btn btn-default" data-link="{{.CloneLink.SSH}}" type="button">SSH</button>
+ <button class="btn btn-default" data-link="{{.CloneLink.HTTPS}}" type="button">HTTPS</button>
+ </span>
+ <input type="text" class="form-control clone-group-url" value="" readonly/>
+ <span class="input-group-btn">
+ <button class="btn btn-default" type="button"><i class="fa fa-copy" data-toggle="tooltip" title="copy to clipboard" data-placement="top"></i></button>
+ </span>
+ </div>
+ <p class="help-block text-center">Need help cloning? Visit <a href="#">Help</a>!</p>
+ </div>
</div>
<div class="btn-group {{if .IsRepositoryWatching}}watching{{else}}no-watching{{end}}" id="gogs-repo-watching" data-watch="/{{.SignedUser.Name}}/{{.Repository.Name}}/action/watch" data-unwatch="/{{.SignedUser.Name}}/{{.Repository.Name}}/action/unwatch">
{{if .IsRepositoryWatching}}
@@ -21,9 +40,8 @@
{{end}}
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
- <span class="sr-only">Toggle Dropdown</span>
</button>
- <div class="dropdown-menu" role="menu">
+ <div class="dropdown-menu">
<div class="dropdown-item text-left to-unwatch">
<h4 role="presentation" class="dropdown-header {{if not .IsRepositoryWatching}}text-primary{{end}}">Not Watching</h4>
<p class="description">You only receive notifications for conversations in which you participate or are @mentioned.</p>
@@ -36,11 +54,11 @@
</div>
</div>
<div class="btn-group">
- <button type="button" class="btn btn-default"><i class="fa fa-star"></i>Star&nbsp;&nbsp;{{.Repository.NumStars}}</button>
+ <button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="top" title="Star"><i class="fa fa-star"></i>&nbsp;{{.Repository.NumStars}}</button>
</div>
{{end}}
<div class="btn-group">
- <a type="button" {{if not .IsRepositoryOwner}}href="/{{.Username}}/{{.Reponame}}/fork"{{end}} class="btn btn-default"><i class="fa fa-code-fork"></i>Fork&nbsp;&nbsp;{{.Repository.NumForks}}</a>
+ <a type="button" {{if not .IsRepositoryOwner}}href="/{{.Username}}/{{.Reponame}}/fork"{{end}} class="btn btn-default" data-toggle="tooltip" data-placement="top" title="Fork"><i class="fa fa-code-fork fa-lg"></i>&nbsp;{{.Repository.NumForks}}</a>
</div>
</div>
</div>
diff --git a/templates/repo/single_bare.tmpl b/templates/repo/single_bare.tmpl
index bb05c2f9..ed182ad2 100644
--- a/templates/repo/single_bare.tmpl
+++ b/templates/repo/single_bare.tmpl
@@ -1,4 +1,4 @@
-<div class="panel panel-default guide-box">
+<div class="panel panel-default guide-box clone-group-btn">
<div class="panel-heading guide-head">
<h4>Quick Guide</h4>
</div>
@@ -9,7 +9,7 @@
<button class="btn btn-default" data-link="{{.CloneLink.SSH}}" type="button">SSH</button>
<button class="btn btn-default" data-link="{{.CloneLink.HTTPS}}" type="button">HTTPS</button>
</span>
- <input type="text" class="form-control" id="guide-clone-url" value="" readonly/>
+ <input type="text" class="form-control clone-group-url" id="guide-clone-url" value="" readonly/>
<span class="input-group-btn">
<button class="btn btn-default" type="button"><i class="fa fa-copy" data-toggle="tooltip" title="copy to clipboard" data-placement="top"></i></button>
</span>
diff --git a/templates/user/active.tmpl b/templates/user/active.tmpl
index fefd7d3a..47c87a59 100644
--- a/templates/user/active.tmpl
+++ b/templates/user/active.tmpl
@@ -6,6 +6,8 @@
{{if .IsActivatePage}}
{{if .ServiceNotEnabled}}
<p>Sorry, Register Mail Confirmation has been disabled.</p>
+ {{else if .ResendLimited}}
+ <p>Sorry, you are sending activation e-mail too frequently, please wait 3 minutes.</p>
{{else}}
<p>New confirmation e-mail has been sent to <b>{{.SignedUser.Email}}</b>, please check your inbox within {{.Hours}} hours to complete your registeration.</p>
<hr/>