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

View File

@@ -103,6 +103,13 @@ trait ActivityService {
None,
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) = {
CommitLog insert (userName, repositoryName, commitId)
}

View File

@@ -68,12 +68,10 @@ trait WikiService {
lock(owner.userName, repository){
val dir = Directory.getWikiRepositoryDir(owner.userName, repository)
if(!dir.exists){
val repo = new RepositoryBuilder().setGitDir(dir).setBare.build
try {
repo.create
JGitUtil.initRepository(dir)
saveWikiPage(owner.userName, repository, "Home", "Home", "Welcome to the %s wiki!!".format(repository), owner, "Initial Commit")
} finally {
repo.close
// once delete cloned repository because initial cloned repository does not have 'branch.master.merge'
FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner.userName, repository))
}

View File

@@ -52,6 +52,7 @@ class BasicAuthenticationFilter extends Filter with RepositoryService with Accou
} catch {
case ex: Exception => {
logger.error("error", ex)
ex.printStackTrace()
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)
@import context._
@import view.helpers._
<div class="pull-right">
<input type="button" id="fork" class="btn" value="Fork" style="margin-bottom: 10px;"/>
</div>
<div class="head">
<a href="@url(repository.owner)">@repository.owner</a> / <a href="@url(repository)">@repository.name</a>
@if(repository.repository.isPrivate){
<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>
<table class="global-nav box-header">
<tr>
@@ -27,8 +36,6 @@
</tr>
</table>
<form method="POST" id="repository_form">
<input type="hidden" name="owner" value="@repository.owner"/>
<input type="hidden" name="name" value="@repository.name"/>
</form>
<script type="text/javascript">
$(function(){
@@ -39,7 +46,7 @@ $(function(){
$('#fork').click(function(){
var form = $('form#repository_form');
form.attr('action', '@path/_fork');
form.attr('action', '@path/@repository.owner/@repository.name/_fork');
form.submit();
});
});

View File

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