diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index bcfae94..1054149 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -117,6 +117,12 @@ diff: Option[String] ) + case class TagForm( + commitId: String, + tagName: String, + message: Option[String] + ) + val uploadForm = mapping( "branch" -> trim(label("Branch", text(required))), "path" -> trim(label("Path", text())), @@ -153,6 +159,12 @@ "diff" -> optional(text()) )(CommentForm.apply) + val tagForm = mapping( + "commitId" -> trim(label("Commit id", text(required))), + "tagName" -> trim(label("Tag name", text(required))), + "message" -> trim(label("Message", optional(text()))) + )(TagForm.apply) + /** * Returns converted HTML from Markdown for preview. */ @@ -794,21 +806,25 @@ }) /** - * Creates a tag + * Displays the create tag dialog. */ - post("/:owner/:repository/tags")(writableUsersOnly { repository => - val tagName = params.getOrElse("name", halt(400)) - val message = params.getOrElse("message", halt(400)) - val commitId = params.getOrElse("commit", halt(400)) + get("/:owner/:repository/tag/:id")(writableUsersOnly { repository => + html.tag(params("id"), repository) + }) + + /** + * Creates a tag. + */ + post("/:owner/:repository/tag", tagForm)(writableUsersOnly { (form, repository) => using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => - JGitUtil.createTag(git, tagName, message, commitId) + JGitUtil.createTag(git, form.tagName, form.message, form.commitId) } match { case Right(message) => flash += "info" -> message - redirect(s"/${repository.owner}/${repository.name}/commit/${commitId}") + redirect(s"/${repository.owner}/${repository.name}/commit/${form.commitId}") case Left(message) => flash += "error" -> message - redirect(s"/${repository.owner}/${repository.name}/commit/${commitId}") + redirect(s"/${repository.owner}/${repository.name}/commit/${form.commitId}") } }) diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index 9413e06..bef631a 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -831,15 +831,16 @@ .find(_._1 != null) } - def createTag(git: Git, name: String, message: String, commitId: String) = { + def createTag(git: Git, name: String, message: Option[String], commitId: String) = { try { val objectId: ObjectId = git.getRepository.resolve(commitId) - val walk: RevWalk = new RevWalk(git.getRepository) - val tagCommand = git.tag().setName(name).setObjectId(walk.parseCommit(objectId)) - if (!message.isEmpty) { - tagCommand.setMessage(message) + using(new RevWalk(git.getRepository)) { walk => + val tagCommand = git.tag().setName(name).setObjectId(walk.parseCommit(objectId)) + message.foreach { message => + tagCommand.setMessage(message) + } + tagCommand.call() } - tagCommand.call() Right("Tag added.") } catch { case e: GitAPIException => Left("Sorry, some Git operation error occurs.") diff --git a/src/main/twirl/gitbucket/core/repo/commit.scala.html b/src/main/twirl/gitbucket/core/repo/commit.scala.html index e0e7d54..b0ebe76 100644 --- a/src/main/twirl/gitbucket/core/repo/commit.scala.html +++ b/src/main/twirl/gitbucket/core/repo/commit.scala.html @@ -20,21 +20,7 @@