blob: 7473f1633aad1acf34b50c667618cf5b4772205a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
<?php
namespace phorkie;
class Forker
{
public function forkLocal($repo)
{
$new = $this->fork($repo->gitDir);
\copy($repo->gitDir . '/description', $new->gitDir . '/description');
$this->index($new);
return $new;
}
public function forkRemote($cloneUrl, $originalUrl)
{
$new = $this->fork($cloneUrl);
file_put_contents(
$new->gitDir . '/description',
'Fork of ' . $originalUrl
);
$this->index($new);
return $new;
}
protected function fork($pathOrUrl)
{
$rs = new Repositories();
$new = $rs->createNew();
$vc = $new->getVc();
//VersionControl_Git wants an existing dir, git clone not
\rmdir($new->gitDir);
$cmd = $vc->getCommand('clone')
//this should be setOption, but it fails with a = between name and value
->addArgument('--separate-git-dir')
->addArgument(
$GLOBALS['phorkie']['cfg']['gitdir'] . '/' . $new->id . '.git'
)
->addArgument($pathOrUrl)
->addArgument($new->workDir);
try {
$cmd->execute();
} catch (\Exception $e) {
//clean up, we've got no workdir otherwise
$new->delete();
throw $e;
}
foreach (\glob($new->gitDir . '/hooks/*') as $hookfile) {
\unlink($hookfile);
}
return $new;
}
protected function index($repo)
{
$db = new Database();
$db->getIndexer()->addRepo($repo);
}
}
?>
|