X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/97c4ac59eed8b66b2e7f85d8ac325b063fb8a0ce..808a3a5857c77ef99605fdfdde9b31b5c02e22c6:/src/phorkie/Repository/Post.php diff --git a/src/phorkie/Repository/Post.php b/src/phorkie/Repository/Post.php index ed44cf1..7a373aa 100644 --- a/src/phorkie/Repository/Post.php +++ b/src/phorkie/Repository/Post.php @@ -5,6 +5,16 @@ class Repository_Post { public $repo; + /** + * When a new file is created during processing, its name + * is stored here for later use. + * + * @var string + */ + public $newfileName; + + + public function __construct(Repository $repo = null) { $this->repo = $repo; @@ -48,8 +58,8 @@ class Repository_Post continue; } - $orignalName = Tools::sanitizeFilename($arFile['original_name']); - $name = Tools::sanitizeFilename($arFile['name']); + $originalName = Tools::sanitizeFilename($arFile['original_name']); + $name = Tools::sanitizeFilename($arFile['name']); if ($arFile['type'] == '_auto_') { //FIXME: upload @@ -58,7 +68,9 @@ class Repository_Post if ($name == '') { if ($bUpload) { - $name = Tools::sanitizeFilename($_FILES['files']['name'][$num]['upload']); + $name = Tools::sanitizeFilename( + $_FILES['files']['name'][$num]['upload'] + ); } else { $name = $this->getNextNumberedFile('phork') . '.' . $arFile['type']; @@ -67,34 +79,38 @@ class Repository_Post $bNew = false; $bDelete = false; - if (!isset($orignalName) || $orignalName == '') { + if (!isset($originalName) || $originalName == '') { //new file $bNew = true; if (strpos($name, '.') === false) { //automatically append file extension if none is there $name .= '.' . $arFile['type']; } - } else if (!$this->repo->hasFile($orignalName)) { + $this->newfileName = $name; + } else if (!$this->repo->hasFile($originalName)) { //unknown file //FIXME: Show error message continue; } else if (isset($arFile['delete']) && $arFile['delete'] == 1) { $bDelete = true; - } else if ($orignalName != $name) { + } else if ($originalName != $name) { if (strpos($name, '/') === false) { //ignore names with a slash in it, would be new directory //FIXME: what to do with overwrites? $vc->getCommand('mv') - ->addArgument($orignalName) + ->addArgument($originalName) ->addArgument($name) ->execute(); $bCommit = true; } else { - $name = $orignalName; + $name = $originalName; } } $file = $this->repo->getFileByName($name, false); + if ($originalName !== '') { + $originalFile = $this->repo->getFileByName($originalName, false); + } if ($bDelete) { $command = $vc->getCommand('rm') ->addArgument($file->getFilename()) @@ -102,13 +118,22 @@ class Repository_Post $bCommit = true; } else if ($bUpload) { move_uploaded_file( - $_FILES['files']['tmp_name'][$num]['upload'], $file->getFullPath() + $_FILES['files']['tmp_name'][$num]['upload'], + $file->getFullPath() ); $command = $vc->getCommand('add') ->addArgument($file->getFilename()) ->execute(); $bCommit = true; - } else if ($bNew || (isset($arFile['content']) && $file->getContent() != $arFile['content'])) { + } else if ($bNew + || (isset($arFile['content']) && isset($originalFile) + && $originalFile->getContent() != $arFile['content'] + ) + ) { + $dir = dirname($file->getFullPath()); + if (!is_dir($dir)) { + mkdir($dir, 0777, true); + } file_put_contents($file->getFullPath(), $arFile['content']); $command = $vc->getCommand('add') ->addArgument($file->getFilename()) @@ -117,18 +142,36 @@ class Repository_Post } } - $commitmsg = "phorkie commit"; if (isset($sessionData['identity'])) { - $commitmsg .= " from ".$sessionData['identity']; + $notes = $sessionData['identity']; } else { - $commitmsg .= " by ".$sessionData['ipaddr']; + $notes = $sessionData['ipaddr']; } if ($bCommit) { $vc->getCommand('commit') - ->setOption('message', $commitmsg) - ->setOption('author', $sessionData['name'].' <'.$sessionData['email'].'>') + ->setOption('message', '') + ->setOption('allow-empty-message') + ->setOption('no-edit') + ->setOption( + 'author', + $sessionData['name'] . ' <' . $sessionData['email'] . '>' + ) + ->execute(); + //FIXME: git needs ref BEFORE add + //quick hack until http://pear.php.net/bugs/bug.php?id=19605 is fixed + //also waiting for https://pear.php.net/bugs/bug.php?id=19623 + $vc->getCommand('notes --ref=identity add') + ->setOption('force') + ->setOption('message', "$notes") ->execute(); + //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(); + + //we changed the hash by committing, so reload it + $this->repo->reloadHash(); + $bChanged = true; } @@ -136,10 +179,18 @@ class Repository_Post //FIXME: index changed files only //also handle file deletions $db = new Database(); + $not = new Notificator(); if ($bNew) { $db->getIndexer()->addRepo($this->repo); + $not->create($this->repo); } else { - $db->getIndexer()->updateRepo($this->repo); + $commits = $this->repo->getHistory(); + $db->getIndexer()->updateRepo( + $this->repo, + $commits[count($commits)-1]->committerTime, + $commits[0]->committerTime + ); + $not->edit($this->repo); } } @@ -152,7 +203,15 @@ class Repository_Post if ($_FILES['files']['error'][$num]['upload'] == 0) { return true; } - if ($arFile['content'] != '') { + if (isset($arFile['content']) && $arFile['content'] != '') { + return true; + } + if (isset($arFile['name']) && $arFile['name'] != '') { + //binary files do not have content + return true; + } + if (isset($arFile['delete']) && $arFile['delete'] != '') { + //binary files do not have content return true; } } @@ -167,15 +226,14 @@ class Repository_Post $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 . '.git') + ->addArgument( + $GLOBALS['phorkie']['cfg']['gitdir'] . '/' . $repo->id . '.git' + ) ->addArgument($repo->workDir) ->execute(); - foreach (glob($repo->gitDir . '/hooks/*') as $hookfile) { - unlink($hookfile); - } - - touch($repo->gitDir . '/git-daemon-export-ok'); + $rs = new Repository_Setup($repo); + $rs->afterInit(); return $repo; } @@ -191,13 +249,23 @@ class Repository_Post return $prefix . $num; } - protected function getType($content) + public function getType($content, $returnError = false) { + if (getenv('PATH') == '') { + //php-fpm does not fill $PATH by default + // we have to work around that since System::which() uses it + putenv('PATH=/usr/local/bin:/usr/bin:/bin'); + } + $tmp = tempnam(sys_get_temp_dir(), 'phorkie-autodetect-'); file_put_contents($tmp, $content); - $type = \MIME_Type_PlainDetect::autoDetect($tmp); + $type = Tool_MIME_Type_PlainDetect::autoDetect($tmp); unlink($tmp); + if ($returnError && $type instanceof \PEAR_Error) { + return $type; + } + return $this->findExtForType($type); }