mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-02 11:36:05 +01:00
(refs #8)Implementing repository creation for group.
This commit is contained in:
@@ -16,12 +16,13 @@ class CreateRepositoryController extends CreateRepositoryControllerBase
|
|||||||
* Creates new repository.
|
* Creates new repository.
|
||||||
*/
|
*/
|
||||||
trait CreateRepositoryControllerBase extends ControllerBase {
|
trait CreateRepositoryControllerBase extends ControllerBase {
|
||||||
self: RepositoryService with WikiService with LabelsService with ActivityService
|
self: RepositoryService with AccountService with WikiService with LabelsService with ActivityService
|
||||||
with UsersAuthenticator =>
|
with UsersAuthenticator =>
|
||||||
|
|
||||||
case class RepositoryCreationForm(name: String, description: Option[String], isPrivate: Boolean, createReadme: Boolean)
|
case class RepositoryCreationForm(owner: String, name: String, description: Option[String], isPrivate: Boolean, createReadme: Boolean)
|
||||||
|
|
||||||
val form = mapping(
|
val form = mapping(
|
||||||
|
"owner" -> trim(label("Owner" , text(required, maxlength(40), identifier))), // TODO check existence.
|
||||||
"name" -> trim(label("Repository name", text(required, maxlength(40), identifier, unique))),
|
"name" -> trim(label("Repository name", text(required, maxlength(40), identifier, unique))),
|
||||||
"description" -> trim(label("Description" , optional(text()))),
|
"description" -> trim(label("Description" , optional(text()))),
|
||||||
"isPrivate" -> trim(label("Repository Type", boolean())),
|
"isPrivate" -> trim(label("Repository Type", boolean())),
|
||||||
@@ -32,7 +33,7 @@ trait CreateRepositoryControllerBase extends ControllerBase {
|
|||||||
* Show the new repository form.
|
* Show the new repository form.
|
||||||
*/
|
*/
|
||||||
get("/new")(usersOnly {
|
get("/new")(usersOnly {
|
||||||
html.newrepo()
|
html.newrepo(getGroupsByUserName(context.loginAccount.get.userName))
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -43,22 +44,22 @@ trait CreateRepositoryControllerBase extends ControllerBase {
|
|||||||
val loginUserName = loginAccount.userName
|
val loginUserName = loginAccount.userName
|
||||||
|
|
||||||
// Insert to the database at first
|
// Insert to the database at first
|
||||||
createRepository(form.name, loginUserName, form.description, form.isPrivate)
|
createRepository(form.name, form.owner, form.description, form.isPrivate)
|
||||||
|
|
||||||
// Insert default labels
|
// Insert default labels
|
||||||
createLabel(loginUserName, form.name, "bug", "fc2929")
|
createLabel(form.owner, form.name, "bug", "fc2929")
|
||||||
createLabel(loginUserName, form.name, "duplicate", "cccccc")
|
createLabel(form.owner, form.name, "duplicate", "cccccc")
|
||||||
createLabel(loginUserName, form.name, "enhancement", "84b6eb")
|
createLabel(form.owner, form.name, "enhancement", "84b6eb")
|
||||||
createLabel(loginUserName, form.name, "invalid", "e6e6e6")
|
createLabel(form.owner, form.name, "invalid", "e6e6e6")
|
||||||
createLabel(loginUserName, form.name, "question", "cc317c")
|
createLabel(form.owner, form.name, "question", "cc317c")
|
||||||
createLabel(loginUserName, form.name, "wontfix", "ffffff")
|
createLabel(form.owner, form.name, "wontfix", "ffffff")
|
||||||
|
|
||||||
// Create the actual repository
|
// Create the actual repository
|
||||||
val gitdir = getRepositoryDir(loginUserName, form.name)
|
val gitdir = getRepositoryDir(form.owner, form.name)
|
||||||
JGitUtil.initRepository(gitdir)
|
JGitUtil.initRepository(gitdir)
|
||||||
|
|
||||||
if(form.createReadme){
|
if(form.createReadme){
|
||||||
val tmpdir = getInitRepositoryDir(loginUserName, form.name)
|
val tmpdir = getInitRepositoryDir(form.owner, form.name)
|
||||||
try {
|
try {
|
||||||
// Clone the repository
|
// Clone the repository
|
||||||
Git.cloneRepository.setURI(gitdir.toURI.toString).setDirectory(tmpdir).call
|
Git.cloneRepository.setURI(gitdir.toURI.toString).setDirectory(tmpdir).call
|
||||||
@@ -86,21 +87,23 @@ trait CreateRepositoryControllerBase extends ControllerBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create Wiki repository
|
// Create Wiki repository
|
||||||
createWikiRepository(loginAccount, form.name)
|
createWikiRepository(loginAccount, form.owner, form.name)
|
||||||
|
|
||||||
// Record activity
|
// Record activity
|
||||||
recordCreateRepositoryActivity(loginUserName, form.name, loginUserName)
|
recordCreateRepositoryActivity(loginUserName, form.name, form.owner)
|
||||||
|
|
||||||
// redirect to the repository
|
// redirect to the repository
|
||||||
redirect(s"/${loginUserName}/${form.name}")
|
redirect(s"/${form.owner}/${form.name}")
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Duplicate check for the repository name.
|
* Duplicate check for the repository name.
|
||||||
*/
|
*/
|
||||||
private def unique: Constraint = new Constraint(){
|
private def unique: Constraint = new Constraint(){
|
||||||
def validate(name: String, value: String): Option[String] =
|
def validate(name: String, value: String): Option[String] = {
|
||||||
|
// TODO fix to retreive user name from request parameter
|
||||||
getRepositoryNamesOfUser(context.loginAccount.get.userName).find(_ == value).map(_ => "Repository already exists.")
|
getRepositoryNamesOfUser(context.loginAccount.get.userName).find(_ == value).map(_ => "Repository already exists.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -24,20 +24,19 @@ trait SignInControllerBase extends ControllerBase { self: SystemSettingsService
|
|||||||
}
|
}
|
||||||
|
|
||||||
post("/signin", form){ form =>
|
post("/signin", form){ form =>
|
||||||
val account = getAccountByUserName(form.userName)
|
getAccountByUserName(form.userName).collect {
|
||||||
if(account.isEmpty || account.get.password != sha1(form.password)){
|
case account if(!account.isGroupAccount && account.password == sha1(form.password)) => {
|
||||||
redirect("/signin")
|
session.setAttribute("LOGIN_ACCOUNT", account)
|
||||||
} else {
|
updateLastLoginDate(account.userName)
|
||||||
session.setAttribute("LOGIN_ACCOUNT", account.get)
|
|
||||||
updateLastLoginDate(account.get.userName)
|
|
||||||
|
|
||||||
session.get("REDIRECT").map { redirectUrl =>
|
session.get("REDIRECT").map { redirectUrl =>
|
||||||
session.removeAttribute("REDIRECT")
|
session.removeAttribute("REDIRECT")
|
||||||
redirect(redirectUrl.asInstanceOf[String])
|
redirect(redirectUrl.asInstanceOf[String])
|
||||||
}.getOrElse {
|
}.getOrElse {
|
||||||
redirect("/")
|
redirect("/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
} getOrElse redirect("/signin")
|
||||||
}
|
}
|
||||||
|
|
||||||
get("/signout"){
|
get("/signout"){
|
||||||
|
|||||||
@@ -74,4 +74,11 @@ trait AccountService {
|
|||||||
.map(_.userName)
|
.map(_.userName)
|
||||||
.list
|
.list
|
||||||
|
|
||||||
|
def getGroupsByUserName(userName: String): List[String] =
|
||||||
|
Query(GroupMembers)
|
||||||
|
.filter(_.userName is userName.bind)
|
||||||
|
.sortBy(_.groupName)
|
||||||
|
.map(_.groupName)
|
||||||
|
.list
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,16 +63,16 @@ object WikiService {
|
|||||||
trait WikiService {
|
trait WikiService {
|
||||||
import WikiService._
|
import WikiService._
|
||||||
|
|
||||||
def createWikiRepository(owner: model.Account, repository: String): Unit = {
|
def createWikiRepository(loginAccount: model.Account, owner: String, repository: String): Unit = {
|
||||||
lock(owner.userName, repository){
|
lock(owner, repository){
|
||||||
val dir = Directory.getWikiRepositoryDir(owner.userName, repository)
|
val dir = Directory.getWikiRepositoryDir(owner, repository)
|
||||||
if(!dir.exists){
|
if(!dir.exists){
|
||||||
try {
|
try {
|
||||||
JGitUtil.initRepository(dir)
|
JGitUtil.initRepository(dir)
|
||||||
saveWikiPage(owner.userName, repository, "Home", "Home", s"Welcome to the ${repository} wiki!!", owner, "Initial Commit")
|
saveWikiPage(owner, repository, "Home", "Home", s"Welcome to the ${repository} wiki!!", loginAccount, "Initial Commit")
|
||||||
} finally {
|
} finally {
|
||||||
// once delete cloned repository because initial cloned repository does not have 'branch.master.merge'
|
// once delete cloned repository because initial cloned repository does not have 'branch.master.merge'
|
||||||
FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner.userName, repository))
|
FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner, repository))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,47 +1,73 @@
|
|||||||
@()(implicit context: app.Context)
|
@(groupNames: List[String])(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
@main("Create a New Repository"){
|
@main("Create a New Repository"){
|
||||||
<div style="width: 600px; margin: 10px auto;">
|
<div style="width: 600px; margin: 10px auto;">
|
||||||
<form id="form" method="post" action="@path/new" validate="true">
|
<form id="form" method="post" action="@path/new" validate="true">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<label for="name"><strong>Repository name</strong></label>
|
<label for="name"><strong>Repository name</strong></label>
|
||||||
<input type="text" name="name" id="name" />
|
<div class="btn-group" style="margin-bottom: 10px;" id="owner-dropdown">
|
||||||
<span id="error-name" class="error"></span>
|
<button class="btn dropdown-toggle" data-toggle="dropdown">
|
||||||
</fieldset>
|
<strong>@avatar(loginAccount.get.userName, 20) @loginAccount.get.userName</strong>
|
||||||
<fieldset>
|
<span class="caret"></span>
|
||||||
<label for="description"><strong>Description</strong> (optional)</label>
|
</button>
|
||||||
<input type="text" name="description" id="description" style="width: 95%;"/>
|
<ul class="dropdown-menu">
|
||||||
</fieldset>
|
<li><a href="javascript:void(0);" data-name="@loginAccount.get.userName"><i class="icon-ok"></i> <span>@avatar(loginAccount.get.userName, 20) @loginAccount.get.userName</span></a></li>
|
||||||
<fieldset class="margin">
|
@groupNames.map { groupName =>
|
||||||
<label>
|
<li><a href="javascript:void(0);" data-name="@groupName"><i class="icon-white"></i> <span>@avatar(groupName, 20) @groupName</span></a></li>
|
||||||
<input type="radio" name="isPrivate" value="false" checked>
|
}
|
||||||
<strong>Public</strong><br>
|
</ul>
|
||||||
<div>
|
<input type="hidden" name="owner" id="owner" />
|
||||||
<span class="note">All users and guests can read this repository.</span>
|
|
||||||
</div>
|
</div>
|
||||||
</label>
|
/
|
||||||
</fieldset>
|
<input type="text" name="name" id="name" />
|
||||||
<fieldset>
|
<span id="error-name" class="error"></span>
|
||||||
<label>
|
</fieldset>
|
||||||
<input type="radio" name="isPrivate" value="true">
|
<fieldset>
|
||||||
<strong>Private</strong><br>
|
<label for="description"><strong>Description</strong> (optional)</label>
|
||||||
<div>
|
<input type="text" name="description" id="description" style="width: 95%;"/>
|
||||||
<span class="note">Only collaborators can read this repository.</span>
|
</fieldset>
|
||||||
</div>
|
<fieldset class="margin">
|
||||||
</label>
|
<label>
|
||||||
</fieldset>
|
<input type="radio" name="isPrivate" value="false" checked>
|
||||||
<fieldset class="margin">
|
<strong>Public</strong><br>
|
||||||
<label for="createReadme">
|
<div>
|
||||||
<input type="checkbox" name="createReadme" id="createReadme"/>
|
<span class="note">All users and guests can read this repository.</span>
|
||||||
<strong>Initialize this repository with a README</strong>
|
</div>
|
||||||
<div>
|
</label>
|
||||||
<span class="note">This will allow you to <code>git clone</code> the repository immediately.</span>
|
</fieldset>
|
||||||
</div>
|
<fieldset>
|
||||||
</label>
|
<label>
|
||||||
</fieldset>
|
<input type="radio" name="isPrivate" value="true">
|
||||||
<fieldset class="margin">
|
<strong>Private</strong><br>
|
||||||
<input type="submit" class="btn btn-success" value="Create repository"/>
|
<div>
|
||||||
</fieldset>
|
<span class="note">Only collaborators can read this repository.</span>
|
||||||
</form>
|
</div>
|
||||||
|
</label>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset class="margin">
|
||||||
|
<label for="createReadme">
|
||||||
|
<input type="checkbox" name="createReadme" id="createReadme"/>
|
||||||
|
<strong>Initialize this repository with a README</strong>
|
||||||
|
<div>
|
||||||
|
<span class="note">This will allow you to <code>git clone</code> the repository immediately.</span>
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset class="margin">
|
||||||
|
<input type="submit" class="btn btn-success" value="Create repository"/>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
<script>
|
||||||
|
$('#owner-dropdown a').click(function(){
|
||||||
|
var userName = $(this).data('name');
|
||||||
|
$('#owner').val(userName);
|
||||||
|
|
||||||
|
$('#owner-dropdown i').attr('class', 'icon-white');
|
||||||
|
$(this).find('i').attr('class', 'icon-ok');
|
||||||
|
|
||||||
|
$('#owner-dropdown strong').html($(this).find('span').html());
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user