|
|
@ -7,6 +7,8 @@ package repo |
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"errors" |
|
|
|
"errors" |
|
|
|
"fmt" |
|
|
|
"fmt" |
|
|
|
|
|
|
|
"io" |
|
|
|
|
|
|
|
"io/ioutil" |
|
|
|
"net/http" |
|
|
|
"net/http" |
|
|
|
"net/url" |
|
|
|
"net/url" |
|
|
|
"strings" |
|
|
|
"strings" |
|
|
@ -34,11 +36,19 @@ const ( |
|
|
|
MILESTONE base.TplName = "repo/issue/milestones" |
|
|
|
MILESTONE base.TplName = "repo/issue/milestones" |
|
|
|
MILESTONE_NEW base.TplName = "repo/issue/milestone_new" |
|
|
|
MILESTONE_NEW base.TplName = "repo/issue/milestone_new" |
|
|
|
MILESTONE_EDIT base.TplName = "repo/issue/milestone_edit" |
|
|
|
MILESTONE_EDIT base.TplName = "repo/issue/milestone_edit" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ISSUE_TEMPLATE_KEY = "IssueTemplate" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
var ( |
|
|
|
ErrFileTypeForbidden = errors.New("File type is not allowed") |
|
|
|
ErrFileTypeForbidden = errors.New("File type is not allowed") |
|
|
|
ErrTooManyFiles = errors.New("Maximum number of files to upload exceeded") |
|
|
|
ErrTooManyFiles = errors.New("Maximum number of files to upload exceeded") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IssueTemplateCandidates = []string{ |
|
|
|
|
|
|
|
"ISSUE_TEMPLATE.md", |
|
|
|
|
|
|
|
".gogs/ISSUE_TEMPLATE.md", |
|
|
|
|
|
|
|
".github/ISSUE_TEMPLATE.md", |
|
|
|
|
|
|
|
} |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
func MustEnableIssues(ctx *middleware.Context) { |
|
|
|
func MustEnableIssues(ctx *middleware.Context) { |
|
|
@ -281,9 +291,47 @@ func RetrieveRepoMetas(ctx *middleware.Context, repo *models.Repository) []*mode |
|
|
|
return labels |
|
|
|
return labels |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func getFileContentFromDefaultBranch(ctx *middleware.Context, filename string) (string, bool) { |
|
|
|
|
|
|
|
var r io.Reader |
|
|
|
|
|
|
|
var bytes []byte |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ctx.Repo.Commit == nil { |
|
|
|
|
|
|
|
var err error |
|
|
|
|
|
|
|
ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return "", false |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(filename) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return "", false |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
r, err = entry.Blob().Data() |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return "", false |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
bytes, err = ioutil.ReadAll(r) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return "", false |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return string(bytes), true |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func setTemplateIfExists(ctx *middleware.Context, ctxDataKey string, possibleFiles []string) { |
|
|
|
|
|
|
|
for _, filename := range possibleFiles { |
|
|
|
|
|
|
|
content, found := getFileContentFromDefaultBranch(ctx, filename) |
|
|
|
|
|
|
|
if found { |
|
|
|
|
|
|
|
ctx.Data[ctxDataKey] = content |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func NewIssue(ctx *middleware.Context) { |
|
|
|
func NewIssue(ctx *middleware.Context) { |
|
|
|
ctx.Data["Title"] = ctx.Tr("repo.issues.new") |
|
|
|
ctx.Data["Title"] = ctx.Tr("repo.issues.new") |
|
|
|
ctx.Data["PageIsIssueList"] = true |
|
|
|
ctx.Data["PageIsIssueList"] = true |
|
|
|
|
|
|
|
setTemplateIfExists(ctx, ISSUE_TEMPLATE_KEY, IssueTemplateCandidates) |
|
|
|
renderAttachmentSettings(ctx) |
|
|
|
renderAttachmentSettings(ctx) |
|
|
|
|
|
|
|
|
|
|
|
RetrieveRepoMetas(ctx, ctx.Repo.Repository) |
|
|
|
RetrieveRepoMetas(ctx, ctx.Repo.Repository) |
|
|
|