(refs #2)Experimental implementation of forking repository.

This commit is contained in:
takezoe
2013-07-11 18:49:03 +09:00
parent 5e1eb39b87
commit 6dd1299dff
7 changed files with 65 additions and 27 deletions

View File

@@ -58,13 +58,7 @@ trait CreateRepositoryControllerBase extends ControllerBase {
// Create the actual repository // Create the actual repository
val gitdir = getRepositoryDir(loginUserName, form.name) val gitdir = getRepositoryDir(loginUserName, form.name)
val repository = new RepositoryBuilder().setGitDir(gitdir).setBare.build JGitUtil.initRepository(gitdir)
repository.create
val config = repository.getConfig
config.setBoolean("http", null, "receivepack", true)
config.save
if(form.createReadme){ if(form.createReadme){
val tmpdir = getInitRepositoryDir(loginUserName, form.name) val tmpdir = getInitRepositoryDir(loginUserName, form.name)
@@ -114,21 +108,17 @@ trait CreateRepositoryControllerBase extends ControllerBase {
insertDefaultLabels(loginUserName, repository.name) insertDefaultLabels(loginUserName, repository.name)
// clone repository actually // clone repository actually
val git = Git.cloneRepository JGitUtil.cloneRepository(
.setURI(getRepositoryDir(repository.owner, repository.name).toURI.toString) getRepositoryDir(repository.owner, repository.name),
.setDirectory(getRepositoryDir(loginUserName, repository.name)) getRepositoryDir(loginUserName, repository.name))
.setBare(true).call
val config = git.getRepository.getConfig
config.setBoolean("http", null, "receivepack", true)
config.save
// Create Wiki repository // Create Wiki repository
// TODO Wiki repository should be cloned also!! JGitUtil.cloneRepository(
createWikiRepository(loginAccount, repository.name) getWikiRepositoryDir(repository.owner, repository.name),
getWikiRepositoryDir(loginUserName, repository.name))
// TODO Record activity!! // Record activity
//recordCreateRepositoryActivity(loginUserName, repositoryName, loginUserName) recordForkActivity(repository.owner, repository.name, loginUserName)
} }
// redirect to the repository // redirect to the repository
redirect("/%s/%s".format(loginUserName, repository.name)) redirect("/%s/%s".format(loginUserName, repository.name))

View File

@@ -102,7 +102,14 @@ trait ActivityService {
s"[user:${activityUserName}] created branch [tag:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]", s"[user:${activityUserName}] created branch [tag:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]",
None, None,
currentDate) currentDate)
def recordForkActivity(userName: String, repositoryName: String, activityUserName: String) =
Activities.autoInc insert(userName, repositoryName, activityUserName,
"forkk",
s"[user:${activityUserName}] forked [repo:${userName}/${repositoryName}] to [repo:${activityUserName}/${repositoryName}]",
None,
currentDate)
def insertCommitId(userName: String, repositoryName: String, commitId: String) = { def insertCommitId(userName: String, repositoryName: String, commitId: String) = {
CommitLog insert (userName, repositoryName, commitId) CommitLog insert (userName, repositoryName, commitId)
} }

View File

@@ -68,12 +68,10 @@ trait WikiService {
lock(owner.userName, repository){ lock(owner.userName, repository){
val dir = Directory.getWikiRepositoryDir(owner.userName, repository) val dir = Directory.getWikiRepositoryDir(owner.userName, repository)
if(!dir.exists){ if(!dir.exists){
val repo = new RepositoryBuilder().setGitDir(dir).setBare.build
try { try {
repo.create JGitUtil.initRepository(dir)
saveWikiPage(owner.userName, repository, "Home", "Home", "Welcome to the %s wiki!!".format(repository), owner, "Initial Commit") saveWikiPage(owner.userName, repository, "Home", "Home", "Welcome to the %s wiki!!".format(repository), owner, "Initial Commit")
} finally { } finally {
repo.close
// 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.userName, repository))
} }

View File

@@ -52,6 +52,7 @@ class BasicAuthenticationFilter extends Filter with RepositoryService with Accou
} catch { } catch {
case ex: Exception => { case ex: Exception => {
logger.error("error", ex) logger.error("error", ex)
ex.printStackTrace()
requireAuth(response) requireAuth(response)
} }
} }

View File

@@ -502,4 +502,29 @@ object JGitUtil {
} }
} }
def initRepository(dir: java.io.File): Unit = {
val repository = new RepositoryBuilder().setGitDir(dir).setBare.build
try {
repository.create
setReceivePack(repository)
} finally {
repository.close
}
}
def cloneRepository(from: java.io.File, to: java.io.File): Unit = {
val git = Git.cloneRepository.setURI(from.toURI.toString).setDirectory(to).setBare(true).call
try {
setReceivePack(git.getRepository)
} finally {
git.getRepository.close
}
}
private def setReceivePack(repository: org.eclipse.jgit.lib.Repository): Unit = {
val config = repository.getConfig
config.setBoolean("http", null, "receivepack", true)
config.save
}
} }

View File

@@ -1,12 +1,21 @@
@(active: String, repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context) @(active: String, repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
@import context._ @import context._
@import view.helpers._ @import view.helpers._
<div class="pull-right">
<input type="button" id="fork" class="btn" value="Fork" style="margin-bottom: 10px;"/>
</div>
<div class="head"> <div class="head">
<a href="@url(repository.owner)">@repository.owner</a> / <a href="@url(repository)">@repository.name</a> <a href="@url(repository.owner)">@repository.owner</a> / <a href="@url(repository)">@repository.name</a>
@if(repository.repository.isPrivate){ @if(repository.repository.isPrivate){
<i class="icon-lock"></i> <i class="icon-lock"></i>
} }
<input type="button" id="fork" class="btn" value="Fork"/> @defining(repository.repository){ x =>
@if(repository.repository.originRepositoryName.isDefined){
<div class="forked">
forked from <a href="@path/@x.originUserName/@x.originRepositoryName">@x.originUserName/@x.originRepositoryName</a>
</div>
}
}
</div> </div>
<table class="global-nav box-header"> <table class="global-nav box-header">
<tr> <tr>
@@ -27,8 +36,6 @@
</tr> </tr>
</table> </table>
<form method="POST" id="repository_form"> <form method="POST" id="repository_form">
<input type="hidden" name="owner" value="@repository.owner"/>
<input type="hidden" name="name" value="@repository.name"/>
</form> </form>
<script type="text/javascript"> <script type="text/javascript">
$(function(){ $(function(){
@@ -39,7 +46,7 @@ $(function(){
$('#fork').click(function(){ $('#fork').click(function(){
var form = $('form#repository_form'); var form = $('form#repository_form');
form.attr('action', '@path/_fork'); form.attr('action', '@path/@repository.owner/@repository.name/_fork');
form.submit(); form.submit();
}); });
}); });

View File

@@ -68,6 +68,16 @@ div.head a {
font-weight: bold; font-weight: bold;
} }
div.head div.forked {
font-size: 60%;
color: #999999;
}
div.head div.forked a {
font-weight: normal;
}
div.container { div.container {
width: 920px; width: 920px;
} }