mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-03 16:59:05 +01:00
Clarify the suffices and prefixes of setting.AppSubURL and setting.AppURL (#12999)
Also removes some unnecessary uses of fmt.Sprintf and adds documentation strings Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
parent
39aa11f9c0
commit
aa4f9180e4
11 changed files with 53 additions and 42 deletions
|
@ -26,7 +26,7 @@ func TestAction_GetRepoLink(t *testing.T) {
|
||||||
repo := AssertExistsAndLoadBean(t, &Repository{}).(*Repository)
|
repo := AssertExistsAndLoadBean(t, &Repository{}).(*Repository)
|
||||||
owner := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User)
|
owner := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User)
|
||||||
action := &Action{RepoID: repo.ID}
|
action := &Action{RepoID: repo.ID}
|
||||||
setting.AppSubURL = "/suburl/"
|
setting.AppSubURL = "/suburl"
|
||||||
expected := path.Join(setting.AppSubURL, owner.Name, repo.Name)
|
expected := path.Join(setting.AppSubURL, owner.Name, repo.Name)
|
||||||
assert.Equal(t, expected, action.GetRepoLink())
|
assert.Equal(t, expected, action.GetRepoLink())
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"path"
|
"strconv"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
@ -413,7 +413,7 @@ func (n *Notification) HTMLURL() string {
|
||||||
|
|
||||||
// APIURL formats a URL-string to the notification
|
// APIURL formats a URL-string to the notification
|
||||||
func (n *Notification) APIURL() string {
|
func (n *Notification) APIURL() string {
|
||||||
return setting.AppURL + path.Join("api/v1/notifications/threads", fmt.Sprintf("%d", n.ID))
|
return setting.AppURL + "api/v1/notifications/threads/" + strconv.FormatInt(n.ID, 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotificationList contains a list of notifications
|
// NotificationList contains a list of notifications
|
||||||
|
|
|
@ -318,7 +318,7 @@ func (repo *Repository) CommitLink(commitID string) (result string) {
|
||||||
|
|
||||||
// APIURL returns the repository API URL
|
// APIURL returns the repository API URL
|
||||||
func (repo *Repository) APIURL() string {
|
func (repo *Repository) APIURL() string {
|
||||||
return setting.AppURL + path.Join("api/v1/repos", repo.FullName())
|
return setting.AppURL + "api/v1/repos/" + repo.FullName()
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCommitsCountCacheKey returns cache key used for commits count caching.
|
// GetCommitsCountCacheKey returns cache key used for commits count caching.
|
||||||
|
|
|
@ -63,7 +63,7 @@ func (u *User) generateRandomAvatar(e Engine) error {
|
||||||
// the local explore page. Function returns immediately.
|
// the local explore page. Function returns immediately.
|
||||||
// When applicable, the link is for an avatar of the indicated size (in pixels).
|
// When applicable, the link is for an avatar of the indicated size (in pixels).
|
||||||
func (u *User) SizedRelAvatarLink(size int) string {
|
func (u *User) SizedRelAvatarLink(size int) string {
|
||||||
return strings.TrimSuffix(setting.AppSubURL, "/") + "/user/avatar/" + u.Name + "/" + strconv.Itoa(size)
|
return setting.AppSubURL + "/user/avatar/" + u.Name + "/" + strconv.Itoa(size)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RealSizedAvatarLink returns a link to the user's avatar. When
|
// RealSizedAvatarLink returns a link to the user's avatar. When
|
||||||
|
|
|
@ -89,11 +89,7 @@ func isLinkStr(link string) bool {
|
||||||
|
|
||||||
func getIssueFullPattern() *regexp.Regexp {
|
func getIssueFullPattern() *regexp.Regexp {
|
||||||
if issueFullPattern == nil {
|
if issueFullPattern == nil {
|
||||||
appURL := setting.AppURL
|
issueFullPattern = regexp.MustCompile(regexp.QuoteMeta(setting.AppURL) +
|
||||||
if len(appURL) > 0 && appURL[len(appURL)-1] != '/' {
|
|
||||||
appURL += "/"
|
|
||||||
}
|
|
||||||
issueFullPattern = regexp.MustCompile(appURL +
|
|
||||||
`\w+/\w+/(?:issues|pulls)/((?:\w{1,10}-)?[1-9][0-9]*)([\?|#]\S+.(\S+)?)?\b`)
|
`\w+/\w+/(?:issues|pulls)/((?:\w{1,10}-)?[1-9][0-9]*)([\?|#]\S+.(\S+)?)?\b`)
|
||||||
}
|
}
|
||||||
return issueFullPattern
|
return issueFullPattern
|
||||||
|
@ -636,6 +632,9 @@ func mentionProcessor(ctx *postProcessCtx, node *html.Node) {
|
||||||
mention := node.Data[loc.Start:loc.End]
|
mention := node.Data[loc.Start:loc.End]
|
||||||
var teams string
|
var teams string
|
||||||
teams, ok := ctx.metas["teams"]
|
teams, ok := ctx.metas["teams"]
|
||||||
|
// FIXME: util.URLJoin may not be necessary here:
|
||||||
|
// - setting.AppURL is defined to have a terminal '/' so unless mention[1:]
|
||||||
|
// is an AppSubURL link we can probably fallback to concatenation.
|
||||||
// team mention should follow @orgName/teamName style
|
// team mention should follow @orgName/teamName style
|
||||||
if ok && strings.Contains(mention, "/") {
|
if ok && strings.Contains(mention, "/") {
|
||||||
mentionOrgAndTeam := strings.Split(mention, "/")
|
mentionOrgAndTeam := strings.Split(mention, "/")
|
||||||
|
|
|
@ -66,17 +66,31 @@ const (
|
||||||
|
|
||||||
// settings
|
// settings
|
||||||
var (
|
var (
|
||||||
// AppVer settings
|
// AppVer is the version of the current build of Gitea. It is set in main.go from main.Version.
|
||||||
AppVer string
|
AppVer string
|
||||||
|
// AppBuiltWith represents a human readable version go runtime build version and build tags. (See main.go formatBuiltWith().)
|
||||||
AppBuiltWith string
|
AppBuiltWith string
|
||||||
|
// AppStartTime store time gitea has started
|
||||||
AppStartTime time.Time
|
AppStartTime time.Time
|
||||||
|
// AppName is the Application name, used in the page title.
|
||||||
|
// It maps to ini:"APP_NAME"
|
||||||
AppName string
|
AppName string
|
||||||
|
// AppURL is the Application ROOT_URL. It always has a '/' suffix
|
||||||
|
// It maps to ini:"ROOT_URL"
|
||||||
AppURL string
|
AppURL string
|
||||||
|
// AppSubURL represents the sub-url mounting point for gitea. It is either "" or starts with '/' and ends without '/', such as '/{subpath}'.
|
||||||
|
// This value is empty if site does not have sub-url.
|
||||||
AppSubURL string
|
AppSubURL string
|
||||||
AppSubURLDepth int // Number of slashes
|
// AppPath represents the path to the gitea binary
|
||||||
AppPath string
|
AppPath string
|
||||||
AppDataPath string
|
// AppWorkPath is the "working directory" of Gitea. It maps to the environment variable GITEA_WORK_DIR.
|
||||||
|
// If that is not set it is the default set here by the linker or failing that the directory of AppPath.
|
||||||
|
//
|
||||||
|
// AppWorkPath is used as the base path for several other paths.
|
||||||
AppWorkPath string
|
AppWorkPath string
|
||||||
|
// AppDataPath is the default path for storing data.
|
||||||
|
// It maps to ini:"APP_DATA_PATH" and defaults to AppWorkPath + "/data"
|
||||||
|
AppDataPath string
|
||||||
|
|
||||||
// Server settings
|
// Server settings
|
||||||
Protocol Scheme
|
Protocol Scheme
|
||||||
|
@ -594,8 +608,9 @@ func NewContext() {
|
||||||
if (Protocol == HTTP && HTTPPort != "80") || (Protocol == HTTPS && HTTPPort != "443") {
|
if (Protocol == HTTP && HTTPPort != "80") || (Protocol == HTTPS && HTTPPort != "443") {
|
||||||
defaultAppURL += ":" + HTTPPort
|
defaultAppURL += ":" + HTTPPort
|
||||||
}
|
}
|
||||||
AppURL = sec.Key("ROOT_URL").MustString(defaultAppURL)
|
AppURL = sec.Key("ROOT_URL").MustString(defaultAppURL + "/")
|
||||||
AppURL = strings.TrimSuffix(AppURL, "/") + "/"
|
// This should be TrimRight to ensure that there is only a single '/' at the end of AppURL.
|
||||||
|
AppURL = strings.TrimRight(AppURL, "/") + "/"
|
||||||
|
|
||||||
// Check if has app suburl.
|
// Check if has app suburl.
|
||||||
appURL, err := url.Parse(AppURL)
|
appURL, err := url.Parse(AppURL)
|
||||||
|
@ -606,7 +621,7 @@ func NewContext() {
|
||||||
// This value is empty if site does not have sub-url.
|
// This value is empty if site does not have sub-url.
|
||||||
AppSubURL = strings.TrimSuffix(appURL.Path, "/")
|
AppSubURL = strings.TrimSuffix(appURL.Path, "/")
|
||||||
StaticURLPrefix = strings.TrimSuffix(sec.Key("STATIC_URL_PREFIX").MustString(AppSubURL), "/")
|
StaticURLPrefix = strings.TrimSuffix(sec.Key("STATIC_URL_PREFIX").MustString(AppSubURL), "/")
|
||||||
AppSubURLDepth = strings.Count(AppSubURL, "/")
|
|
||||||
// Check if Domain differs from AppURL domain than update it to AppURL's domain
|
// Check if Domain differs from AppURL domain than update it to AppURL's domain
|
||||||
urlHostname := appURL.Hostname()
|
urlHostname := appURL.Hostname()
|
||||||
if urlHostname != Domain && net.ParseIP(urlHostname) == nil && urlHostname != "" {
|
if urlHostname != Domain && net.ParseIP(urlHostname) == nil && urlHostname != "" {
|
||||||
|
|
|
@ -364,7 +364,7 @@ func WorkerCancel(ctx *context.Context) {
|
||||||
mq.CancelWorkers(pid)
|
mq.CancelWorkers(pid)
|
||||||
ctx.Flash.Info(ctx.Tr("admin.monitor.queue.pool.cancelling"))
|
ctx.Flash.Info(ctx.Tr("admin.monitor.queue.pool.cancelling"))
|
||||||
ctx.JSON(200, map[string]interface{}{
|
ctx.JSON(200, map[string]interface{}{
|
||||||
"redirect": setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid),
|
"redirect": setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,7 +387,7 @@ func Flush(ctx *context.Context) {
|
||||||
log.Error("Flushing failure for %s: Error %v", mq.Name, err)
|
log.Error("Flushing failure for %s: Error %v", mq.Name, err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddWorkers adds workers to a worker group
|
// AddWorkers adds workers to a worker group
|
||||||
|
@ -401,23 +401,23 @@ func AddWorkers(ctx *context.Context) {
|
||||||
number := ctx.QueryInt("number")
|
number := ctx.QueryInt("number")
|
||||||
if number < 1 {
|
if number < 1 {
|
||||||
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.pool.addworkers.mustnumbergreaterzero"))
|
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.pool.addworkers.mustnumbergreaterzero"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
timeout, err := time.ParseDuration(ctx.Query("timeout"))
|
timeout, err := time.ParseDuration(ctx.Query("timeout"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.pool.addworkers.musttimeoutduration"))
|
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.pool.addworkers.musttimeoutduration"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, ok := mq.Managed.(queue.ManagedPool); !ok {
|
if _, ok := mq.Managed.(queue.ManagedPool); !ok {
|
||||||
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.pool.none"))
|
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.pool.none"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mq.AddWorkers(number, timeout)
|
mq.AddWorkers(number, timeout)
|
||||||
ctx.Flash.Success(ctx.Tr("admin.monitor.queue.pool.added"))
|
ctx.Flash.Success(ctx.Tr("admin.monitor.queue.pool.added"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetQueueSettings sets the maximum number of workers and other settings for this queue
|
// SetQueueSettings sets the maximum number of workers and other settings for this queue
|
||||||
|
@ -430,7 +430,7 @@ func SetQueueSettings(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
if _, ok := mq.Managed.(queue.ManagedPool); !ok {
|
if _, ok := mq.Managed.(queue.ManagedPool); !ok {
|
||||||
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.pool.none"))
|
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.pool.none"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,7 +445,7 @@ func SetQueueSettings(ctx *context.Context) {
|
||||||
maxNumber, err = strconv.Atoi(maxNumberStr)
|
maxNumber, err = strconv.Atoi(maxNumberStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.settings.maxnumberworkers.error"))
|
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.settings.maxnumberworkers.error"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if maxNumber < -1 {
|
if maxNumber < -1 {
|
||||||
|
@ -459,7 +459,7 @@ func SetQueueSettings(ctx *context.Context) {
|
||||||
number, err = strconv.Atoi(numberStr)
|
number, err = strconv.Atoi(numberStr)
|
||||||
if err != nil || number < 0 {
|
if err != nil || number < 0 {
|
||||||
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.settings.numberworkers.error"))
|
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.settings.numberworkers.error"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -470,7 +470,7 @@ func SetQueueSettings(ctx *context.Context) {
|
||||||
timeout, err = time.ParseDuration(timeoutStr)
|
timeout, err = time.ParseDuration(timeoutStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.settings.timeout.error"))
|
ctx.Flash.Error(ctx.Tr("admin.monitor.queue.settings.timeout.error"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -479,5 +479,5 @@ func SetQueueSettings(ctx *context.Context) {
|
||||||
|
|
||||||
mq.SetPoolSettings(maxNumber, number, timeout)
|
mq.SetPoolSettings(maxNumber, number, timeout)
|
||||||
ctx.Flash.Success(ctx.Tr("admin.monitor.queue.settings.changed"))
|
ctx.Flash.Success(ctx.Tr("admin.monitor.queue.settings.changed"))
|
||||||
ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/admin/monitor/queue/%d", qid))
|
ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10))
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
package org
|
package org
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models"
|
"code.gitea.io/gitea/models"
|
||||||
|
@ -153,8 +152,7 @@ func IsMember(ctx *context.APIContext) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
redirectURL := fmt.Sprintf("%sapi/v1/orgs/%s/public_members/%s",
|
redirectURL := setting.AppURL + "api/v1/orgs/" + ctx.Org.Organization.Name + "/public_members/" + userToCheck.Name
|
||||||
setting.AppURL, ctx.Org.Organization.Name, userToCheck.Name)
|
|
||||||
ctx.Redirect(redirectURL, 302)
|
ctx.Redirect(redirectURL, 302)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,7 @@ func Search(ctx *context.Context) {
|
||||||
ctx.Data["Keyword"] = keyword
|
ctx.Data["Keyword"] = keyword
|
||||||
ctx.Data["Language"] = language
|
ctx.Data["Language"] = language
|
||||||
ctx.Data["queryType"] = queryType
|
ctx.Data["queryType"] = queryType
|
||||||
ctx.Data["SourcePath"] = setting.AppSubURL + "/" +
|
ctx.Data["SourcePath"] = path.Join(setting.AppSubURL, ctx.Repo.Repository.Owner.Name, ctx.Repo.Repository.Name)
|
||||||
path.Join(ctx.Repo.Repository.Owner.Name, ctx.Repo.Repository.Name)
|
|
||||||
ctx.Data["SearchResults"] = searchResults
|
ctx.Data["SearchResults"] = searchResults
|
||||||
ctx.Data["SearchResultLanguages"] = searchResultLanguages
|
ctx.Data["SearchResultLanguages"] = searchResultLanguages
|
||||||
ctx.Data["RequireHighlightJS"] = true
|
ctx.Data["RequireHighlightJS"] = true
|
||||||
|
|
|
@ -174,7 +174,7 @@ func NotificationStatusPost(c *context.Context) {
|
||||||
if c.Written() {
|
if c.Written() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.Data["Link"] = fmt.Sprintf("%snotifications", setting.AppURL)
|
c.Data["Link"] = setting.AppURL + "notifications"
|
||||||
|
|
||||||
c.HTML(http.StatusOK, tplNotificationDiv)
|
c.HTML(http.StatusOK, tplNotificationDiv)
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ func TestIsValidSlackChannel(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIsExternalURL(t *testing.T) {
|
func TestIsExternalURL(t *testing.T) {
|
||||||
setting.AppURL = "https://try.gitea.io"
|
setting.AppURL = "https://try.gitea.io/"
|
||||||
type test struct {
|
type test struct {
|
||||||
Expected bool
|
Expected bool
|
||||||
RawURL string
|
RawURL string
|
||||||
|
|
Loading…
Reference in a new issue