Implement repository cloning

This commit is contained in:
Naoki Takezoe
2017-12-04 13:59:53 +09:00
parent 43d19d7d52
commit 13800a7023
3 changed files with 38 additions and 17 deletions

View File

@@ -87,15 +87,16 @@ trait AccountControllerBase extends AccountManagementControllerBase {
"clearImage" -> trim(label("Clear image" ,boolean()))
)(EditGroupForm.apply)
case class RepositoryCreationForm(owner: String, name: String, description: Option[String], isPrivate: Boolean, createReadme: Boolean)
case class RepositoryCreationForm(owner: String, name: String, description: Option[String], isPrivate: Boolean, initOption: String, sourceUrl: Option[String])
case class ForkRepositoryForm(owner: String, name: String)
val newRepositoryForm = mapping(
"owner" -> trim(label("Owner" , text(required, maxlength(100), identifier, existsAccount))),
"name" -> trim(label("Repository name", text(required, maxlength(100), repository, uniqueRepository))),
"description" -> trim(label("Description" , optional(text()))),
"isPrivate" -> trim(label("Repository Type", boolean())),
"createReadme" -> trim(label("Create README" , boolean()))
"owner" -> trim(label("Owner", text(required, maxlength(100), identifier, existsAccount))),
"name" -> trim(label("Repository name", text(required, maxlength(100), repository, uniqueRepository))),
"description" -> trim(label("Description", optional(text()))),
"isPrivate" -> trim(label("Repository Type", boolean())),
"initOption" -> trim(label("Initialize option", text(required))),
"sourceUrl" -> trim(label("Source git repository URL", optional(text()))) // TODO required if initOption is "COPY"
)(RepositoryCreationForm.apply)
val forkRepositoryForm = mapping(
@@ -529,7 +530,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
LockUtil.lock(s"${form.owner}/${form.name}"){
if(getRepository(form.owner, form.name).isEmpty){
// Create the repository
createRepository(context.loginAccount.get, form.owner, form.name, form.description, form.isPrivate, form.createReadme)
createRepository(context.loginAccount.get, form.owner, form.name, form.description, form.isPrivate, form.initOption, form.sourceUrl)
// Call hooks
PluginRegistry().getRepositoryHooks.foreach(_.created(form.owner, form.name))

View File

@@ -1,19 +1,27 @@
package gitbucket.core.service
import java.nio.file.Files
import gitbucket.core.model.Profile.profile.blockingApi._
import gitbucket.core.util.SyntaxSugars._
import gitbucket.core.util.Directory._
import gitbucket.core.util.JGitUtil
import gitbucket.core.model.Account
import org.apache.commons.io.FileUtils
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.dircache.DirCache
import org.eclipse.jgit.lib.{FileMode, Constants}
import org.eclipse.jgit.lib.{Constants, FileMode}
trait RepositoryCreationService {
self: AccountService with RepositoryService with LabelsService with WikiService with ActivityService with PrioritiesService =>
def createRepository(loginAccount: Account, owner: String, name: String, description: Option[String], isPrivate: Boolean, createReadme: Boolean)
(implicit s: Session) {
def createRepository(loginAccount: Account, owner: String, name: String, description: Option[String],
isPrivate: Boolean, createReadme: Boolean)(implicit s: Session): Unit = {
createRepository(loginAccount, owner, name, description, isPrivate, if (createReadme) "README" else "EMPTY", None)
}
def createRepository(loginAccount: Account, owner: String, name: String, description: Option[String],
isPrivate: Boolean, initOption: String, sourceUrl: Option[String])(implicit s: Session): Unit = {
val ownerAccount = getAccountByUserName(owner).get
val loginUserName = loginAccount.userName
@@ -37,7 +45,7 @@ trait RepositoryCreationService {
val gitdir = getRepositoryDir(owner, name)
JGitUtil.initRepository(gitdir)
if(createReadme){
if (initOption == "README") {
using(Git.open(gitdir)){ git =>
val builder = DirCache.newInCore.builder()
val inserter = git.getRepository.newObjectInserter()
@@ -61,6 +69,18 @@ trait RepositoryCreationService {
}
}
if (initOption == "COPY") {
sourceUrl.foreach { url =>
val dir = Files.createTempDirectory(s"gitbucket-${owner}-${name}").toFile
println("Cloning to " + dir.getAbsolutePath)
Git.cloneRepository().setBare(true).setURI(url).setDirectory(dir).setCloneAllBranches(true).call()
using(Git.open(dir)) { git =>
git.push().setRemote(gitdir.toURI.toString).setPushAll().setPushTags().call()
}
FileUtils.deleteQuietly(dir)
}
}
// Create Wiki repository
createWikiRepository(loginAccount, owner, name)

View File

@@ -59,28 +59,28 @@ isCreateRepoOptionPublic: Boolean)(implicit context: gitbucket.core.controller.C
</fieldset>
<fieldset class="border-top">
<label class="radio">
<input type="radio" name="createRepository" value="EMPTY" checked/>
<input type="radio" name="initOption" value="EMPTY" checked/>
<span class="strong">Create an empty repository</span>
<div class="normal muted">
Create an empty repository. You have to initialize by yourself initially.
</div>
</label>
<label class="radio">
<input type="radio" name="createRepository" value="README"/>
<input type="radio" name="initOption" value="README"/>
<span class="strong">Initialize this repository with a README</span>
<div class="normal muted">
Create a repository which has README.md. You can clone the repository immediately.
</div>
</label>
<label class="radio">
<input type="radio" name="createRepository" value="COPY"/>
<input type="radio" name="initOption" value="COPY"/>
<span class="strong">Copy existing git repository</span>
<div class="normal muted">
Create new repository from existing git repository.
</div>
</label>
</fieldset>
<input type="text" class="form-control" name="existingRepositoryUrl" id="existingRepositoryUrl" disabled/>
<input type="text" class="form-control" name="sourceUrl" id="sourceUrl" disabled placeholder="Source git repository URL..."/>
<fieldset class="border-top form-actions">
<input type="submit" class="btn btn-success" value="Create repository"/>
</fieldset>
@@ -99,7 +99,7 @@ $('#owner-dropdown a').click(function(){
$('#owner-dropdown span.strong').html($(this).find('span').html());
});
$('input[name=createRepository]').click(function(){
$('#existingRepositoryUrl').prop('disabled', $('input[name=createRepository]:checked').val() != 'COPY');
$('input[name=initOption]').click(function () {
$('#sourceUrl').prop('disabled', $('input[name=initOption]:checked').val() != 'COPY');
});
</script>