| @@ -5,7 +5,7 @@ Gogs - Go Git Service [ | |||
| ##### Current version: 0.7.11 Beta | |||
| ##### Current version: 0.7.12 Beta | |||
| <table> | |||
| <tr> | |||
| @@ -368,9 +368,7 @@ fork_from_self = You cannot fork repository you already owned! | |||
| copy_link = Copy | |||
| copy_link_success = Copied! | |||
| copy_link_error = Press ⌘-C or Ctrl-C to copy | |||
| click_to_copy = Copy to clipboard | |||
| copied = Copied OK | |||
| clone_helper = Need help cloning? Visit <a target="_blank" href="%s">Help</a>! | |||
| unwatch = Unwatch | |||
| watch = Watch | |||
| unstar = Unstar | |||
| @@ -634,21 +632,21 @@ release.stable = Stable | |||
| release.edit = edit | |||
| release.ahead = <strong>%d</strong> commits to %s since this release | |||
| release.source_code = Source Code | |||
| release.new_subheader = Publish releases to iterate product. | |||
| release.edit_subheader = Detailed change log can help users understand what has been improved. | |||
| release.tag_name = Tag name | |||
| release.target = Target | |||
| release.tag_helper = Choose an existing tag, or create a new tag on publish. | |||
| release.release_title = Release title | |||
| release.content_with_md = Content with <a href="%s">Markdown</a> | |||
| release.write = Write | |||
| release.preview = Preview | |||
| release.content_placeholder = Write some content | |||
| release.loading = Loading... | |||
| release.title = Title | |||
| release.content = Content | |||
| release.prerelease_desc = This is a pre-release | |||
| release.prerelease_helper = We’ll point out that this release is not production-ready. | |||
| release.cancel = Cancel | |||
| release.publish = Publish Release | |||
| release.save_draft = Save Draft | |||
| release.edit_release = Edit Release | |||
| release.tag_name_already_exist = Release with this tag name has already existed. | |||
| release.downloads = Downloads | |||
| [org] | |||
| org_name_holder = Organization Name | |||
| @@ -17,7 +17,7 @@ import ( | |||
| "github.com/gogits/gogs/modules/setting" | |||
| ) | |||
| const APP_VER = "0.7.11.1115 Beta" | |||
| const APP_VER = "0.7.12.1115 Beta" | |||
| func init() { | |||
| runtime.GOMAXPROCS(runtime.NumCPU()) | |||
| @@ -288,6 +288,32 @@ func (err ErrUpdateTaskNotExist) Error() string { | |||
| return fmt.Sprintf("update task does not exist [uuid: %s]", err.UUID) | |||
| } | |||
| type ErrReleaseAlreadyExist struct { | |||
| TagName string | |||
| } | |||
| func IsErrReleaseAlreadyExist(err error) bool { | |||
| _, ok := err.(ErrReleaseAlreadyExist) | |||
| return ok | |||
| } | |||
| func (err ErrReleaseAlreadyExist) Error() string { | |||
| return fmt.Sprintf("Release tag already exist [tag_name: %s]", err.TagName) | |||
| } | |||
| type ErrReleaseNotExist struct { | |||
| TagName string | |||
| } | |||
| func IsErrReleaseNotExist(err error) bool { | |||
| _, ok := err.(ErrReleaseNotExist) | |||
| return ok | |||
| } | |||
| func (err ErrReleaseNotExist) Error() string { | |||
| return fmt.Sprintf("Release tag does not exist [tag_name: %s]", err.TagName) | |||
| } | |||
| // __ __ ___. .__ __ | |||
| // / \ / \ ____\_ |__ | |__ ____ ____ | | __ | |||
| // \ \/\/ // __ \| __ \| | \ / _ \ / _ \| |/ / | |||
| @@ -5,7 +5,6 @@ | |||
| package models | |||
| import ( | |||
| "errors" | |||
| "sort" | |||
| "strings" | |||
| "time" | |||
| @@ -15,16 +14,11 @@ import ( | |||
| "github.com/gogits/gogs/modules/git" | |||
| ) | |||
| var ( | |||
| ErrReleaseAlreadyExist = errors.New("Release already exist") | |||
| ErrReleaseNotExist = errors.New("Release does not exist") | |||
| ) | |||
| // Release represents a release of repository. | |||
| type Release struct { | |||
| Id int64 | |||
| RepoId int64 | |||
| PublisherId int64 | |||
| ID int64 `xorm:"pk autoincr"` | |||
| RepoID int64 | |||
| PublisherID int64 | |||
| Publisher *User `xorm:"-"` | |||
| TagName string | |||
| LowerTagName string | |||
| @@ -47,12 +41,12 @@ func (r *Release) AfterSet(colName string, _ xorm.Cell) { | |||
| } | |||
| // IsReleaseExist returns true if release with given tag name already exists. | |||
| func IsReleaseExist(repoId int64, tagName string) (bool, error) { | |||
| func IsReleaseExist(repoID int64, tagName string) (bool, error) { | |||
| if len(tagName) == 0 { | |||
| return false, nil | |||
| } | |||
| return x.Get(&Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)}) | |||
| return x.Get(&Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)}) | |||
| } | |||
| func createTag(gitRepo *git.Repository, rel *Release) error { | |||
| @@ -84,11 +78,11 @@ func createTag(gitRepo *git.Repository, rel *Release) error { | |||
| // CreateRelease creates a new release of repository. | |||
| func CreateRelease(gitRepo *git.Repository, rel *Release) error { | |||
| isExist, err := IsReleaseExist(rel.RepoId, rel.TagName) | |||
| isExist, err := IsReleaseExist(rel.RepoID, rel.TagName) | |||
| if err != nil { | |||
| return err | |||
| } else if isExist { | |||
| return ErrReleaseAlreadyExist | |||
| return ErrReleaseAlreadyExist{rel.TagName} | |||
| } | |||
| if err = createTag(gitRepo, rel); err != nil { | |||
| @@ -100,22 +94,22 @@ func CreateRelease(gitRepo *git.Repository, rel *Release) error { | |||
| } | |||
| // GetRelease returns release by given ID. | |||
| func GetRelease(repoId int64, tagName string) (*Release, error) { | |||
| isExist, err := IsReleaseExist(repoId, tagName) | |||
| func GetRelease(repoID int64, tagName string) (*Release, error) { | |||
| isExist, err := IsReleaseExist(repoID, tagName) | |||
| if err != nil { | |||
| return nil, err | |||
| } else if !isExist { | |||
| return nil, ErrReleaseNotExist | |||
| return nil, ErrReleaseNotExist{tagName} | |||
| } | |||
| rel := &Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)} | |||
| rel := &Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)} | |||
| _, err = x.Get(rel) | |||
| return rel, err | |||
| } | |||
| // GetReleasesByRepoId returns a list of releases of repository. | |||
| func GetReleasesByRepoId(repoId int64) (rels []*Release, err error) { | |||
| err = x.Desc("created").Find(&rels, Release{RepoId: repoId}) | |||
| func GetReleasesByRepoId(repoID int64) (rels []*Release, err error) { | |||
| err = x.Desc("created").Find(&rels, Release{RepoID: repoID}) | |||
| return rels, err | |||
| } | |||
| @@ -150,6 +144,6 @@ func UpdateRelease(gitRepo *git.Repository, rel *Release) (err error) { | |||
| if err = createTag(gitRepo, rel); err != nil { | |||
| return err | |||
| } | |||
| _, err = x.Id(rel.Id).AllCols().Update(rel) | |||
| _, err = x.Id(rel.ID).AllCols().Update(rel) | |||
| return err | |||
| } | |||
| @@ -1116,7 +1116,7 @@ func DeleteRepository(uid, repoID int64) error { | |||
| return err | |||
| } else if _, err = sess.Delete(&Milestone{RepoID: repoID}); err != nil { | |||
| return err | |||
| } else if _, err = sess.Delete(&Release{RepoId: repoID}); err != nil { | |||
| } else if _, err = sess.Delete(&Release{RepoID: repoID}); err != nil { | |||
| return err | |||
| } else if _, err = sess.Delete(&Collaboration{RepoID: repoID}); err != nil { | |||
| return err | |||
| @@ -215,12 +215,12 @@ func (f *CreateLabelForm) Validate(ctx *macaron.Context, errs binding.Errors) bi | |||
| // \/ \/ \/ \/ \/ \/ | |||
| type NewReleaseForm struct { | |||
| TagName string `form:"tag_name" binding:"Required"` | |||
| TagName string `binding:"Required"` | |||
| Target string `form:"tag_target" binding:"Required"` | |||
| Title string `form:"title" binding:"Required"` | |||
| Content string `form:"content" binding:"Required"` | |||
| Draft string `form:"draft"` | |||
| Prerelease bool `form:"prerelease"` | |||
| Title string `binding:"Required"` | |||
| Content string | |||
| Draft string | |||
| Prerelease bool | |||
| } | |||
| func (f *NewReleaseForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | |||
| @@ -2393,6 +2393,85 @@ footer .container .links > *:first-child { | |||
| padding: 5px 10px; | |||
| font-size: 1.2em; | |||
| } | |||
| .repository.release #release-list { | |||
| border-top: 1px solid #DDD; | |||
| margin-top: 20px; | |||
| padding-top: 15px; | |||
| } | |||
| .repository.release #release-list > li { | |||
| list-style: none; | |||
| } | |||
| .repository.release #release-list > li .meta, | |||
| .repository.release #release-list > li .detail { | |||
| padding-top: 30px; | |||
| padding-bottom: 40px; | |||
| } | |||
| .repository.release #release-list > li .meta { | |||
| text-align: right; | |||
| position: relative; | |||
| } | |||
| .repository.release #release-list > li .meta .tag:not(.icon) { | |||
| display: block; | |||
| margin-top: 15px; | |||
| } | |||
| .repository.release #release-list > li .meta .commit { | |||
| display: block; | |||
| margin-top: 10px; | |||
| } | |||
| .repository.release #release-list > li .detail { | |||
| border-left: 1px solid #DDD; | |||
| } | |||
| .repository.release #release-list > li .detail .author img { | |||
| margin-bottom: -3px; | |||
| } | |||
| .repository.release #release-list > li .detail .download { | |||
| margin-top: 20px; | |||
| } | |||
| .repository.release #release-list > li .detail .download > a .octicon { | |||
| margin-left: 5px; | |||
| margin-right: 5px; | |||
| } | |||
| .repository.release #release-list > li .detail .download .list { | |||
| padding-left: 0; | |||
| border-top: 1px solid #eee; | |||
| } | |||
| .repository.release #release-list > li .detail .download .list li { | |||
| list-style: none; | |||
| display: block; | |||
| padding-top: 8px; | |||
| padding-bottom: 8px; | |||
| border-bottom: 1px solid #eee; | |||
| } | |||
| .repository.release #release-list > li .detail .dot { | |||
| width: 9px; | |||
| height: 9px; | |||
| background-color: #ccc; | |||
| z-index: 999; | |||
| position: absolute; | |||
| display: block; | |||
| left: -5px; | |||
| top: 40px; | |||
| border-radius: 6px; | |||
| border: 1px solid #FFF; | |||
| } | |||
| .repository.new.release .target { | |||
| min-width: 500px; | |||
| } | |||
| .repository.new.release .target .at { | |||
| margin-left: -5px; | |||
| margin-right: 5px; | |||
| } | |||
| .repository.new.release .target .dropdown.icon { | |||
| margin: 0; | |||
| padding-top: 3px; | |||
| } | |||
| .repository.new.release .target .selection.dropdown { | |||
| padding-top: 10px; | |||
| padding-bottom: 10px; | |||
| } | |||
| .repository.new.release .prerelease.field { | |||
| margin-bottom: 0; | |||
| } | |||
| .issue.list { | |||
| list-style: none; | |||
| padding-top: 15px; | |||
| @@ -794,6 +794,102 @@ | |||
| } | |||
| } | |||
| } | |||
| &.release { | |||
| #release-list { | |||
| border-top: 1px solid #DDD; | |||
| margin-top: 20px; | |||
| padding-top: 15px; | |||
| >li { | |||
| list-style: none; | |||
| .meta, | |||
| .detail { | |||
| padding-top: 30px; | |||
| padding-bottom: 40px; | |||
| } | |||
| .meta { | |||
| text-align: right; | |||
| position: relative; | |||
| .tag:not(.icon) { | |||
| display: block; | |||
| margin-top: 15px; | |||
| } | |||
| .commit { | |||
| display: block; | |||
| margin-top: 10px; | |||
| } | |||
| } | |||
| .detail { | |||
| border-left: 1px solid #DDD; | |||
| .author { | |||
| img { | |||
| margin-bottom: -3px; | |||
| } | |||
| } | |||
| .download { | |||
| margin-top: 20px; | |||
| >a { | |||
| .octicon { | |||
| margin-left: 5px; | |||
| margin-right: 5px; | |||
| } | |||
| } | |||
| .list { | |||
| padding-left: 0; | |||
| border-top: 1px solid #eee; | |||
| li { | |||
| list-style: none; | |||
| display: block; | |||
| padding-top: 8px; | |||
| padding-bottom: 8px; | |||
| border-bottom: 1px solid #eee; | |||
| } | |||
| } | |||
| } | |||
| .dot { | |||
| width: 9px; | |||
| height: 9px; | |||
| background-color: #ccc; | |||
| z-index: 999; | |||
| position: absolute; | |||
| display: block; | |||
| left: -5px; | |||
| top: 40px; | |||
| border-radius: 6px; | |||
| border: 1px solid #FFF; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| &.new.release { | |||
| .target { | |||
| min-width: 500px; | |||
| .at { | |||
| margin-left: -5px; | |||
| margin-right: 5px; | |||
| } | |||
| .dropdown.icon { | |||
| margin: 0; | |||
| padding-top: 3px; | |||
| } | |||
| .selection.dropdown { | |||
| padding-top: 10px; | |||
| padding-bottom: 10px; | |||
| } | |||
| } | |||
| .prerelease.field { | |||
| margin-bottom: 0; | |||
| } | |||
| } | |||
| } | |||
| // End of .repository | |||
| @@ -13,15 +13,12 @@ import ( | |||
| ) | |||
| const ( | |||
| RELEASES base.TplName = "repo/release/list" | |||
| RELEASE_NEW base.TplName = "repo/release/new" | |||
| RELEASE_EDIT base.TplName = "repo/release/edit" | |||
| RELEASES base.TplName = "repo/release/list" | |||
| RELEASE_NEW base.TplName = "repo/release/new" | |||
| ) | |||
| func Releases(ctx *middleware.Context) { | |||
| ctx.Data["Title"] = ctx.Tr("repo.release.releases") | |||
| ctx.Data["IsRepoToolbarReleases"] = true | |||
| ctx.Data["IsRepoReleaseNew"] = false | |||
| rawTags, err := ctx.Repo.GitRepo.GetTags() | |||
| if err != nil { | |||
| @@ -45,7 +42,7 @@ func Releases(ctx *middleware.Context) { | |||
| continue | |||
| } | |||
| if rel.TagName == rawTag { | |||
| rel.Publisher, err = models.GetUserByID(rel.PublisherId) | |||
| rel.Publisher, err = models.GetUserByID(rel.PublisherID) | |||
| if err != nil { | |||
| ctx.Handle(500, "GetUserById", err) | |||
| return | |||
| @@ -105,7 +102,7 @@ func Releases(ctx *middleware.Context) { | |||
| continue | |||
| } | |||
| rel.Publisher, err = models.GetUserByID(rel.PublisherId) | |||
| rel.Publisher, err = models.GetUserByID(rel.PublisherID) | |||
| if err != nil { | |||
| ctx.Handle(500, "GetUserById", err) | |||
| return | |||
| @@ -140,27 +137,13 @@ func Releases(ctx *middleware.Context) { | |||
| } | |||
| func NewRelease(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner() { | |||
| ctx.Handle(403, "release.ReleasesNew", nil) | |||
| return | |||
| } | |||
| ctx.Data["Title"] = ctx.Tr("repo.release.new_release") | |||
| ctx.Data["tag_target"] = ctx.Repo.Repository.DefaultBranch | |||
| ctx.Data["IsRepoToolbarReleases"] = true | |||
| ctx.Data["IsRepoReleaseNew"] = true | |||
| ctx.HTML(200, RELEASE_NEW) | |||
| } | |||
| func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) { | |||
| if !ctx.Repo.IsOwner() { | |||
| ctx.Handle(403, "release.ReleasesNew", nil) | |||
| return | |||
| } | |||
| ctx.Data["Title"] = ctx.Tr("repo.release.new_release") | |||
| ctx.Data["IsRepoToolbarReleases"] = true | |||
| ctx.Data["IsRepoReleaseNew"] = true | |||
| if ctx.HasError() { | |||
| ctx.HTML(200, RELEASE_NEW) | |||
| @@ -185,8 +168,8 @@ func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) { | |||
| } | |||
| rel := &models.Release{ | |||
| RepoId: ctx.Repo.Repository.ID, | |||
| PublisherId: ctx.User.Id, | |||
| RepoID: ctx.Repo.Repository.ID, | |||
| PublisherID: ctx.User.Id, | |||
| Title: form.Title, | |||
| TagName: form.TagName, | |||
| Target: form.Target, | |||
| @@ -198,67 +181,67 @@ func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) { | |||
| } | |||
| if err = models.CreateRelease(ctx.Repo.GitRepo, rel); err != nil { | |||
| if err == models.ErrReleaseAlreadyExist { | |||
| if models.IsErrReleaseAlreadyExist(err) { | |||
| ctx.Data["Err_TagName"] = true | |||
| ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_already_exist"), RELEASE_NEW, &form) | |||
| } else { | |||
| ctx.Handle(500, "CreateRelease", err) | |||
| } | |||
| return | |||
| } | |||
| log.Trace("%s Release created: %s/%s:%s", ctx.Req.RequestURI, ctx.User.LowerName, ctx.Repo.Repository.Name, form.TagName) | |||
| log.Trace("Release created: %s/%s:%s", ctx.User.LowerName, ctx.Repo.Repository.Name, form.TagName) | |||
| ctx.Redirect(ctx.Repo.RepoLink + "/releases") | |||
| } | |||
| func EditRelease(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner() { | |||
| ctx.Handle(403, "release.ReleasesEdit", nil) | |||
| return | |||
| } | |||
| ctx.Data["Title"] = ctx.Tr("repo.release.edit_release") | |||
| ctx.Data["PageIsEditRelease"] = true | |||
| tagName := ctx.Params(":tagname") | |||
| rel, err := models.GetRelease(ctx.Repo.Repository.ID, tagName) | |||
| if err != nil { | |||
| if err == models.ErrReleaseNotExist { | |||
| if models.IsErrReleaseNotExist(err) { | |||
| ctx.Handle(404, "GetRelease", err) | |||
| } else { | |||
| ctx.Handle(500, "GetRelease", err) | |||
| } | |||
| return | |||
| } | |||
| ctx.Data["Release"] = rel | |||
| ctx.Data["tag_name"] = rel.TagName | |||
| ctx.Data["tag_target"] = rel.Target | |||
| ctx.Data["title"] = rel.Title | |||
| ctx.Data["content"] = rel.Note | |||
| ctx.Data["prerelease"] = rel.IsPrerelease | |||
| ctx.Data["Title"] = ctx.Tr("repo.release.edit_release") | |||
| ctx.Data["IsRepoToolbarReleases"] = true | |||
| ctx.HTML(200, RELEASE_EDIT) | |||
| ctx.HTML(200, RELEASE_NEW) | |||
| } | |||
| func EditReleasePost(ctx *middleware.Context, form auth.EditReleaseForm) { | |||
| if !ctx.Repo.IsOwner() { | |||
| ctx.Handle(403, "release.EditReleasePost", nil) | |||
| return | |||
| } | |||
| ctx.Data["Title"] = ctx.Tr("repo.release.edit_release") | |||
| ctx.Data["PageIsEditRelease"] = true | |||
| tagName := ctx.Params(":tagname") | |||
| rel, err := models.GetRelease(ctx.Repo.Repository.ID, tagName) | |||
| if err != nil { | |||
| if err == models.ErrReleaseNotExist { | |||
| if models.IsErrReleaseNotExist(err) { | |||
| ctx.Handle(404, "GetRelease", err) | |||
| } else { | |||
| ctx.Handle(500, "GetRelease", err) | |||
| } | |||
| return | |||
| } | |||
| ctx.Data["Release"] = rel | |||
| ctx.Data["tag_name"] = rel.TagName | |||
| ctx.Data["tag_target"] = rel.Target | |||
| ctx.Data["title"] = rel.Title | |||
| ctx.Data["content"] = rel.Note | |||
| ctx.Data["prerelease"] = rel.IsPrerelease | |||
| if ctx.HasError() { | |||
| ctx.HTML(200, RELEASE_EDIT) | |||
| ctx.HTML(200, RELEASE_NEW) | |||
| return | |||
| } | |||
| ctx.Data["Title"] = ctx.Tr("repo.release.edit_release") | |||
| ctx.Data["IsRepoToolbarReleases"] = true | |||
| rel.Title = form.Title | |||
| rel.Note = form.Content | |||
| rel.IsDraft = len(form.Draft) > 0 | |||
| @@ -1 +1 @@ | |||
| 0.7.11.1115 Beta | |||
| 0.7.12.1115 Beta | |||
| @@ -1,59 +0,0 @@ | |||
| {{template "ng/base/head" .}} | |||
| {{template "ng/base/header" .}} | |||
| <div id="repo-wrapper"> | |||
| {{template "repo/header_old" .}} | |||
| <div id="repo-content" class="clear container"> | |||
| <div id="repo-main" class="left grid-5-6"> | |||
| {{template "ng/base/alert" .}} | |||
| <div id="release"> | |||
| <h4 id="release-head">{{.i18n.Tr "repo.release.edit_release"}}</h4> | |||
| <form class="form" id="release-new-form" action="{{.RepoLink}}/releases/edit/{{.Release.TagName}}" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <div class="field"> | |||
| <b>{{.Release.TagName}}</b> | |||
| <span class="target-at">@</span> | |||
| <strong>{{.Repository.DefaultBranch}}</strong> | |||
| </div> | |||
| <div class="field"> | |||
| <input class="ipt ipt-large ipt-radius grid-4-5" id="release-new-title" name="title" placeholder="{{.i18n.Tr "repo.release.release_title"}}" value="{{.Release.Title}}" required> | |||
| </div> | |||
| <br> | |||
| <div class="field grid-4-5"> | |||
| <div class="md-help pull-right"> | |||
| {{.i18n.Tr "repo.release.content_with_md" "https://help.github.com/articles/markdown-basics" | Str2html}} | |||
| </div> | |||
| <div class="clear"> | |||
| <ul class="tab-nav list-unstyled"> | |||
| <li class="js-tab-nav js-tab-nav-show left" data-tab-target="#release-textarea"> | |||
| <button class="btn btn-medium btn-gray btn-left-radius">{{.i18n.Tr "repo.release.write"}}</button> | |||
| </li> | |||
| <li class="js-tab-nav left markdown-preview" id="release-preview-btn" data-tab-target="#release-preview" data-ajax="{{AppSubUrl}}/api/v1/markdown" data-ajax-name="release-preview" data-ajax-context="{{.RepoLink}}" data-ajax-method="post" data-preview="#release-preview"> | |||
| <button class="btn btn-medium btn-gray btn-right-radius">{{.i18n.Tr "repo.release.preview"}}</button> | |||
| </li> | |||
| </ul> | |||
| </div> | |||
| <div id="release-textarea"> | |||
| <div class="form-group"> | |||
| <textarea class="ipt ipt-large ipt-radius" name="content" id="release-new-content" rows="10" placeholder="{{.i18n.Tr "repo.release.content_placeholder"}}" data-ajax-rel="release-preview" data-ajax-val="val" data-ajax-field="text" required>{{.Release.Note}}</textarea> | |||
| </div> | |||
| </div> | |||
| <div class="markdown hide" id="release-preview">{{.i18n.Tr "repo.release.loading"}}</div> | |||
| <br> | |||
| <hr> | |||
| <div class="text-right"> | |||
| <input class="ipt-chk" name="prerelease" type="checkbox" {{if .Release.IsPrerelease}}checked{{end}}/> | |||
| <span><strong>{{.i18n.Tr "repo.release.prerelease_desc"}}</strong></span> | |||
| <p>{{.i18n.Tr "repo.release.prerelease_helper"}}</p> | |||
| <button class="btn btn-large btn-green btn-radius">Publish release</button> | |||
| {{if .Release.IsDraft}} | |||
| <input class="btn btn-large btn-gary btn-radius" type="submit" name="draft" value="{{.i18n.Tr "repo.release.save_draft"}}"/> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| </div> | |||
| {{template "repo/sidebar" .}} | |||
| </div> | |||
| </div> | |||
| {{template "ng/base/footer" .}} | |||
| @@ -1,73 +1,80 @@ | |||
| {{template "ng/base/head" .}} | |||
| {{template "ng/base/header" .}} | |||
| <div id="repo-wrapper"> | |||
| {{template "repo/header_old" .}} | |||
| <div id="repo-content" class="clear container"> | |||
| <div id="repo-main" class="left grid-5-6"> | |||
| <div id="release"> | |||
| <h4 id="release-head"> | |||
| <span class="release"><strong>{{.i18n.Tr "repo.release.releases"}}</strong></span><!-- / | |||
| <a class="tag" href="{{AppSubUrl}}/{tag_link}">Tags</a> --> | |||
| <!-- comment : if in tag page, show a.release and span.tag please --> | |||
| {{if .IsRepositoryAdmin}} | |||
| <a class="btn" href="{{$.RepoLink}}/releases/new"> | |||
| <button class="btn btn-medium btn-blue btn-radius"> | |||
| {{.i18n.Tr "repo.release.new_release"}} | |||
| </button> | |||
| </a> | |||
| {{end}} | |||
| </h4> | |||
| <ul id="release-list" class="list-unstyled"> | |||
| {{range .Releases}} | |||
| <li class="release-item clearfix" id="release-{{.Sha1}}"> | |||
| {{if .PublisherId}} | |||
| <div class="grid-1-6 text-right release-meta"> | |||
| {{if .IsDraft}} | |||
| <span class="label label-blue label-radius">{{$.i18n.Tr "repo.release.draft"}}</span> | |||
| {{else if .IsPrerelease}} | |||
| <span class="label label-orange label-radius">{{$.i18n.Tr "repo.release.prerelease"}}</span> | |||
| {{else}} | |||
| <span class="label label-green label-radius">{{$.i18n.Tr "repo.release.stable"}}</span> | |||
| {{end}} | |||
| <a class="tag" href="{{$.RepoLink}}/src/{{.TagName}}" rel="nofollow"><i class="fa fa-tag"></i> {{.TagName}}</a> | |||
| <a class="commit" href="{{$.RepoLink}}/src/{{.Sha1}}" rel="nofollow"><i class="fa fa-code"></i> {{ShortSha .Sha1}}</a> | |||
| </div> | |||
| <div class="grid-9-12 release-detail left"> | |||
| <h4 class="title"><a href="{{$.RepoLink}}/src/{{.TagName}}">{{.Title}}</a> <small>(<a href="{{$.RepoLink}}/releases/edit/{{.TagName}}" rel="nofollow">{{$.i18n.Tr "repo.release.edit"}}</a>)</small></h4> | |||
| <p class="info"> | |||
| <span class="author"><img class="avatar-20" src="{{.Publisher.AvatarLink}}"> | |||
| <a href="{{AppSubUrl}}/{{.Publisher.Name}}">{{.Publisher.Name}}</a></span> | |||
| {{if .Created}}<span class="time">{{TimeSince .Created $.Lang}}</span>{{end}} | |||
| <span class="ahead">{{$.i18n.Tr "repo.release.ahead" .NumCommitsBehind .Target | Str2html}}</span> | |||
| </p> | |||
| <div class="markdown desc"> | |||
| {{Str2html .Note}} | |||
| </div> | |||
| <p class="download"> | |||
| <a class="btn btn-gray btn-large btn-radius" href="{{$.RepoLink}}/archive/{{.TagName}}.zip" rel="nofollow"><i class="fa fa-download"></i> {{$.i18n.Tr "repo.release.source_code"}} (ZIP)</a> | |||
| <a class="btn btn-gray btn-large btn-radius" href="{{$.RepoLink}}/archive/{{.TagName}}.tar.gz"><i class="fa fa-download"></i> {{$.i18n.Tr "repo.release.source_code"}} (TAR.GZ)</a> | |||
| </p> | |||
| <span class="dot"> </span> | |||
| </div> | |||
| {{else}} | |||
| <div class="grid-1-6 text-right release-meta"> | |||
| <a class="commit" href="{{$.RepoLink}}/src/{{.Sha1}}" rel="nofollow"><i class="fa fa-code"></i> {{ShortSha .Sha1}}</a> | |||
| </div> | |||
| <div class="grid-9-12 release-detail left"> | |||
| <h5 class="title"><a href="{{$.RepoLink}}/src/{{.TagName}}" rel="nofollow">{{.TagName}}</a> <i class="fa fa-tag"></i></h5> | |||
| <p class="download"> | |||
| <a class="download-link" href="{{$.RepoLink}}/archive/{{.TagName}}.zip" rel="nofollow"><i class="fa fa-download"></i> ZIP</a> | |||
| <a class="download-link" href="{{$.RepoLink}}/archive/{{.TagName}}.tar.gz"><i class="fa fa-download"></i> TAR.GZ</a> | |||
| </p> | |||
| <span class="dot"> </span> | |||
| </div> | |||
| {{end}} | |||
| </li> | |||
| {{end}} | |||
| </ul> | |||
| {{template "base/head" .}} | |||
| <div class="repository release"> | |||
| {{template "repo/header" .}} | |||
| <div class="ui container"> | |||
| {{template "repo/sidebar" .}} | |||
| <h2 class="ui header"> | |||
| {{.i18n.Tr "repo.release.releases"}} | |||
| {{if .IsRepositoryAdmin}} | |||
| <div class="ui right"> | |||
| <a class="ui small green button" href="{{$.RepoLink}}/releases/new"> | |||
| {{.i18n.Tr "repo.release.new_release"}} | |||
| </a> | |||
| </div> | |||
| {{end}} | |||
| </h2> | |||
| <ul id="release-list"> | |||
| {{range .Releases}} | |||
| <li class="ui grid"> | |||
| <div class="ui four wide column meta"> | |||
| {{if .PublisherID}} | |||
| {{if .IsDraft}} | |||
| <span class="ui yellow label">{{$.i18n.Tr "repo.release.draft"}}</span> | |||
| {{else if .IsPrerelease}} | |||
| <span class="ui orange label">{{$.i18n.Tr "repo.release.prerelease"}}</span> | |||
| {{else}} | |||
| <span class="ui green label">{{$.i18n.Tr "repo.release.stable"}}</span> | |||
| {{end}} | |||
| <span class="tag text blue"> | |||
| <a href="{{$.RepoLink}}/src/{{.TagName}}" rel="nofollow"><i class="tag icon"></i> {{.TagName}}</a> | |||
| </span> | |||
| {{end}} | |||
| <span class="commit"> | |||
| <a href="{{$.RepoLink}}/src/{{.Sha1}}" rel="nofollow"><i class="code icon"></i> {{ShortSha .Sha1}}</a> | |||
| </span> | |||
| </div> | |||
| <div class="ui twelve wide column detail"> | |||
| {{if .PublisherID}} | |||
| <h3> | |||
| <a href="{{$.RepoLink}}/src/{{.TagName}}">{{.Title}}</a> | |||
| <small>(<a href="{{$.RepoLink}}/releases/edit/{{.TagName}}" rel="nofollow">{{$.i18n.Tr "repo.release.edit"}}</a>)</small> | |||
| </h3> | |||
| <p class="text grey"> | |||
| <span class="author"> | |||
| <img class="img-10" src="{{.Publisher.AvatarLink}}"> | |||
| <a href="{{AppSubUrl}}/{{.Publisher.Name}}">{{.Publisher.Name}}</a> | |||
| </span> | |||
| {{if .Created}}<span class="time">{{TimeSince .Created $.Lang}}</span>{{end}} | |||
| <span class="ahead">{{$.i18n.Tr "repo.release.ahead" .NumCommitsBehind .Target | Str2html}}</span> | |||
| </p> | |||
| <div class="markdown desc"> | |||
| {{Str2html .Note}} | |||
| </div> | |||
| <div class="download"> | |||
| <h2>{{$.i18n.Tr "repo.release.downloads"}}</h2> | |||
| <ul class="list"> | |||
| <li> | |||
| <a href="{{$.RepoLink}}/archive/{{.TagName}}.zip" rel="nofollow"><i class="icon octicon octicon-file-zip"></i> {{$.i18n.Tr "repo.release.source_code"}} (ZIP)</a> | |||
| </li> | |||
| <li> | |||
| <a href="{{$.RepoLink}}/archive/{{.TagName}}.tar.gz"><i class="icon octicon octicon-file-zip"></i> {{$.i18n.Tr "repo.release.source_code"}} (TAR.GZ)</a> | |||
| </li> | |||
| </ul> | |||
| </div> | |||
| {{else}} | |||
| <h4> | |||
| <a href="{{$.RepoLink}}/src/{{.TagName}}" rel="nofollow"><i class="tag icon"></i> {{.TagName}}</a> | |||
| </h4> | |||
| <div class="download"> | |||
| <a href="{{$.RepoLink}}/archive/{{.TagName}}.zip" rel="nofollow"><i class="octicon octicon-file-zip"></i> ZIP</a> | |||
| <a href="{{$.RepoLink}}/archive/{{.TagName}}.tar.gz"><i class="octicon octicon-file-zip"></i> TAR.GZ</a> | |||
| </div> | |||
| {{end}} | |||
| <span class="dot"> </span> | |||
| </div> | |||
| {{template "repo/sidebar" .}} | |||
| </div> | |||
| </li> | |||
| {{end}} | |||
| </ul> | |||
| </div> | |||
| </div> | |||
| {{template "ng/base/footer" .}} | |||
| {{template "base/footer" .}} | |||
| @@ -1,68 +1,83 @@ | |||
| {{template "ng/base/head" .}} | |||
| {{template "ng/base/header" .}} | |||
| <div id="repo-wrapper"> | |||
| {{template "repo/header_old" .}} | |||
| <div id="repo-content" class="clear container"> | |||
| <div id="repo-main" class="left grid-5-6"> | |||
| {{template "ng/base/alert" .}} | |||
| <div id="release"> | |||
| <h4 id="release-head">{{.i18n.Tr "repo.release.new_release"}}</h4> | |||
| <form class="form" id="release-new-form" action="{{.RepoLink}}/releases/new" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <div class="field"> | |||
| <input class="ipt ipt-large ipt-radius" name="tag_name" value="{{.tag_name}}" placeholder="{{.i18n.Tr "repo.release.tag_name"}}" required> | |||
| <span class="target-at">@</span> | |||
| <div class="inline-block drop"> | |||
| <button class="btn btn-gray btn-medium btn-radius drop-bottom"> | |||
| <i class="octicon octicon-git-branch"></i> {{.i18n.Tr "repo.release.target"}} : | |||
| <strong id="repo-branch-current">{{.Repository.DefaultBranch}}</strong> | |||
| </button> | |||
| <ul class="drop-down menu menu-vertical menu-radius switching-list" id="release-new-target-branch-list"> | |||
| {{range .Branches}} | |||
| <li {{if eq . $.tag_target}}class="checked"{{end}}><a><i class="octicon octicon-check"></i>{{.}}</a></li> | |||
| {{end}} | |||
| </ul> | |||
| </div> | |||
| <input id="tag-target" type="hidden" name="tag_target" value="{{.tag_target}}"/> | |||
| </div> | |||
| <p class="help">{{.i18n.Tr "repo.release.tag_helper"}}</p> | |||
| <div class="field"> | |||
| <input class="ipt ipt-large ipt-radius grid-4-5" id="release-new-title" name="title" placeholder="{{.i18n.Tr "repo.release.release_title"}}" value="{{.title}}" required> | |||
| </div> | |||
| <br> | |||
| <div class="field grid-4-5"> | |||
| <div class="md-help pull-right"> | |||
| {{.i18n.Tr "repo.release.content_with_md" "https://help.github.com/articles/markdown-basics" | Str2html}} | |||
| </div> | |||
| <div class="clear"> | |||
| <ul class="tab-nav list-unstyled"> | |||
| <li class="js-tab-nav js-tab-nav-show left" data-tab-target="#release-textarea"> | |||
| <button class="btn btn-medium btn-gray btn-left-radius">{{.i18n.Tr "repo.release.write"}}</button> | |||
| </li> | |||
| <li class="js-tab-nav left markdown-preview" id="release-preview-btn" data-tab-target="#release-preview" data-ajax="{{AppSubUrl}}/api/v1/markdown" data-ajax-name="release-preview" data-ajax-context="{{.RepoLink}}" data-ajax-method="post" data-preview="#release-preview"> | |||
| <button class="btn btn-medium btn-gray btn-right-radius">{{.i18n.Tr "repo.release.preview"}}</button> | |||
| </li> | |||
| </ul> | |||
| </div> | |||
| <div id="release-textarea"> | |||
| <div class="form-group"> | |||
| <textarea class="ipt ipt-large ipt-radius" name="content" id="release-new-content" rows="10" placeholder="{{.i18n.Tr "repo.release.content_placeholder"}}" data-ajax-rel="release-preview" data-ajax-val="val" data-ajax-field="text" required>{{.content}}</textarea> | |||
| </div> | |||
| </div> | |||
| <div class="markdown hide" id="release-preview">{{.i18n.Tr "repo.release.loading"}}</div> | |||
| <hr> | |||
| <div class="text-right"> | |||
| <input class="ipt-chk" name="prerelease" type="checkbox" {{if .prerelease}}checked{{end}}/> | |||
| <span><strong>{{.i18n.Tr "repo.release.prerelease_desc"}}</strong></span> | |||
| <p>{{.i18n.Tr "repo.release.prerelease_helper"}}</p> | |||
| <button class="btn btn-large btn-green btn-radius">{{.i18n.Tr "repo.release.publish"}}</button> | |||
| <input class="btn btn-large btn-gary btn-radius" type="submit" name="draft" value="{{.i18n.Tr "repo.release.save_draft"}}"/> | |||
| </div> | |||
| </div> | |||
| </form> | |||
| {{template "base/head" .}} | |||
| <div class="repository new release"> | |||
| {{template "repo/header" .}} | |||
| <div class="ui container"> | |||
| {{template "repo/sidebar" .}} | |||
| <h2 class="ui dividing header"> | |||
| {{if .PageIsEditRelease}} | |||
| {{.i18n.Tr "repo.release.edit_release"}} | |||
| <div class="sub header">{{.i18n.Tr "repo.release.edit_subheader"}}</div> | |||
| {{else}} | |||
| {{.i18n.Tr "repo.release.new_release"}} | |||
| <div class="sub header">{{.i18n.Tr "repo.release.new_subheader"}}</div> | |||
| {{end}} | |||
| </h2> | |||
| {{template "base/alert" .}} | |||
| <form class="ui form grid" action="{{.Link}}" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <div class="ui seven wide column target"> | |||
| <div class="inline field {{if .Err_TagName}}error{{end}}"> | |||
| {{if .PageIsEditRelease}} | |||
| <b>{{.tag_name}}</b><span class="at">@</span><strong>{{.tag_target}}</strong> | |||
| {{else}} | |||
| <input name="tag_name" value="{{.tag_name}}" placeholder="{{.i18n.Tr "repo.release.tag_name"}}" autofocus required> | |||
| <span class="at">@</span> | |||
| <div class="ui selection dropdown"> | |||
| <input type="hidden" name="tag_target" value="{{.tag_target}}"/> | |||
| <i class="octicon octicon-git-branch"></i> | |||
| <div class="text"> | |||
| {{.i18n.Tr "repo.release.target"}} : | |||
| <strong id="repo-branch-current">{{.Repository.DefaultBranch}}</strong> | |||
| </div> | |||
| <i class="dropdown icon"></i> | |||
| <div class="menu"> | |||
| {{range .Branches}} | |||
| <div class="item" data-value="{{.}}">{{.}}</div> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| <span class="help">{{.i18n.Tr "repo.release.tag_helper"}}</span> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| <div class="eleven wide column"> | |||
| <div class="field {{if .Err_Title}}error{{end}}"> | |||
| <label>{{.i18n.Tr "repo.release.title"}}</label> | |||
| <input name="title" placeholder="{{.i18n.Tr "repo.release.title"}}" value="{{.title}}" autofocus required> | |||
| </div> | |||
| <div class="field"> | |||
| <label>{{.i18n.Tr "repo.release.content"}}</label> | |||
| <textarea name="content">{{.content}}</textarea> | |||
| </div> | |||
| </div> | |||
| <div class="ui container"> | |||
| <div class="ui divider"></div> | |||
| <div class="ui text right"> | |||
| <div class="prerelease field"> | |||
| <div class="ui checkbox"> | |||
| <input type="checkbox" name="prerelease" {{if .prerelease}}checked{{end}}> | |||
| <label><strong>{{.i18n.Tr "repo.release.prerelease_desc"}}</strong></label> | |||
| </div> | |||
| </div> | |||
| <span class="help">{{.i18n.Tr "repo.release.prerelease_helper"}}</span> | |||
| <div class="field"> | |||
| {{if .PageIsEditRelease}} | |||
| <a class="ui blue basic button" href="{{.RepoLink}}/releases"> | |||
| {{.i18n.Tr "repo.release.cancel"}} | |||
| </a> | |||
| <button class="ui green button"> | |||
| {{.i18n.Tr "repo.release.edit_release"}} | |||
| </button> | |||
| {{else}} | |||
| <button class="ui green button"> | |||
| {{.i18n.Tr "repo.release.publish"}} | |||
| </button> | |||
| <input class="ui grey button" type="submit" name="draft" value="{{.i18n.Tr "repo.release.save_draft"}}"/> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| {{template "repo/sidebar" .}} | |||
| </div> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| </div> | |||
| {{template "ng/base/footer" .}} | |||
| {{template "base/footer" .}} | |||