diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini
index d8060f0b5..20f27e183 100644
--- a/conf/locale/locale_de-DE.ini
+++ b/conf/locale/locale_de-DE.ini
@@ -490,10 +490,10 @@ monitor.start = Startzeit
monitor.execute_time = Ausführungszeit
[action]
-create_repo = Repository erstellen %s
-commit_repo = pushed to %s at %s
-create_issue = opened issue %s#%s
-comment_issue = commented on issue %s#%s
+create_repo = Repository erstellen %s
+commit_repo = pushed to %s at %s
+create_issue = opened issue %s#%s
+comment_issue = commented on issue %s#%s
[tool]
ago = vor
diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini
index 75ea7fcc2..50422bd25 100644
--- a/conf/locale/locale_en-US.ini
+++ b/conf/locale/locale_en-US.ini
@@ -541,10 +541,10 @@ monitor.start = Start Time
monitor.execute_time = Execution Time
[action]
-create_repo = created repository %s
-commit_repo = pushed to %s at %s
-create_issue = opened issue %s#%s
-comment_issue = commented on issue %s#%s
+create_repo = created repository %s
+commit_repo = pushed to %s at %s
+create_issue = opened issue %s#%s
+comment_issue = commented on issue %s#%s
[tool]
ago = ago
diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini
index 606e4c989..f26d46fcd 100644
--- a/conf/locale/locale_zh-CN.ini
+++ b/conf/locale/locale_zh-CN.ini
@@ -539,10 +539,10 @@ monitor.start = 开始时间
monitor.execute_time = 已执行时间
[action]
-create_repo = 创建了仓库 %s
-commit_repo = 推送了 %s 分支的代码到 %s
-create_issue = 创建了工单 %s#%s
-comment_issue = 评论了工单 %s#%s
+create_repo = 创建了仓库 %s
+commit_repo = 推送了 %s 分支的代码到 %s
+create_issue = 创建了工单 %s#%s
+comment_issue = 评论了工单 %s#%s
[tool]
ago = 之前
diff --git a/models/action.go b/models/action.go
index a6b22b161..596f51aff 100644
--- a/models/action.go
+++ b/models/action.go
@@ -137,7 +137,7 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com
return err
}
- url := fmt.Sprintf("/%s/%s/commit/%s", repoUserName, repoName, c.Sha1)
+ url := fmt.Sprintf("%s/%s/%s/commit/%s", setting.AppRootSubUrl, repoUserName, repoName, c.Sha1)
message := fmt.Sprintf(`%s`, url, c.Message)
if _, err = CreateComment(userId, issue.RepoId, issue.Id, 0, 0, COMMIT, message, nil); err != nil {
diff --git a/models/user.go b/models/user.go
index b3ea81617..1bed8109a 100644
--- a/models/user.go
+++ b/models/user.go
@@ -82,14 +82,14 @@ type User struct {
// DashboardLink returns the user dashboard page link.
func (u *User) DashboardLink() string {
if u.IsOrganization() {
- return "/org/" + u.Name + "/dashboard/"
+ return setting.AppRootSubUrl + "/org/" + u.Name + "/dashboard/"
}
- return "/"
+ return setting.AppRootSubUrl + "/"
}
// HomeLink returns the user home page link.
func (u *User) HomeLink() string {
- return "/user/" + u.Name
+ return setting.AppRootSubUrl + "/user/" + u.Name
}
// AvatarLink returns user gravatar link.
diff --git a/modules/base/markdown.go b/modules/base/markdown.go
index b8bd33e11..2aa81005b 100644
--- a/modules/base/markdown.go
+++ b/modules/base/markdown.go
@@ -14,6 +14,7 @@ import (
"strings"
"github.com/gogits/gfm"
+ "github.com/gogits/gogs/modules/setting"
)
func isletter(c byte) bool {
@@ -112,7 +113,7 @@ func RenderSpecialLink(rawBytes []byte, urlPrefix string) []byte {
ms := MentionPattern.FindAll(line, -1)
for _, m := range ms {
line = bytes.Replace(line, m,
- []byte(fmt.Sprintf(`%s`, m[1:], m)), -1)
+ []byte(fmt.Sprintf(`%s`, setting.AppRootSubUrl, m[1:], m)), -1)
}
}
diff --git a/modules/base/template.go b/modules/base/template.go
index 338fe677b..dd883ea36 100644
--- a/modules/base/template.go
+++ b/modules/base/template.go
@@ -82,6 +82,9 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
"AppName": func() string {
return setting.AppName
},
+ "AppRootSubUrl": func() string {
+ return setting.AppRootSubUrl
+ },
"AppVer": func() string {
return setting.AppVer
},
@@ -163,14 +166,14 @@ func ActionIcon(opType int) string {
// TODO: Legacy
const (
- TPL_CREATE_REPO = `%s created repository %s`
- TPL_COMMIT_REPO = `%s pushed to %s at %s%s`
- TPL_COMMIT_REPO_LI = `
`
- TPL_CREATE_ISSUE = `%s opened issue %s#%s
+ TPL_CREATE_REPO = `%s created repository %s`
+ TPL_COMMIT_REPO = `%s pushed to %s at %s%s`
+ TPL_COMMIT_REPO_LI = ``
+ TPL_CREATE_ISSUE = `%s opened issue %s#%s
%s
`
- TPL_TRANSFER_REPO = `%s transfered repository %s
to %s`
- TPL_PUSH_TAG = `%s pushed tag %s at %s`
- TPL_COMMENT_ISSUE = `%s commented on issue %s#%s
+ TPL_TRANSFER_REPO = `%s transfered repository %s
to %s`
+ TPL_PUSH_TAG = `%s pushed tag %s at %s`
+ TPL_COMMENT_ISSUE = `%s commented on issue %s#%s
%s
`
)
@@ -207,7 +210,7 @@ func ActionDesc(act Actioner) string {
content := act.GetContent()
switch act.GetOpType() {
case 1: // Create repository.
- return fmt.Sprintf(TPL_CREATE_REPO, actUserName, actUserName, repoLink, repoName)
+ return fmt.Sprintf(TPL_CREATE_REPO, setting.AppRootSubUrl, actUserName, actUserName, repoLink, repoName)
case 5: // Commit repository.
var push *PushCommits
if err := json.Unmarshal([]byte(content), &push); err != nil {
@@ -218,22 +221,22 @@ func ActionDesc(act Actioner) string {
buf.WriteString(fmt.Sprintf(TPL_COMMIT_REPO_LI, AvatarLink(commit.AuthorEmail), repoLink, commit.Sha1, commit.Sha1[:7], commit.Message) + "\n")
}
if push.Len > 3 {
- buf.WriteString(fmt.Sprintf(``, actUserName, repoName, branch, push.Len))
+ buf.WriteString(fmt.Sprintf(``, actUserName, repoName, branch, push.Len))
}
- return fmt.Sprintf(TPL_COMMIT_REPO, actUserName, actUserName, repoLink, branch, branch, repoLink, repoLink,
+ return fmt.Sprintf(TPL_COMMIT_REPO, setting.AppRootSubUrl, actUserName, actUserName, repoLink, branch, branch, repoLink, repoLink,
buf.String())
case 6: // Create issue.
infos := strings.SplitN(content, "|", 2)
- return fmt.Sprintf(TPL_CREATE_ISSUE, actUserName, actUserName, repoLink, infos[0], repoLink, infos[0],
+ return fmt.Sprintf(TPL_CREATE_ISSUE, setting.AppRootSubUrl, actUserName, actUserName, repoLink, infos[0], repoLink, infos[0],
AvatarLink(email), infos[1])
case 8: // Transfer repository.
newRepoLink := content + "/" + repoName
- return fmt.Sprintf(TPL_TRANSFER_REPO, actUserName, actUserName, repoLink, newRepoLink, newRepoLink)
+ return fmt.Sprintf(TPL_TRANSFER_REPO, setting.AppRootSubUrl, actUserName, actUserName, repoLink, newRepoLink, newRepoLink)
case 9: // Push tag.
- return fmt.Sprintf(TPL_PUSH_TAG, actUserName, actUserName, repoLink, branch, branch, repoLink, repoLink)
+ return fmt.Sprintf(TPL_PUSH_TAG, setting.AppRootSubUrl, actUserName, actUserName, repoLink, branch, branch, repoLink, repoLink)
case 10: // Comment issue.
infos := strings.SplitN(content, "|", 2)
- return fmt.Sprintf(TPL_COMMENT_ISSUE, actUserName, actUserName, repoLink, infos[0], repoLink, infos[0],
+ return fmt.Sprintf(TPL_COMMENT_ISSUE, setting.AppRootSubUrl, actUserName, actUserName, repoLink, infos[0], repoLink, infos[0],
AvatarLink(email), infos[1])
default:
return "invalid type"
diff --git a/modules/middleware/auth.go b/modules/middleware/auth.go
index 51ce48c69..ccd8d0315 100644
--- a/modules/middleware/auth.go
+++ b/modules/middleware/auth.go
@@ -25,13 +25,13 @@ func Toggle(options *ToggleOptions) macaron.Handler {
return func(ctx *Context) {
// Cannot view any page before installation.
if !setting.InstallLock {
- ctx.Redirect("/install")
+ ctx.Redirect(setting.AppRootSubUrl + "/install")
return
}
// Redirect to dashboard if user tries to visit any non-login page.
if options.SignOutRequire && ctx.IsSigned && ctx.Req.RequestURI != "/" {
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
return
}
@@ -48,8 +48,8 @@ func Toggle(options *ToggleOptions) macaron.Handler {
if strings.HasSuffix(ctx.Req.RequestURI, "watch") {
return
}
- ctx.SetCookie("redirect_to", "/"+url.QueryEscape(ctx.Req.RequestURI))
- ctx.Redirect("/user/login")
+ ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppRootSubUrl + ctx.Req.RequestURI))
+ ctx.Redirect(setting.AppRootSubUrl + "/user/login")
return
} else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm {
ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
diff --git a/modules/middleware/context.go b/modules/middleware/context.go
index 3ef1b1d62..5c26f91f5 100644
--- a/modules/middleware/context.go
+++ b/modules/middleware/context.go
@@ -187,7 +187,7 @@ func Contexter() macaron.Handler {
Session: sess,
}
// Compute current URL for real-time change language.
- link := ctx.Req.RequestURI
+ link := setting.AppRootSubUrl + ctx.Req.RequestURI
i := strings.Index(link, "?")
if i > -1 {
link = link[:i]
diff --git a/modules/middleware/org.go b/modules/middleware/org.go
index 7bb24ab7e..3a2cf7bc8 100644
--- a/modules/middleware/org.go
+++ b/modules/middleware/org.go
@@ -9,6 +9,7 @@ import (
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/log"
+ "github.com/gogits/gogs/modules/setting"
)
func OrgAssignment(redirect bool, args ...bool) macaron.Handler {
@@ -37,7 +38,7 @@ func OrgAssignment(redirect bool, args ...bool) macaron.Handler {
ctx.Handle(404, "GetUserByName", err)
} else if redirect {
log.Error(4, "GetUserByName", err)
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
} else {
ctx.Handle(500, "GetUserByName", err)
}
@@ -67,7 +68,7 @@ func OrgAssignment(redirect bool, args ...bool) macaron.Handler {
}
ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner
- ctx.Org.OrgLink = "/org/" + org.Name
+ ctx.Org.OrgLink = setting.AppRootSubUrl + "/org/" + org.Name
ctx.Data["OrgLink"] = ctx.Org.OrgLink
// Team.
@@ -79,7 +80,7 @@ func OrgAssignment(redirect bool, args ...bool) macaron.Handler {
ctx.Handle(404, "GetTeam", err)
} else if redirect {
log.Error(4, "GetTeam", err)
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
} else {
ctx.Handle(500, "GetTeam", err)
}
diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go
index 82ef3c799..e7d7fb561 100644
--- a/modules/middleware/repo.go
+++ b/modules/middleware/repo.go
@@ -60,7 +60,7 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
ctx.Handle(404, "GetUserByName", err)
} else if redirect {
log.Error(4, "GetUserByName", err)
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
} else {
ctx.Handle(500, "GetUserByName", err)
}
@@ -72,7 +72,7 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
if u == nil {
if redirect {
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
return
}
ctx.Handle(404, "RepoAssignment", errors.New("invliad user account for single repository"))
@@ -92,7 +92,7 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
ctx.Handle(404, "GetRepositoryByName", err)
return
} else if redirect {
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
return
}
ctx.Handle(500, "GetRepositoryByName", err)
@@ -160,7 +160,7 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
return
}
ctx.Repo.GitRepo = gitRepo
- ctx.Repo.RepoLink = "/" + u.Name + "/" + repo.Name
+ ctx.Repo.RepoLink = setting.AppRootSubUrl + "/" + u.Name + "/" + repo.Name
ctx.Data["RepoLink"] = ctx.Repo.RepoLink
tags, err := ctx.Repo.GitRepo.GetTags()
@@ -298,8 +298,8 @@ func RequireTrueOwner() macaron.Handler {
return func(ctx *Context) {
if !ctx.Repo.IsTrueOwner && !ctx.Repo.IsAdmin {
if !ctx.IsSigned {
- ctx.SetCookie("redirect_to", "/"+url.QueryEscape(ctx.Req.RequestURI))
- ctx.Redirect("/user/login")
+ ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppRootSubUrl + ctx.Req.RequestURI))
+ ctx.Redirect(setting.AppRootSubUrl + "/user/login")
return
}
ctx.Handle(404, ctx.Req.RequestURI, nil)
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index 5fb1d52d0..744277448 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -6,6 +6,7 @@ package setting
import (
"fmt"
+ "net/url"
"os"
"os/exec"
"path"
@@ -31,9 +32,10 @@ const (
var (
// App settings.
- AppVer string
- AppName string
- AppUrl string
+ AppVer string
+ AppName string
+ AppUrl string
+ AppRootSubUrl string
// Server settings.
Protocol Scheme
@@ -165,6 +167,12 @@ func NewConfigContext() {
AppUrl += "/"
}
+ url, err := url.Parse(AppUrl)
+ if err != nil {
+ log.Fatal(4, "Invalid ROOT_URL %s: %s", AppUrl, err)
+ }
+ AppRootSubUrl = strings.TrimSuffix(url.Path, "/")
+
Protocol = HTTP
if Cfg.MustValue("server", "PROTOCOL") == "https" {
Protocol = HTTPS
diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js
index 74bb6cc22..fcc470e9a 100644
--- a/public/ng/js/gogs.js
+++ b/public/ng/js/gogs.js
@@ -202,7 +202,7 @@ var Gogs = {};
// Search users by keyword.
Gogs.searchUsers = function (val, $target) {
$.ajax({
- url: '/api/v1/users/search?q=' + val,
+ url: Gogs.AppRootSubUrl + '/api/v1/users/search?q=' + val,
dataType: "json",
success: function (json) {
if (json.ok && json.data.length) {
@@ -222,7 +222,7 @@ var Gogs = {};
// Search repositories by keyword.
Gogs.searchRepos = function (val, $target, $param) {
$.ajax({
- url: '/api/v1/repos/search?q=' + val + '&' + $param,
+ url: Gogs.AppRootSubUrl + '/api/v1/repos/search?q=' + val + '&' + $param,
dataType: "json",
success: function (json) {
if (json.ok && json.data.length) {
@@ -245,7 +245,7 @@ var Gogs = {};
return;
}
$(selector).zclip({
- path: "/js/ZeroClipboard.swf",
+ path: Gogs.AppRootSubUrl + "/js/ZeroClipboard.swf",
copy: function () {
var t = $(this).data("copy-val");
var to = $($(this).data("copy-from"));
@@ -592,6 +592,7 @@ function initInstall() {
}
$(document).ready(function () {
+ Gogs.AppRootSubUrl = $('head').data('suburl');
initCore();
if ($('#user-profile-setting').length) {
initUserSetting();
@@ -644,7 +645,7 @@ function homepage() {
$('#promo-form').submit(function (e) {
if ($('#username').val() === "") {
e.preventDefault();
- window.location.href = '/user/login';
+ window.location.href = Gogs.AppRootSubUrl + '/user/login';
return true
}
});
@@ -652,9 +653,9 @@ function homepage() {
$('#register-button').click(function (e) {
if ($('#username').val() === "") {
e.preventDefault();
- window.location.href = '/user/sign_up';
+ window.location.href = Gogs.AppRootSubUrl + '/user/sign_up';
return true
}
- $('#promo-form').attr('action', '/user/sign_up');
+ $('#promo-form').attr('action', Gogs.AppRootSubUrl + '/user/sign_up');
});
}
diff --git a/routers/admin/admin.go b/routers/admin/admin.go
index 756d76c0f..1fee7adbd 100644
--- a/routers/admin/admin.go
+++ b/routers/admin/admin.go
@@ -143,7 +143,7 @@ func Dashboard(ctx *middleware.Context) {
} else {
ctx.Flash.Success(success)
}
- ctx.Redirect("/admin")
+ ctx.Redirect(setting.AppRootSubUrl + "/admin")
return
}
diff --git a/routers/admin/auths.go b/routers/admin/auths.go
index 6fbeab354..9eaae489a 100644
--- a/routers/admin/auths.go
+++ b/routers/admin/auths.go
@@ -14,6 +14,7 @@ import (
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
@@ -99,7 +100,7 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
}
log.Trace("Authentication created by admin(%s): %s", ctx.User.Name, form.AuthName)
- ctx.Redirect("/admin/auths")
+ ctx.Redirect(setting.AppRootSubUrl + "/admin/auths")
}
func EditAuthSource(ctx *middleware.Context) {
@@ -180,7 +181,7 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
log.Trace("Authentication changed by admin(%s): %s", ctx.User.Name, form.AuthName)
ctx.Flash.Success(ctx.Tr("admin.auths.update_success"))
- ctx.Redirect("/admin/auths/" + ctx.Params(":authid"))
+ ctx.Redirect(setting.AppRootSubUrl + "/admin/auths/" + ctx.Params(":authid"))
}
func DeleteAuthSource(ctx *middleware.Context) {
@@ -200,12 +201,12 @@ func DeleteAuthSource(ctx *middleware.Context) {
switch err {
case models.ErrAuthenticationUserUsed:
ctx.Flash.Error("form.still_own_user")
- ctx.Redirect("/admin/auths/" + ctx.Params(":authid"))
+ ctx.Redirect(setting.AppRootSubUrl + "/admin/auths/" + ctx.Params(":authid"))
default:
ctx.Handle(500, "DelLoginSource", err)
}
return
}
log.Trace("Authentication deleted by admin(%s): %s", ctx.User.Name, a.Name)
- ctx.Redirect("/admin/auths")
+ ctx.Redirect(setting.AppRootSubUrl + "/admin/auths")
}
diff --git a/routers/admin/users.go b/routers/admin/users.go
index 3f14e48f0..5cdb0f5ce 100644
--- a/routers/admin/users.go
+++ b/routers/admin/users.go
@@ -14,6 +14,7 @@ import (
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
@@ -120,7 +121,7 @@ func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) {
return
}
log.Trace("Account created by admin(%s): %s", ctx.User.Name, u.Name)
- ctx.Redirect("/admin/users")
+ ctx.Redirect(setting.AppRootSubUrl + "/admin/users")
}
func EditUser(ctx *middleware.Context) {
@@ -197,7 +198,7 @@ func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) {
ctx.Data["User"] = u
ctx.Flash.Success(ctx.Tr("admin.users.update_profile_success"))
- ctx.Redirect("/admin/users/" + ctx.Params(":userid"))
+ ctx.Redirect(setting.AppRootSubUrl + "/admin/users/" + ctx.Params(":userid"))
}
func DeleteUser(ctx *middleware.Context) {
@@ -217,12 +218,12 @@ func DeleteUser(ctx *middleware.Context) {
switch err {
case models.ErrUserOwnRepos:
ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo"))
- ctx.Redirect("/admin/users/" + ctx.Params(":userid"))
+ ctx.Redirect(setting.AppRootSubUrl + "/admin/users/" + ctx.Params(":userid"))
default:
ctx.Handle(500, "DeleteUser", err)
}
return
}
log.Trace("Account deleted by admin(%s): %s", ctx.User.Name, u.Name)
- ctx.Redirect("/admin/users")
+ ctx.Redirect(setting.AppRootSubUrl + "/admin/users")
}
diff --git a/routers/home.go b/routers/home.go
index 36a4f50fd..8e973d161 100644
--- a/routers/home.go
+++ b/routers/home.go
@@ -33,7 +33,7 @@ func Home(ctx *middleware.Context) {
// Check auto-login.
uname := ctx.GetCookie(setting.CookieUserName)
if len(uname) != 0 {
- ctx.Redirect("/user/login")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/login")
return
}
diff --git a/routers/install.go b/routers/install.go
index 26409814e..54da4d4f7 100644
--- a/routers/install.go
+++ b/routers/install.go
@@ -253,5 +253,5 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
log.Info("First-time run install finished!")
ctx.Flash.Success(ctx.Tr("install.install_success"))
- ctx.Redirect("/user/login")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/login")
}
diff --git a/routers/org/members.go b/routers/org/members.go
index 823daec94..d3bd51eae 100644
--- a/routers/org/members.go
+++ b/routers/org/members.go
@@ -11,6 +11,7 @@ import (
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
@@ -86,7 +87,7 @@ func MembersAction(ctx *middleware.Context) {
if ctx.Params(":action") != "leave" {
ctx.Redirect(ctx.Org.OrgLink + "/members")
} else {
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
}
}
diff --git a/routers/org/org.go b/routers/org/org.go
index 27ccf02d3..cea70823a 100644
--- a/routers/org/org.go
+++ b/routers/org/org.go
@@ -10,6 +10,7 @@ import (
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
@@ -82,5 +83,5 @@ func CreatePost(ctx *middleware.Context, form auth.CreateOrgForm) {
}
log.Trace("Organization created: %s", org.Name)
- ctx.Redirect("/org/" + form.OrgName + "/dashboard")
+ ctx.Redirect(setting.AppRootSubUrl + "/org/" + form.OrgName + "/dashboard")
}
diff --git a/routers/org/setting.go b/routers/org/setting.go
index f853ef0e8..3d397c0c6 100644
--- a/routers/org/setting.go
+++ b/routers/org/setting.go
@@ -11,6 +11,7 @@ import (
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
@@ -48,7 +49,7 @@ func SettingsPost(ctx *middleware.Context, form auth.UpdateOrgSettingForm) {
} else if err = models.ChangeUserName(org, form.OrgUserName); err != nil {
if err == models.ErrUserNameIllegal {
ctx.Flash.Error(ctx.Tr("form.illegal_username"))
- ctx.Redirect("/org/" + org.LowerName + "/settings")
+ ctx.Redirect(setting.AppRootSubUrl + "/org/" + org.LowerName + "/settings")
return
} else {
ctx.Handle(500, "ChangeUserName", err)
@@ -72,7 +73,7 @@ func SettingsPost(ctx *middleware.Context, form auth.UpdateOrgSettingForm) {
}
log.Trace("Organization setting updated: %s", org.Name)
ctx.Flash.Success(ctx.Tr("org.settings.update_setting_success"))
- ctx.Redirect("/org/" + org.Name + "/settings")
+ ctx.Redirect(setting.AppRootSubUrl + "/org/" + org.Name + "/settings")
}
func SettingsDelete(ctx *middleware.Context) {
@@ -86,13 +87,13 @@ func SettingsDelete(ctx *middleware.Context) {
switch err {
case models.ErrUserOwnRepos:
ctx.Flash.Error(ctx.Tr("form.org_still_own_repo"))
- ctx.Redirect("/org/" + org.LowerName + "/settings/delete")
+ ctx.Redirect(setting.AppRootSubUrl + "/org/" + org.LowerName + "/settings/delete")
default:
ctx.Handle(500, "DeleteOrganization", err)
}
} else {
log.Trace("Organization deleted: %s", ctx.User.Name)
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
}
return
}
diff --git a/routers/repo/commit.go b/routers/repo/commit.go
index f7feb4d95..e58b9e78f 100644
--- a/routers/repo/commit.go
+++ b/routers/repo/commit.go
@@ -159,8 +159,8 @@ func Diff(ctx *middleware.Context) {
ctx.Data["Diff"] = diff
ctx.Data["Parents"] = parents
ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0
- ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", commitId)
- ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", commitId)
+ ctx.Data["SourcePath"] = setting.AppRootSubUrl + "/" + path.Join(userName, repoName, "src", commitId)
+ ctx.Data["RawPath"] = setting.AppRootSubUrl + "/" + path.Join(userName, repoName, "raw", commitId)
ctx.HTML(200, DIFF)
}
diff --git a/routers/repo/issue.go b/routers/repo/issue.go
index 934cf3c98..8aba82ffc 100644
--- a/routers/repo/issue.go
+++ b/routers/repo/issue.go
@@ -54,8 +54,8 @@ func Issues(ctx *middleware.Context) {
isShowClosed := ctx.Query("state") == "closed"
if viewType != "all" && !ctx.IsSigned {
- ctx.SetCookie("redirect_to", "/"+url.QueryEscape(ctx.Req.RequestURI))
- ctx.Redirect("/user/login")
+ ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppRootSubUrl + ctx.Req.RequestURI))
+ ctx.Redirect(setting.AppRootSubUrl + "/user/login")
return
}
@@ -312,7 +312,7 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
}
log.Trace("%d Issue created: %d", ctx.Repo.Repository.Id, issue.Id)
- send(200, fmt.Sprintf("/%s/%s/issues/%d", ctx.Params(":username"), ctx.Params(":reponame"), issue.Index), nil)
+ send(200, fmt.Sprintf("%s/%s/%s/issues/%d", setting.AppRootSubUrl, ctx.Params(":username"), ctx.Params(":reponame"), issue.Index), nil)
}
func checkLabels(labels, allLabels []*models.Label) {
diff --git a/routers/repo/repo.go b/routers/repo/repo.go
index 17f20a0a7..3bd9aa7cd 100644
--- a/routers/repo/repo.go
+++ b/routers/repo/repo.go
@@ -18,6 +18,7 @@ import (
"github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
@@ -95,7 +96,7 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
form.Gitignore, form.License, form.Private, false, form.InitReadme)
if err == nil {
log.Trace("Repository created: %s/%s", ctxUser.Name, form.RepoName)
- ctx.Redirect("/" + ctxUser.Name + "/" + form.RepoName)
+ ctx.Redirect(setting.AppRootSubUrl + "/" + ctxUser.Name + "/" + form.RepoName)
return
} else if err == models.ErrRepoAlreadyExist {
ctx.Data["Err_RepoName"] = true
@@ -179,7 +180,7 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
form.Mirror, url)
if err == nil {
log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName)
- ctx.Redirect("/" + ctxUser.Name + "/" + form.RepoName)
+ ctx.Redirect(setting.AppRootSubUrl + "/" + ctxUser.Name + "/" + form.RepoName)
return
} else if err == models.ErrRepoAlreadyExist {
ctx.Data["Err_RepoName"] = true
diff --git a/routers/repo/setting.go b/routers/repo/setting.go
index 62f2dbf53..926b54320 100644
--- a/routers/repo/setting.go
+++ b/routers/repo/setting.go
@@ -97,7 +97,7 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
}
ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
- ctx.Redirect(fmt.Sprintf("/%s/%s/settings", ctx.Repo.Owner.Name, ctx.Repo.Repository.Name))
+ ctx.Redirect(fmt.Sprintf("%s/%s/%s/settings", setting.AppRootSubUrl, ctx.Repo.Owner.Name, ctx.Repo.Repository.Name))
case "transfer":
if ctx.Repo.Repository.Name != form.RepoName {
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
@@ -122,7 +122,7 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
}
log.Trace("Repository transfered: %s/%s -> %s", ctx.Repo.Owner.Name, ctx.Repo.Repository.Name, newOwner)
ctx.Flash.Success(ctx.Tr("repo.settings.transfer_succeed"))
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
case "delete":
if ctx.Repo.Repository.Name != form.RepoName {
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
@@ -151,9 +151,9 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
}
log.Trace("Repository deleted: %s/%s", ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
if ctx.Repo.Owner.IsOrganization() {
- ctx.Redirect("/org/" + ctx.Repo.Owner.Name + "/dashboard")
+ ctx.Redirect(setting.AppRootSubUrl + "/org/" + ctx.Repo.Owner.Name + "/dashboard")
} else {
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
}
}
}
@@ -167,7 +167,7 @@ func SettingsCollaboration(ctx *middleware.Context) {
if ctx.Req.Method == "POST" {
name := strings.ToLower(ctx.Query("collaborator"))
if len(name) == 0 || ctx.Repo.Owner.LowerName == name {
- ctx.Redirect(ctx.Req.URL.Path)
+ ctx.Redirect(setting.AppRootSubUrl + ctx.Req.URL.Path)
return
}
has, err := models.HasAccess(name, repoLink, models.WRITABLE)
@@ -175,7 +175,7 @@ func SettingsCollaboration(ctx *middleware.Context) {
ctx.Handle(500, "HasAccess", err)
return
} else if has {
- ctx.Redirect(ctx.Req.URL.Path)
+ ctx.Redirect(setting.AppRootSubUrl + ctx.Req.URL.Path)
return
}
@@ -183,7 +183,7 @@ func SettingsCollaboration(ctx *middleware.Context) {
if err != nil {
if err == models.ErrUserNotExist {
ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
- ctx.Redirect(ctx.Req.URL.Path)
+ ctx.Redirect(setting.AppRootSubUrl + ctx.Req.URL.Path)
} else {
ctx.Handle(500, "GetUserByName", err)
}
@@ -204,7 +204,7 @@ func SettingsCollaboration(ctx *middleware.Context) {
}
ctx.Flash.Success(ctx.Tr("repo.settings.add_collaborator_success"))
- ctx.Redirect(ctx.Req.URL.Path)
+ ctx.Redirect(setting.AppRootSubUrl + ctx.Req.URL.Path)
return
}
diff --git a/routers/user/auth.go b/routers/user/auth.go
index e3d132166..1dbc3300d 100644
--- a/routers/user/auth.go
+++ b/routers/user/auth.go
@@ -82,7 +82,7 @@ func SignIn(ctx *middleware.Context) {
return
}
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
}
func SignInPost(ctx *middleware.Context, form auth.SignInForm) {
@@ -140,7 +140,7 @@ func SignInPost(ctx *middleware.Context, form auth.SignInForm) {
return
}
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
}
func SignOut(ctx *middleware.Context) {
@@ -151,7 +151,7 @@ func SignOut(ctx *middleware.Context) {
ctx.Session.Delete("socialEmail")
ctx.SetCookie(setting.CookieUserName, "", -1)
ctx.SetCookie(setting.CookieRememberName, "", -1)
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
}
func oauthSignUp(ctx *middleware.Context, sid int64) {
@@ -288,7 +288,7 @@ func SignUpPost(ctx *middleware.Context, cpt *captcha.Captcha, form auth.Registe
return
}
- ctx.Redirect("/user/login")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/login")
}
func Activate(ctx *middleware.Context) {
@@ -335,7 +335,7 @@ func Activate(ctx *middleware.Context) {
ctx.Session.Set("uid", user.Id)
ctx.Session.Set("uname", user.Name)
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
return
}
@@ -437,7 +437,7 @@ func ResetPasswdPost(ctx *middleware.Context) {
}
log.Trace("User password reset: %s", u.Name)
- ctx.Redirect("/user/login")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/login")
return
}
diff --git a/routers/user/home.go b/routers/user/home.go
index 372f111ae..b411b8fc1 100644
--- a/routers/user/home.go
+++ b/routers/user/home.go
@@ -13,6 +13,7 @@ import (
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
@@ -126,7 +127,7 @@ func Profile(ctx *middleware.Context) {
uname := ctx.Params(":username")
// Special handle for FireFox requests favicon.ico.
if uname == "favicon.ico" {
- ctx.Redirect("/img/favicon.png")
+ ctx.Redirect(setting.AppRootSubUrl + "/img/favicon.png")
return
}
@@ -141,7 +142,7 @@ func Profile(ctx *middleware.Context) {
}
if u.IsOrganization() {
- ctx.Redirect("/org/" + u.Name)
+ ctx.Redirect(setting.AppRootSubUrl + "/org/" + u.Name)
return
}
@@ -181,7 +182,7 @@ func Email2User(ctx *middleware.Context) {
}
return
}
- ctx.Redirect("/user/" + u.Name)
+ ctx.Redirect(setting.AppRootSubUrl + "/user/" + u.Name)
}
const (
diff --git a/routers/user/setting.go b/routers/user/setting.go
index 4e0e468f0..a540f054f 100644
--- a/routers/user/setting.go
+++ b/routers/user/setting.go
@@ -14,6 +14,7 @@ import (
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
@@ -55,7 +56,7 @@ func SettingsPost(ctx *middleware.Context, form auth.UpdateProfileForm) {
} else if err = models.ChangeUserName(ctx.User, form.UserName); err != nil {
if err == models.ErrUserNameIllegal {
ctx.Flash.Error(ctx.Tr("form.illegal_username"))
- ctx.Redirect("/user/settings")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/settings")
return
} else {
ctx.Handle(500, "ChangeUserName", err)
@@ -78,7 +79,7 @@ func SettingsPost(ctx *middleware.Context, form auth.UpdateProfileForm) {
}
log.Trace("User setting updated: %s", ctx.User.Name)
ctx.Flash.Success(ctx.Tr("settings.update_profile_success"))
- ctx.Redirect("/user/settings")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/settings")
}
func SettingsPassword(ctx *middleware.Context) {
@@ -119,7 +120,7 @@ func SettingsPasswordPost(ctx *middleware.Context, form auth.ChangePasswordForm)
ctx.Flash.Success(ctx.Tr("settings.change_password_success"))
}
- ctx.Redirect("/user/settings/password")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/settings/password")
}
func SettingsSSHKeys(ctx *middleware.Context) {
@@ -160,7 +161,7 @@ func SettingsSSHKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
ctx.Handle(500, "DeletePublicKey", err)
} else {
log.Trace("SSH key deleted: %s", ctx.User.Name)
- ctx.Redirect("/user/settings/ssh")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/settings/ssh")
}
return
}
@@ -177,7 +178,7 @@ func SettingsSSHKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
if ok, err := models.CheckPublicKeyString(cleanContent); !ok {
ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error()))
- ctx.Redirect("/user/settings/ssh")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/settings/ssh")
return
}
@@ -196,7 +197,7 @@ func SettingsSSHKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
} else {
log.Trace("SSH key added: %s", ctx.User.Name)
ctx.Flash.Success(ctx.Tr("settings.add_key_success"))
- ctx.Redirect("/user/settings/ssh")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/settings/ssh")
return
}
}
@@ -217,7 +218,7 @@ func SettingsSocial(ctx *middleware.Context) {
return
}
ctx.Flash.Success(ctx.Tr("settings.unbind_success"))
- ctx.Redirect("/user/settings/social")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/settings/social")
return
}
@@ -248,13 +249,13 @@ func SettingsDelete(ctx *middleware.Context) {
switch err {
case models.ErrUserOwnRepos:
ctx.Flash.Error(ctx.Tr("form.still_own_repo"))
- ctx.Redirect("/user/settings/delete")
+ ctx.Redirect(setting.AppRootSubUrl + "/user/settings/delete")
default:
ctx.Handle(500, "DeleteUser", err)
}
} else {
log.Trace("Account deleted: %s", ctx.User.Name)
- ctx.Redirect("/")
+ ctx.Redirect(setting.AppRootSubUrl + "/")
}
return
}
diff --git a/routers/user/social.go b/routers/user/social.go
index 07c6deed6..fc2ea5fb4 100644
--- a/routers/user/social.go
+++ b/routers/user/social.go
@@ -22,7 +22,7 @@ import (
func extractPath(next string) string {
n, err := url.Parse(next)
if err != nil {
- return "/"
+ return setting.AppRootSubUrl + "/"
}
return n.Path
}
@@ -88,7 +88,7 @@ func SocialSignIn(ctx *middleware.Context) {
return
}
case models.ErrOauth2NotAssociated:
- next = "/user/sign_up"
+ next = setting.AppRootSubUrl + "/user/sign_up"
default:
ctx.Handle(500, "social.SocialSignIn(GetOauth2)", err)
return
diff --git a/templates/admin/auth/edit.tmpl b/templates/admin/auth/edit.tmpl
index 400a4cebe..4dead7f07 100644
--- a/templates/admin/auth/edit.tmpl
+++ b/templates/admin/auth/edit.tmpl
@@ -12,7 +12,7 @@
-