From: Christian Weiske Date: Wed, 11 Apr 2012 18:22:33 +0000 (+0200) Subject: separate git and work directories - gives nicer public git clone urls X-Git-Tag: v0.1.0~47 X-Git-Url: https://git.cweiske.de/phorkie.git/commitdiff_plain/1c14a6bfb93c914374a6b2f96aec971f8c5b3053 separate git and work directories - gives nicer public git clone urls --- diff --git a/data/config.default.php b/data/config.default.php index 7c9969e..cec3799 100644 --- a/data/config.default.php +++ b/data/config.default.php @@ -1,8 +1,9 @@ __DIR__ . '/../repos/', - 'tpl' => __DIR__ . '/templates/', - 'css' => 'http://twitter.github.com/bootstrap/assets/css/bootstrap.css', + 'gitdir' => __DIR__ . '/../repos/git/', + 'workdir' => __DIR__ . '/../repos/work/', + 'tpl' => __DIR__ . '/templates/', + 'css' => 'http://twitter.github.com/bootstrap/assets/css/bootstrap.css', ); /** * Array of supported file types / languages. diff --git a/data/config.php.dist b/data/config.php.dist index 8ef80e9..0d60a10 100644 --- a/data/config.php.dist +++ b/data/config.php.dist @@ -1,5 +1,6 @@ diff --git a/src/phorkie/Repositories.php b/src/phorkie/Repositories.php index ef59dd7..dc3387b 100644 --- a/src/phorkie/Repositories.php +++ b/src/phorkie/Repositories.php @@ -5,7 +5,8 @@ class Repositories { public function __construct() { - $this->reposDir = $GLOBALS['phorkie']['cfg']['repos']; + $this->workDir = $GLOBALS['phorkie']['cfg']['workdir']; + $this->gitDir = $GLOBALS['phorkie']['cfg']['gitdir']; } /** @@ -13,17 +14,21 @@ class Repositories */ public function createNew() { - chdir($this->reposDir); - $dirs = glob('*', GLOB_ONLYDIR); + chdir($this->gitDir); + $dirs = glob('*.git', GLOB_ONLYDIR); + array_walk($dirs, function ($dir) { return substr($dir, 0, -4); }); sort($dirs, SORT_NUMERIC); $n = end($dirs) + 1; - unset($dirs); - $dir = $this->reposDir . '/' . $n . '/'; + chdir($this->workDir); + $dir = $this->workDir . '/' . $n . '/'; mkdir($dir, 0777);//FIXME $r = new Repository(); $r->id = $n; - $r->repoDir = $dir; + $r->workDir = $dir; + $r->gitDir = $this->gitDir . '/' . $n . '.git/'; + mkdir($r->gitDir, 0777);//FIXME + return $r; } @@ -37,15 +42,15 @@ class Repositories */ public function getList($page = 0, $perPage = 10) { - chdir($this->reposDir); - $dirs = glob('*', GLOB_ONLYDIR); + chdir($this->gitDir); + $dirs = glob('*.git', GLOB_ONLYDIR); sort($dirs, SORT_NUMERIC); $some = array_slice($dirs, $page * $perPage, $perPage); $repos = array(); foreach ($some as $oneDir) { $r = new Repository(); - $r->loadById($oneDir); + $r->loadById(substr($oneDir, 0, -4)); $repos[] = $r; } return $repos; diff --git a/src/phorkie/Repository.php b/src/phorkie/Repository.php index 6dec015..0117ec2 100644 --- a/src/phorkie/Repository.php +++ b/src/phorkie/Repository.php @@ -12,11 +12,18 @@ class Repository public $id; /** - * Full path to the git repository + * Full path to the .git repository * * @var string */ - public $repoDir; + public $gitDir; + + /** + * Full path to the work tree directory + * + * @var string + */ + public $workDir; /** * Load Repository data from GET-Request @@ -34,12 +41,26 @@ class Repository throw new Exception_Input('Paste ID not numeric'); } $this->id = (int)$_GET['id']; + $this->loadDirs(); + } - $repoDir = $GLOBALS['phorkie']['cfg']['repos'] . '/' . $this->id; - if (!is_dir($repoDir)) { - throw new Exception_NotFound('Paste not found'); + protected function loadDirs() + { + $gitDir = $GLOBALS['phorkie']['cfg']['gitdir'] . '/' . $this->id . '.git'; + if (!is_dir($gitDir)) { + throw new Exception_NotFound( + sprintf('Paste %d .git dir not found', $this->id) + ); + } + $this->gitDir = $gitDir; + + $workDir = $GLOBALS['phorkie']['cfg']['workdir'] . '/' . $this->id; + if (!is_dir($workDir)) { + throw new Exception_NotFound( + sprintf('Paste %d work dir not found', $this->id) + ); } - $this->repoDir = $repoDir; + $this->workDir = $workDir; } public function loadById($id) @@ -48,17 +69,12 @@ class Repository throw new Exception_Input('Paste ID not numeric'); } $this->id = (int)$id; - - $repoDir = $GLOBALS['phorkie']['cfg']['repos'] . '/' . $this->id; - if (!is_dir($repoDir)) { - throw new Exception_NotFound('Paste not found'); - } - $this->repoDir = $repoDir; + $this->loadDirs(); } public function getVc() { - return new \VersionControl_Git($this->repoDir); + return new \VersionControl_Git($this->gitDir); } /** @@ -68,7 +84,7 @@ class Repository */ public function getFiles() { - $files = glob($this->repoDir . '/*'); + $files = glob($this->workDir . '/*'); $arFiles = array(); foreach ($files as $path) { $arFiles[] = new File($path, $this); @@ -85,7 +101,7 @@ class Repository if ($name == '') { throw new Exception_Input('Empty file name given'); } - $path = $this->repoDir . '/' . $base; + $path = $this->workDir . '/' . $base; if ($bHasToExist && !is_readable($path)) { throw new Exception_Input('File does not exist'); } @@ -110,20 +126,21 @@ class Repository */ public function delete() { - return Tools::recursiveDelete($this->repoDir); + return Tools::recursiveDelete($this->workDir) + && Tools::recursiveDelete($this->gitDir); } public function getDescription() { - if (!is_readable($this->repoDir . '/.git/description')) { + if (!is_readable($this->gitDir . '/description')) { return null; } - return file_get_contents($this->repoDir . '/.git/description'); + return file_get_contents($this->gitDir . '/description'); } public function setDescription($description) { - file_put_contents($this->repoDir . '/.git/description', $description); + file_put_contents($this->gitDir . '/description', $description); } /** diff --git a/src/phorkie/Repository/Post.php b/src/phorkie/Repository/Post.php index 8cd9323..6ff8df6 100644 --- a/src/phorkie/Repository/Post.php +++ b/src/phorkie/Repository/Post.php @@ -114,13 +114,19 @@ class Repository_Post $rs = new Repositories(); $repo = $rs->createNew(); $vc = $repo->getVc(); - $vc->initRepository(); - - foreach (glob($repo->repoDir . '/.git/hooks/*') as $hookfile) { + //$vc->initRepository(); + $vc->getCommand('init') + //this should be setOption, but it fails with a = between name and value + ->addArgument('--separate-git-dir') + ->addArgument($GLOBALS['phorkie']['cfg']['gitdir'] . '/' . $repo->id) + ->addArgument($repo->workDir) + ->execute(); + + foreach (glob($repo->gitDir . '/hooks/*') as $hookfile) { unlink($hookfile); } - touch($repo->repoDir . '/.git/git-daemon-export-ok'); + touch($repo->gitDir . '/git-daemon-export-ok'); return $repo; } @@ -130,7 +136,7 @@ class Repository_Post $num = -1; do { ++$num; - $files = glob($this->repo->repoDir . '/' . $prefix . $num . '.*'); + $files = glob($this->repo->workDir . '/' . $prefix . $num . '.*'); } while (count($files)); return $prefix . $num; diff --git a/www/fork.php b/www/fork.php index cc98df0..7997632 100644 --- a/www/fork.php +++ b/www/fork.php @@ -14,13 +14,18 @@ $repo->loadFromRequest(); $rs = new Repositories(); $new = $rs->createNew(); -$new->getVc()->getCommand('clone') - ->addArgument($repo->repoDir) - ->addArgument($new->repoDir) +$vc = $new->getVc(); +\rmdir($new->gitDir);//VersionControl_Git wants an existing dir, git clone not +$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($repo->gitDir) + ->addArgument($new->workDir) ->execute(); -\copy($repo->repoDir . '/.git/description', $new->repoDir . '/.git/description'); -foreach (glob($new->repoDir . '/.git/hooks/*') as $hookfile) { - unlink($hookfile); +\copy($repo->gitDir . '/description', $new->gitDir . '/description'); +foreach (\glob($new->gitDir . '/hooks/*') as $hookfile) { + \unlink($hookfile); } //FIXME: where to put fork source link?