fork($repo->gitDir); \copy($repo->gitDir . '/description', $new->gitDir . '/description'); $new->getVc() ->getCommand('config') ->addArgument('remote.origin.title') ->addArgument(file_get_contents($repo->gitDir . '/description')) ->execute(); $this->index($new); $not = new Notificator(); $not->create($new); return $new; } public function forkRemote($cloneUrl, $originalUrl, $title = null) { $new = $this->fork($cloneUrl); $new->getVc() ->getCommand('config') ->addArgument('remote.origin.title') ->addArgument($title) ->execute(); if ($originalUrl != $cloneUrl) { $new->getVc() ->getCommand('config') ->addArgument('remote.origin.homepage') ->addArgument($originalUrl) ->execute(); } if ($title === null) { $title = 'Fork of ' . $originalUrl; } file_put_contents($new->gitDir . '/description', $title); $this->index($new); $not = new Notificator(); $not->create($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; } $rs = new Repository_Setup($new); $rs->afterInit(); //update info for dumb git HTTP transport //the post-update hook should do that IMO, but does not somehow $vc->getCommand('update-server-info')->execute(); return $new; } protected function index($repo) { $db = new Database(); $db->getIndexer()->addRepo($repo); } } ?>