#1146 finish new access rights for collaborators

This commit is contained in:
Unknwon committed 2016-03-05 20:45:23 -05:00
1 parent 045f14fbd0
commit a5b0400be7
22 files changed
+210 -190

No files matched your search

+1 -1
View File
@@ -3,7 +3,7 @@ Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?bra
![](https://github.com/gogits/gogs/blob/master/public/img/gogs-large-resize.png?raw=true)
##### Current version: 0.8.58
##### Current version: 0.8.59
| Web | UI | Preview |
|:-------------:|:-------:|:-------:|
+7 -7
View File
@@ -334,7 +334,7 @@ func runWeb(ctx *cli.Context) {
}
reqRepoAdmin := middleware.RequireRepoAdmin()
reqRepoPusher := middleware.RequireRepoPusher()
reqRepoWriter := middleware.RequireRepoWriter()
// ***** START: Organization *****
m.Group("/org", func() {
@@ -448,7 +448,7 @@ func runWeb(ctx *cli.Context) {
m.Post("/label", repo.UpdateIssueLabel)
m.Post("/milestone", repo.UpdateIssueMilestone)
m.Post("/assignee", repo.UpdateIssueAssignee)
}, reqRepoAdmin)
}, reqRepoWriter)
m.Group("/:index", func() {
m.Post("/title", repo.UpdateIssueTitle)
@@ -460,7 +460,7 @@ func runWeb(ctx *cli.Context) {
m.Post("/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel)
m.Post("/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel)
m.Post("/delete", repo.DeleteLabel)
}, reqRepoAdmin, middleware.RepoRef())
}, reqRepoWriter, middleware.RepoRef())
m.Group("/milestones", func() {
m.Combo("/new").Get(repo.NewMilestone).
Post(bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost)
@@ -468,7 +468,7 @@ func runWeb(ctx *cli.Context) {
m.Post("/:id/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.EditMilestonePost)
m.Get("/:id/:action", repo.ChangeMilestonStatus)
m.Post("/delete", repo.DeleteMilestone)
}, reqRepoAdmin, middleware.RepoRef())
}, reqRepoWriter, middleware.RepoRef())
m.Group("/releases", func() {
m.Get("/new", repo.NewRelease)
@@ -476,7 +476,7 @@ func runWeb(ctx *cli.Context) {
m.Get("/edit/:tagname", repo.EditRelease)
m.Post("/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost)
m.Post("/delete", repo.DeleteRelease)
}, reqRepoAdmin, middleware.RepoRef())
}, reqRepoWriter, middleware.RepoRef())
m.Combo("/compare/*", repo.MustAllowPulls).Get(repo.CompareAndPullRequest).
Post(bindIgnErr(auth.CreateIssueForm{}), repo.CompareAndPullRequestPost)
@@ -503,7 +503,7 @@ func runWeb(ctx *cli.Context) {
m.Combo("/:page/_edit").Get(repo.EditWiki).
Post(bindIgnErr(auth.NewWikiForm{}), repo.EditWikiPost)
m.Post("/:page/delete", repo.DeleteWikiPagePost)
}, reqSignIn, reqRepoPusher)
}, reqSignIn, reqRepoWriter)
}, repo.MustEnableWiki, middleware.RepoRef())
m.Get("/archive/*", repo.Download)
@@ -511,7 +511,7 @@ func runWeb(ctx *cli.Context) {
m.Group("/pulls/:index", func() {
m.Get("/commits", middleware.RepoRef(), repo.ViewPullCommits)
m.Get("/files", middleware.RepoRef(), repo.ViewPullFiles)
m.Post("/merge", reqRepoAdmin, repo.MergePullRequest)
m.Post("/merge", reqRepoWriter, repo.MergePullRequest)
}, repo.MustAllowPulls)
m.Group("", func() {
+1 -1
View File
@@ -476,7 +476,7 @@ issues.closed_at = `closed <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.reopened_at = `reopened <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at = `referenced this issue from a commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.poster = Poster
issues.admin = Admin
issues.collaborator = Collaborator
issues.owner = Owner
issues.sign_up_for_free = Sign up for free
issues.sign_in_require_desc = to join this conversation. Already have an account? <a href="%s">Sign in to comment</a>
+1 -1
View File
@@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting"
)
const APP_VER = "0.8.58.0305"
const APP_VER = "0.8.59.0305"
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
+11 -9
View File
@@ -298,16 +298,18 @@ func newIssue(e *xorm.Session, repo *Repository, issue *Issue, labelIDs []int64,
return err
}
// During the session, SQLite3 dirver cannot handle retrieve objects after update something.
// So we have to get all needed labels first.
labels := make([]*Label, 0, len(labelIDs))
if err = e.In("id", labelIDs).Find(&labels); err != nil {
return fmt.Errorf("find all labels: %v", err)
}
if len(labelIDs) > 0 {
// During the session, SQLite3 dirver cannot handle retrieve objects after update something.
// So we have to get all needed labels first.
labels := make([]*Label, 0, len(labelIDs))
if err = e.In("id", labelIDs).Find(&labels); err != nil {
return fmt.Errorf("find all labels: %v", err)
}
for _, label := range labels {
if err = issue.addLabel(e, label); err != nil {
return fmt.Errorf("addLabel: %v", err)
for _, label := range labels {
if err = issue.addLabel(e, label); err != nil {
return fmt.Errorf("addLabel: %v", err)
}
}
}
+1 -1
View File
@@ -39,7 +39,7 @@ type CommentTag int
const (
COMMENT_TAG_NONE CommentTag = iota
COMMENT_TAG_POSTER
COMMENT_TAG_ADMIN
COMMENT_TAG_WRITER
COMMENT_TAG_OWNER
)
+6 -10
View File
@@ -348,19 +348,15 @@ func (u *User) UploadAvatar(data []byte) error {
// IsAdminOfRepo returns true if user has admin or higher access of repository.
func (u *User) IsAdminOfRepo(repo *Repository) bool {
if repo.MustOwner().IsOrganization() {
has, err := HasAccess(u, repo, ACCESS_MODE_ADMIN)
if err != nil {
log.Error(3, "HasAccess: %v", err)
}
return has
has, err := HasAccess(u, repo, ACCESS_MODE_ADMIN)
if err != nil {
log.Error(3, "HasAccess: %v", err)
}
return repo.IsOwnedBy(u.Id)
return has
}
// CanWriteTo returns true if user has write access to given repository.
func (u *User) CanWriteTo(repo *Repository) bool {
// IsWriterOfRepo returns true if user has write access to given repository.
func (u *User) IsWriterOfRepo(repo *Repository) bool {
has, err := HasAccess(u, repo, ACCESS_MODE_WRITE)
if err != nil {
log.Error(3, "HasAccess: %v", err)
+2 -2
View File
@@ -4322,7 +4322,7 @@ func confLocaleLocale_deDeIni() (*asset, error) {
return a, nil
}
var _confLocaleLocale_enUsIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xbd\xeb\x72\xdc\x48\xae\x27\xfe\x9d\x4f\xc1\xf6\x84\xc3\x76\x84\x5c\x8e\xee\x3e\xff\xff\x6e\x74\xb4\xdd\x2b\x4b\xed\xcb\x19\xcb\xd2\x48\x72\xf7\xce\x76\x38\xd8\xac\x22\x55\xc5\x71\x15\x59\x43\xb2\x24\x6b\x26\xe6\x0d\xf6\x01\xf6\xf9\xf6\x49\x16\xf8\x01\xc8\x0b\xc9\x92\xec\x9e\xe3\x0f\x16\x2b\x13\x79\x43\x22\x91\x00\x12\x89\xcc\xb7\xdb\xac\x28\xbb\x45\xfa\x3c\x3d\x4c\xb7\x79\x55\xaf\xcb\xae\x4b\xbb\x72\x7d\xf5\x74\xd5\x74\x7d\x59\xa4\xaf\xab\x9e\x7e\xb7\xd7\xd5\xa2\x4c\x92\x55\xb3\x29\x09\xf4\x0d\xfd\x49\x8a\xbc\x5b\xcd\x9b\xbc\x2d\x28\xe1\xd8\xbe\x93\xf2\xf3\x76\xdd\xb4\x0c\xf4\xb3\x7c\x25\xab\x72\xbd\xe5\x32\xf4\x27\xe9\xaa\x65\x9d\x55\x35\xfd\xbc\xa0\xaf\xf4\x6d\x2d\x29\xcd\xae\xb7\xa4\xd3\x5d\x2f\x69\xbb\xad\x25\x7d\xd8\x26\x6d\xb9\xac\xa8\x37\x2d\x25\x9d\xeb\x67\x72\x53\xce\xbb\xaa\xe7\x96\x7e\x95\xaf\xe4\xba\x6c\xbb\xaa\xe1\xda\x7f\x91\xaf\x64\x9b\x2f\x19\xe0\x8c\xfe\x24\x7d\xb9\xd9\xae\x73\x14\xb8\xd4\xcf\x64\x9d\xd7\xcb\x9d\xc0\xbc\xd3\xcf\x64\xd1\x96\x94\x95\xd5\xe5\x0d\xa5\x1e\xe1\xc7\x6c\x36\x4b\x76\x84\x84\x6c\xdb\x36\x57\xd5\xba\xcc\xf2\xba\xc8\x36\x32\xcc\x0f\x94\x9e\x6a\x7a\x4a\xe9\x29\xa7\x63\x08\x65\x41\x43\xcd\xf2\x4e\xc7\x41\xb8\xa4\x91\xe7\x5d\x82\xaa\xea\x7c\x63\xa5\xf9\x33\x29\x37\x79\xb5\x66\xac\xf1\x5f\xea\x77\xd7\xdd\x34\x40\xed\x99\x7e\x12\x0e\xb2\xfe\x76\x5b\x02\x05\x4f\x2f\xe9\x2b\x59\xe4\xdb\x7e\xb1\xca\xb9\x9b\xf2\x95\x10\xd0\xb6\x21\x5c\x34\xed\x2d\xe0\xec\x47\xd2\xb4\xcb\xbc\xae\xfe\x91\xf7\x82\x9f\xd3\xe0\x67\xb2\xa9\xda\xb6\x61\xd4\x9e\xe0\x23\xa1\x91\x67\x5c\x0f\xa5\xbc\x27\x24\x04\xb5\x70\xce\xa6\x5a\xb6\x82\x45\xce\x3c\xc1\x2f\xae\x45\xf2\xb4\x26\xc9\x72\xb5\x5d\x35\xed\x27\x4d\x7d\xc5\x9f\x83\x2a\xa9\x73\x9a\x1b\xf7\x2b\xaf\x69\x3e\x34\xf7\x04\x3f\x22\x80\x2e\xc9\x8b\x0d\x61\x78\x9b\xd7\x25\xa3\xee\x90\x7f\x11\xbe\xe8\x57\x92\x2f\x16\xcd\xae\xee\xb3\xae\xec\xfb\xaa\x5e\xf2\x1c\x1c\x4a\x52\x7a\xa1\x49\x49\x90\xe7\xd2\x6e\x9b\x9d\x9b\x65\x4a\xff\x2b\xfd\x4c\xcf\xe4\xa7\xe4\x05\x85\x90\xe9\x4a\x52\x93\x7d\x75\x5d\xf5\x55\x29\x8d\xd9\x8f\x64\xbb\x5b\xaf\x09\x9f\x7f\xdf\x95\x5d\xcf\x59\x67\xf4\x9b\x30\x20\xbf\x93\xaa\xeb\x76\x28\xf1\x16\x1f\x09\x4d\x6a\xbd\xc0\x70\x8e\xf0\x91\x24\xbf\x75\x65\xde\x2e\x56\x1f\x13\xf9\x8b\xde\xf2\x07\x13\xe5\xbe\xe9\x66\x0a\x53\xea\x92\x16\xac\x81\x64\xd1\x14\xfc\xe3\x88\xfe\x50\xd5\x55\xdd\xf5\xf9\x7a\xfd\x31\xd1\x0f\x06\x93\x2f\x99\x82\xbe\xea\x81\x07\x4d\x4c\x2f\xfa\x72\xdb\xf1\x1c\xa6\xaf\xaa\xb6\xeb\x9f\xf6\x15\x51\xf1\xf9\xae\x4e\x8a\x66\xf1\x89\xd6\x07\xaf\x75\xb4\xfc\xf6\x2a\x25\x74\x3d\xa2\x15\xd2\xee\xea\x9a\x10\x94\xbe\x6e\x08\x69\xd4\x4c\x45\xed\x1f\x03\xfa\x20\xdd\xae\xcb\xbc\x23\x90\x32\x2f\xd2\x1f\xf3\xb4\xcf\xdb\x65\xd9\x3f\x7f\x90\xcd\x69\x5d\x7e\x7a\x90\xae\xda\xf2\xea\xf9\x83\x87\xdd\x83\x17\xaf\x77\x54\x6c\x5d\xd5\x65\xf7\xe3\xb3\xfc\x45\xba\xc8\x29\x87\xd0\x78\x9b\xce\xcb\x2b\x5e\x86\xd4\x56\x4a\xf4\x5f\x2f\x79\x09\xde\xf6\x2b\x6e\x90\x68\x81\x3e\xba\x94\x79\xc0\x37\x09\x4f\x00\xf1\x88\xac\x98\x1b\xbf\x43\x87\x90\xdc\xd2\x04\x9c\xdc\x5e\xfc\xe5\xdd\x41\x7a\x46\x4c\x6f\xd9\x96\xf8\xa6\xff\xa8\xc4\xf7\x29\x8d\xf6\xb2\x3a\x7e\x39\x4b\xa8\xac\x21\xe4\x38\xef\xf3\x39\xf7\xdd\xcd\x3f\x67\xca\xf2\x74\x79\x58\xa4\xcc\x46\xc1\x32\xbb\x3e\x9a\x96\xa9\x25\x4e\x75\x28\x5f\x70\x75\xbc\x67\xe6\x40\xe9\x0e\xb3\x67\x82\x33\xaa\x2a\x7d\xfb\xfe\xfd\xe9\xf1\xcb\xb4\xac\x97\x84\x99\xf4\xa6\xea\x57\xe9\xae\xbf\xfa\xef\xd9\xb2\xac\xcb\x36\x5f\x67\x8b\x8a\x91\xd2\x12\xc9\xa6\x84\x25\x19\xe2\x2c\xe9\xba\x35\xf1\x2e\x50\xc1\xc5\xc5\xbb\xf4\x84\x29\x61\x9b\xf7\x2b\x74\xa4\x5f\x25\xdd\xdf\xd7\x8c\x28\xd7\xe0\xe5\xaa\x4c\xb1\x1c\x00\xd4\x5c\x0d\xf1\x92\x16\xda\xd7\x59\xfa\xe3\xbc\x7d\x11\xf4\x2f\x9f\x77\xcd\x7a\xd7\x6b\xc9\x9b\x55\x59\x63\xa2\x88\x94\xda\x9e\x18\xa1\x6d\x2b\xb3\xa4\x6c\xdb\x8c\x58\x72\x7f\xcb\xd3\xa3\x7d\xd9\xd7\x8a\x54\x46\xab\xa4\x6e\x7a\x9a\xfe\x14\xe5\xa4\x8a\xaa\xbe\xce\xd7\x55\x41\x93\xe4\x11\x19\x97\x45\x62\xd1\xd0\x7c\x73\x69\xa2\xe8\xe6\x06\x28\xa2\xb5\x4b\x3b\x46\xfa\x60\xf6\x00\x2c\xfc\xc1\xd3\x07\xb3\xa4\x6e\x32\xe1\x2f\xcc\xec\x8b\xaa\xcb\xe7\xc4\xf8\x65\x23\x6a\x8d\x8f\xfe\x95\xe9\x4e\xba\xa2\x10\x69\x04\xc1\x73\xc2\x9b\x1b\xf6\x14\x26\xca\x9c\x76\x00\xb0\x29\x65\x50\xe1\xd8\x8d\x9b\x39\xba\x10\x86\xe6\x12\x46\x63\x4e\x6c\xa2\x8d\x2a\x0f\xb7\xdb\x75\xb5\x90\xa6\x5f\x4b\x9e\x27\x50\xde\xea\x15\x29\x21\x1c\x08\xcc\xf2\x02\x32\xa3\x5e\x33\xc3\x4b\xa3\x9d\x03\xe5\x57\x25\xad\xb8\xd5\x6e\x29\xdb\xdd\xba\xd9\x15\xdf\x80\x11\xd9\xcc\x79\x3e\x94\x9e\x37\xd4\x61\x50\x95\x03\xf0\x4d\x1c\x12\x43\x61\xe9\xa2\x2d\x37\x4d\xcf\x88\xd3\x62\xcc\x41\x6f\x2a\xca\xa4\x91\x76\xf9\x35\xed\x9b\x7d\x23\x4b\xb9\xa0\xa5\xba\xe0\x8a\x89\xf3\xed\x48\x44\x90\xe5\x44\xfc\x47\x96\x94\xa5\xc5\xb4\x0b\xa8\xcd\x8e\x56\xe1\x8a\x2a\x63\xc4\xb3\x88\x43\x55\x4e\xf5\x13\x43\xa2\x7a\xc0\x1d\x68\xc5\x37\xb4\x1d\xf3\x44\x1f\xe3\x43\x7f\x87\xf5\x53\xaf\xf2\xab\x2b\xea\x55\x47\xab\xe9\x4d\xba\x58\x37\xb4\x14\x3f\x9c\xbf\xeb\x78\xa1\xad\xb2\x6d\xd3\x42\xb4\xa1\xac\x33\xfa\x74\x69\x0Line truncated
var _confLocaleLocale_enUsIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xbd\xeb\x72\xdc\x48\xae\x27\xfe\x9d\x4f\xc1\xf6\x84\xc3\x76\x84\x5c\x8e\xee\x3e\xff\xff\x6e\x74\xb4\xdd\x2b\x4b\xed\xcb\x19\xcb\xd2\x48\x72\xf7\xce\x76\x38\xd8\xac\x22\x55\xc5\x71\x15\x59\x43\xb2\x24\x6b\x26\xe6\x0d\xf6\x01\xf6\xf9\xf6\x49\x16\xf8\x01\xc8\x0b\xc9\x92\xec\x9e\xe3\x0f\x16\x2b\x13\x79\x43\x22\x91\x00\x12\x89\xcc\xb7\xdb\xac\x28\xbb\x45\xfa\x3c\x3d\x4c\xb7\x79\x55\xaf\xcb\xae\x4b\xbb\x72\x7d\xf5\x74\xd5\x74\x7d\x59\xa4\xaf\xab\x9e\x7e\xb7\xd7\xd5\xa2\x4c\x92\x55\xb3\x29\x09\xf4\x0d\xfd\x49\x8a\xbc\x5b\xcd\x9b\xbc\x2d\x28\xe1\xd8\xbe\x93\xf2\xf3\x76\xdd\xb4\x0c\xf4\xb3\x7c\x25\xab\x72\xbd\xe5\x32\xf4\x27\xe9\xaa\x65\x9d\x55\x35\xfd\xbc\xa0\xaf\xf4\x6d\x2d\x29\xcd\xae\xb7\xa4\xd3\x5d\x2f\x69\xbb\xad\x25\x7d\xd8\x26\x6d\xb9\xac\xa8\x37\x2d\x25\x9d\xeb\x67\x72\x53\xce\xbb\xaa\xe7\x96\x7e\x95\xaf\xe4\xba\x6c\xbb\xaa\xe1\xda\x7f\x91\xaf\x64\x9b\x2f\x19\xe0\x8c\xfe\x24\x7d\xb9\xd9\xae\x73\x14\xb8\xd4\xcf\x64\x9d\xd7\xcb\x9d\xc0\xbc\xd3\xcf\x64\xd1\x96\x94\x95\xd5\xe5\x0d\xa5\x1e\xe1\xc7\x6c\x36\x4b\x76\x84\x84\x6c\xdb\x36\x57\xd5\xba\xcc\xf2\xba\xc8\x36\x32\xcc\x0f\x94\x9e\x6a\x7a\x4a\xe9\x29\xa7\x63\x08\x65\x41\x43\xcd\xf2\x4e\xc7\x41\xb8\xa4\x91\xe7\x5d\x82\xaa\xea\x7c\x63\xa5\xf9\x33\x29\x37\x79\xb5\x66\xac\xf1\x5f\xea\x77\xd7\xdd\x34\x40\xed\x99\x7e\x12\x0e\xb2\xfe\x76\x5b\x02\x05\x4f\x2f\xe9\x2b\x59\xe4\xdb\x7e\xb1\xca\xb9\x9b\xf2\x95\x10\xd0\xb6\x21\x5c\x34\xed\x2d\xe0\xec\x47\xd2\xb4\xcb\xbc\xae\xfe\x91\xf7\x82\x9f\xd3\xe0\x67\xb2\xa9\xda\xb6\x61\xd4\x9e\xe0\x23\xa1\x91\x67\x5c\x0f\xa5\xbc\x27\x24\x04\xb5\x70\xce\xa6\x5a\xb6\x82\x45\xce\x3c\xc1\x2f\xae\x45\xf2\xb4\x26\xc9\x72\xb5\x5d\x35\xed\x27\x4d\x7d\xc5\x9f\x83\x2a\xa9\x73\x9a\x1b\xf7\x2b\xaf\x69\x3e\x34\xf7\x04\x3f\x22\x80\x2e\xc9\x8b\x0d\x61\x78\x9b\xd7\x25\xa3\xee\x90\x7f\x11\xbe\xe8\x57\x92\x2f\x16\xcd\xae\xee\xb3\xae\xec\xfb\xaa\x5e\xf2\x1c\x1c\x4a\x52\x7a\xa1\x49\x49\x90\xe7\xd2\x6e\x9b\x9d\x9b\x65\x4a\xff\x2b\xfd\x4c\xcf\xe4\xa7\xe4\x05\x85\x90\xe9\x4a\x52\x93\x7d\x75\x5d\xf5\x55\x29\x8d\xd9\x8f\x64\xbb\x5b\xaf\x09\x9f\x7f\xdf\x95\x5d\xcf\x59\x67\xf4\x9b\x30\x20\xbf\x93\xaa\xeb\x76\x28\xf1\x16\x1f\x09\x4d\x6a\xbd\xc0\x70\x8e\xf0\x91\x24\xbf\x75\x65\xde\x2e\x56\x1f\x13\xf9\x8b\xde\xf2\x07\x13\xe5\xbe\xe9\x66\x0a\x53\xea\x92\x16\xac\x81\x64\xd1\x14\xfc\xe3\x88\xfe\x50\xd5\x55\xdd\xf5\xf9\x7a\xfd\x31\xd1\x0f\x06\x93\x2f\x99\x82\xbe\xea\x81\x07\x4d\x4c\x2f\xfa\x72\xdb\xf1\x1c\xa6\xaf\xaa\xb6\xeb\x9f\xf6\x15\x51\xf1\xf9\xae\x4e\x8a\x66\xf1\x89\xd6\x07\xaf\x75\xb4\xfc\xf6\x2a\x25\x74\x3d\xa2\x15\xd2\xee\xea\x9a\x10\x94\xbe\x6e\x08\x69\xd4\x4c\x45\xed\x1f\x03\xfa\x20\xdd\xae\xcb\xbc\x23\x90\x32\x2f\xd2\x1f\xf3\xb4\xcf\xdb\x65\xd9\x3f\x7f\x90\xcd\x69\x5d\x7e\x7a\x90\xae\xda\xf2\xea\xf9\x83\x87\xdd\x83\x17\xaf\x77\x54\x6c\x5d\xd5\x65\xf7\xe3\xb3\xfc\x45\xba\xc8\x29\x87\xd0\x78\x9b\xce\xcb\x2b\x5e\x86\xd4\x56\x4a\xf4\x5f\x2f\x79\x09\xde\xf6\x2b\x6e\x90\x68\x81\x3e\xba\x94\x79\xc0\x37\x09\x4f\x00\xf1\x88\xac\x98\x1b\xbf\x43\x87\x90\xdc\xd2\x04\x9c\xdc\x5e\xfc\xe5\xdd\x41\x7a\x46\x4c\x6f\xd9\x96\xf8\xa6\xff\xa8\xc4\xf7\x29\x8d\xf6\xb2\x3a\x7e\x39\x4b\xa8\xac\x21\xe4\x38\xef\xf3\x39\xf7\xdd\xcd\x3f\x67\xca\xf2\x74\x79\x58\xa4\xcc\x46\xc1\x32\xbb\x3e\x9a\x96\xa9\x25\x4e\x75\x28\x5f\x70\x75\xbc\x67\xe6\x40\xe9\x0e\xb3\x67\x82\x33\xaa\x2a\x7d\xfb\xfe\xfd\xe9\xf1\xcb\xb4\xac\x97\x84\x99\xf4\xa6\xea\x57\xe9\xae\xbf\xfa\xef\xd9\xb2\xac\xcb\x36\x5f\x67\x8b\x8a\x91\xd2\x12\xc9\xa6\x84\x25\x19\xe2\x2c\xe9\xba\x35\xf1\x2e\x50\xc1\xc5\xc5\xbb\xf4\x84\x29\x61\x9b\xf7\x2b\x74\xa4\x5f\x25\xdd\xdf\xd7\x8c\x28\xd7\xe0\xe5\xaa\x4c\xb1\x1c\x00\xd4\x5c\x0d\xf1\x92\x16\xda\xd7\x59\xfa\xe3\xbc\x7d\x11\xf4\x2f\x9f\x77\xcd\x7a\xd7\x6b\xc9\x9b\x55\x59\x63\xa2\x88\x94\xda\x9e\x18\xa1\x6d\x2b\xb3\xa4\x6c\xdb\x8c\x58\x72\x7f\xcb\xd3\xa3\x7d\xd9\xd7\x8a\x54\x46\xab\xa4\x6e\x7a\x9a\xfe\x14\xe5\xa4\x8a\xaa\xbe\xce\xd7\x55\x41\x93\xe4\x11\x19\x97\x45\x62\xd1\xd0\x7c\x73\x69\xa2\xe8\xe6\x06\x28\xa2\xb5\x4b\x3b\x46\xfa\x60\xf6\x00\x2c\xfc\xc1\xd3\x07\xb3\xa4\x6e\x32\xe1\x2f\xcc\xec\x8b\xaa\xcb\xe7\xc4\xf8\x65\x23\x6a\x8d\x8f\xfe\x95\xe9\x4e\xba\xa2\x10\x69\x04\xc1\x73\xc2\x9b\x1b\xf6\x14\x26\xca\x9c\x76\x00\xb0\x29\x65\x50\xe1\xd8\x8d\x9b\x39\xba\x10\x86\xe6\x12\x46\x63\x4e\x6c\xa2\x8d\x2a\x0f\xb7\xdb\x75\xb5\x90\xa6\x5f\x4b\x9e\x27\x50\xde\xea\x15\x29\x21\x1c\x08\xcc\xf2\x02\x32\xa3\x5e\x33\xc3\x4b\xa3\x9d\x03\xe5\x57\x25\xad\xb8\xd5\x6e\x29\xdb\xdd\xba\xd9\x15\xdf\x80\x11\xd9\xcc\x79\x3e\x94\x9e\x37\xd4\x61\x50\x95\x03\xf0\x4d\x1c\x12\x43\x61\xe9\xa2\x2d\x37\x4d\xcf\x88\xd3\x62\xcc\x41\x6f\x2a\xca\xa4\x91\x76\xf9\x35\xed\x9b\x7d\x23\x4b\xb9\xa0\xa5\xba\xe0\x8a\x89\xf3\xed\x48\x44\x90\xe5\x44\xfc\x47\x96\x94\xa5\xc5\xb4\x0b\xa8\xcd\x8e\x56\xe1\x8a\x2a\x63\xc4\xb3\x88\x43\x55\x4e\xf5\x13\x43\xa2\x7a\xc0\x1d\x68\xc5\x37\xb4\x1d\xf3\x44\x1f\xe3\x43\x7f\x87\xf5\x53\xaf\xf2\xab\x2b\xea\x55\x47\xab\xe9\x4d\xba\x58\x37\xb4\x14\x3f\x9c\xbf\xeb\x78\xa1\xad\xb2\x6d\xd3\x42\xb4\xa1\xac\x33\xfa\x74\x69\x0Line truncated
func confLocaleLocale_enUsIniBytes() ([]byte, error) {
return bindataRead(
@@ -4337,7 +4337,7 @@ func confLocaleLocale_enUsIni() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "conf/locale/locale_en-US.ini", size: 50813, mode: os.FileMode(420), modTime: time.Unix(1457217399, 0)}
info := bindataFileInfo{name: "conf/locale/locale_en-US.ini", size: 50827, mode: os.FileMode(420), modTime: time.Unix(1457227639, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
+3 -3
View File
@@ -84,12 +84,12 @@ func (r *RepoContext) IsAdmin() bool {
return r.AccessMode >= models.ACCESS_MODE_ADMIN
}
// IsPusher returns true if current user has write or higher access of repository.
func (r *RepoContext) IsPusher() bool {
// IsWriter returns true if current user has write or higher access of repository.
func (r *RepoContext) IsWriter() bool {
return r.AccessMode >= models.ACCESS_MODE_WRITE
}
// Return if the current user has read access for this repository
// HasAccess returns true if the current user has at least read access for this repository
func (r *RepoContext) HasAccess() bool {
return r.AccessMode >= models.ACCESS_MODE_READ
}
+5 -5
View File
@@ -140,7 +140,7 @@ func RepoAssignment(args ...bool) macaron.Handler {
ctx.Data["Owner"] = ctx.Repo.Repository.Owner
ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner()
ctx.Data["IsRepositoryAdmin"] = ctx.Repo.IsAdmin()
ctx.Data["IsRepositoryPusher"] = ctx.Repo.IsPusher()
ctx.Data["IsRepositoryWriter"] = ctx.Repo.IsWriter()
if repo.IsFork {
RetrieveBaseRepo(ctx, repo)
@@ -150,7 +150,7 @@ func RepoAssignment(args ...bool) macaron.Handler {
}
// People who have push access and propose a new pull request.
if ctx.Repo.IsPusher() {
if ctx.Repo.IsWriter() {
// Pull request is allowed if this is a fork repository
// and base repository accepts pull requests.
if repo.BaseRepo != nil {
@@ -336,16 +336,16 @@ func RepoRef() macaron.Handler {
func RequireRepoAdmin() macaron.Handler {
return func(ctx *Context) {
if !ctx.Repo.IsAdmin() {
if !ctx.IsSigned || (!ctx.Repo.IsAdmin() && !ctx.User.IsAdmin) {
ctx.Handle(404, ctx.Req.RequestURI, nil)
return
}
}
}
func RequireRepoPusher() macaron.Handler {
func RequireRepoWriter() macaron.Handler {
return func(ctx *Context) {
if !ctx.Repo.IsPusher() {
if !ctx.IsSigned || (!ctx.Repo.IsWriter() && !ctx.User.IsAdmin) {
ctx.Handle(404, ctx.Req.RequestURI, nil)
return
}
+9 -9
View File
@@ -273,7 +273,7 @@ func RetrieveRepoMilestonesAndAssignees(ctx *middleware.Context, repo *models.Re
}
func RetrieveRepoMetas(ctx *middleware.Context, repo *models.Repository) []*models.Label {
if !ctx.Repo.IsAdmin() {
if !ctx.Repo.IsWriter() {
return nil
}
@@ -356,7 +356,7 @@ func ValidateRepoMetas(ctx *middleware.Context, form auth.CreateIssueForm) ([]in
return nil, 0, 0
}
if !ctx.Repo.IsAdmin() {
if !ctx.Repo.IsWriter() {
return nil, 0, 0
}
@@ -624,7 +624,7 @@ func ViewIssue(ctx *middleware.Context) {
ctx.Data["Labels"] = labels
// Check milestone and assignee.
if ctx.Repo.IsAdmin() {
if ctx.Repo.IsWriter() {
RetrieveRepoMilestonesAndAssignees(ctx, repo)
if ctx.Written() {
return
@@ -664,8 +664,8 @@ func ViewIssue(ctx *middleware.Context) {
if repo.IsOwnedBy(comment.PosterID) ||
(repo.Owner.IsOrganization() && repo.Owner.IsOwnedBy(comment.PosterID)) {
comment.ShowTag = models.COMMENT_TAG_OWNER
} else if comment.Poster.IsAdminOfRepo(repo) {
comment.ShowTag = models.COMMENT_TAG_ADMIN
} else if comment.Poster.IsWriterOfRepo(repo) {
comment.ShowTag = models.COMMENT_TAG_WRITER
} else if comment.PosterID == issue.PosterID {
comment.ShowTag = models.COMMENT_TAG_POSTER
}
@@ -688,7 +688,7 @@ func ViewIssue(ctx *middleware.Context) {
ctx.Data["Participants"] = participants
ctx.Data["NumParticipants"] = len(participants)
ctx.Data["Issue"] = issue
ctx.Data["IsIssueOwner"] = ctx.Repo.IsAdmin() || (ctx.IsSigned && issue.IsPoster(ctx.User.Id))
ctx.Data["IsIssueOwner"] = ctx.Repo.IsWriter() || (ctx.IsSigned && (issue.IsPoster(ctx.User.Id) || ctx.User.IsAdmin))
ctx.Data["SignInLink"] = setting.AppSubUrl + "/user/login"
ctx.Data["RequireHighlightJS"] = true
@@ -715,7 +715,7 @@ func UpdateIssueTitle(ctx *middleware.Context) {
return
}
if !ctx.IsSigned || (ctx.User.Id != issue.PosterID && !ctx.Repo.IsAdmin()) {
if !ctx.IsSigned || (ctx.User.Id != issue.PosterID && !ctx.Repo.IsWriter() && !ctx.User.IsAdmin) {
ctx.Error(403)
return
}
@@ -742,7 +742,7 @@ func UpdateIssueContent(ctx *middleware.Context) {
return
}
if !ctx.IsSigned || (ctx.User.Id != issue.PosterID && !ctx.Repo.IsAdmin()) {
if !ctx.IsSigned || (ctx.User.Id != issue.PosterID && !ctx.Repo.IsWriter() && !ctx.User.IsAdmin) {
ctx.Error(403)
return
}
@@ -883,7 +883,7 @@ func NewComment(ctx *middleware.Context, form auth.CreateCommentForm) {
var comment *models.Comment
defer func() {
// Check if issue admin/poster changes the status of issue.
if (ctx.Repo.IsAdmin() || (ctx.IsSigned && issue.IsPoster(ctx.User.Id))) &&
if (ctx.Repo.IsWriter() || (ctx.IsSigned && issue.IsPoster(ctx.User.Id))) &&
(form.Status == "reopen" || form.Status == "close") &&
!(issue.IsPull && issue.HasMerged) {
+1 -1
View File
@@ -490,7 +490,7 @@ func ParseCompareInfo(ctx *middleware.Context) (*models.User, *models.Repository
}
}
if !ctx.User.CanWriteTo(headRepo) && !ctx.User.IsAdmin {
if !ctx.User.IsWriterOfRepo(headRepo) && !ctx.User.IsAdmin {
log.Trace("ParseCompareInfo[%d]: does not have write access or site admin", baseRepo.ID)
ctx.Handle(404, "ParseCompareInfo", nil)
return nil, nil, nil, nil, "", ""
+18
View File
@@ -142,6 +142,10 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
ctx.Redirect(ctx.Repo.RepoLink + "/settings")
case "convert":
if !ctx.Repo.IsOwner() {
ctx.Error(404)
return
}
if repo.Name != form.RepoName {
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
return
@@ -172,6 +176,10 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
ctx.Redirect(setting.AppSubUrl + "/" + ctx.Repo.Owner.Name + "/" + repo.Name)
case "transfer":
if !ctx.Repo.IsOwner() {
ctx.Error(404)
return
}
if repo.Name != form.RepoName {
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
return
@@ -205,7 +213,12 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
log.Trace("Repository transfered: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newOwner)
ctx.Flash.Success(ctx.Tr("repo.settings.transfer_succeed"))
ctx.Redirect(setting.AppSubUrl + "/" + newOwner + "/" + repo.Name)
case "delete":
if !ctx.Repo.IsOwner() {
ctx.Error(404)
return
}
if repo.Name != form.RepoName {
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
return
@@ -226,7 +239,12 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success"))
ctx.Redirect(ctx.Repo.Owner.DashboardLink())
case "delete-wiki":
if !ctx.Repo.IsOwner() {
ctx.Error(404)
return
}
if repo.Name != form.RepoName {
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
return
+1 -1
View File
@@ -1 +1 @@
0.8.58.0305
0.8.59.0305
+3 -3
View File
@@ -4,7 +4,7 @@
<div class="ui container">
<div class="navbar">
{{template "repo/issue/navbar" .}}
{{if .IsRepositoryAdmin}}
{{if .IsRepositoryWriter}}
<div class="ui right">
<div class="ui green new-label button">{{.i18n.Tr "repo.issues.new_label"}}</div>
</div>
@@ -40,7 +40,7 @@
{{range .Labels}}
<li class="item">
<div class="ui label" style="color: {{.ForegroundColor}}; background-color: {{.Color}}"><i class="octicon octicon-tag"></i> {{.Name}}</div>
{{if $.IsRepositoryAdmin}}
{{if $.IsRepositoryWriter}}
<a class="ui right delete-button" href="#" data-url="{{$.RepoLink}}/labels/delete" data-id="{{.ID}}"><i class="octicon octicon-trashcan"></i> {{$.i18n.Tr "repo.issues.label_delete"}}</a>
<a class="ui right edit-label-button" href="#" data-id={{.ID}} data-title={{.Name}} data-color={{.Color}}><i class="octicon octicon-pencil"></i> {{$.i18n.Tr "repo.issues.label_edit"}}</a>
{{end}}
@@ -51,7 +51,7 @@
</div>
</div>
{{if .IsRepositoryAdmin}}
{{if .IsRepositoryWriter}}
<div class="ui small basic delete modal">
<div class="ui icon header">
<i class="trash icon"></i>
+1 -1
View File
@@ -4,7 +4,7 @@
<div class="ui container">
<div class="navbar">
{{template "repo/issue/navbar" .}}
{{if and .IsRepositoryAdmin .PageIsEditMilestone}}
{{if and .IsRepositoryWriter .PageIsEditMilestone}}
<div class="ui right floated secondary menu">
<a class="ui green button" href="{{$.RepoLink}}/milestones/new">{{.i18n.Tr "repo.milestones.new"}}</a>
</div>
+3 -3
View File
@@ -4,7 +4,7 @@
<div class="ui container">
<div class="navbar">
{{template "repo/issue/navbar" .}}
{{if .IsRepositoryAdmin}}
{{if .IsRepositoryWriter}}
<div class="ui right">
<a class="ui green button" href="{{$.Link}}/new">{{.i18n.Tr "repo.milestones.new"}}</a>
</div>
@@ -49,7 +49,7 @@
<i class="octicon octicon-issue-closed"></i> {{$.i18n.Tr "repo.issues.close_tab" .NumClosedIssues}}
</span>
</div>
{{if $.IsRepositoryAdmin}}
{{if $.IsRepositoryWriter}}
<div class="ui right operate">
<a href="{{$.Link}}/{{.ID}}/edit" data-id={{.ID}} data-title={{.Name}}><i class="octicon octicon-pencil"></i> {{$.i18n.Tr "repo.issues.label_edit"}}</a>
{{if .IsClosed}}
@@ -93,7 +93,7 @@
</div>
</div>
{{if .IsRepositoryAdmin}}
{{if .IsRepositoryWriter}}
<div class="ui small basic delete modal">
<div class="ui icon header">
<i class="trash icon"></i>
+5 -5
View File
@@ -65,7 +65,7 @@
{{if eq .ShowTag 1}}
{{$.i18n.Tr "repo.issues.poster"}}
{{else if eq .ShowTag 2}}
{{$.i18n.Tr "repo.issues.admin"}}
{{$.i18n.Tr "repo.issues.collaborator"}}
{{else if eq .ShowTag 3}}
{{$.i18n.Tr "repo.issues.owner"}}
{{end}}
@@ -165,7 +165,7 @@
<span class="octicon octicon-check"></span>
{{$.i18n.Tr "repo.pulls.can_auto_merge_desc"}}
</div>
{{if .IsRepositoryAdmin}}
{{if .IsRepositoryWriter}}
<div class="ui divider"></div>
<div>
<form class="ui form" action="{{.Link}}/merge" method="post">
@@ -231,7 +231,7 @@
<div class="four wide column">
<div class="ui segment metas">
<div class="ui {{if not .IsRepositoryAdmin}}disabled{{end}} floating jump select-label dropdown">
<div class="ui {{if not .IsRepositoryWriter}}disabled{{end}} floating jump select-label dropdown">
<span class="text">
<strong>{{.i18n.Tr "repo.issues.new.labels"}}</strong>
<span class="octicon octicon-gear"></span>
@@ -252,7 +252,7 @@
<div class="ui divider"></div>
<div class="ui {{if not .IsRepositoryAdmin}}disabled{{end}} floating jump select-milestone dropdown">
<div class="ui {{if not .IsRepositoryWriter}}disabled{{end}} floating jump select-milestone dropdown">
<span class="text">
<strong>{{.i18n.Tr "repo.issues.new.milestone"}}</strong>
<span class="octicon octicon-gear"></span>
@@ -293,7 +293,7 @@
<div class="ui divider"></div>
<input id="assignee_id" name="assignee_id" type="hidden" value="{{.assignee_id}}">
<div class="ui {{if not .IsRepositoryAdmin}}disabled{{end}} floating jump select-assignee dropdown">
<div class="ui {{if not .IsRepositoryWriter}}disabled{{end}} floating jump select-assignee dropdown">
<span class="text">
<strong>{{.i18n.Tr "repo.issues.new.assignee"}}</strong>
<span class="octicon octicon-gear"></span>
+2 -2
View File
@@ -5,7 +5,7 @@
{{template "base/alert" .}}
<h2 class="ui header">
{{.i18n.Tr "repo.release.releases"}}
{{if .IsRepositoryAdmin}}
{{if .IsRepositoryWriter}}
<div class="ui right">
<a class="ui small green button" href="{{$.RepoLink}}/releases/new">
{{.i18n.Tr "repo.release.new_release"}}
@@ -37,7 +37,7 @@
{{if .PublisherID}}
<h3>
<a href="{{$.RepoLink}}/src/{{.TagName}}">{{.Title}}</a>
{{if $.IsRepositoryAdmin}}<small>(<a href="{{$.RepoLink}}/releases/edit/{{.TagName}}" rel="nofollow">{{$.i18n.Tr "repo.release.edit"}}</a>)</small>{{end}}
{{if $.IsRepositoryWriter}}<small>(<a href="{{$.RepoLink}}/releases/edit/{{.TagName}}" rel="nofollow">{{$.i18n.Tr "repo.release.edit"}}</a>)</small>{{end}}
</h3>
<p class="text grey">
<span class="author">
+127 -123
View File
@@ -136,6 +136,7 @@
</form>
</div>
{{if .IsRepositoryOwner}}
<h4 class="ui top attached warning header">
{{.i18n.Tr "repo.settings.danger_zone"}}
</h4>
@@ -189,145 +190,148 @@
</div>
</div>
</div>
{{end}}
</div>
</div>
</div>
</div>
{{if .Repository.IsMirror}}
<div class="ui small modal" id="convert-repo-modal">
<div class="header">
{{.i18n.Tr "repo.settings.convert"}}
</div>
<div class="content">
<div class="ui warning message text left">
{{.i18n.Tr "repo.settings.convert_notices_1" | Safe}}
{{if .IsRepositoryOwner}}
{{if .Repository.IsMirror}}
<div class="ui small modal" id="convert-repo-modal">
<div class="header">
{{.i18n.Tr "repo.settings.convert"}}
</div>
<form class="ui form" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="convert">
<div class="field">
<label>
{{.i18n.Tr "repo.settings.transfer_form_title"}}
<span class="text red">{{.Repository.Name}}</span>
</label>
</div>
<div class="required field">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" required>
<div class="content">
<div class="ui warning message text left">
{{.i18n.Tr "repo.settings.convert_notices_1" | Safe}}
</div>
<form class="ui form" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="convert">
<div class="field">
<label>
{{.i18n.Tr "repo.settings.transfer_form_title"}}
<span class="text red">{{.Repository.Name}}</span>
</label>
</div>
<div class="required field">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" required>
</div>
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.convert_confirm"}}</button>
</div>
</form>
</div>
</div>
{{end}}
<div class="ui small modal" id="transfer-repo-modal">
<div class="header">
{{.i18n.Tr "repo.settings.transfer"}}
</div>
<div class="content">
<div class="ui warning message text left">
{{.i18n.Tr "repo.settings.transfer_notices_1" | Safe}} <br>
{{.i18n.Tr "repo.settings.transfer_notices_2" | Safe}}
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.convert_confirm"}}</button>
</div>
</form>
</div>
<form class="ui form" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="transfer">
<div class="field">
<label>
{{.i18n.Tr "repo.settings.transfer_form_title"}}
<span class="text red">{{.Repository.Name}}</span>
</label>
</div>
<div class="required field">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" required>
</div>
<div class="required field">
<label for="new_owner_name">{{.i18n.Tr "repo.settings.transfer_owner"}}</label>
<input id="new_owner_name" name="new_owner_name" required>
</div>
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.make_transfer"}}</button>
</div>
</form>
</div>
</div>
{{end}}
<div class="ui small modal" id="delete-repo-modal">
<div class="header">
{{.i18n.Tr "repo.settings.delete"}}
</div>
<div class="content">
<div class="ui warning message text left">
{{.i18n.Tr "repo.settings.delete_notices_1" | Safe}} <br>
{{.i18n.Tr "repo.settings.delete_notices_2" | Safe}}
{{if .Repository.NumForks}}<br>
{{.i18n.Tr "repo.settings.delete_notices_fork_1" | Safe}} <br>
{{.i18n.Tr "repo.settings.delete_notices_fork_2" | Safe}} <br>
{{.i18n.Tr "repo.settings.delete_notices_fork_3" | Safe}}
{{end}}
<div class="ui small modal" id="transfer-repo-modal">
<div class="header">
{{.i18n.Tr "repo.settings.transfer"}}
</div>
<form class="ui form" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="delete">
<div class="field">
<label>
{{.i18n.Tr "repo.settings.transfer_form_title"}}
<span class="text red">{{.Repository.Name}}</span>
</label>
</div>
<div class="required field">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" required>
<div class="content">
<div class="ui warning message text left">
{{.i18n.Tr "repo.settings.transfer_notices_1" | Safe}} <br>
{{.i18n.Tr "repo.settings.transfer_notices_2" | Safe}}
</div>
<form class="ui form" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="transfer">
<div class="field">
<label>
{{.i18n.Tr "repo.settings.transfer_form_title"}}
<span class="text red">{{.Repository.Name}}</span>
</label>
</div>
<div class="required field">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" required>
</div>
<div class="required field">
<label for="new_owner_name">{{.i18n.Tr "repo.settings.transfer_owner"}}</label>
<input id="new_owner_name" name="new_owner_name" required>
</div>
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_delete"}}</button>
</div>
</form>
</div>
</div>
{{if .Repository.EnableWiki}}
<div class="ui small modal" id="delete-wiki-modal">
<div class="header">
{{.i18n.Tr "repo.settings.wiki-delete"}}
</div>
<div class="content">
<div class="ui warning message text left">
{{.i18n.Tr "repo.settings.delete_notices_1" | Safe}}<br>
{{.i18n.Tr "repo.settings.wiki_delete_notices_1" .Repository.Name | Safe}}
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.make_transfer"}}</button>
</div>
</form>
</div>
<form class="ui form" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="delete-wiki">
<div class="field">
<label>
{{.i18n.Tr "repo.settings.transfer_form_title"}}
<span class="text red">{{.Repository.Name}}</span>
</label>
</div>
<div class="required field">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" required>
</div>
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_delete"}}</button>
</div>
</form>
</div>
</div>
<div class="ui small modal" id="delete-repo-modal">
<div class="header">
{{.i18n.Tr "repo.settings.delete"}}
</div>
<div class="content">
<div class="ui warning message text left">
{{.i18n.Tr "repo.settings.delete_notices_1" | Safe}} <br>
{{.i18n.Tr "repo.settings.delete_notices_2" | Safe}}
{{if .Repository.NumForks}}<br>
{{.i18n.Tr "repo.settings.delete_notices_fork_1" | Safe}} <br>
{{.i18n.Tr "repo.settings.delete_notices_fork_2" | Safe}} <br>
{{.i18n.Tr "repo.settings.delete_notices_fork_3" | Safe}}
{{end}}
</div>
<form class="ui form" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="delete">
<div class="field">
<label>
{{.i18n.Tr "repo.settings.transfer_form_title"}}
<span class="text red">{{.Repository.Name}}</span>
</label>
</div>
<div class="required field">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" required>
</div>
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_delete"}}</button>
</div>
</form>
</div>
</div>
{{if .Repository.EnableWiki}}
<div class="ui small modal" id="delete-wiki-modal">
<div class="header">
{{.i18n.Tr "repo.settings.wiki-delete"}}
</div>
<div class="content">
<div class="ui warning message text left">
{{.i18n.Tr "repo.settings.delete_notices_1" | Safe}}<br>
{{.i18n.Tr "repo.settings.wiki_delete_notices_1" .Repository.Name | Safe}}
</div>
<form class="ui form" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="delete-wiki">
<div class="field">
<label>
{{.i18n.Tr "repo.settings.transfer_form_title"}}
<span class="text red">{{.Repository.Name}}</span>
</label>
</div>
<div class="required field">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" required>
</div>
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_delete"}}</button>
</div>
</form>
</div>
</div>
{{end}}
{{end}}
{{template "base/footer" .}}
+1 -1
View File
@@ -6,7 +6,7 @@
<span class="mega-octicon octicon-book"></span>
<h2>{{.i18n.Tr "repo.wiki.welcome"}}</h2>
<p>{{.i18n.Tr "repo.wiki.welcome_desc"}}</p>
{{if .IsRepositoryPusher}}
{{if .IsRepositoryWriter}}
<a class="ui green button" href="{{.RepoLink}}/wiki/_new">{{.i18n.Tr "repo.wiki.create_first_page"}}</a>
{{end}}
</div>
+1 -1
View File
@@ -46,7 +46,7 @@
</div>
<div class="ui dividing header">
{{.title}}
{{if .IsRepositoryPusher}}
{{if .IsRepositoryWriter}}
<div class="ui right">
<a class="ui small button" href="{{.RepoLink}}/wiki/{{.PageURL}}/_edit">{{.i18n.Tr "repo.wiki.edit_page_button"}}</a>
<a class="ui green small button" href="{{.RepoLink}}/wiki/_new">{{.i18n.Tr "repo.wiki.new_page_button"}}</a>