mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-13 17:05:50 +01:00
Merge branch 'rename-repository'
This commit is contained in:
@@ -113,7 +113,14 @@ trait CreateRepositoryControllerBase extends ControllerBase {
|
|||||||
val loginUserName = loginAccount.userName
|
val loginUserName = loginAccount.userName
|
||||||
|
|
||||||
LockUtil.lock(s"${loginUserName}/${repository.name}/create"){
|
LockUtil.lock(s"${loginUserName}/${repository.name}/create"){
|
||||||
if(getRepository(loginUserName, repository.name, baseUrl).isEmpty){
|
if(repository.owner == loginUserName){
|
||||||
|
// redirect to the repository
|
||||||
|
redirect(s"/${repository.owner}/${repository.name}")
|
||||||
|
} else {
|
||||||
|
getForkedRepositories(repository.owner, repository.name).find(_._1 == loginUserName).map { case (owner, name) =>
|
||||||
|
// redirect to the repository
|
||||||
|
redirect(s"/${owner}/${name}")
|
||||||
|
} getOrElse {
|
||||||
// Insert to the database at first
|
// Insert to the database at first
|
||||||
val originUserName = repository.repository.originUserName.getOrElse(repository.owner)
|
val originUserName = repository.repository.originUserName.getOrElse(repository.owner)
|
||||||
val originRepositoryName = repository.repository.originRepositoryName.getOrElse(repository.name)
|
val originRepositoryName = repository.repository.originRepositoryName.getOrElse(repository.name)
|
||||||
@@ -158,9 +165,10 @@ trait CreateRepositoryControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
// Record activity
|
// Record activity
|
||||||
recordForkActivity(repository.owner, repository.name, loginUserName)
|
recordForkActivity(repository.owner, repository.name, loginUserName)
|
||||||
}
|
|
||||||
// redirect to the repository
|
// redirect to the repository
|
||||||
redirect("/%s/%s".format(loginUserName, repository.name))
|
redirect(s"/${loginUserName}/${repository.name}")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
"targetUserName" -> trim(text(required, maxlength(100))),
|
"targetUserName" -> trim(text(required, maxlength(100))),
|
||||||
"targetBranch" -> trim(text(required, maxlength(100))),
|
"targetBranch" -> trim(text(required, maxlength(100))),
|
||||||
"requestUserName" -> trim(text(required, maxlength(100))),
|
"requestUserName" -> trim(text(required, maxlength(100))),
|
||||||
|
"requestRepositoryName" -> trim(text(required, maxlength(100))),
|
||||||
"requestBranch" -> trim(text(required, maxlength(100))),
|
"requestBranch" -> trim(text(required, maxlength(100))),
|
||||||
"commitIdFrom" -> trim(text(required, maxlength(40))),
|
"commitIdFrom" -> trim(text(required, maxlength(40))),
|
||||||
"commitIdTo" -> trim(text(required, maxlength(40)))
|
"commitIdTo" -> trim(text(required, maxlength(40)))
|
||||||
@@ -51,6 +52,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
targetUserName: String,
|
targetUserName: String,
|
||||||
targetBranch: String,
|
targetBranch: String,
|
||||||
requestUserName: String,
|
requestUserName: String,
|
||||||
|
requestRepositoryName: String,
|
||||||
requestBranch: String,
|
requestBranch: String,
|
||||||
commitIdFrom: String,
|
commitIdFrom: String,
|
||||||
commitIdTo: String)
|
commitIdTo: String)
|
||||||
@@ -213,73 +215,85 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/compare/*...*")(referrersOnly { repository =>
|
get("/:owner/:repository/compare/*...*")(referrersOnly { forkedRepository =>
|
||||||
val Seq(origin, forked) = multiParams("splat")
|
val Seq(origin, forked) = multiParams("splat")
|
||||||
val (originOwner, tmpOriginBranch) = parseCompareIdentifie(origin, repository.owner)
|
val (originOwner, tmpOriginBranch) = parseCompareIdentifie(origin, forkedRepository.owner)
|
||||||
val (forkedOwner, tmpForkedBranch) = parseCompareIdentifie(forked, repository.owner)
|
val (forkedOwner, tmpForkedBranch) = parseCompareIdentifie(forked, forkedRepository.owner)
|
||||||
|
|
||||||
(getRepository(originOwner, repository.name, baseUrl),
|
(for(
|
||||||
getRepository(forkedOwner, repository.name, baseUrl)) match {
|
originRepositoryName <- if(originOwner == forkedOwner){
|
||||||
case (Some(originRepository), Some(forkedRepository)) => {
|
Some(forkedRepository.name)
|
||||||
|
} else {
|
||||||
|
forkedRepository.repository.originRepositoryName.orElse {
|
||||||
|
getForkedRepositories(forkedRepository.owner, forkedRepository.name).find(_._1 == originOwner).map(_._2)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
originRepository <- getRepository(originOwner, originRepositoryName, baseUrl)
|
||||||
|
) yield {
|
||||||
using(
|
using(
|
||||||
Git.open(getRepositoryDir(originOwner, repository.name)),
|
Git.open(getRepositoryDir(originRepository.owner, originRepository.name)),
|
||||||
Git.open(getRepositoryDir(forkedOwner, repository.name))
|
Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))
|
||||||
){ case (oldGit, newGit) =>
|
){ case (oldGit, newGit) =>
|
||||||
val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2
|
val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2
|
||||||
val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2
|
val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2
|
||||||
|
|
||||||
val forkedId = getForkedCommitId(oldGit, newGit,
|
val forkedId = getForkedCommitId(oldGit, newGit,
|
||||||
originOwner, repository.name, originBranch,
|
originRepository.owner, originRepository.name, originBranch,
|
||||||
forkedOwner, repository.name, forkedBranch)
|
forkedRepository.owner, forkedRepository.name, forkedBranch)
|
||||||
|
|
||||||
val oldId = oldGit.getRepository.resolve(forkedId)
|
val oldId = oldGit.getRepository.resolve(forkedId)
|
||||||
val newId = newGit.getRepository.resolve(forkedBranch)
|
val newId = newGit.getRepository.resolve(forkedBranch)
|
||||||
|
|
||||||
val (commits, diffs) = getRequestCompareInfo(
|
val (commits, diffs) = getRequestCompareInfo(
|
||||||
originOwner, repository.name, oldId.getName,
|
originRepository.owner, originRepository.name, oldId.getName,
|
||||||
forkedOwner, repository.name, newId.getName)
|
forkedRepository.owner, forkedRepository.name, newId.getName)
|
||||||
|
|
||||||
pulls.html.compare(
|
pulls.html.compare(
|
||||||
commits,
|
commits,
|
||||||
diffs,
|
diffs,
|
||||||
repository.repository.originUserName.map { userName =>
|
(forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match {
|
||||||
userName :: getForkedRepositories(userName, repository.name)
|
case (Some(userName), Some(repositoryName)) => (userName, repositoryName) :: getForkedRepositories(userName, repositoryName)
|
||||||
} getOrElse List(repository.owner),
|
case _ => (forkedRepository.owner, forkedRepository.name) :: getForkedRepositories(forkedRepository.owner, forkedRepository.name)
|
||||||
|
},
|
||||||
originBranch,
|
originBranch,
|
||||||
forkedBranch,
|
forkedBranch,
|
||||||
oldId.getName,
|
oldId.getName,
|
||||||
newId.getName,
|
newId.getName,
|
||||||
repository,
|
forkedRepository,
|
||||||
originRepository,
|
originRepository,
|
||||||
forkedRepository,
|
forkedRepository,
|
||||||
hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
hasWritePermission(forkedRepository.owner, forkedRepository.name, context.loginAccount))
|
||||||
}
|
|
||||||
}
|
|
||||||
case _ => NotFound
|
|
||||||
}
|
}
|
||||||
|
}) getOrElse NotFound
|
||||||
})
|
})
|
||||||
|
|
||||||
ajaxGet("/:owner/:repository/compare/*...*/mergecheck")(collaboratorsOnly { repository =>
|
ajaxGet("/:owner/:repository/compare/*...*/mergecheck")(collaboratorsOnly { forkedRepository =>
|
||||||
val Seq(origin, forked) = multiParams("splat")
|
val Seq(origin, forked) = multiParams("splat")
|
||||||
val (originOwner, tmpOriginBranch) = parseCompareIdentifie(origin, repository.owner)
|
val (originOwner, tmpOriginBranch) = parseCompareIdentifie(origin, forkedRepository.owner)
|
||||||
val (forkedOwner, tmpForkedBranch) = parseCompareIdentifie(forked, repository.owner)
|
val (forkedOwner, tmpForkedBranch) = parseCompareIdentifie(forked, forkedRepository.owner)
|
||||||
|
|
||||||
(getRepository(originOwner, repository.name, baseUrl),
|
(for(
|
||||||
getRepository(forkedOwner, repository.name, baseUrl)) match {
|
originRepositoryName <- if(originOwner == forkedOwner){
|
||||||
case (Some(originRepository), Some(forkedRepository)) => {
|
Some(forkedRepository.name)
|
||||||
|
} else {
|
||||||
|
forkedRepository.repository.originRepositoryName.orElse {
|
||||||
|
getForkedRepositories(forkedRepository.owner, forkedRepository.name).find(_._1 == originOwner).map(_._2)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
originRepository <- getRepository(originOwner, originRepositoryName, baseUrl)
|
||||||
|
) yield {
|
||||||
using(
|
using(
|
||||||
Git.open(getRepositoryDir(originOwner, repository.name)),
|
Git.open(getRepositoryDir(originRepository.owner, originRepository.name)),
|
||||||
Git.open(getRepositoryDir(forkedOwner, repository.name))
|
Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))
|
||||||
){ case (oldGit, newGit) =>
|
){ case (oldGit, newGit) =>
|
||||||
val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2
|
val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2
|
||||||
val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2
|
val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2
|
||||||
|
|
||||||
pulls.html.mergecheck(
|
pulls.html.mergecheck(
|
||||||
checkConflict(originOwner, repository.name, originBranch, forkedOwner, repository.name, forkedBranch))
|
checkConflict(originRepository.owner, originRepository.name, originBranch,
|
||||||
}
|
forkedRepository.owner, forkedRepository.name, forkedBranch))
|
||||||
}
|
|
||||||
case _ => NotFound()
|
|
||||||
}
|
}
|
||||||
|
}) getOrElse NotFound
|
||||||
})
|
})
|
||||||
|
|
||||||
post("/:owner/:repository/pulls/new", pullRequestForm)(referrersOnly { (form, repository) =>
|
post("/:owner/:repository/pulls/new", pullRequestForm)(referrersOnly { (form, repository) =>
|
||||||
@@ -301,7 +315,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
issueId = issueId,
|
issueId = issueId,
|
||||||
originBranch = form.targetBranch,
|
originBranch = form.targetBranch,
|
||||||
requestUserName = form.requestUserName,
|
requestUserName = form.requestUserName,
|
||||||
requestRepositoryName = repository.name,
|
requestRepositoryName = form.requestRepositoryName,
|
||||||
requestBranch = form.requestBranch,
|
requestBranch = form.requestBranch,
|
||||||
commitIdFrom = form.commitIdFrom,
|
commitIdFrom = form.commitIdFrom,
|
||||||
commitIdTo = form.commitIdTo)
|
commitIdTo = form.commitIdTo)
|
||||||
@@ -309,7 +323,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
// fetch requested branch
|
// fetch requested branch
|
||||||
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
git.fetch
|
git.fetch
|
||||||
.setRemote(getRepositoryDir(form.requestUserName, repository.name).toURI.toString)
|
.setRemote(getRepositoryDir(form.requestUserName, form.requestRepositoryName).toURI.toString)
|
||||||
.setRefSpecs(new RefSpec(s"refs/heads/${form.requestBranch}:refs/pull/${issueId}/head"))
|
.setRefSpecs(new RefSpec(s"refs/heads/${form.requestBranch}:refs/pull/${issueId}/head"))
|
||||||
.call
|
.call
|
||||||
}
|
}
|
||||||
@@ -407,8 +421,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
private def getForkedCommitId(oldGit: Git, newGit: Git, userName: String, repositoryName: String, branch: String,
|
private def getForkedCommitId(oldGit: Git, newGit: Git, userName: String, repositoryName: String, branch: String,
|
||||||
requestUserName: String, requestRepositoryName: String, requestBranch: String): String =
|
requestUserName: String, requestRepositoryName: String, requestBranch: String): String =
|
||||||
JGitUtil.getCommitLogs(newGit, requestBranch, true){ commit =>
|
JGitUtil.getCommitLogs(newGit, requestBranch, true){ commit =>
|
||||||
existsCommitId(userName, repositoryName, commit.getName) &&
|
existsCommitId(userName, repositoryName, commit.getName) && JGitUtil.getBranchesOfCommit(oldGit, commit.getName).contains(branch)
|
||||||
JGitUtil.getBranchesOfCommit(oldGit, commit.getName).contains(branch)
|
|
||||||
}.head.id
|
}.head.id
|
||||||
|
|
||||||
private def getRequestCompareInfo(userName: String, repositoryName: String, branch: String,
|
private def getRequestCompareInfo(userName: String, repositoryName: String, branch: String,
|
||||||
|
|||||||
@@ -21,9 +21,10 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo
|
|||||||
with OwnerAuthenticator with UsersAuthenticator =>
|
with OwnerAuthenticator with UsersAuthenticator =>
|
||||||
|
|
||||||
// for repository options
|
// for repository options
|
||||||
case class OptionsForm(description: Option[String], defaultBranch: String, isPrivate: Boolean)
|
case class OptionsForm(repositoryName: String, description: Option[String], defaultBranch: String, isPrivate: Boolean)
|
||||||
|
|
||||||
val optionsForm = mapping(
|
val optionsForm = mapping(
|
||||||
|
"repositoryName" -> trim(label("Description" , text(required, maxlength(40), identifier, renameRepositoryName))),
|
||||||
"description" -> trim(label("Description" , optional(text()))),
|
"description" -> trim(label("Description" , optional(text()))),
|
||||||
"defaultBranch" -> trim(label("Default Branch" , text(required, maxlength(100)))),
|
"defaultBranch" -> trim(label("Default Branch" , text(required, maxlength(100)))),
|
||||||
"isPrivate" -> trim(label("Repository Type", boolean()))
|
"isPrivate" -> trim(label("Repository Type", boolean()))
|
||||||
@@ -43,6 +44,13 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo
|
|||||||
"url" -> trim(label("url", text(required, webHook)))
|
"url" -> trim(label("url", text(required, webHook)))
|
||||||
)(WebHookForm.apply)
|
)(WebHookForm.apply)
|
||||||
|
|
||||||
|
// for transfer ownership
|
||||||
|
case class TransferOwnerShipForm(newOwner: String)
|
||||||
|
|
||||||
|
val transferForm = mapping(
|
||||||
|
"newOwner" -> trim(label("New owner", text(required, transferUser)))
|
||||||
|
)(TransferOwnerShipForm.apply)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Redirect to the Options page.
|
* Redirect to the Options page.
|
||||||
*/
|
*/
|
||||||
@@ -70,8 +78,21 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo
|
|||||||
repository.repository.isPrivate
|
repository.repository.isPrivate
|
||||||
} getOrElse form.isPrivate
|
} getOrElse form.isPrivate
|
||||||
)
|
)
|
||||||
|
// Change repository name
|
||||||
|
if(repository.name != form.repositoryName){
|
||||||
|
// Update database
|
||||||
|
renameRepository(repository.owner, repository.name, repository.owner, form.repositoryName)
|
||||||
|
// Move git repository
|
||||||
|
defining(getRepositoryDir(repository.owner, repository.name)){ dir =>
|
||||||
|
FileUtils.moveDirectory(dir, getRepositoryDir(repository.owner, form.repositoryName))
|
||||||
|
}
|
||||||
|
// Move wiki repository
|
||||||
|
defining(getWikiRepositoryDir(repository.owner, repository.name)){ dir =>
|
||||||
|
FileUtils.moveDirectory(dir, getWikiRepositoryDir(repository.owner, form.repositoryName))
|
||||||
|
}
|
||||||
|
}
|
||||||
flash += "info" -> "Repository settings has been updated."
|
flash += "info" -> "Repository settings has been updated."
|
||||||
redirect(s"/${repository.owner}/${repository.name}/settings/options")
|
redirect(s"/${repository.owner}/${form.repositoryName}/settings/options")
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -153,10 +174,30 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo
|
|||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display the delete repository page.
|
* Display the danger zone.
|
||||||
*/
|
*/
|
||||||
get("/:owner/:repository/settings/delete")(ownerOnly {
|
get("/:owner/:repository/settings/danger")(ownerOnly {
|
||||||
settings.html.delete(_)
|
settings.html.danger(_)
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer repository ownership.
|
||||||
|
*/
|
||||||
|
post("/:owner/:repository/settings/transfer", transferForm)(ownerOnly { (form, repository) =>
|
||||||
|
// Change repository owner
|
||||||
|
if(repository.owner != form.newOwner){
|
||||||
|
// Update database
|
||||||
|
renameRepository(repository.owner, repository.name, form.newOwner, repository.name)
|
||||||
|
// Move git repository
|
||||||
|
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 =>
|
||||||
|
FileUtils.moveDirectory(dir, getWikiRepositoryDir(form.newOwner, repository.name))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
redirect(s"/${form.newOwner}/${repository.name}")
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -195,4 +236,32 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Duplicate check for the rename repository name.
|
||||||
|
*/
|
||||||
|
private def renameRepositoryName: Constraint = new Constraint(){
|
||||||
|
override def validate(name: String, value: String, params: Map[String, String], messages: Messages): Option[String] =
|
||||||
|
params.get("repository").filter(_ != value).flatMap { _ =>
|
||||||
|
params.get("owner").flatMap { userName =>
|
||||||
|
getRepositoryNamesOfUser(userName).find(_ == value).map(_ => "Repository already exists.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides Constraint to validate the repository transfer user.
|
||||||
|
*/
|
||||||
|
private def transferUser: Constraint = new Constraint(){
|
||||||
|
override def validate(name: String, value: String, messages: Messages): Option[String] =
|
||||||
|
getAccountByUserName(value) match {
|
||||||
|
case None => Some("User does not exist.")
|
||||||
|
case Some(x) => if(x.userName == params("owner")){
|
||||||
|
Some("This is current repository owner.")
|
||||||
|
} else {
|
||||||
|
params.get("repository").flatMap { repositoryName =>
|
||||||
|
getRepositoryNamesOfUser(x.userName).find(_ == repositoryName).map{ _ => "User already has same repository." }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -39,6 +39,67 @@ trait RepositoryService { self: AccountService =>
|
|||||||
IssueId insert (userName, repositoryName, 0)
|
IssueId insert (userName, repositoryName, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def renameRepository(oldUserName: String, oldRepositoryName: String, newUserName: String, newRepositoryName: String): Unit = {
|
||||||
|
(Query(Repositories) filter { t => t.byRepository(oldUserName, oldRepositoryName) } firstOption).map { repository =>
|
||||||
|
Repositories insert repository.copy(userName = newUserName, repositoryName = newRepositoryName)
|
||||||
|
|
||||||
|
val webHooks = Query(WebHooks ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val milestones = Query(Milestones ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val issueId = Query(IssueId ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val issues = Query(Issues ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val pullRequests = Query(PullRequests ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val labels = Query(Labels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val issueComments = Query(IssueComments).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val issueLabels = Query(IssueLabels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val collaborators = Query(Collaborators).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val commitLog = Query(CommitLog ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
val activities = Query(Activities ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
|
||||||
|
Repositories.filter { t =>
|
||||||
|
(t.originUserName is oldUserName.bind) && (t.originRepositoryName is oldRepositoryName.bind)
|
||||||
|
}.map { t => t.originUserName ~ t.originRepositoryName }.update(newUserName, newRepositoryName)
|
||||||
|
|
||||||
|
Repositories.filter { t =>
|
||||||
|
(t.parentUserName is oldUserName.bind) && (t.parentRepositoryName is oldRepositoryName.bind)
|
||||||
|
}.map { t => t.originUserName ~ t.originRepositoryName }.update(newUserName, newRepositoryName)
|
||||||
|
|
||||||
|
PullRequests.filter { t =>
|
||||||
|
t.requestRepositoryName is oldRepositoryName.bind
|
||||||
|
}.map { t => t.requestUserName ~ t.requestRepositoryName }.update(newUserName, newRepositoryName)
|
||||||
|
|
||||||
|
deleteRepository(oldUserName, oldRepositoryName)
|
||||||
|
|
||||||
|
WebHooks .insertAll(webHooks .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
Milestones .insertAll(milestones .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
IssueId .insertAll(issueId .map(_.copy(_1 = newUserName, _2 = newRepositoryName)) :_*)
|
||||||
|
Issues .insertAll(issues .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
PullRequests .insertAll(pullRequests .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
IssueComments .insertAll(issueComments .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
Labels .insertAll(labels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
IssueLabels .insertAll(issueLabels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
Collaborators .insertAll(collaborators .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
CommitLog .insertAll(commitLog .map(_.copy(_1 = newUserName, _2 = newRepositoryName)) :_*)
|
||||||
|
Activities .insertAll(activities .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*)
|
||||||
|
|
||||||
|
// Update activity messages
|
||||||
|
val updateActivities = Activities.filter { t =>
|
||||||
|
(t.message like s"%:${oldUserName}/${oldRepositoryName}]%") ||
|
||||||
|
(t.message like s"%:${oldUserName}/${oldRepositoryName}#%")
|
||||||
|
}.map { t => t.activityId ~ t.message }.list
|
||||||
|
|
||||||
|
updateActivities.foreach { case (activityId, message) =>
|
||||||
|
Activities.filter(_.activityId is activityId.bind).map(_.message).update(
|
||||||
|
message
|
||||||
|
.replace(s"[repo:${oldUserName}/${oldRepositoryName}]" ,s"[repo:${newUserName}/${newRepositoryName}]")
|
||||||
|
.replace(s"[branch:${oldUserName}/${oldRepositoryName}#" ,s"[branch:${newUserName}/${newRepositoryName}#")
|
||||||
|
.replace(s"[tag:${oldUserName}/${oldRepositoryName}#" ,s"[tag:${newUserName}/${newRepositoryName}#")
|
||||||
|
.replace(s"[pullreq:${oldUserName}/${oldRepositoryName}#",s"[pullreq:${newUserName}/${newRepositoryName}#")
|
||||||
|
.replace(s"[issue:${oldUserName}/${oldRepositoryName}#" ,s"[issue:${newUserName}/${newRepositoryName}#")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def deleteRepository(userName: String, repositoryName: String): Unit = {
|
def deleteRepository(userName: String, repositoryName: String): Unit = {
|
||||||
Activities .filter(_.byRepository(userName, repositoryName)).delete
|
Activities .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
CommitLog .filter(_.byRepository(userName, repositoryName)).delete
|
CommitLog .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
@@ -207,11 +268,11 @@ trait RepositoryService { self: AccountService =>
|
|||||||
}.length).first
|
}.length).first
|
||||||
|
|
||||||
|
|
||||||
def getForkedRepositories(userName: String, repositoryName: String): List[String] =
|
def getForkedRepositories(userName: String, repositoryName: String): List[(String, String)] =
|
||||||
Query(Repositories).filter { t =>
|
Query(Repositories).filter { t =>
|
||||||
(t.originUserName is userName.bind) && (t.originRepositoryName is repositoryName.bind)
|
(t.originUserName is userName.bind) && (t.originRepositoryName is repositoryName.bind)
|
||||||
}
|
}
|
||||||
.sortBy(_.userName asc).map(_.userName).list
|
.sortBy(_.userName asc).map(t => t.userName ~ t.repositoryName).list
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
@(commits: Seq[Seq[util.JGitUtil.CommitInfo]],
|
@(commits: Seq[Seq[util.JGitUtil.CommitInfo]],
|
||||||
diffs: Seq[util.JGitUtil.DiffInfo],
|
diffs: Seq[util.JGitUtil.DiffInfo],
|
||||||
members: List[String],
|
members: List[(String, String)],
|
||||||
originId: String,
|
originId: String,
|
||||||
forkedId: String,
|
forkedId: String,
|
||||||
sourceId: String,
|
sourceId: String,
|
||||||
@@ -20,25 +20,25 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="compare-edit" style="display: none;">
|
<div id="compare-edit" style="display: none;">
|
||||||
<a href="#" id="cancel-condition-editing" class="pull-right"><i class="icon-remove-circle"></i></a>
|
<a href="#" id="cancel-condition-editing" class="pull-right"><i class="icon-remove-circle"></i></a>
|
||||||
@helper.html.dropdown(originRepository.owner + "/" + repository.name, "base fork") {
|
@helper.html.dropdown(originRepository.owner + "/" + originRepository.name, "base fork") {
|
||||||
@members.map { member =>
|
@members.map { case (owner, name) =>
|
||||||
<li><a href="#" class="origin-owner" data-name="@member">@helper.html.checkicon(member == originRepository.owner) @member/@repository.name</a></li>
|
<li><a href="#" class="origin-owner" data-owner="@owner" data-name="@name">@helper.html.checkicon(owner == originRepository.owner) @owner/@name</a></li>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@helper.html.dropdown(originId, "base") {
|
@helper.html.dropdown(originId, "base") {
|
||||||
@originRepository.branchList.map { branch =>
|
@originRepository.branchList.map { branch =>
|
||||||
<li><a href="#" class="origin-branch" data-name="@encodeRefName(branch)">@helper.html.checkicon(branch == originId) @branch</a></li>
|
<li><a href="#" class="origin-branch" data-branch="@encodeRefName(branch)">@helper.html.checkicon(branch == originId) @branch</a></li>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
...
|
...
|
||||||
@helper.html.dropdown(forkedRepository.owner + "/" + repository.name, "head fork") {
|
@helper.html.dropdown(forkedRepository.owner + "/" + forkedRepository.name, "head fork") {
|
||||||
@members.map { member =>
|
@members.map { case (owner, name) =>
|
||||||
<li><a href="#" class="forked-owner" data-name="@member">@helper.html.checkicon(member == forkedRepository.owner) @member/@repository.name</a></li>
|
<li><a href="#" class="forked-owner" data-owner="@owner" data-name="@name">@helper.html.checkicon(owner == forkedRepository.owner) @owner/@name</a></li>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@helper.html.dropdown(forkedId, "compare") {
|
@helper.html.dropdown(forkedId, "compare") {
|
||||||
@forkedRepository.branchList.map { branch =>
|
@forkedRepository.branchList.map { branch =>
|
||||||
<li><a href="#" class="forked-branch" data-name="@encodeRefName(branch)">@helper.html.checkicon(branch == forkedId) @branch</a></li>
|
<li><a href="#" class="forked-branch" data-branch="@encodeRefName(branch)">@helper.html.checkicon(branch == forkedId) @branch</a></li>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="pull-request-form" class="box" style="display: none;">
|
<div id="pull-request-form" class="box" style="display: none;">
|
||||||
<div class="box-content">
|
<div class="box-content">
|
||||||
<form method="POST" action="@path/@originRepository.owner/@repository.name/pulls/new" validate="true">
|
<form method="POST" action="@path/@originRepository.owner/@originRepository.name/pulls/new" validate="true">
|
||||||
<div style="width: 260px; position: absolute; margin-left: 635px;">
|
<div style="width: 260px; position: absolute; margin-left: 635px;">
|
||||||
<div class="check-conflict" style="display: none;">
|
<div class="check-conflict" style="display: none;">
|
||||||
<img src="@assets/common/images/indicator.gif"/> Checking...
|
<img src="@assets/common/images/indicator.gif"/> Checking...
|
||||||
@@ -62,6 +62,7 @@
|
|||||||
<input type="hidden" name="targetUserName" value="@originRepository.owner"/>
|
<input type="hidden" name="targetUserName" value="@originRepository.owner"/>
|
||||||
<input type="hidden" name="targetBranch" value="@originId"/>
|
<input type="hidden" name="targetBranch" value="@originId"/>
|
||||||
<input type="hidden" name="requestUserName" value="@forkedRepository.owner"/>
|
<input type="hidden" name="requestUserName" value="@forkedRepository.owner"/>
|
||||||
|
<input type="hidden" name="requestRepositoryName" value="@forkedRepository.name"/>
|
||||||
<input type="hidden" name="requestBranch" value="@forkedId"/>
|
<input type="hidden" name="requestBranch" value="@forkedId"/>
|
||||||
<input type="hidden" name="commitIdFrom" value="@sourceId"/>
|
<input type="hidden" name="commitIdFrom" value="@sourceId"/>
|
||||||
<input type="hidden" name="commitIdTo" value="@commitId"/>
|
<input type="hidden" name="commitIdTo" value="@commitId"/>
|
||||||
@@ -104,14 +105,16 @@ $(function(){
|
|||||||
|
|
||||||
@if(members.isEmpty){
|
@if(members.isEmpty){
|
||||||
location.href = '@url(repository)/compare/' +
|
location.href = '@url(repository)/compare/' +
|
||||||
$.trim($('i.icon-ok').parents('a.origin-branch').data('name')) + '...' +
|
$.trim($('i.icon-ok').parents('a.origin-branch').data('branch')) + '...' +
|
||||||
$.trim($('i.icon-ok').parents('a.forked-branch').data('name'));
|
$.trim($('i.icon-ok').parents('a.forked-branch').data('branch'));
|
||||||
} else {
|
} else {
|
||||||
location.href = '@url(repository)/compare/' +
|
location.href = '@path/' +
|
||||||
$.trim($('i.icon-ok').parents('a.origin-owner' ).data('name')) + ':' +
|
$.trim($('i.icon-ok').parents('a.forked-owner' ).data('owner')) + '/' +
|
||||||
$.trim($('i.icon-ok').parents('a.origin-branch').data('name')) + '...' +
|
$.trim($('i.icon-ok').parents('a.forked-owner' ).data('name')) +'/compare/' +
|
||||||
$.trim($('i.icon-ok').parents('a.forked-owner' ).data('name')) + ':' +
|
$.trim($('i.icon-ok').parents('a.origin-owner' ).data('owner')) + ':' +
|
||||||
$.trim($('i.icon-ok').parents('a.forked-branch').data('name'));
|
$.trim($('i.icon-ok').parents('a.origin-branch').data('branch')) + '...' +
|
||||||
|
$.trim($('i.icon-ok').parents('a.forked-owner' ).data('owner')) + ':' +
|
||||||
|
$.trim($('i.icon-ok').parents('a.forked-branch').data('branch'));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -129,15 +132,15 @@ $(function(){
|
|||||||
|
|
||||||
@if(members.isEmpty){
|
@if(members.isEmpty){
|
||||||
checkConflict(
|
checkConflict(
|
||||||
$.trim($('i.icon-ok').parents('a.origin-branch').data('name')),
|
$.trim($('i.icon-ok').parents('a.origin-branch').data('branch')),
|
||||||
$.trim($('i.icon-ok').parents('a.forked-branch').data('name'))
|
$.trim($('i.icon-ok').parents('a.forked-branch').data('branch'))
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
checkConflict(
|
checkConflict(
|
||||||
$.trim($('i.icon-ok').parents('a.origin-owner' ).data('name')) + ":" +
|
$.trim($('i.icon-ok').parents('a.origin-owner' ).data('owner')) + ":" +
|
||||||
$.trim($('i.icon-ok').parents('a.origin-branch').data('name')),
|
$.trim($('i.icon-ok').parents('a.origin-branch').data('branch')),
|
||||||
$.trim($('i.icon-ok').parents('a.forked-owner' ).data('name')) + ":" +
|
$.trim($('i.icon-ok').parents('a.forked-owner' ).data('owner')) + ":" +
|
||||||
$.trim($('i.icon-ok').parents('a.forked-branch').data('name'))
|
$.trim($('i.icon-ok').parents('a.forked-branch').data('branch'))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@(originRepository: Option[service.RepositoryService.RepositoryInfo],
|
@(originRepository: Option[service.RepositoryService.RepositoryInfo],
|
||||||
members: List[String],
|
members: List[(String, String)],
|
||||||
repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
|
repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@@ -23,11 +23,11 @@
|
|||||||
}
|
}
|
||||||
(origin)
|
(origin)
|
||||||
</div>
|
</div>
|
||||||
@members.map { owner =>
|
@members.map { case (owner, name) =>
|
||||||
<div class="block">
|
<div class="block">
|
||||||
@avatar(owner, 20)
|
@avatar(owner, 20)
|
||||||
<span@if(repository.owner == owner){ class="highlight"}>
|
<span@if(repository.owner == owner){ class="highlight"}>
|
||||||
<a href="@url(owner)">@owner</a> / <a href="@path/@owner/@repository.name">@repository.name</a>
|
<a href="@url(owner)">@owner</a> / <a href="@path/@owner/@name">@name</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
44
src/main/twirl/settings/danger.scala.html
Normal file
44
src/main/twirl/settings/danger.scala.html
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
@(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
|
||||||
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
|
@html.main("Danger Zone", Some(repository)){
|
||||||
|
@html.header("settings", repository)
|
||||||
|
@menu("danger", repository){
|
||||||
|
<div class="box">
|
||||||
|
<div class="box-header">Danger Zone</div>
|
||||||
|
<div class="box-content">
|
||||||
|
<form id="transfer-form" method="post" action="@url(repository)/settings/transfer" validate="true" autocomplete="off">
|
||||||
|
<fieldset>
|
||||||
|
<label class="strong">Transfer Ownership</label>
|
||||||
|
<div>
|
||||||
|
Transfer this repo to another user or to group.
|
||||||
|
<div class="pull-right">
|
||||||
|
@helper.html.account("newOwner", 150)
|
||||||
|
<input type="submit" class="btn btn-danger" value="Transfer"/>
|
||||||
|
<div>
|
||||||
|
<span id="error-newOwner" class="error"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
<form id="delete-form" method="post" action="@url(repository)/settings/delete">
|
||||||
|
<fieldset class="margin">
|
||||||
|
<label class="strong">Delete repository</label>
|
||||||
|
<div>
|
||||||
|
Once you delete a repository, there is no going back.
|
||||||
|
<input type="submit" class="btn btn-danger pull-right" value="Delete this repository"/>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<script>
|
||||||
|
$(function(){
|
||||||
|
$('#delete-form').submit(function(){
|
||||||
|
return confirm('Once you delete a repository, there is no going back.\nAre you sure?');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
@(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
|
|
||||||
@import context._
|
|
||||||
@import view.helpers._
|
|
||||||
@html.main("Delete Repository", Some(repository)){
|
|
||||||
@html.header("settings", repository)
|
|
||||||
@menu("delete", repository){
|
|
||||||
<form id="form" method="post" action="@url(repository)/settings/delete">
|
|
||||||
<h3>Delete repository</h3>
|
|
||||||
<p>
|
|
||||||
Once you delete a repository, there is no going back.
|
|
||||||
</p>
|
|
||||||
<input type="submit" class="btn btn-danger" value="Delete this repository"/>
|
|
||||||
</form>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<script>
|
|
||||||
$(function(){
|
|
||||||
$('#form').submit(function(){
|
|
||||||
return confirm('Once you delete a repository, there is no going back.\nAre you sure?');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
@@ -14,8 +14,8 @@
|
|||||||
<li@if(active=="hooks"){ class="active"}>
|
<li@if(active=="hooks"){ class="active"}>
|
||||||
<a href="@url(repository)/settings/hooks">Service Hooks</a>
|
<a href="@url(repository)/settings/hooks">Service Hooks</a>
|
||||||
</li>
|
</li>
|
||||||
<li@if(active=="delete"){ class="active"}>
|
<li@if(active=="danger"){ class="active"}>
|
||||||
<a href="@url(repository)/settings/delete">Delete Repository</a>
|
<a href="@url(repository)/settings/danger">Danger Zone</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,6 +10,11 @@
|
|||||||
<div class="box-header">Settings</div>
|
<div class="box-header">Settings</div>
|
||||||
<div class="box-content">
|
<div class="box-content">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
|
<label for="repositoryName" class="strong">Repository Name:</label>
|
||||||
|
<input type="text" name="repositoryName" id="repositoryName" value="@repository.name"/>
|
||||||
|
<span id="error-repositoryName" class="error"></span>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset class="margin">
|
||||||
<label for="description" class="strong">Description:</label>
|
<label for="description" class="strong">Description:</label>
|
||||||
<input type="text" name="description" id="description" style="width: 600px;" value="@repository.repository.description"/>
|
<input type="text" name="description" id="description" style="width: 600px;" value="@repository.repository.description"/>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|||||||
Reference in New Issue
Block a user