From d224fc1c5ff54ef2326e27681963397217bf9784 Mon Sep 17 00:00:00 2001 From: KOUNOIKE Yuusuke Date: Mon, 23 Apr 2018 00:10:49 +0900 Subject: [PATCH 1/2] add tag on commit. close #1265 --- .../RepositoryViewerController.scala | 23 ++++++++++++++++- .../scala/gitbucket/core/util/JGitUtil.scala | 25 ++++++++++++++----- .../gitbucket/core/repo/commit.scala.html | 25 ++++++++++++++++--- 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 3da3594f9..e8e967ddd 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -515,7 +515,9 @@ trait RepositoryViewerControllerBase extends ControllerBase { repository, diffs, oldCommitId, - hasDeveloperRole(repository.owner, repository.name, context.loginAccount) + hasDeveloperRole(repository.owner, repository.name, context.loginAccount), + flash.get("info"), + flash.get("error") ) } } @@ -730,6 +732,25 @@ trait RepositoryViewerControllerBase extends ControllerBase { html.branches(branches, hasDeveloperRole(repository.owner, repository.name, context.loginAccount), repository) }) + /** + * Creates a tag + */ + 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)) + using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + JGitUtil.createTag(git, tagName, message, commitId) + } match { + case Right(message) => + flash += "info" -> message + redirect(s"/${repository.owner}/${repository.name}/commit/${commitId}") + case Left(message) => + flash += "error" -> message + redirect(s"/${repository.owner}/${repository.name}/commit/${commitId}") + } + }) + /** * Creates a branch. */ diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index bb33431f6..0803150c3 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -23,12 +23,7 @@ import java.util.concurrent.TimeUnit import java.util.function.Consumer import org.cache2k.Cache2kBuilder -import org.eclipse.jgit.api.errors.{ - InvalidRefNameException, - JGitInternalException, - NoHeadException, - RefAlreadyExistsException -} +import org.eclipse.jgit.api.errors._ import org.eclipse.jgit.diff.{DiffEntry, DiffFormatter, RawTextComparator} import org.eclipse.jgit.dircache.DirCacheEntry import org.eclipse.jgit.util.io.DisabledOutputStream @@ -816,6 +811,24 @@ object JGitUtil { .find(_._1 != null) } + def createTag(git: Git, name: String, message: 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) + } + tagCommand.call() + Right("Tag added.") + } catch { + case e: GitAPIException => Left("Sorry, some Git operation error occurs.") + case e: ConcurrentRefUpdateException => Left("Sorry some error occurs.") + case e: InvalidTagNameException => Left("Sorry, that name is invalid.") + case e: NoHeadException => Left("Sorry, this repo doesn't have HEAD reference") + } + } + def createBranch(git: Git, fromBranch: String, newBranch: String) = { try { git.branchCreate().setStartPoint(fromBranch).setName(newBranch).call() diff --git a/src/main/twirl/gitbucket/core/repo/commit.scala.html b/src/main/twirl/gitbucket/core/repo/commit.scala.html index 0658bbf02..62e19ce5f 100644 --- a/src/main/twirl/gitbucket/core/repo/commit.scala.html +++ b/src/main/twirl/gitbucket/core/repo/commit.scala.html @@ -6,16 +6,35 @@ repository: gitbucket.core.service.RepositoryService.RepositoryInfo, diffs: Seq[gitbucket.core.util.JGitUtil.DiffInfo], oldCommitId: Option[String], - hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context) + hasWritePermission: Boolean, + info: Option[Any] = None, + error: Option[Any] = None)(implicit context: gitbucket.core.controller.Context) @import gitbucket.core.view.helpers @import gitbucket.core.view.helpers.RichHtmlSeq @gitbucket.core.html.main(commit.shortMessage, Some(repository)){ - @gitbucket.core.html.menu("files", repository){ + @gitbucket.core.html.menu("files", repository, None, info, error){
-
+
Browse code + @if(hasWritePermission) { + + + }
@helpers.link(commit.summary, repository)
@if(commit.description.isDefined){ From a5e130db0b879bfb7e648fa9c2578f5af0fa1f23 Mon Sep 17 00:00:00 2001 From: Naoki Takezoe Date: Mon, 23 Jul 2018 13:32:46 +0900 Subject: [PATCH 2/2] Change the create tag form to a dialog --- .../RepositoryViewerController.scala | 32 ++++++++++++++----- .../scala/gitbucket/core/util/JGitUtil.scala | 13 ++++---- .../gitbucket/core/repo/commit.scala.html | 16 +--------- .../twirl/gitbucket/core/repo/tag.scala.html | 26 +++++++++++++++ 4 files changed, 58 insertions(+), 29 deletions(-) create mode 100644 src/main/twirl/gitbucket/core/repo/tag.scala.html diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index bcfae94b0..105414904 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -117,6 +117,12 @@ trait RepositoryViewerControllerBase extends ControllerBase { 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 @@ trait RepositoryViewerControllerBase extends ControllerBase { "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 @@ trait RepositoryViewerControllerBase extends ControllerBase { }) /** - * 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 9413e0608..bef631af6 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -831,15 +831,16 @@ object JGitUtil { .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 e0e7d54ed..b0ebe7651 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 @@
Browse code @if(hasWritePermission) { - - + Add tag }
@helpers.link(commit.summary, repository)
diff --git a/src/main/twirl/gitbucket/core/repo/tag.scala.html b/src/main/twirl/gitbucket/core/repo/tag.scala.html new file mode 100644 index 000000000..6f40e9bd1 --- /dev/null +++ b/src/main/twirl/gitbucket/core/repo/tag.scala.html @@ -0,0 +1,26 @@ +@(commitId: String, + repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit context: gitbucket.core.controller.Context) +@import gitbucket.core.view.helpers +

+ Add tag +

+
+
+
+ + + +
+
+
+
+ + + +
+
+
+ + +
+