<?php
$GLOBALS['phorkie']['cfg'] = array(
- 'repos' => __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.
<?php
-//$GLOBALS['phorkie']['cfg']['repos'] = '/var/cache/git/paste/';
+//$GLOBALS['phorkie']['cfg']['gitdir'] = '/var/cache/git/paste/git/';
+//$GLOBALS['phorkie']['cfg']['workdir'] = '/var/cache/git/paste/work/';
//$GLOBALS['phorkie']['cfg']['git']['public'] = 'git://bogo/git/paste/';
//$GLOBALS['phorkie']['cfg']['git']['private'] = 'ssh://git@bogo:paste/';
?>
{
public function __construct()
{
- $this->reposDir = $GLOBALS['phorkie']['cfg']['repos'];
+ $this->workDir = $GLOBALS['phorkie']['cfg']['workdir'];
+ $this->gitDir = $GLOBALS['phorkie']['cfg']['gitdir'];
}
/**
*/
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;
}
*/
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;
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
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)
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);
}
/**
*/
public function getFiles()
{
- $files = glob($this->repoDir . '/*');
+ $files = glob($this->workDir . '/*');
$arFiles = array();
foreach ($files as $path) {
$arFiles[] = new File($path, $this);
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');
}
*/
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);
}
/**
$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;
}
$num = -1;
do {
++$num;
- $files = glob($this->repo->repoDir . '/' . $prefix . $num . '.*');
+ $files = glob($this->repo->workDir . '/' . $prefix . $num . '.*');
} while (count($files));
return $prefix . $num;
$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?