diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 3da3594..e8e967d 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -515,7 +515,9 @@ repository, diffs, oldCommitId, - hasDeveloperRole(repository.owner, repository.name, context.loginAccount) + hasDeveloperRole(repository.owner, repository.name, context.loginAccount), + flash.get("info"), + flash.get("error") ) } } @@ -731,6 +733,25 @@ }) /** + * 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. */ post("/:owner/:repository/branches")(writableUsersOnly { repository => diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index bb33431..0803150 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.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 @@ .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 0658bbf..62e19ce 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){