diff --git a/src/main/scala/gitbucket/core/controller/AccountController.scala b/src/main/scala/gitbucket/core/controller/AccountController.scala index 04455ea..09313ec 100644 --- a/src/main/scala/gitbucket/core/controller/AccountController.scala +++ b/src/main/scala/gitbucket/core/controller/AccountController.scala @@ -87,15 +87,16 @@ "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 @@ 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)) diff --git a/src/main/scala/gitbucket/core/service/RepositoryCreationService.scala b/src/main/scala/gitbucket/core/service/RepositoryCreationService.scala index 2aa4196..e32e99c 100644 --- a/src/main/scala/gitbucket/core/service/RepositoryCreationService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryCreationService.scala @@ -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 @@ 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 @@ } } + 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) diff --git a/src/main/twirl/gitbucket/core/account/newrepo.scala.html b/src/main/twirl/gitbucket/core/account/newrepo.scala.html index d094a55..d645317 100644 --- a/src/main/twirl/gitbucket/core/account/newrepo.scala.html +++ b/src/main/twirl/gitbucket/core/account/newrepo.scala.html @@ -59,28 +59,28 @@
- +
@@ -99,7 +99,7 @@ $('#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'); });