mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 21:45:50 +01:00
(refs #102)Experimental implementation of transfer repository ownership
This commit is contained in:
@@ -44,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))) // TODO user and repository existence check
|
||||||
|
)(TransferOwnerShipForm.apply)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Redirect to the Options page.
|
* Redirect to the Options page.
|
||||||
*/
|
*/
|
||||||
@@ -166,6 +173,34 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo
|
|||||||
redirect(s"/${repository.owner}/${repository.name}/settings/hooks")
|
redirect(s"/${repository.owner}/${repository.name}/settings/hooks")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the transfer ownership page.
|
||||||
|
*/
|
||||||
|
get("/:owner/:repository/settings/transfer")(ownerOnly {
|
||||||
|
settings.html.transfer(_)
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the repository options.
|
||||||
|
*/
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// flash += "info" -> "Repository ownership is transferred."
|
||||||
|
redirect(s"/${form.newOwner}/${repository.name}/settings/transfer")
|
||||||
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display the delete repository page.
|
* Display the delete repository page.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ trait RepositoryService { self: AccountService =>
|
|||||||
|
|
||||||
def renameRepository(oldUserName: String, oldRepositoryName: String, newUserName: String, newRepositoryName: String): Unit = {
|
def renameRepository(oldUserName: String, oldRepositoryName: String, newUserName: String, newRepositoryName: String): Unit = {
|
||||||
(Query(Repositories) filter { t => t.byRepository(oldUserName, oldRepositoryName) } firstOption).map { repository =>
|
(Query(Repositories) filter { t => t.byRepository(oldUserName, oldRepositoryName) } firstOption).map { repository =>
|
||||||
Repositories insert repository.copy(repositoryName = newRepositoryName)
|
Repositories insert repository.copy(userName = newUserName, repositoryName = newRepositoryName)
|
||||||
|
|
||||||
val webHooks = Query(WebHooks ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val webHooks = Query(WebHooks ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val milestones = Query(Milestones ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val milestones = Query(Milestones ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
|||||||
@@ -14,6 +14,9 @@
|
|||||||
<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=="transfer"){ class="active"}>
|
||||||
|
<a href="@url(repository)/settings/transfer">Transfer Ownership</a>
|
||||||
|
</li>
|
||||||
<li@if(active=="delete"){ class="active"}>
|
<li@if(active=="delete"){ class="active"}>
|
||||||
<a href="@url(repository)/settings/delete">Delete Repository</a>
|
<a href="@url(repository)/settings/delete">Delete Repository</a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
24
src/main/twirl/settings/transfer.scala.html
Normal file
24
src/main/twirl/settings/transfer.scala.html
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
@(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
|
||||||
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
|
@html.main("Delete Repository", Some(repository)){
|
||||||
|
@html.header("settings", repository)
|
||||||
|
@menu("transfer", repository){
|
||||||
|
<form id="form" method="post" action="@url(repository)/settings/transfer">
|
||||||
|
<h3>Transfer Ownership</h3>
|
||||||
|
<fieldset>
|
||||||
|
<label for="newOwner" class="strong">New owner:</label>
|
||||||
|
<input type="text" name="newOwner" id="newOwner"/>
|
||||||
|
<span id="error-newOwner" class="error"></span>
|
||||||
|
</fieldset>
|
||||||
|
<input type="submit" class="btn btn-danger" value="Transfer"/>
|
||||||
|
</form>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<script>
|
||||||
|
$(function(){
|
||||||
|
$('#form').submit(function(){
|
||||||
|
return confirm('Do you really want to transfer this repo?');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
Reference in New Issue
Block a user