Merge branch 'kounoike-pr-create-tag'

This commit is contained in:
Naoki Takezoe
2018-07-23 13:39:59 +09:00
4 changed files with 92 additions and 10 deletions

View File

@@ -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.
*/
@@ -542,7 +554,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")
)
}
}
@@ -791,6 +805,29 @@ trait RepositoryViewerControllerBase extends ControllerBase {
html.branches(branches, hasDeveloperRole(repository.owner, repository.name, context.loginAccount), repository)
})
/**
* Displays the create tag dialog.
*/
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, form.tagName, form.message, form.commitId)
} match {
case Right(message) =>
flash += "info" -> message
redirect(s"/${repository.owner}/${repository.name}/commit/${form.commitId}")
case Left(message) =>
flash += "error" -> message
redirect(s"/${repository.owner}/${repository.name}/commit/${form.commitId}")
}
})
/**
* Creates a branch.
*/

View File

@@ -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
@@ -836,6 +831,25 @@ object JGitUtil {
.find(_._1 != null)
}
def createTag(git: Git, name: String, message: Option[String], commitId: String) = {
try {
val objectId: ObjectId = git.getRepository.resolve(commitId)
using(new RevWalk(git.getRepository)) { walk =>
val tagCommand = git.tag().setName(name).setObjectId(walk.parseCommit(objectId))
message.foreach { message =>
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()

View File

@@ -6,17 +6,22 @@
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
@import gitbucket.core.model._
@gitbucket.core.html.main(commit.shortMessage, Some(repository)){
@gitbucket.core.html.menu("files", repository){
@gitbucket.core.html.menu("files", repository, None, info, error){
<table class="table table-bordered">
<tr>
<th class="box-header">
<div class="pull-right align-right">
<div class="pull-right align-right btn-group">
<a href="@helpers.url(repository)/tree/@commit.id" class="btn btn-default">Browse code</a>
@if(hasWritePermission) {
<a href="@helpers.url(repository)/tag/@commit.id" class="btn btn-default" rel="facebox">Add tag</a>
}
</div>
<div class="commit-log">@helpers.link(commit.summary, repository)</div>
@if(commit.description.isDefined){

View File

@@ -0,0 +1,26 @@
@(commitId: String,
repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.view.helpers
<h2 class="facebox-header">
Add tag
</h2>
<form action="@helpers.url(repository)/tag" id="tag" method="post" validate="true">
<fieldset style="margin-top: 20px;">
<div class="form-group">
<label class="control-label" for="tagName">Tag name</label>
<input type="text" id="tagName" name="tagName" class="form-control">
<span class="error" id="error-tagName"></span>
</div>
</fieldset>
<fieldset>
<div class="form-group">
<label class="control-label" for="message">Message</label>
<input type="text" id="message" name="message" class="form-control">
<span class="error" id="error-message"></span>
</div>
</fieldset>
<div class="text-right">
<input type="hidden" name="commitId" value="@commitId">
<input type="submit" class="btn btn-success" value="Add tag">
</div>
</form>