aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslene <vslene@gmail.com>2014-03-20 21:02:52 +0800
committerslene <vslene@gmail.com>2014-03-20 21:02:52 +0800
commitc6bd723ce17ae3c0495f84e46a9296b30db5aee1 (patch)
treea2153db027aa03db50f2e7f841bd2545fa65a2bd
parent21379e30a18fed473ae2bbeb41332919ff80497d (diff)
parentc7b6fbfd46fe465b5103ecc0b743ea009eb1e586 (diff)
downloadgitea-c6bd723ce17ae3c0495f84e46a9296b30db5aee1.tar.gz
gitea-c6bd723ce17ae3c0495f84e46a9296b30db5aee1.zip
Merge branch 'master' of github.com:gogits/gogs
Conflicts: public/js/app.js
-rw-r--r--.gitignore4
-rw-r--r--README.md1
-rw-r--r--models/user.go9
-rw-r--r--modules/mailer/mailer.go4
-rw-r--r--modules/middleware/auth.go14
-rw-r--r--modules/middleware/context.go12
-rw-r--r--modules/middleware/repo.go7
-rwxr-xr-xpublic/css/gogs.css32
-rw-r--r--public/js/app.js30
-rw-r--r--routers/admin/admin.go24
-rw-r--r--routers/dashboard.go4
-rw-r--r--routers/dev/template.go2
-rw-r--r--routers/repo/repo.go4
-rw-r--r--routers/repo/single.go22
-rw-r--r--routers/user/setting.go18
-rw-r--r--routers/user/user.go34
-rw-r--r--templates/admin/dashboard.tmpl24
-rw-r--r--templates/admin/repos.tmpl23
-rw-r--r--templates/admin/users.tmpl23
-rw-r--r--templates/base/navbar.tmpl1
-rw-r--r--templates/repo/setting.tmpl4
-rw-r--r--templates/repo/single.tmpl2
-rw-r--r--templates/repo/single_bare.tmpl31
-rw-r--r--templates/repo/toolbar.tmpl3
-rw-r--r--web.go6
25 files changed, 280 insertions, 58 deletions
diff --git a/.gitignore b/.gitignore
index 3e550c3fc7..ad27cc8be8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,6 @@ gogs
*.db
*.log
custom/
-.vendor/ \ No newline at end of file
+.vendor/
+.idea/
+*.iml \ No newline at end of file
diff --git a/README.md b/README.md
index b43e3c98a5..3a1023c6d9 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@ There are some very good products in this category such as [gitlab](http://gitla
- Please see [Wiki](https://github.com/gogits/gogs/wiki) for project design, develop specification, change log and road map.
- See [Trello Broad](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team.
- Try it before anything? Go down to **Installation -> Install from binary** section!.
+- Having troubles? Get help from [Troubleshooting](https://github.com/gogits/gogs/wiki/Troubleshooting).
## Features
diff --git a/models/user.go b/models/user.go
index 76cf2d20ce..fd89af6b3f 100644
--- a/models/user.go
+++ b/models/user.go
@@ -51,6 +51,7 @@ type User struct {
Location string
Website string
IsActive bool
+ IsAdmin bool
Rands string `xorm:"VARCHAR(10)"`
Created time.Time `xorm:"created"`
Updated time.Time `xorm:"updated"`
@@ -136,7 +137,13 @@ func RegisterUser(user *User) (*User, error) {
}
return nil, err
}
- return user, nil
+
+ if user.Id == 1 {
+ user.IsAdmin = true
+ user.IsActive = true
+ _, err = orm.Id(user.Id).UseBool().Update(user)
+ }
+ return user, err
}
// get user by erify code
diff --git a/modules/mailer/mailer.go b/modules/mailer/mailer.go
index 3823e01fa6..150607f8c4 100644
--- a/modules/mailer/mailer.go
+++ b/modules/mailer/mailer.go
@@ -57,9 +57,9 @@ func processMailQueue() {
info = ", info: " + msg.Info
}
log.Error(fmt.Sprintf("Async sent email %d succeed, not send emails: %s%s err: %s", num, tos, info, err))
- return
+ } else {
+ log.Trace(fmt.Sprintf("Async sent email %d succeed, sent emails: %s%s", num, tos, info))
}
- log.Trace(fmt.Sprintf("Async sent email %d succeed, sent emails: %s%s", num, tos, info))
}
}
}
diff --git a/modules/middleware/auth.go b/modules/middleware/auth.go
index d45a21e988..44033abb8f 100644
--- a/modules/middleware/auth.go
+++ b/modules/middleware/auth.go
@@ -20,7 +20,7 @@ func SignInRequire(redirect bool) martini.Handler {
return
} else if !ctx.User.IsActive && base.Service.RegisterEmailConfirm {
ctx.Data["Title"] = "Activate Your Account"
- ctx.Render.HTML(200, "user/active", ctx.Data)
+ ctx.HTML(200, "user/active")
return
}
}
@@ -31,6 +31,18 @@ func SignOutRequire() martini.Handler {
return func(ctx *Context) {
if ctx.IsSigned {
ctx.Redirect("/")
+ return
+ }
+ }
+}
+
+// AdminRequire requires user signed in as administor.
+func AdminRequire() martini.Handler {
+ return func(ctx *Context) {
+ if !ctx.User.IsAdmin {
+ ctx.Error(403)
+ return
}
+ ctx.Data["PageIsAdmin"] = true
}
}
diff --git a/modules/middleware/context.go b/modules/middleware/context.go
index 6ac87de3be..cb3cbabca6 100644
--- a/modules/middleware/context.go
+++ b/modules/middleware/context.go
@@ -61,24 +61,29 @@ func (ctx *Context) HasError() bool {
return hasErr.(bool)
}
+// HTML calls render.HTML underlying but reduce one argument.
+func (ctx *Context) HTML(status int, name string, htmlOpt ...HTMLOptions) {
+ ctx.Render.HTML(status, name, ctx.Data, htmlOpt...)
+}
+
// RenderWithErr used for page has form validation but need to prompt error to users.
func (ctx *Context) RenderWithErr(msg, tpl string, form auth.Form) {
ctx.Data["HasError"] = true
ctx.Data["ErrorMsg"] = msg
auth.AssignForm(form, ctx.Data)
- ctx.HTML(200, tpl, ctx.Data)
+ ctx.HTML(200, tpl)
}
// Handle handles and logs error by given status.
func (ctx *Context) Handle(status int, title string, err error) {
log.Error("%s: %v", title, err)
if martini.Dev == martini.Prod {
- ctx.HTML(500, "status/500", ctx.Data)
+ ctx.HTML(500, "status/500")
return
}
ctx.Data["ErrorMsg"] = err
- ctx.HTML(status, fmt.Sprintf("status/%d", status), ctx.Data)
+ ctx.HTML(status, fmt.Sprintf("status/%d", status))
}
// InitContext initializes a classic context for a request.
@@ -106,6 +111,7 @@ func InitContext() martini.Handler {
ctx.Data["SignedUser"] = user
ctx.Data["SignedUserId"] = user.Id
ctx.Data["SignedUserName"] = user.LowerName
+ ctx.Data["IsAdmin"] = ctx.User.IsAdmin
}
ctx.Data["PageStartTime"] = time.Now()
diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go
index f0cab8e895..62c67bcee1 100644
--- a/modules/middleware/repo.go
+++ b/modules/middleware/repo.go
@@ -65,9 +65,12 @@ func RepoAssignment(redirect bool) martini.Handler {
}
ctx.Repo.IsValid = true
- ctx.Repo.IsWatching = models.IsWatching(ctx.User.Id, repo.Id)
+ if ctx.User != nil {
+ ctx.Repo.IsWatching = models.IsWatching(ctx.User.Id, repo.Id)
+ }
ctx.Repo.Repository = repo
- ctx.Repo.CloneLink.SSH = fmt.Sprintf("git@%s:%s/%s.git", base.Domain, ctx.User.LowerName, repo.LowerName)
+ ctx.Repo.CloneLink.SSH = fmt.Sprintf("git@%s:%s/%s.git", base.Domain, user.LowerName, repo.LowerName)
+ ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("https://%s/%s/%s.git", base.Domain, user.LowerName, repo.LowerName)
ctx.Data["IsRepositoryValid"] = true
ctx.Data["Repository"] = repo
diff --git a/public/css/gogs.css b/public/css/gogs.css
index 83d1b96fe2..eb5f7ad2a5 100755
--- a/public/css/gogs.css
+++ b/public/css/gogs.css
@@ -644,7 +644,19 @@ html, body {
}
.file-content .file-body {
- padding: 30px 30px 50px;
+ padding: 0;
+ border: none;
+ background-color: #FFF;
+}
+
+.file-content .file-body pre {
+ background-color: #FFF;
+ border: none;
+}
+
+.file-content .markdown > pre > ol.linenums > li:first-child {
+ padding-top: 0;
+ margin-top: 0;
}
.file-content .file-body.file-code {
@@ -732,6 +744,24 @@ html, body {
background-color: #FFF;
}
+.commit-list .date {
+ width: 120px;
+}
+
+.guide-box pre, .guide-box .input-group {
+ margin-top: 20px;
+ margin-bottom: 30px;
+ line-height: 24px;
+}
+
+.guide-box input[readonly] {
+ background-color: #FFF;
+}
+
+.guide-box {
+ margin-top: 20px;
+}
+
/* wrapper and footer */
#wrapper {
diff --git a/public/js/app.js b/public/js/app.js
index f3e8d6d1d2..12f9e7f359 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -41,15 +41,15 @@ var Gogits = {
});
};
Gogits.initPopovers = function () {
- var hideAllPopovers = function() {
- $('[data-toggle=popover]').each(function() {
+ var hideAllPopovers = function () {
+ $('[data-toggle=popover]').each(function () {
$(this).popover('hide');
- });
+ });
};
- $(document).on('click', function(e) {
+ $(document).on('click', function (e) {
var $e = $(e.target);
- if($e.data('toggle') == 'popover'||$e.parents("[data-toggle=popover], .popover").length > 0){
+ if ($e.data('toggle') == 'popover' || $e.parents("[data-toggle=popover], .popover").length > 0) {
return;
}
hideAllPopovers();
@@ -161,6 +161,23 @@ function initUserSetting() {
});
}
+function initRepository() {
+ var $guide = $('.guide-box');
+ if ($guide.length) {
+ var $url = $('#guide-clone-url');
+ $guide.find('button[data-url]').on("click",function () {
+ var $this = $(this);
+ if (!$this.hasClass('btn-primary')) {
+ $guide.find('.btn-primary').removeClass('btn-primary').addClass("btn-default");
+ $(this).addClass('btn-primary').removeClass('btn-default');
+ $url.val($this.data("url"));
+ $guide.find('span.clone-url').text($this.data('url'));
+ }
+ }).eq(0).trigger("click");
+ // todo copy to clipboard
+ }
+}
+
(function ($) {
$(function () {
initCore();
@@ -171,5 +188,8 @@ function initUserSetting() {
if (body.data("page") == "user") {
initUserSetting();
}
+ if ($('.gogs-repo-nav').length) {
+ initRepository();
+ }
});
})(jQuery);
diff --git a/routers/admin/admin.go b/routers/admin/admin.go
new file mode 100644
index 0000000000..c7523b7f59
--- /dev/null
+++ b/routers/admin/admin.go
@@ -0,0 +1,24 @@
+// Copyright 2014 The Gogs 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 admin
+
+import (
+ "github.com/gogits/gogs/modules/middleware"
+)
+
+func Dashboard(ctx *middleware.Context) {
+ ctx.Data["Title"] = "Admin Dashboard"
+ ctx.HTML(200, "admin/dashboard")
+}
+
+func Users(ctx *middleware.Context) {
+ ctx.Data["Title"] = "User Management"
+ ctx.HTML(200, "admin/users")
+}
+
+func Repositories(ctx *middleware.Context) {
+ ctx.Data["Title"] = "Repository Management"
+ ctx.HTML(200, "admin/repos")
+}
diff --git a/routers/dashboard.go b/routers/dashboard.go
index 6c194ad9e5..f61d67b7de 100644
--- a/routers/dashboard.go
+++ b/routers/dashboard.go
@@ -15,10 +15,10 @@ func Home(ctx *middleware.Context) {
return
}
ctx.Data["PageIsHome"] = true
- ctx.HTML(200, "home", ctx.Data)
+ ctx.HTML(200, "home")
}
func Help(ctx *middleware.Context) {
ctx.Data["PageIsHelp"] = true
- ctx.HTML(200, "help", ctx.Data)
+ ctx.HTML(200, "help")
}
diff --git a/routers/dev/template.go b/routers/dev/template.go
index 7d5225ece7..d2f77ac4d5 100644
--- a/routers/dev/template.go
+++ b/routers/dev/template.go
@@ -21,5 +21,5 @@ func TemplatePreview(ctx *middleware.Context, params martini.Params) {
ctx.Data["Code"] = "2014031910370000009fff6782aadb2162b4a997acb69d4400888e0b9274657374"
ctx.Data["ActiveCodeLives"] = base.Service.ActiveCodeLives / 60
ctx.Data["ResetPwdCodeLives"] = base.Service.ResetPwdCodeLives / 60
- ctx.HTML(200, params["_1"], ctx.Data)
+ ctx.HTML(200, params["_1"])
}
diff --git a/routers/repo/repo.go b/routers/repo/repo.go
index b38473b18a..556cc4343c 100644
--- a/routers/repo/repo.go
+++ b/routers/repo/repo.go
@@ -18,7 +18,7 @@ func Create(ctx *middleware.Context, form auth.CreateRepoForm) {
ctx.Data["Licenses"] = models.Licenses
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "repo/create", ctx.Data)
+ ctx.HTML(200, "repo/create")
return
}
@@ -45,7 +45,7 @@ func SettingPost(ctx *middleware.Context) {
case "delete":
if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") {
ctx.Data["ErrorMsg"] = "Please make sure you entered repository name is correct."
- ctx.HTML(200, "repo/setting", ctx.Data)
+ ctx.HTML(200, "repo/setting")
return
}
diff --git a/routers/repo/single.go b/routers/repo/single.go
index 2bc77c1c01..6eb839c10d 100644
--- a/routers/repo/single.go
+++ b/routers/repo/single.go
@@ -38,7 +38,7 @@ func Branches(ctx *middleware.Context, params martini.Params) {
ctx.Data["Branches"] = brs
ctx.Data["IsRepoToolbarBranches"] = true
- ctx.HTML(200, "repo/branches", ctx.Data)
+ ctx.HTML(200, "repo/branches")
}
func Single(ctx *middleware.Context, params martini.Params) {
@@ -59,6 +59,8 @@ func Single(ctx *middleware.Context, params martini.Params) {
return
}
+ ctx.Data["IsRepoToolbarSource"] = true
+
// Branches.
brs, err := models.GetBranches(params["username"], params["reponame"])
if err != nil {
@@ -67,7 +69,7 @@ func Single(ctx *middleware.Context, params martini.Params) {
return
} else if len(brs) == 0 {
ctx.Data["IsBareRepo"] = true
- ctx.HTML(200, "repo/single", ctx.Data)
+ ctx.HTML(200, "repo/single")
return
}
@@ -175,9 +177,8 @@ func Single(ctx *middleware.Context, params martini.Params) {
ctx.Data["Paths"] = Paths
ctx.Data["Treenames"] = treenames
- ctx.Data["IsRepoToolbarSource"] = true
ctx.Data["BranchLink"] = branchLink
- ctx.HTML(200, "repo/single", ctx.Data)
+ ctx.HTML(200, "repo/single")
}
func Setting(ctx *middleware.Context, params martini.Params) {
@@ -186,6 +187,8 @@ func Setting(ctx *middleware.Context, params martini.Params) {
return
}
+ ctx.Data["IsRepoToolbarSetting"] = true
+
// Branches.
brs, err := models.GetBranches(params["username"], params["reponame"])
if err != nil {
@@ -194,7 +197,7 @@ func Setting(ctx *middleware.Context, params martini.Params) {
return
} else if len(brs) == 0 {
ctx.Data["IsBareRepo"] = true
- ctx.HTML(200, "repo/setting", ctx.Data)
+ ctx.HTML(200, "repo/setting")
return
}
@@ -204,8 +207,7 @@ func Setting(ctx *middleware.Context, params martini.Params) {
}
ctx.Data["Title"] = title + " - settings"
- ctx.Data["IsRepoToolbarSetting"] = true
- ctx.HTML(200, "repo/setting", ctx.Data)
+ ctx.HTML(200, "repo/setting")
}
func Commits(ctx *middleware.Context, params martini.Params) {
@@ -229,17 +231,17 @@ func Commits(ctx *middleware.Context, params martini.Params) {
ctx.Data["Reponame"] = params["reponame"]
ctx.Data["CommitCount"] = commits.Len()
ctx.Data["Commits"] = commits
- ctx.HTML(200, "repo/commits", ctx.Data)
+ ctx.HTML(200, "repo/commits")
}
func Issues(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarIssues"] = true
- ctx.HTML(200, "repo/issues", ctx.Data)
+ ctx.HTML(200, "repo/issues")
}
func Pulls(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarPulls"] = true
- ctx.HTML(200, "repo/pulls", ctx.Data)
+ ctx.HTML(200, "repo/pulls")
}
func Action(ctx *middleware.Context, params martini.Params) {
diff --git a/routers/user/setting.go b/routers/user/setting.go
index 053f327f0f..f0c7a8a5b1 100644
--- a/routers/user/setting.go
+++ b/routers/user/setting.go
@@ -24,13 +24,13 @@ func Setting(ctx *middleware.Context, form auth.UpdateProfileForm) {
ctx.Data["Owner"] = user
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/setting", ctx.Data)
+ ctx.HTML(200, "user/setting")
return
}
// below is for POST requests
if hasErr, ok := ctx.Data["HasError"]; ok && hasErr.(bool) {
- ctx.HTML(200, "user/setting", ctx.Data)
+ ctx.HTML(200, "user/setting")
return
}
@@ -45,7 +45,7 @@ func Setting(ctx *middleware.Context, form auth.UpdateProfileForm) {
}
ctx.Data["IsSuccess"] = true
- ctx.HTML(200, "user/setting", ctx.Data)
+ ctx.HTML(200, "user/setting")
log.Trace("%s User setting updated: %s", ctx.Req.RequestURI, ctx.User.LowerName)
}
@@ -55,7 +55,7 @@ func SettingPassword(ctx *middleware.Context, form auth.UpdatePasswdForm) {
ctx.Data["IsUserPageSettingPasswd"] = true
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/password", ctx.Data)
+ ctx.HTML(200, "user/password")
return
}
@@ -82,7 +82,7 @@ func SettingPassword(ctx *middleware.Context, form auth.UpdatePasswdForm) {
}
ctx.Data["Owner"] = user
- ctx.HTML(200, "user/password", ctx.Data)
+ ctx.HTML(200, "user/password")
log.Trace("%s User password updated: %s", ctx.Req.RequestURI, ctx.User.LowerName)
}
@@ -123,7 +123,7 @@ func SettingSSHKeys(ctx *middleware.Context, form auth.AddSSHKeyForm) {
// Add new SSH key.
if ctx.Req.Method == "POST" {
if hasErr, ok := ctx.Data["HasError"]; ok && hasErr.(bool) {
- ctx.HTML(200, "user/publickey", ctx.Data)
+ ctx.HTML(200, "user/publickey")
return
}
@@ -155,7 +155,7 @@ func SettingSSHKeys(ctx *middleware.Context, form auth.AddSSHKeyForm) {
ctx.Data["PageIsUserSetting"] = true
ctx.Data["IsUserPageSettingSSH"] = true
ctx.Data["Keys"] = keys
- ctx.HTML(200, "user/publickey", ctx.Data)
+ ctx.HTML(200, "user/publickey")
}
func SettingNotification(ctx *middleware.Context) {
@@ -163,7 +163,7 @@ func SettingNotification(ctx *middleware.Context) {
ctx.Data["Title"] = "Notification"
ctx.Data["PageIsUserSetting"] = true
ctx.Data["IsUserPageSettingNotify"] = true
- ctx.HTML(200, "user/notification", ctx.Data)
+ ctx.HTML(200, "user/notification")
}
func SettingSecurity(ctx *middleware.Context) {
@@ -171,5 +171,5 @@ func SettingSecurity(ctx *middleware.Context) {
ctx.Data["Title"] = "Security"
ctx.Data["PageIsUserSetting"] = true
ctx.Data["IsUserPageSettingSecurity"] = true
- ctx.HTML(200, "user/security", ctx.Data)
+ ctx.HTML(200, "user/security")
}
diff --git a/routers/user/user.go b/routers/user/user.go
index 37070af3f9..be2c4d3839 100644
--- a/routers/user/user.go
+++ b/routers/user/user.go
@@ -34,7 +34,7 @@ func Dashboard(ctx *middleware.Context) {
return
}
ctx.Data["Feeds"] = feeds
- ctx.HTML(200, "user/dashboard", ctx.Data)
+ ctx.HTML(200, "user/dashboard")
}
func Profile(ctx *middleware.Context, params martini.Params) {
@@ -70,19 +70,19 @@ func Profile(ctx *middleware.Context, params martini.Params) {
}
ctx.Data["PageIsUserProfile"] = true
- ctx.HTML(200, "user/profile", ctx.Data)
+ ctx.HTML(200, "user/profile")
}
func SignIn(ctx *middleware.Context, form auth.LogInForm) {
ctx.Data["Title"] = "Log In"
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/signin", ctx.Data)
+ ctx.HTML(200, "user/signin")
return
}
if hasErr, ok := ctx.Data["HasError"]; ok && hasErr.(bool) {
- ctx.HTML(200, "user/signin", ctx.Data)
+ ctx.HTML(200, "user/signin")
return
}
@@ -113,7 +113,7 @@ func SignUp(ctx *middleware.Context, form auth.RegisterForm) {
ctx.Data["PageIsSignUp"] = true
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/signup", ctx.Data)
+ ctx.HTML(200, "user/signup")
return
}
@@ -126,7 +126,7 @@ func SignUp(ctx *middleware.Context, form auth.RegisterForm) {
}
if ctx.HasError() {
- ctx.HTML(200, "user/signup", ctx.Data)
+ ctx.HTML(200, "user/signup")
return
}
@@ -153,12 +153,12 @@ func SignUp(ctx *middleware.Context, form auth.RegisterForm) {
log.Trace("%s User created: %s", ctx.Req.RequestURI, strings.ToLower(form.UserName))
// Send confirmation e-mail.
- if base.Service.RegisterEmailConfirm {
+ if base.Service.RegisterEmailConfirm && u.Id > 1 {
mailer.SendRegisterMail(ctx.Render, u)
ctx.Data["IsSendRegisterMail"] = true
ctx.Data["Email"] = u.Email
ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
- ctx.Render.HTML(200, "user/active", ctx.Data)
+ ctx.HTML(200, "user/active")
return
}
ctx.Redirect("/user/login")
@@ -170,7 +170,7 @@ func Delete(ctx *middleware.Context) {
ctx.Data["IsUserPageSettingDelete"] = true
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/delete", ctx.Data)
+ ctx.HTML(200, "user/delete")
return
}
@@ -195,7 +195,7 @@ func Delete(ctx *middleware.Context) {
}
}
- ctx.HTML(200, "user/delete", ctx.Data)
+ ctx.HTML(200, "user/delete")
}
const (
@@ -218,21 +218,25 @@ func Feeds(ctx *middleware.Context, form auth.FeedsForm) {
}
func Issues(ctx *middleware.Context) {
- ctx.HTML(200, "user/issues", ctx.Data)
+ ctx.HTML(200, "user/issues")
}
func Pulls(ctx *middleware.Context) {
- ctx.HTML(200, "user/pulls", ctx.Data)
+ ctx.HTML(200, "user/pulls")
}
func Stars(ctx *middleware.Context) {
- ctx.HTML(200, "user/stars", ctx.Data)
+ ctx.HTML(200, "user/stars")
}
func Activate(ctx *middleware.Context) {
code := ctx.Query("code")
if len(code) == 0 {
ctx.Data["IsActivatePage"] = true
+ if ctx.User.IsActive {
+ ctx.Error(404)
+ return
+ }
// Resend confirmation e-mail.
if base.Service.RegisterEmailConfirm {
ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
@@ -240,7 +244,7 @@ func Activate(ctx *middleware.Context) {
} else {
ctx.Data["ServiceNotEnabled"] = true
}
- ctx.Render.HTML(200, "user/active", ctx.Data)
+ ctx.HTML(200, "user/active")
return
}
@@ -259,5 +263,5 @@ func Activate(ctx *middleware.Context) {
}
ctx.Data["IsActivateFailed"] = true
- ctx.Render.HTML(200, "user/active", ctx.Data)
+ ctx.HTML(200, "user/active")
}
diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl
new file mode 100644
index 0000000000..84456c85b8
--- /dev/null
+++ b/templates/admin/dashboard.tmpl
@@ -0,0 +1,24 @@
+{{template "base/head" .}}
+{{template "base/navbar" .}}
+<div id="gogs-body" class="container" data-page="admin">
+ <div id="gogs-user-setting-nav" class="col-md-3">
+ <ul class="list-group" data-init="tabs">
+ <li class="list-group-item active"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
+ <li class="list-group-item"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
+ <li class="list-group-item"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
+ </ul>
+ </div>
+
+ <div id="gogs-admin-container" class="col-md-9">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ Statistic
+ </div>
+
+ <div class="panel-body">
+ Gogs database has 4 users, 3 repositories, 4 SSH keys.
+ </div>
+ </div>
+ </div>
+</div>
+{{template "base/footer" .}} \ No newline at end of file
diff --git a/templates/admin/repos.tmpl b/templates/admin/repos.tmpl
new file mode 100644
index 0000000000..ec7f47e090
--- /dev/null
+++ b/templates/admin/repos.tmpl
@@ -0,0 +1,23 @@
+{{template "base/head" .}}
+{{template "base/navbar" .}}
+<div id="gogs-body" class="container" data-page="admin">
+ <div id="gogs-user-setting-nav" class="col-md-3">
+ <ul class="list-group" data-init="tabs">
+ <li class="list-group-item"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
+ <li class="list-group-item"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
+ <li class="list-group-item active"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
+ </ul>
+ </div>
+
+ <div id="gogs-admin-container" class="col-md-9">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ Repository Management
+ </div>
+
+ <div class="panel-body">
+ </div>
+ </div>
+ </div>
+</div>
+{{template "base/footer" .}} \ No newline at end of file
diff --git a/templates/admin/users.tmpl b/templates/admin/users.tmpl
new file mode 100644
index 0000000000..8acf256d05
--- /dev/null
+++ b/templates/admin/users.tmpl
@@ -0,0 +1,23 @@
+{{template "base/head" .}}
+{{template "base/navbar" .}}
+<div id="gogs-body" class="container" data-page="admin">
+ <div id="gogs-user-setting-nav" class="col-md-3">
+ <ul class="list-group" data-init="tabs">
+ <li class="list-group-item"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
+ <li class="list-group-item active"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
+ <li class="list-group-item"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
+ </ul>
+ </div>
+
+ <div id="gogs-admin-container" class="col-md-9">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ User Management
+ </div>
+
+ <div class="panel-body">
+ </div>
+ </div>
+ </div>
+</div>
+{{template "base/footer" .}} \ No newline at end of file
diff --git a/templates/base/navbar.tmpl b/templates/base/navbar.tmpl
index e0d796a87b..9c064d07e7 100644
--- a/templates/base/navbar.tmpl
+++ b/templates/base/navbar.tmpl
@@ -10,6 +10,7 @@
</a>
<a class="navbar-right gogs-nav-item{{if .PageIsNewRepo}} active{{end}}" href="/repo/create" data-toggle="tooltip" data-placement="bottom" title="New Repository"><i class="fa fa-plus fa-lg"></i></a>
<a class="navbar-right gogs-nav-item{{if .PageIsUserSetting}} active{{end}}" href="/user/setting" data-toggle="tooltip" data-placement="bottom" title="Setting"><i class="fa fa-cogs fa-lg"></i></a>
+ {{if .IsAdmin}}<a class="navbar-right gogs-nav-item{{if .PageIsAdmin}} active{{end}}" href="/admin" data-toggle="tooltip" data-placement="bottom" title="Admin"><i class="fa fa-gear fa-lg"></i></a>{{end}}
{{else}}<a id="gogs-nav-signin" class="gogs-nav-item navbar-right navbar-btn btn btn-danger" href="/user/login/">Sign in</a>{{end}}
</nav>
</div>
diff --git a/templates/repo/setting.tmpl b/templates/repo/setting.tmpl
index 06f0ed4d50..a2fb1771d4 100644
--- a/templates/repo/setting.tmpl
+++ b/templates/repo/setting.tmpl
@@ -10,20 +10,24 @@
<li class="list-group-item"><a href="#">Notifications</a></li>-->
</ul>
</div>
+
<div id="gogs-repo-setting-container" class="col-md-9">
{{if .ErrorMsg}}<p class="alert alert-danger">{{.ErrorMsg}}</p>{{end}}
<div class="panel panel-default">
<div class="panel-heading">
Repository Options
</div>
+
<div class="panel-body">
</div>
</div>
+
<div class="panel panel-warning">
<div class="panel-heading">
Danger Zone
</div>
+
<div class="panel-body">
<button type="button" class="btn btn-default pull-right" href="#delete-repository-modal" data-toggle="modal">
Delete this repository
diff --git a/templates/repo/single.tmpl b/templates/repo/single.tmpl
index 60247898e2..8a7b5e479b 100644
--- a/templates/repo/single.tmpl
+++ b/templates/repo/single.tmpl
@@ -5,7 +5,7 @@
<div id="gogs-body" class="container">
<div id="gogs-source">
{{if .IsBareRepo}}
- Need to fill in some guide.
+ {{template "repo/single_bare" .}}
{{else}}
<div class="source-toolbar">
{{ $n := len .Treenames}}
diff --git a/templates/repo/single_bare.tmpl b/templates/repo/single_bare.tmpl
new file mode 100644
index 0000000000..06711157d4
--- /dev/null
+++ b/templates/repo/single_bare.tmpl
@@ -0,0 +1,31 @@
+<div class="panel panel-default guide-box">
+ <div class="panel-heading guide-head">
+ <h4>Quick Guide</h4>
+ </div>
+ <div class="panel-body guide-content text-center">
+ <h3>Clone this repository</h3>
+ <div class="input-group col-md-8 col-md-offset-2 guide-buttons">
+ <span class="input-group-btn">
+ <button class="btn btn-default" data-url="{{.CloneLink.SSH}}" type="button">SSH</button>
+ <button class="btn btn-default" data-url="{{.CloneLink.HTTPS}}" type="button">HTTPS</button>
+ </span>
+ <input type="text" class="form-control" 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>
+ </div>
+ <p>We recommend every repository include a <strong>README</strong>, <strong>LICENSE</strong>, and <strong>.gitignore</strong>.</p>
+ <hr/>
+ <h3>Create a new repository on the command line</h3>
+ <pre class="text-left"><code>touch README.md
+git init
+git add README.md
+git commit -m "first commit"
+git remote add origin <span class="clone-url"></span>
+git push -u origin master</code></pre>
+ <hr/>
+ <h3>Push an existing repository from the command line</h3>
+ <pre class="text-left"><code>git remote add origin <span class="clone-url"></span>
+git push -u origin master</code></pre>
+ </div>
+</div> \ No newline at end of file
diff --git a/templates/repo/toolbar.tmpl b/templates/repo/toolbar.tmpl
index 5cd9f526b4..b51768a3c3 100644
--- a/templates/repo/toolbar.tmpl
+++ b/templates/repo/toolbar.tmpl
@@ -15,9 +15,8 @@
<li><a href="/{{.RepositoryLink}}/release">Release</a></li>
<li><a href="//{{.RepositoryLink}}/wiki">Wiki</a></li>
</ul>
- </li>
+ </li>{{end}}
</ul>
- {{end}}
<ul class="nav navbar-nav navbar-right">
{{if not .IsBareRepo}}
<li class="dropdown">
diff --git a/web.go b/web.go
index ceb193e6fd..a5a8305aee 100644
--- a/web.go
+++ b/web.go
@@ -21,6 +21,7 @@ import (
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/routers"
+ "github.com/gogits/gogs/routers/admin"
"github.com/gogits/gogs/routers/dev"
"github.com/gogits/gogs/routers/repo"
"github.com/gogits/gogs/routers/user"
@@ -99,6 +100,11 @@ func runWeb(*cli.Context) {
m.Get("/help", routers.Help)
+ adminReq := middleware.AdminRequire()
+ m.Any("/admin", reqSignIn, adminReq, admin.Dashboard)
+ m.Any("/admin/users", reqSignIn, adminReq, admin.Users)
+ m.Any("/admin/repos", reqSignIn, adminReq, admin.Repositories)
+
m.Post("/:username/:reponame/settings", reqSignIn, middleware.RepoAssignment(true), repo.SettingPost)
m.Get("/:username/:reponame/settings", reqSignIn, middleware.RepoAssignment(true), repo.Setting)