@@ -409,6 +409,7 @@ func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool) | |||||
ID: repo.ID, | ID: repo.ID, | ||||
Owner: repo.Owner.APIFormat(), | Owner: repo.Owner.APIFormat(), | ||||
Name: repo.Name, | Name: repo.Name, | ||||
Alias: repo.Alias, | |||||
FullName: repo.FullName(), | FullName: repo.FullName(), | ||||
FullDisplayName: repo.FullDisplayName(), | FullDisplayName: repo.FullDisplayName(), | ||||
Description: repo.Description, | Description: repo.Description, | ||||
@@ -1956,6 +1957,26 @@ func getRepositoryByOwnerAndName(e Engine, ownerName, repoName string) (*Reposit | |||||
return &repo, nil | return &repo, nil | ||||
} | } | ||||
// GetRepositoryByOwnerAndAlias returns the repository by given ownername and reponame. | |||||
func GetRepositoryByOwnerAndAlias(ownerName, alias string) (*Repository, error) { | |||||
return getRepositoryByOwnerAndAlias(x, ownerName, alias) | |||||
} | |||||
func getRepositoryByOwnerAndAlias(e Engine, ownerName, alias string) (*Repository, error) { | |||||
var repo Repository | |||||
has, err := e.Table("repository").Select("repository.*"). | |||||
Join("INNER", "`user`", "`user`.id = repository.owner_id"). | |||||
Where("repository.lower_alias = ?", strings.ToLower(alias)). | |||||
And("`user`.lower_name = ?", strings.ToLower(ownerName)). | |||||
Get(&repo) | |||||
if err != nil { | |||||
return nil, err | |||||
} else if !has { | |||||
return nil, ErrRepoNotExist{0, 0, ownerName, alias} | |||||
} | |||||
return &repo, nil | |||||
} | |||||
// GetRepositoryByName returns the repository by given name under user if exists. | // GetRepositoryByName returns the repository by given name under user if exists. | ||||
func GetRepositoryByName(ownerID int64, name string) (*Repository, error) { | func GetRepositoryByName(ownerID int64, name string) (*Repository, error) { | ||||
repo := &Repository{ | repo := &Repository{ | ||||
@@ -49,6 +49,7 @@ type Repository struct { | |||||
ID int64 `json:"id"` | ID int64 `json:"id"` | ||||
Owner *User `json:"owner"` | Owner *User `json:"owner"` | ||||
Name string `json:"name"` | Name string `json:"name"` | ||||
Alias string `json:"alias"` | |||||
FullName string `json:"full_name"` | FullName string `json:"full_name"` | ||||
FullDisplayName string `json:"full_display_name"` | FullDisplayName string `json:"full_display_name"` | ||||
Description string `json:"description"` | Description string `json:"description"` | ||||
@@ -64,18 +64,18 @@ socket.onmessage = function (e) { | |||||
var currentTime = new Date().getTime(); | var currentTime = new Date().getTime(); | ||||
for(var i = 0; i < messageQueue.length; i++){ | for(var i = 0; i < messageQueue.length; i++){ | ||||
var record = messageQueue[i]; | var record = messageQueue[i]; | ||||
var recordPrefix = getMsg(record); | var recordPrefix = getMsg(record); | ||||
var actionName = getAction(record.OpType,isZh); | var actionName = getAction(record.OpType,isZh); | ||||
if(record.OpType == "6" || record.OpType == "10" || record.OpType == "12" || record.OpType == "13"){ | if(record.OpType == "6" || record.OpType == "10" || record.OpType == "12" || record.OpType == "13"){ | ||||
html += recordPrefix + actionName; | html += recordPrefix + actionName; | ||||
html += " <a href=\"" + getIssueLink(record) + "\" rel=\"nofollow\">" + getIssueText(record) + "</a>" | |||||
html += " <a href=\"" + getIssueLink(record) + "\" rel=\"nofollow\">" + getIssueText(record) + "</a>" | |||||
} | } | ||||
else if(record.OpType == "7" || record.OpType == "11" || record.OpType == "14" || record.OpType == "15" || record.OpType == "22" | else if(record.OpType == "7" || record.OpType == "11" || record.OpType == "14" || record.OpType == "15" || record.OpType == "22" | ||||
|| record.OpType == "23"){ | || record.OpType == "23"){ | ||||
html += recordPrefix + actionName; | html += recordPrefix + actionName; | ||||
html += " <a href=\"" + getPRLink(record) + "\" rel=\"nofollow\">" + getPRText(record) + "</a>" | |||||
html += " <a href=\"" + getPRLink(record) + "\" rel=\"nofollow\">" + getPRText(record) + "</a>" | |||||
} | } | ||||
else if(record.OpType == "1"){ | else if(record.OpType == "1"){ | ||||
html += recordPrefix + actionName; | html += recordPrefix + actionName; | ||||
@@ -120,7 +120,7 @@ function getMsg(record){ | |||||
html += "<div class=\"swiper-slide item\">"; | html += "<div class=\"swiper-slide item\">"; | ||||
html += " <img class=\"ui avatar image\" src=\"/user/avatar/" + record.ActUser.Name + "/-1\" alt=\"\">" | html += " <img class=\"ui avatar image\" src=\"/user/avatar/" + record.ActUser.Name + "/-1\" alt=\"\">" | ||||
html += " <div class=\"middle aligned content nowrap\">" | html += " <div class=\"middle aligned content nowrap\">" | ||||
html += " <a href=\"/" + record.ActUser.Name + "\" title=\"\">" + record.ActUser.Name + "</a>" | |||||
html += " <a href=\"/" + record.ActUser.Name + "\" title=\"\">" + record.ActUser.Name + "</a>" | |||||
return html; | return html; | ||||
} | } | ||||
@@ -133,7 +133,7 @@ function getRepotext(record){ | |||||
} | } | ||||
function getRepoLink(record){ | function getRepoLink(record){ | ||||
return record.Repo.OwnerName + "/" + record.Repo.Name; | return record.Repo.OwnerName + "/" + record.Repo.Name; | ||||
} | } | ||||
function getTime(UpdatedUnix,currentTime){ | function getTime(UpdatedUnix,currentTime){ | ||||
@@ -143,7 +143,7 @@ function getTime(UpdatedUnix,currentTime){ | |||||
if( timeEscSecond < 0){ | if( timeEscSecond < 0){ | ||||
timeEscSecond = 1; | timeEscSecond = 1; | ||||
} | } | ||||
var hours= Math.floor(timeEscSecond / 3600); | var hours= Math.floor(timeEscSecond / 3600); | ||||
//计算相差分钟数 | //计算相差分钟数 | ||||
var leave2 = Math.floor(timeEscSecond % (3600)); //计算小时数后剩余的秒数 | var leave2 = Math.floor(timeEscSecond % (3600)); //计算小时数后剩余的秒数 | ||||
@@ -172,11 +172,11 @@ function getPRText(record){ | |||||
}else{ | }else{ | ||||
return record.Repo.OwnerName + "/" + record.Repo.Name + "#" + getIssueId(record); | return record.Repo.OwnerName + "/" + record.Repo.Name + "#" + getIssueId(record); | ||||
} | } | ||||
} | } | ||||
function getIssueLink(record){ | function getIssueLink(record){ | ||||
return "/" + record.Repo.OwnerName + "/" + record.Repo.Name + "/issues/" + getIssueId(record); | return "/" + record.Repo.OwnerName + "/" + record.Repo.Name + "/issues/" + getIssueId(record); | ||||
} | } | ||||
@@ -202,7 +202,7 @@ function getIssueText(record){ | |||||
}else{ | }else{ | ||||
return record.Repo.OwnerName + "/" + record.Repo.Name + "#" + getIssueId(record); | return record.Repo.OwnerName + "/" + record.Repo.Name + "#" + getIssueId(record); | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
@@ -354,7 +354,7 @@ function displayRepo(json){ | |||||
html += " <i class=\"ri-star-line\"></i>" + record["NumStars"] + "<i class=\"ri-git-branch-line am-ml-10\"></i>" + record["NumForks"]; | html += " <i class=\"ri-star-line\"></i>" + record["NumStars"] + "<i class=\"ri-git-branch-line am-ml-10\"></i>" + record["NumForks"]; | ||||
html += " </span>"; | html += " </span>"; | ||||
html += " <img class=\"left floated mini ui image\" src=\"" + record["Avatar"] + "\">"; | html += " <img class=\"left floated mini ui image\" src=\"" + record["Avatar"] + "\">"; | ||||
html += " <a class=\"header nowrap\" href=\"/" + record["OwnerName"] + "/" + record["Name"] + "\">" + record["Name"] +"</a>"; | |||||
html += " <a class=\"header nowrap\" href=\"/" + record["OwnerName"] + "/" + record["Name"] + "\">" + record["Alias"] +"</a>"; | |||||
html += " <div class=\"description nowrap-2\">" + record["Description"] + " </div>"; | html += " <div class=\"description nowrap-2\">" + record["Description"] + " </div>"; | ||||
html += " <div class=\"ui tags nowrap am-mt-10\">" | html += " <div class=\"ui tags nowrap am-mt-10\">" | ||||
if(record["Topics"] != null){ | if(record["Topics"] != null){ | ||||
@@ -408,4 +408,4 @@ function displayOrg(json){ | |||||
} | } | ||||
} | } | ||||
orgDiv.innerHTML = html; | orgDiv.innerHTML = html; | ||||
} | |||||
} |
@@ -150,7 +150,7 @@ func TeamsRepoAction(ctx *context.Context) { | |||||
case "add": | case "add": | ||||
repoName := path.Base(ctx.Query("repo_name")) | repoName := path.Base(ctx.Query("repo_name")) | ||||
var repo *models.Repository | var repo *models.Repository | ||||
repo, err = models.GetRepositoryByName(ctx.Org.Organization.ID, repoName) | |||||
repo, err = models.GetRepositoryByOwnerAndAlias(ctx.Org.Organization.Name, repoName) | |||||
if err != nil { | if err != nil { | ||||
if models.IsErrRepoNotExist(err) { | if models.IsErrRepoNotExist(err) { | ||||
ctx.Flash.Error(ctx.Tr("org.teams.add_nonexistent_repo")) | ctx.Flash.Error(ctx.Tr("org.teams.add_nonexistent_repo")) | ||||
@@ -13,6 +13,7 @@ import ( | |||||
"path" | "path" | ||||
"regexp" | "regexp" | ||||
"strings" | "strings" | ||||
"unicode/utf8" | |||||
"code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
"code.gitea.io/gitea/modules/auth" | "code.gitea.io/gitea/modules/auth" | ||||
@@ -566,7 +567,7 @@ func CheckName(ctx *context.Context) { | |||||
var r = make(map[string]string, 1) | var r = make(map[string]string, 1) | ||||
q := ctx.Query("q") | q := ctx.Query("q") | ||||
owner := ctx.Query("owner") | owner := ctx.Query("owner") | ||||
if q == "" || owner == "" || len(q) > 100 || !validation.ValidAlphaDashDotChinese(q) { | |||||
if q == "" || owner == "" || utf8.RuneCountInString(q) > 100 || !validation.ValidAlphaDashDotChinese(q) { | |||||
r["name"] = "" | r["name"] = "" | ||||
ctx.JSON(200, r) | ctx.JSON(200, r) | ||||
return | return | ||||
@@ -122,7 +122,7 @@ func GetRecommendRepoFromPromote(filename string) ([]map[string]interface{}, err | |||||
} else { | } else { | ||||
ownerName := strings.Trim(repoName[0:tmpIndex], " ") | ownerName := strings.Trim(repoName[0:tmpIndex], " ") | ||||
repoName := strings.Trim(repoName[tmpIndex+1:], " ") | repoName := strings.Trim(repoName[tmpIndex+1:], " ") | ||||
repo, err := models.GetRepositoryByOwnerAndName(ownerName, repoName) | |||||
repo, err := models.GetRepositoryByOwnerAndAlias(ownerName, repoName) | |||||
if err == nil { | if err == nil { | ||||
repoMap := make(map[string]interface{}) | repoMap := make(map[string]interface{}) | ||||
repoMap["ID"] = fmt.Sprint(repo.ID) | repoMap["ID"] = fmt.Sprint(repo.ID) | ||||
@@ -36,7 +36,7 @@ | |||||
<span class="text gold">{{svg "octicon-lock" 16}}</span> | <span class="text gold">{{svg "octicon-lock" 16}}</span> | ||||
{{end}} | {{end}} | ||||
</td> | </td> | ||||
<td><a href="{{AppSubUrl}}/{{.Owner.Name}}/{{.Name}}">{{.Name}}</a></td> | |||||
<td><a href="{{AppSubUrl}}/{{.Owner.Name}}/{{.Name}}">{{.Alias}}</a></td> | |||||
<td><i class="fa fa{{if .IsPrivate}}-check{{end}}-square-o"></i></td> | <td><i class="fa fa{{if .IsPrivate}}-check{{end}}-square-o"></i></td> | ||||
<td>{{.NumWatches}}</td> | <td>{{.NumWatches}}</td> | ||||
<td>{{.NumStars}}</td> | <td>{{.NumStars}}</td> | ||||
@@ -50,7 +50,7 @@ | |||||
{{else}} | {{else}} | ||||
{{svg "octicon-repo" 16}} | {{svg "octicon-repo" 16}} | ||||
{{end}} | {{end}} | ||||
<strong>{{$.Org.Name}}/{{.Name}}</strong> | |||||
<strong>{{$.Org.Name}}/{{.Alias}}</strong> | |||||
</a> | </a> | ||||
</div> | </div> | ||||
{{else}} | {{else}} | ||||
@@ -2411,8 +2411,8 @@ function searchRepositories() { | |||||
const items = []; | const items = []; | ||||
$.each(response.data, (_i, item) => { | $.each(response.data, (_i, item) => { | ||||
items.push({ | items.push({ | ||||
title: item.full_name.split('/')[1], | |||||
description: item.full_name | |||||
title: item.full_display_name.split('/')[1], | |||||
description: item.full_display_name | |||||
}); | }); | ||||
}); | }); | ||||
@@ -2677,7 +2677,7 @@ function initTemplateSearch() { | |||||
// Parse the response from the api to work with our dropdown | // Parse the response from the api to work with our dropdown | ||||
$.each(response.data, (_r, repo) => { | $.each(response.data, (_r, repo) => { | ||||
filteredResponse.results.push({ | filteredResponse.results.push({ | ||||
name: htmlEncode(repo.full_name), | |||||
name: htmlEncode(repo.full_display_name), | |||||
value: repo.id | value: repo.id | ||||
}); | }); | ||||
}); | }); | ||||