mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-09 15:05:50 +01:00
Merge branch 'master' into plugin-system
Conflicts: src/main/scala/servlet/AutoUpdateListener.scala
This commit is contained in:
@@ -50,8 +50,8 @@
|
|||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="rename" depends="embed">
|
<target name="rename" depends="embed">
|
||||||
<rename src="${target.dir}/scala-${scala.version}/gitbucket_${scala.version}-${gitbucket.version}.war"
|
<move file="${target.dir}/scala-${scala.version}/gitbucket_${scala.version}-${gitbucket.version}.war"
|
||||||
dest="${target.dir}/scala-${scala.version}/gitbucket.war"/>
|
tofile="${target.dir}/scala-${scala.version}/gitbucket.war"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="all" depends="rename">
|
<target name="all" depends="rename">
|
||||||
|
|||||||
@@ -291,7 +291,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
* Create new repository.
|
* Create new repository.
|
||||||
*/
|
*/
|
||||||
post("/new", newRepositoryForm)(usersOnly { form =>
|
post("/new", newRepositoryForm)(usersOnly { form =>
|
||||||
LockUtil.lock(s"${form.owner}/${form.name}/create"){
|
LockUtil.lock(s"${form.owner}/${form.name}"){
|
||||||
if(getRepository(form.owner, form.name, context.baseUrl).isEmpty){
|
if(getRepository(form.owner, form.name, context.baseUrl).isEmpty){
|
||||||
val ownerAccount = getAccountByUserName(form.owner).get
|
val ownerAccount = getAccountByUserName(form.owner).get
|
||||||
val loginAccount = context.loginAccount.get
|
val loginAccount = context.loginAccount.get
|
||||||
@@ -354,7 +354,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
val loginAccount = context.loginAccount.get
|
val loginAccount = context.loginAccount.get
|
||||||
val loginUserName = loginAccount.userName
|
val loginUserName = loginAccount.userName
|
||||||
|
|
||||||
LockUtil.lock(s"${loginUserName}/${repository.name}/create"){
|
LockUtil.lock(s"${loginUserName}/${repository.name}"){
|
||||||
if(repository.owner == loginUserName || getRepository(loginAccount.userName, repository.name, baseUrl).isDefined){
|
if(repository.owner == loginUserName || getRepository(loginAccount.userName, repository.name, baseUrl).isDefined){
|
||||||
// redirect to the repository if repository already exists
|
// redirect to the repository if repository already exists
|
||||||
redirect(s"/${loginUserName}/${repository.name}")
|
redirect(s"/${loginUserName}/${repository.name}")
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ trait DashboardControllerBase extends ControllerBase {
|
|||||||
condition,
|
condition,
|
||||||
None,
|
None,
|
||||||
false),
|
false),
|
||||||
getPullRequestCountGroupByUser(condition.state == "closed", userName, None),
|
getPullRequestCountGroupByUser(condition.state == "closed", None, None),
|
||||||
getRepositoryNamesOfUser(userName).map { RepoName =>
|
getRepositoryNamesOfUser(userName).map { RepoName =>
|
||||||
(userName, RepoName, counts.collectFirst { case (_, RepoName, count) => count }.getOrElse(0))
|
(userName, RepoName, counts.collectFirst { case (_, RepoName, count) => count }.getOrElse(0))
|
||||||
}.sortBy(_._3).reverse,
|
}.sortBy(_._3).reverse,
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ trait IndexControllerBase extends ControllerBase {
|
|||||||
val loginAccount = context.loginAccount
|
val loginAccount = context.loginAccount
|
||||||
|
|
||||||
html.index(getRecentActivities(),
|
html.index(getRecentActivities(),
|
||||||
getVisibleRepositories(loginAccount, context.baseUrl),
|
getVisibleRepositories(loginAccount, context.baseUrl, withoutPhysicalInfo = true),
|
||||||
loginAccount.map{ account => getUserRepositories(account.userName, context.baseUrl) }.getOrElse(Nil)
|
loginAccount.map{ account => getUserRepositories(account.userName, context.baseUrl, withoutPhysicalInfo = true) }.getOrElse(Nil)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import org.eclipse.jgit.lib.{ObjectId, CommitBuilder, PersonIdent}
|
|||||||
import service.IssuesService._
|
import service.IssuesService._
|
||||||
import service.PullRequestService._
|
import service.PullRequestService._
|
||||||
import util.JGitUtil.DiffInfo
|
import util.JGitUtil.DiffInfo
|
||||||
import service.RepositoryService.RepositoryTreeNode
|
|
||||||
import util.JGitUtil.CommitInfo
|
import util.JGitUtil.CommitInfo
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import org.eclipse.jgit.merge.MergeStrategy
|
import org.eclipse.jgit.merge.MergeStrategy
|
||||||
@@ -124,7 +123,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
params("id").toIntOpt.flatMap { issueId =>
|
params("id").toIntOpt.flatMap { issueId =>
|
||||||
val owner = repository.owner
|
val owner = repository.owner
|
||||||
val name = repository.name
|
val name = repository.name
|
||||||
LockUtil.lock(s"${owner}/${name}/merge"){
|
LockUtil.lock(s"${owner}/${name}"){
|
||||||
getPullRequest(owner, name, issueId).map { case (issue, pullreq) =>
|
getPullRequest(owner, name, issueId).map { case (issue, pullreq) =>
|
||||||
using(Git.open(getRepositoryDir(owner, name))) { git =>
|
using(Git.open(getRepositoryDir(owner, name))) { git =>
|
||||||
// mark issue as merged and close.
|
// mark issue as merged and close.
|
||||||
@@ -367,7 +366,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
*/
|
*/
|
||||||
private def checkConflict(userName: String, repositoryName: String, branch: String,
|
private def checkConflict(userName: String, repositoryName: String, branch: String,
|
||||||
requestUserName: String, requestRepositoryName: String, requestBranch: String): Boolean = {
|
requestUserName: String, requestRepositoryName: String, requestBranch: String): Boolean = {
|
||||||
LockUtil.lock(s"${userName}/${repositoryName}/merge-check"){
|
LockUtil.lock(s"${userName}/${repositoryName}"){
|
||||||
using(Git.open(getRepositoryDir(requestUserName, requestRepositoryName))) { git =>
|
using(Git.open(getRepositoryDir(requestUserName, requestRepositoryName))) { git =>
|
||||||
val remoteRefName = s"refs/heads/${branch}"
|
val remoteRefName = s"refs/heads/${branch}"
|
||||||
val tmpRefName = s"refs/merge-check/${userName}/${branch}"
|
val tmpRefName = s"refs/merge-check/${userName}/${branch}"
|
||||||
@@ -403,7 +402,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
private def checkConflictInPullRequest(userName: String, repositoryName: String, branch: String,
|
private def checkConflictInPullRequest(userName: String, repositoryName: String, branch: String,
|
||||||
requestUserName: String, requestRepositoryName: String, requestBranch: String,
|
requestUserName: String, requestRepositoryName: String, requestBranch: String,
|
||||||
issueId: Int): Boolean = {
|
issueId: Int): Boolean = {
|
||||||
LockUtil.lock(s"${userName}/${repositoryName}/merge") {
|
LockUtil.lock(s"${userName}/${repositoryName}") {
|
||||||
using(Git.open(getRepositoryDir(userName, repositoryName))) { git =>
|
using(Git.open(getRepositoryDir(userName, repositoryName))) { git =>
|
||||||
// merge
|
// merge
|
||||||
val merger = MergeStrategy.RECURSIVE.newMerger(git.getRepository, true)
|
val merger = MergeStrategy.RECURSIVE.newMerger(git.getRepository, true)
|
||||||
@@ -466,7 +465,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
pulls.html.list(
|
pulls.html.list(
|
||||||
searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName),
|
searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName),
|
||||||
getPullRequestCountGroupByUser(condition.state == "closed", owner, Some(repoName)),
|
getPullRequestCountGroupByUser(condition.state == "closed", Some(owner), Some(repoName)),
|
||||||
userName,
|
userName,
|
||||||
page,
|
page,
|
||||||
countIssue(condition.copy(state = "open" ), filterUser, true, owner -> repoName),
|
countIssue(condition.copy(state = "open" ), filterUser, true, owner -> repoName),
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package app
|
|||||||
|
|
||||||
import service._
|
import service._
|
||||||
import util.Directory._
|
import util.Directory._
|
||||||
import util.{UsersAuthenticator, OwnerAuthenticator}
|
import util.{LockUtil, UsersAuthenticator, OwnerAuthenticator}
|
||||||
import jp.sf.amateras.scalatra.forms._
|
import jp.sf.amateras.scalatra.forms._
|
||||||
import org.apache.commons.io.FileUtils
|
import org.apache.commons.io.FileUtils
|
||||||
import org.scalatra.i18n.Messages
|
import org.scalatra.i18n.Messages
|
||||||
@@ -185,15 +185,17 @@ trait RepositorySettingsControllerBase extends ControllerBase {
|
|||||||
post("/:owner/:repository/settings/transfer", transferForm)(ownerOnly { (form, repository) =>
|
post("/:owner/:repository/settings/transfer", transferForm)(ownerOnly { (form, repository) =>
|
||||||
// Change repository owner
|
// Change repository owner
|
||||||
if(repository.owner != form.newOwner){
|
if(repository.owner != form.newOwner){
|
||||||
// Update database
|
LockUtil.lock(s"${repository.owner}/${repository.name}"){
|
||||||
renameRepository(repository.owner, repository.name, form.newOwner, repository.name)
|
// Update database
|
||||||
// Move git repository
|
renameRepository(repository.owner, repository.name, form.newOwner, repository.name)
|
||||||
defining(getRepositoryDir(repository.owner, repository.name)){ dir =>
|
// Move git repository
|
||||||
FileUtils.moveDirectory(dir, getRepositoryDir(form.newOwner, repository.name))
|
defining(getRepositoryDir(repository.owner, repository.name)){ dir =>
|
||||||
}
|
FileUtils.moveDirectory(dir, getRepositoryDir(form.newOwner, repository.name))
|
||||||
// Move wiki repository
|
}
|
||||||
defining(getWikiRepositoryDir(repository.owner, repository.name)){ dir =>
|
// Move wiki repository
|
||||||
FileUtils.moveDirectory(dir, getWikiRepositoryDir(form.newOwner, repository.name))
|
defining(getWikiRepositoryDir(repository.owner, repository.name)){ dir =>
|
||||||
|
FileUtils.moveDirectory(dir, getWikiRepositoryDir(form.newOwner, repository.name))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
redirect(s"/${form.newOwner}/${repository.name}")
|
redirect(s"/${form.newOwner}/${repository.name}")
|
||||||
@@ -203,12 +205,13 @@ trait RepositorySettingsControllerBase extends ControllerBase {
|
|||||||
* Delete the repository.
|
* Delete the repository.
|
||||||
*/
|
*/
|
||||||
post("/:owner/:repository/settings/delete")(ownerOnly { repository =>
|
post("/:owner/:repository/settings/delete")(ownerOnly { repository =>
|
||||||
deleteRepository(repository.owner, repository.name)
|
LockUtil.lock(s"${repository.owner}/${repository.name}"){
|
||||||
|
deleteRepository(repository.owner, repository.name)
|
||||||
FileUtils.deleteDirectory(getRepositoryDir(repository.owner, repository.name))
|
|
||||||
FileUtils.deleteDirectory(getWikiRepositoryDir(repository.owner, repository.name))
|
|
||||||
FileUtils.deleteDirectory(getTemporaryDir(repository.owner, repository.name))
|
|
||||||
|
|
||||||
|
FileUtils.deleteDirectory(getRepositoryDir(repository.owner, repository.name))
|
||||||
|
FileUtils.deleteDirectory(getWikiRepositoryDir(repository.owner, repository.name))
|
||||||
|
FileUtils.deleteDirectory(getTemporaryDir(repository.owner, repository.name))
|
||||||
|
}
|
||||||
redirect(s"/${repository.owner}")
|
redirect(s"/${repository.owner}")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ trait PullRequestService { self: IssuesService =>
|
|||||||
.map(pr => pr.commitIdTo ~ pr.commitIdFrom)
|
.map(pr => pr.commitIdTo ~ pr.commitIdFrom)
|
||||||
.update((commitIdTo, commitIdFrom))
|
.update((commitIdTo, commitIdFrom))
|
||||||
|
|
||||||
def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String]): List[PullRequestCount] =
|
def getPullRequestCountGroupByUser(closed: Boolean, owner: Option[String], repository: Option[String]): List[PullRequestCount] =
|
||||||
Query(PullRequests)
|
Query(PullRequests)
|
||||||
.innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) }
|
.innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) }
|
||||||
.filter { case (t1, t2) =>
|
.filter { case (t1, t2) =>
|
||||||
(t2.closed is closed.bind) &&
|
(t2.closed is closed.bind) &&
|
||||||
(t1.userName is owner.bind) &&
|
(t1.userName is owner.get.bind, owner.isDefined) &&
|
||||||
(t1.repositoryName is repository.get.bind, repository.isDefined)
|
(t1.repositoryName is repository.get.bind, repository.isDefined)
|
||||||
}
|
}
|
||||||
.groupBy { case (t1, t2) => t2.openedUserName }
|
.groupBy { case (t1, t2) => t2.openedUserName }
|
||||||
|
|||||||
@@ -155,13 +155,17 @@ trait RepositoryService { self: AccountService =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getUserRepositories(userName: String, baseUrl: String): List[RepositoryInfo] = {
|
def getUserRepositories(userName: String, baseUrl: String, withoutPhysicalInfo: Boolean = false): List[RepositoryInfo] = {
|
||||||
Query(Repositories).filter { t1 =>
|
Query(Repositories).filter { t1 =>
|
||||||
(t1.userName is userName.bind) ||
|
(t1.userName is userName.bind) ||
|
||||||
(Query(Collaborators).filter { t2 => t2.byRepository(t1.userName, t1.repositoryName) && (t2.collaboratorName is userName.bind)} exists)
|
(Query(Collaborators).filter { t2 => t2.byRepository(t1.userName, t1.repositoryName) && (t2.collaboratorName is userName.bind)} exists)
|
||||||
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
||||||
new RepositoryInfo(
|
new RepositoryInfo(
|
||||||
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl),
|
if(withoutPhysicalInfo){
|
||||||
|
new JGitUtil.RepositoryInfo(repository.userName, repository.repositoryName, baseUrl)
|
||||||
|
} else {
|
||||||
|
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl)
|
||||||
|
},
|
||||||
repository,
|
repository,
|
||||||
getForkedCount(
|
getForkedCount(
|
||||||
repository.originUserName.getOrElse(repository.userName),
|
repository.originUserName.getOrElse(repository.userName),
|
||||||
@@ -178,9 +182,12 @@ trait RepositoryService { self: AccountService =>
|
|||||||
* @param loginAccount the logged in account
|
* @param loginAccount the logged in account
|
||||||
* @param baseUrl the base url of this application
|
* @param baseUrl the base url of this application
|
||||||
* @param repositoryUserName the repository owner (if None then returns all repositories which are visible for logged in user)
|
* @param repositoryUserName the repository owner (if None then returns all repositories which are visible for logged in user)
|
||||||
|
* @param withoutPhysicalInfo if true then the result does not include physical repository information such as commit count,
|
||||||
|
* branches and tags
|
||||||
* @return the repository information which is sorted in descending order of lastActivityDate.
|
* @return the repository information which is sorted in descending order of lastActivityDate.
|
||||||
*/
|
*/
|
||||||
def getVisibleRepositories(loginAccount: Option[Account], baseUrl: String, repositoryUserName: Option[String] = None): List[RepositoryInfo] = {
|
def getVisibleRepositories(loginAccount: Option[Account], baseUrl: String, repositoryUserName: Option[String] = None,
|
||||||
|
withoutPhysicalInfo: Boolean = false): List[RepositoryInfo] = {
|
||||||
(loginAccount match {
|
(loginAccount match {
|
||||||
// for Administrators
|
// for Administrators
|
||||||
case Some(x) if(x.isAdmin) => Query(Repositories)
|
case Some(x) if(x.isAdmin) => Query(Repositories)
|
||||||
@@ -195,7 +202,11 @@ trait RepositoryService { self: AccountService =>
|
|||||||
repositoryUserName.map { userName => t.userName is userName.bind } getOrElse ConstColumn.TRUE
|
repositoryUserName.map { userName => t.userName is userName.bind } getOrElse ConstColumn.TRUE
|
||||||
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
||||||
new RepositoryInfo(
|
new RepositoryInfo(
|
||||||
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl),
|
if(withoutPhysicalInfo){
|
||||||
|
new JGitUtil.RepositoryInfo(repository.userName, repository.repositoryName, baseUrl)
|
||||||
|
} else {
|
||||||
|
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl)
|
||||||
|
},
|
||||||
repository,
|
repository,
|
||||||
getForkedCount(
|
getForkedCount(
|
||||||
repository.originUserName.getOrElse(repository.userName),
|
repository.originUserName.getOrElse(repository.userName),
|
||||||
|
|||||||
@@ -35,7 +35,11 @@ object JGitUtil {
|
|||||||
* @param branchList the list of branch names
|
* @param branchList the list of branch names
|
||||||
* @param tags the list of tags
|
* @param tags the list of tags
|
||||||
*/
|
*/
|
||||||
case class RepositoryInfo(owner: String, name: String, url: String, commitCount: Int, branchList: List[String], tags: List[TagInfo])
|
case class RepositoryInfo(owner: String, name: String, url: String, commitCount: Int, branchList: List[String], tags: List[TagInfo]){
|
||||||
|
def this(owner: String, name: String, baseUrl: String) = {
|
||||||
|
this(owner, name, s"${baseUrl}/git/${owner}/${name}.git", 0, Nil, Nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The file data for the file list of the repository viewer.
|
* The file data for the file list of the repository viewer.
|
||||||
|
|||||||
@@ -78,9 +78,9 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
}
|
}
|
||||||
<script type="text/javascript" src="@assets/jsdifflib/difflib.js"></script>
|
<script type="text/javascript" src="@assets/vendors/jsdifflib/difflib.js"></script>
|
||||||
<script type="text/javascript" src="@assets/jsdifflib/diffview.js"></script>
|
<script type="text/javascript" src="@assets/vendors/jsdifflib/diffview.js"></script>
|
||||||
<link href="@assets/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
<link href="@assets/vendors/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
||||||
<script>
|
<script>
|
||||||
$(function(){
|
$(function(){
|
||||||
@if(showIndex){
|
@if(showIndex){
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<link href="@assets/google-code-prettify/prettify.css" type="text/css" rel="stylesheet"/>
|
<link href="@assets/vendors/google-code-prettify/prettify.css" type="text/css" rel="stylesheet"/>
|
||||||
<script src="@assets/google-code-prettify/prettify.js"></script>
|
<script src="@assets/vendors/google-code-prettify/prettify.js"></script>
|
||||||
<script>
|
<script>
|
||||||
$(function(){
|
$(function(){
|
||||||
@if(elastic){
|
@if(elastic){
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ $(function(){
|
|||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
$('i.icon-remove-circle').click(function(){
|
$('.issue-comment-box i.icon-remove-circle').click(function(){
|
||||||
if(confirm('Are you sure you want to delete this?')) {
|
if(confirm('Are you sure you want to delete this?')) {
|
||||||
var id = $(this).closest('a').data('comment-id');
|
var id = $(this).closest('a').data('comment-id');
|
||||||
$.post('@url(repository)/issue_comments/delete/' + id,
|
$.post('@url(repository)/issue_comments/delete/' + id,
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ $(function(){
|
|||||||
$('#label-assigned').html($('<span>')
|
$('#label-assigned').html($('<span>')
|
||||||
.append($('<a class="username strong">').attr('href', '@path/' + userName).text(userName))
|
.append($('<a class="username strong">').attr('href', '@path/' + userName).text(userName))
|
||||||
.append(' will be assigned'));
|
.append(' will be assigned'));
|
||||||
$('a.assign[data-name=' + userName + '] i').attr('class', 'icon-ok');
|
$('a.assign[data-name=' + jqSelectorEscape(userName) + '] i').attr('class', 'icon-ok');
|
||||||
}
|
}
|
||||||
$('input[name=assignedUserName]').val(userName);
|
$('input[name=assignedUserName]').val(userName);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
$(function(){
|
$(function(){
|
||||||
var callback = function(data){
|
var callback = function(data){
|
||||||
$('#commentContent-@commentId').empty().html(data.content);
|
$('#commentContent-@commentId').empty().html(data.content);
|
||||||
|
prettyPrint();
|
||||||
};
|
};
|
||||||
|
|
||||||
$('#update-comment-@commentId').click(function(){
|
$('#update-comment-@commentId').click(function(){
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
</div>
|
</div>
|
||||||
@if(hasWritePermission){
|
@if(hasWritePermission){
|
||||||
@helper.html.dropdown() {
|
@helper.html.dropdown() {
|
||||||
<li><a href="javascript:void(0);" class="milestone" data-id=""><i class="icon-remove-circle"></i> No milestone</a></li>
|
<li><a href="javascript:void(0);" class="milestone" data-id=""><i class="icon-remove-circle"></i> Clear this milestone</a></li>
|
||||||
@milestones.filter(_._1.closedDate.isEmpty).map { case (milestone, _, _) =>
|
@milestones.filter(_._1.closedDate.isEmpty).map { case (milestone, _, _) =>
|
||||||
<li>
|
<li>
|
||||||
<a href="javascript:void(0);" class="milestone" data-id="@milestone.milestoneId" data-title="@milestone.title">
|
<a href="javascript:void(0);" class="milestone" data-id="@milestone.milestoneId" data-title="@milestone.title">
|
||||||
@@ -116,7 +116,7 @@ $(function(){
|
|||||||
.append($this.find('img.avatar').clone(false)).append(' ')
|
.append($this.find('img.avatar').clone(false)).append(' ')
|
||||||
.append($('<a class="username strong">').attr('href', '@path/' + userName).text(userName))
|
.append($('<a class="username strong">').attr('href', '@path/' + userName).text(userName))
|
||||||
.append(' is assigned');
|
.append(' is assigned');
|
||||||
$('a.assign[data-name=' + userName + '] i').attr('class', 'icon-ok');
|
$('a.assign[data-name=' + jqSelectorEscape(userName) + '] i').attr('class', 'icon-ok');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,26 +9,26 @@
|
|||||||
<link rel="icon" href="@assets/common/images/favicon.png" type="image/vnd.microsoft.icon" />
|
<link rel="icon" href="@assets/common/images/favicon.png" type="image/vnd.microsoft.icon" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<!-- Le styles -->
|
<!-- Le styles -->
|
||||||
<link href="@assets/bootstrap/css/bootstrap.css" rel="stylesheet">
|
<link href="@assets/vendors/bootstrap/css/bootstrap.css" rel="stylesheet">
|
||||||
<link href="@assets/bootstrap/css/bootstrap-responsive.css" rel="stylesheet">
|
<link href="@assets/vendors/bootstrap/css/bootstrap-responsive.css" rel="stylesheet">
|
||||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||||
<!--[if lt IE 9]>
|
<!--[if lt IE 9]>
|
||||||
<script src="@assets/bootstrap/js/html5shiv.js"></script>
|
<script src="@assets/vendors/bootstrap/js/html5shiv.js"></script>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<link href="@assets/datepicker/css/datepicker.css" rel="stylesheet">
|
<link href="@assets/vendors/datepicker/css/datepicker.css" rel="stylesheet">
|
||||||
<link href="@assets/colorpicker/css/bootstrap-colorpicker.css" rel="stylesheet">
|
<link href="@assets/vendors/colorpicker/css/bootstrap-colorpicker.css" rel="stylesheet">
|
||||||
<link href="@assets/google-code-prettify/prettify.css" type="text/css" rel="stylesheet"/>
|
<link href="@assets/vendors/google-code-prettify/prettify.css" type="text/css" rel="stylesheet"/>
|
||||||
<link href="@assets/common/css/gitbucket.css" rel="stylesheet">
|
<link href="@assets/common/css/gitbucket.css" rel="stylesheet">
|
||||||
<script src="@assets/common/js/jquery-1.9.1.js"></script>
|
<script src="@assets/vendors/jquery/jquery-1.9.1.js"></script>
|
||||||
<script src="@assets/common/js/dropzone.js"></script>
|
<script src="@assets/vendors/dropzone/dropzone.js"></script>
|
||||||
<script src="@assets/common/js/validation.js"></script>
|
<script src="@assets/common/js/validation.js"></script>
|
||||||
<script src="@assets/common/js/gitbucket.js"></script>
|
<script src="@assets/common/js/gitbucket.js"></script>
|
||||||
<script src="@assets/bootstrap/js/bootstrap.js"></script>
|
<script src="@assets/vendors/bootstrap/js/bootstrap.js"></script>
|
||||||
<script src="@assets/datepicker/js/bootstrap-datepicker.js"></script>
|
<script src="@assets/vendors/datepicker/js/bootstrap-datepicker.js"></script>
|
||||||
<script src="@assets/colorpicker/js/bootstrap-colorpicker.js"></script>
|
<script src="@assets/vendors/colorpicker/js/bootstrap-colorpicker.js"></script>
|
||||||
<script src="@assets/google-code-prettify/prettify.js"></script>
|
<script src="@assets/vendors/google-code-prettify/prettify.js"></script>
|
||||||
<script src="@assets/zclip/ZeroClipboard.min.js"></script>
|
<script src="@assets/vendors/zclip/ZeroClipboard.min.js"></script>
|
||||||
<script src="@assets/elastic/jquery.elastic.source.js"></script>
|
<script src="@assets/vendors/elastic/jquery.elastic.source.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<form id="search" action="@path/search" method="POST">
|
<form id="search" action="@path/search" method="POST">
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<ul class="nav nav-tabs fill-width pull-left" id="pullreq-tab">
|
<ul class="nav nav-tabs fill-width pull-left" id="pullreq-tab">
|
||||||
<li class="active"><a href="#conversation">Conversation</a></li>
|
<li class="active"><a href="#conversation">Conversation <span class="badge">@comments.size</span></a></li>
|
||||||
<li><a href="#commits">Commits <span class="badge">@commits.size</span></a></li>
|
<li><a href="#commits">Commits <span class="badge">@commits.size</span></a></li>
|
||||||
<li><a href="#files">Files Changed <span class="badge">@diffs.size</span></a></li>
|
<li><a href="#files">Files Changed <span class="badge">@diffs.size</span></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -77,7 +77,7 @@
|
|||||||
</table>
|
</table>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<script src="@assets/common/js/jquery.ba-hashchange.js"></script>
|
<script src="@assets/vendors/jquery/jquery.ba-hashchange.js"></script>
|
||||||
<script>
|
<script>
|
||||||
$(window).load(function(){
|
$(window).load(function(){
|
||||||
$(window).hashchange(function(){
|
$(window).hashchange(function(){
|
||||||
|
|||||||
@@ -51,9 +51,9 @@
|
|||||||
</form>
|
</form>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<script type="text/javascript" src="@assets/jsdifflib/difflib.js"></script>
|
<script type="text/javascript" src="@assets/vendors/jsdifflib/difflib.js"></script>
|
||||||
<script type="text/javascript" src="@assets/jsdifflib/diffview.js"></script>
|
<script type="text/javascript" src="@assets/vendors/jsdifflib/diffview.js"></script>
|
||||||
<link href="@assets/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
<link href="@assets/vendors/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
||||||
<script>
|
<script>
|
||||||
$(function(){
|
$(function(){
|
||||||
diffUsingJS('oldText', 'newText', 'diffText');
|
diffUsingJS('oldText', 'newText', 'diffText');
|
||||||
|
|||||||
@@ -68,10 +68,10 @@
|
|||||||
</form>
|
</form>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<script src="@assets/ace/ace.js" type="text/javascript" charset="utf-8"></script>
|
<script src="@assets/vendors/ace/ace.js" type="text/javascript" charset="utf-8"></script>
|
||||||
<script type="text/javascript" src="@assets/jsdifflib/difflib.js"></script>
|
<script type="text/javascript" src="@assets/vendors/jsdifflib/difflib.js"></script>
|
||||||
<script type="text/javascript" src="@assets/jsdifflib/diffview.js"></script>
|
<script type="text/javascript" src="@assets/vendors/jsdifflib/diffview.js"></script>
|
||||||
<link href="@assets/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
<link href="@assets/vendors/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
|
||||||
<script>
|
<script>
|
||||||
$(function(){
|
$(function(){
|
||||||
$('#editor').text($('#initial').val());
|
$('#editor').text($('#initial').val());
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
<div class="small">
|
<div class="small">
|
||||||
<strong>Clone this wiki locally</strong>
|
<strong>Clone this wiki locally</strong>
|
||||||
</div>
|
</div>
|
||||||
@helper.html.copy("repository-url-copy", repository.httpUrl){
|
@helper.html.copy("repository-url-copy", httpUrl(repository)){
|
||||||
<input type="text" value="@httpUrl(repository)" id="repository-url" style="width: 160px;" readonly>
|
<input type="text" value="@httpUrl(repository)" id="repository-url" style="width: 160px;" readonly>
|
||||||
}
|
}
|
||||||
@if(settings.ssh && loginAccount.isDefined){
|
@if(settings.ssh && loginAccount.isDefined){
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -3,7 +3,6 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
body {
|
body {
|
||||||
color: #333;
|
color: #333;
|
||||||
line-height: 100%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
li p {
|
li p {
|
||||||
|
|||||||
@@ -103,3 +103,7 @@ function diffUsingJS(oldTextId, newTextId, outputId) {
|
|||||||
viewType: 1
|
viewType: 1
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function jqSelectorEscape(val) {
|
||||||
|
return val.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, '\\$&');
|
||||||
|
}
|
||||||
@@ -59,6 +59,8 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
|||||||
|
|
||||||
var DiffHighlightRules = function() {
|
var DiffHighlightRules = function() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.$rules = {
|
this.$rules = {
|
||||||
"start" : [{
|
"start" : [{
|
||||||
regex: "^(?:\\*{15}|={67}|-{3}|\\+{3})$",
|
regex: "^(?:\\*{15}|={67}|-{3}|\\+{3})$",
|
||||||
7008
src/main/webapp/assets/vendors/ace/mode-jsoniq.js
vendored
Normal file
7008
src/main/webapp/assets/vendors/ace/mode-jsoniq.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user