diff --git a/src/main/scala/gitbucket/core/controller/ReleasesController.scala b/src/main/scala/gitbucket/core/controller/ReleasesController.scala index ed44860..ee8c785 100644 --- a/src/main/scala/gitbucket/core/controller/ReleasesController.scala +++ b/src/main/scala/gitbucket/core/controller/ReleasesController.scala @@ -3,13 +3,14 @@ import java.io.File import gitbucket.core.service.{AccountService, ActivityService, ReleaseService, RepositoryService} -import gitbucket.core.util.{FileUtil, ReadableUsersAuthenticator, ReferrerAuthenticator, WritableUsersAuthenticator} +import gitbucket.core.util._ import gitbucket.core.util.Directory._ import gitbucket.core.util.Implicits._ import org.scalatra.forms._ import gitbucket.core.releases.html +import gitbucket.core.util.SyntaxSugars.using import org.apache.commons.io.FileUtils -import scala.collection.JavaConverters._ +import org.eclipse.jgit.api.Git class ReleaseController extends ReleaseControllerBase @@ -87,10 +88,12 @@ get("/:owner/:repository/releases/:tag/create")(writableUsersOnly { repository => val tagName = params("tag") + val previousTags = repository.tags.takeWhile(_.name != tagName).reverse + repository.tags .find(_.name == tagName) .map { tag => - html.form(repository, tag, None) + html.form(repository, tag, previousTags.map(_.name), tag.message, None) } .getOrElse(NotFound()) }) @@ -123,14 +126,37 @@ redirect(s"/${repository.owner}/${repository.name}/releases/${tagName}") }) + get("/:owner/:repository/changelog/*...*")(writableUsersOnly { repository => + val Seq(previousTag, currentTag) = multiParams("splat") + val previousTagId = repository.tags.collectFirst { case x if x.name == previousTag => x.id }.getOrElse("") + + val commitLog = using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + val commits = JGitUtil.getCommitLog(git, previousTagId, currentTag).reverse + commits + .map { commit => + s"- ${commit.shortMessage} ${commit.id}" + } + .mkString("\n") + } + + commitLog + }) + get("/:owner/:repository/releases/:tag/edit")(writableUsersOnly { repository => val tagName = params("tag") + val previousTags = repository.tags.takeWhile(_.name != tagName).reverse (for { release <- getRelease(repository.owner, repository.name, tagName) tag <- repository.tags.find(_.name == tagName) } yield { - html.form(repository, tag, Some(release, getReleaseAssets(repository.owner, repository.name, tagName))) + html.form( + repository, + tag, + previousTags.map(_.name), + release.content.getOrElse(""), + Some(release, getReleaseAssets(repository.owner, repository.name, tagName)) + ) }).getOrElse(NotFound()) }) diff --git a/src/main/twirl/gitbucket/core/releases/form.scala.html b/src/main/twirl/gitbucket/core/releases/form.scala.html index 6fd8be2..a1c041a 100644 --- a/src/main/twirl/gitbucket/core/releases/form.scala.html +++ b/src/main/twirl/gitbucket/core/releases/form.scala.html @@ -1,5 +1,7 @@ @(repository: gitbucket.core.service.RepositoryService.RepositoryInfo, tag: gitbucket.core.util.JGitUtil.TagInfo, + tags: Seq[String], + content: String, release: Option[(gitbucket.core.model.ReleaseTag, Seq[gitbucket.core.model.ReleaseAsset])])(implicit context: gitbucket.core.controller.Context) @import gitbucket.core.view.helpers @gitbucket.core.html.main(s"New Release - ${repository.owner}/${repository.name}", Some(repository)){ @@ -14,9 +16,18 @@ } +
+ Previous tag: + +
@gitbucket.core.helper.html.preview( repository = repository, - content = release.flatMap { case (release, _) => release.content }.getOrElse(tag.message), + content = content, enableWikiLink = false, enableRefsLink = true, enableLineBreaks = true, @@ -74,5 +85,19 @@ $(file.previewElement).prevAll('div.dz-preview').addBack().remove(); } }); + + $('#insert-changelog-button').click(function(){ + var previousTag = $('#insert-changelog-tag option:selected').val(); + $.get('@context.path/@repository.owner/@repository.name/changelog/' + encodeURIComponent(previousTag) + '...@helpers.urlEncode(tag.name)', function(data){ + console.log(data); + var content = $('textarea[name=content]').val(); + if(content == ''){ + content = data; + } else { + content = content.trimRight() + '\n\n' + data; + } + $('textarea[name=content]').val(content); + }); + }); }); diff --git a/src/main/twirl/gitbucket/core/releases/list.scala.html b/src/main/twirl/gitbucket/core/releases/list.scala.html index 814db32..75e21af 100644 --- a/src/main/twirl/gitbucket/core/releases/list.scala.html +++ b/src/main/twirl/gitbucket/core/releases/list.scala.html @@ -37,7 +37,7 @@ }.getOrElse { @if(hasWritePermission){
- Create release + Create release
}
@tag.message

@@ -46,7 +46,7 @@ @release.map { case (release, assets) => @assets.map { asset =>
  • - @asset.label + @asset.label @helpers.readableSize(Some(asset.size))
  • }