mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 13:35:50 +01:00
(refs #2)Experimental implementation of forking repository.
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user