예제 #1
0
 /**
  *  clear cache files.
  *
  *  @access public
  *  @todo   implement Ethna_Renderer::clear_cache();
  *  @todo   implement Ethna_Plugin_Cachemanager::clear_cache();
  *  @todo   avoid echo, printf
  */
 function perform()
 {
     $r = $this->_getopt(array('basedir=', 'any-tmp-files', 'smarty', 'pear', 'cachemanager'));
     if (Ethna::isError($r)) {
         return $r;
     }
     list($args, ) = $r;
     $basedir = isset($args['basedir']) ? realpath(end($args['basedir'])) : getcwd();
     $controller = Ethna_Handle::getAppController($basedir);
     if (Ethna::isError($controller)) {
         return $controller;
     }
     $tmp_dir = $controller->getDirectory('tmp');
     if (isset($args['smarty']) || isset($args['any-tmp-files'])) {
         echo "cleaning smarty caches, compiled templates...";
         $renderer = $controller->getRenderer();
         if (strtolower(get_class($renderer)) == "ethna_renderer_smarty") {
             $renderer->getEngine()->clear_all_cache();
             $renderer->getEngine()->clear_compiled_tpl();
         }
         echo " done\n";
     }
     if (isset($args['cachemanager']) || isset($args['any-tmp-files'])) {
         echo "cleaning Ethna_Plugin_Cachemanager caches...";
         $cache_dir = sprintf("%s/cache", $tmp_dir);
         Ethna_Util::purgeDir($cache_dir);
         echo " done\n";
     }
     if (isset($args['any-tmp-files'])) {
         echo "cleaning tmp dirs...";
         // purge only entries in tmp.
         if ($dh = opendir($tmp_dir)) {
             while (($entry = readdir($dh)) !== false) {
                 if ($entry === '.' || $entry === '..') {
                     continue;
                 }
                 Ethna_Util::purgeDir("{$tmp_dir}/{$entry}");
             }
             closedir($dh);
         }
         echo " done\n";
     }
     return true;
 }
 /**
  * @access private
  */
 function &_makePackage($skelfile, $setting, $workdir)
 {
     if (Ethna_Util::mkdir($workdir, 0755) === false) {
         return Ethna::raiseError("failed making working dir: {$workdir}.");
     }
     // プラグインの元ファイルを作成
     $rfp = fopen($skelfile, "r");
     if ($rfp == false) {
         return Ethna::raiseError("failed open skelton file: {$skelfile}.");
     }
     $outputfile = $setting['filename'];
     $wfp = fopen("{$workdir}/{$outputfile}", "w");
     if ($rfp == false) {
         fclose($rfp);
         return Ethna::raiseError("failed creating working file: {$outputfile}.");
     }
     for (;;) {
         $s = fread($rfp, 4096);
         if (strlen($s) == 0) {
             break;
         }
         foreach ($setting['macro'] as $k => $v) {
             $s = preg_replace("/{\\\${$k}}/", $v, $s);
         }
         fwrite($wfp, $s);
     }
     fclose($wfp);
     fclose($rfp);
     // package.xml を作る
     $pkgconfig = array('packagedirectory' => $workdir, 'outputdirectory' => $workdir, 'ignore' => array('CVS/', '.cvsignore', '.svn/', 'package.xml', 'package.ini', $setting['pkgname'] . '-*.tgz'), 'filelistgenerator' => 'file', 'changelogoldtonew' => false);
     $packagexml =& new PEAR_PackageFileManager2();
     $pkgconfig = array_merge($pkgconfig, $setting['config']);
     $packagexml->setOptions($pkgconfig);
     $packagexml->setPackage($setting['pkgname']);
     $packagexml->setSummary($setting['summary']);
     $packagexml->setNotes($setting['notes']);
     $packagexml->setDescription($setting['description']);
     $packagexml->setChannel($setting['channel']);
     $packagexml->setAPIVersion($setting['version']);
     $packagexml->setReleaseVersion($setting['version']);
     $packagexml->setReleaseStability($setting['state']);
     $packagexml->setAPIStability($setting['state']);
     $packagexml->setPackageType('php');
     foreach ($setting['maintainers'] as $m) {
         $packagexml->addMaintainer($m['role'], $m['user'], $m['name'], $m['email'], $m['active']);
     }
     $packagexml->setLicense($setting['license']['name'], $setting['license']['uri']);
     $packagexml->addRole('css', 'php');
     $packagexml->addRole('tpl', 'php');
     $packagexml->addRole('ethna', 'php');
     $packagexml->addRole('sh', 'script');
     $packagexml->addRole('bat', 'script');
     $packagexml->setPhpDep('4.1.0');
     $packagexml->setPearinstallerDep('1.3.5');
     $packagexml->generateContents();
     foreach ($setting['callback'] as $method => $params) {
         $r = call_user_func_array(array(&$packagexml, $method), $params);
     }
     $r = $packagexml->writePackageFile();
     if (PEAR::isError($r)) {
         return Ethna::raiseError($r->getMessage, $r->getCode());
     }
     // package を作る
     $r = $this->pear->_run('package', array(), array("{$workdir}/package.xml"));
     if (PEAR::isError($r)) {
         return Ethna::raiseError($r->getMessage, $r->getCode());
     }
     if (Ethna_Util::purgeDir($workdir) === false) {
         return Ethna::raiseError("failed cleaning up working dir: {$workdir}.");
     }
 }
예제 #3
0
 /**
  *  @access public
  *  @todo   deal with the package including some plugins.
  */
 public function perform()
 {
     $true = true;
     //   check arguments.
     $args = $this->_parseArgList();
     if (Ethna::isError($args)) {
         return Ethna::raiseError($args->getMessage(), 'usage');
     }
     $basedir = isset($args['basedir']) ? realpath($args['basedir']) : getcwd();
     $channel = isset($args['channel']) ? $args['channel'] : 'dummy';
     $pear_local = new Ethna_PearConfig_Local();
     $r = $pear_local->init('local', $basedir, $channel);
     if (Ethna::isError($r)) {
         return $r;
     }
     //    build command string.
     $pear_cmds = $args['pear_args'];
     $pear_bin = ETHNA_OS_WINDOWS ? getenv('PHP_PEAR_BIN_DIR') . DIRECTORY_SEPARATOR . 'pear.bat' : PHP_BINDIR . DIRECTORY_SEPARATOR . 'pear';
     $local_conf_file = $pear_local->getConfFile();
     array_unshift($pear_cmds, $pear_bin, '-c', $local_conf_file);
     if (ETHNA_OS_WINDOWS) {
         foreach ($pear_cmds as $key => $value) {
             $pear_cmds[$key] = strpos($value, ' ') !== false ? '"' . $value . '"' : $value;
         }
     }
     $command_str = implode(' ', $pear_cmds);
     //   finally exec pear command.
     if (ETHNA_OS_WINDOWS) {
         $tmp_dir_name = "ethna_tmp_dir";
         Ethna_Util::mkdir($tmp_dir_name, 0777);
         $tmpnam = tempnam($tmp_dir_name, "temp") . '.bat';
         $fp = fopen($tmpnam, 'w');
         fwrite($fp, "@echo off\r\n");
         fwrite($fp, $command_str . " 2>&1");
         fclose($fp);
         system($tmpnam);
         Ethna_Util::purgeDir($tmp_dir_name);
     } else {
         system($command_str);
     }
     return $true;
 }
예제 #4
0
파일: Util.php 프로젝트: dqneo/ethnam
 /**
  *  ディレクトリを再帰的に削除する
  *  (途中で失敗しても中断せず、削除できるものはすべて消す)
  *
  *  @access public
  *  @param  string  $file   削除するファイルまたはディレクトリ
  *  @return bool    true:成功 false:失敗
  *  @static
  */
 public static function purgeDir($dir)
 {
     if (file_exists($dir) === false) {
         return false;
     }
     if (is_dir($dir) === false) {
         return unlink($dir);
     }
     $dh = opendir($dir);
     if ($dh === false) {
         return false;
     }
     $ret = true;
     while (($entry = readdir($dh)) !== false) {
         if ($entry === '.' || $entry === '..') {
             continue;
         }
         $ret = $ret && Ethna_Util::purgeDir("{$dir}/{$entry}");
     }
     closedir($dh);
     if ($ret) {
         return rmdir($dir);
     } else {
         return false;
     }
 }
예제 #5
0
파일: MockProject.php 프로젝트: riaf/ethna
 function delete()
 {
     Ethna_Util::purgeDir($this->proj_basedir);
 }