Source for file Ethna_Plugin_Handle_MakePluginPackage.php

Documentation is available at Ethna_Plugin_Handle_MakePluginPackage.php

  1. <?php
  2. // vim: foldmethod=marker
  3. /**
  4.  *  Ethna_Plugin_Handle_MakePluginPackage.php
  5.  *
  6.  *  please go to http://ethna.jp/ethna-document-dev_guide-pearchannel.html
  7.  *  for more info.
  8.  *
  9.  *  @author     ICHII Takashi <ichii386@schweetheart.jp>
  10.  *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
  11.  *  @package    Ethna
  12.  *  @version    $Id$
  13.  */
  14.  
  15. require_once ETHNA_BASE . '/class/Ethna_PearWrapper.php';
  16.  
  17. // {{{ Ethna_Plugin_Handle_MakePluginPackage
  18. /**
  19.  *  make-plugin-package handler.
  20.  *
  21.  *  @author     ICHII Takashi <ichii386@schweetheart.jp>
  22.  *  @access     public
  23.  *  @package    Ethna
  24.  */
  25. {
  26.     // {{{ perform()
  27.     /**
  28.      * @access public
  29.      */
  30.     function perform()
  31.     {
  32.         require_once 'PEAR/PackageFileManager.php';
  33.         require_once 'PEAR/PackageFileManager2.php';
  34.         require_once 'PEAR/PackageFileManager/File.php';
  35.  
  36.         // 引数の評価
  37.         $args =& $this->_parseArgList();
  38.         if (Ethna::isError($args)) {
  39.             return $args;
  40.         }
  41.         list($ini, $skelfile, $workdir) = $args;
  42.  
  43.         // パッケージを作るプラグインの target
  44.         $targets = array();
  45.         if ($ini['plugin']['master'] == true) {
  46.             $targets[] = 'master';
  47.         }
  48.         if ($ini['plugin']['local'] == true) {
  49.             $targets[] = 'local';
  50.         }
  51.  
  52.         // 設定用の配列を用意
  53.         $setting = array();
  54.  
  55.         // {{{ master と local で共通の設定
  56.         // プラグイン名
  57.         $ptype = $ini['plugin']['type'];
  58.         $pname = $ini['plugin']['name'];
  59.  
  60.         // パッケージの説明
  61.         $setting['channel']     = $ini['package']['channel'];
  62.         $setting['summary']     = $ini['package']['summary'];
  63.         $setting['description'] = $ini['package']['description'];
  64.  
  65.         // リリースの説明
  66.         $setting['version']     = $ini['release']['version'];
  67.         $setting['state']       = $ini['release']['state'];
  68.         $setting['notes']       = $ini['release']['notes'];
  69.  
  70.         // メンテナ
  71.         $mnts = $ini['maintainers'];
  72.         for ($i = 1; ; $i++) {
  73.             if (isset($mnts["name$i"]) == false
  74.                 || isset($mnts["user$i"]) == false
  75.                 || isset($mnts["email$i"]) == false) {
  76.                 break;
  77.             }
  78.             $setting['maintainers'][] = array(
  79.                 'user'   => $mnts["user$i"],
  80.                 'name'   => $mnts["name$i"],
  81.                 'email'  => $mnts["email$i"],
  82.                 'role'   => isset($mnts["role$i"]) ? $mnts["role$i"] : 'lead',
  83.                 'active' => isset($mnts["active$i"]) ? $mnts["active$i"] == true: 'yes',
  84.                 );
  85.         }
  86.  
  87.         // ライセンス
  88.         $setting['license']['name'] = $ini['license']['name'];
  89.         if (isset($ini['license']['uri'])) {
  90.             $setting['license']['uri'] = $ini['license']['uri'];
  91.         }
  92.         // }}}
  93.  
  94.         // まるまるコピー :-p
  95.         $setting = array('master' => $setting, 'local' => $setting);
  96.  
  97.         // {{{ master と local で異なる部分
  98.         // パッケージ名
  99.         $setting['master']['pkgname'] = "Ethna_Plugin_{$ptype}_{$pname}";
  100.         $setting['local'] ['pkgname'] = "App_Plugin_{$ptype}_{$pname}";
  101.  
  102.         // プラグインのファイル名
  103.         $setting['master']['filename'] = "Ethna_Plugin_{$ptype}_{$pname}.php";
  104.         $setting['local'] ['filename'] = "skel.plugin.{$ptype}_{$pname}.php";
  105.  
  106.         // 入力ファイルの置換マクロ
  107.         $setting['master']['macro'] = array(
  108.             // package 時に置換
  109.             'application_id'    => 'Ethna',
  110.             'project_id'        => 'Ethna',
  111.             );
  112.         $setting['local']['macro'] = array(
  113.             // install 時に置換
  114.             );
  115.  
  116.         // setOptins($config) 時に merge する設定
  117.         $setting['master']['config'] = array(
  118.             'baseinstalldir' => "Ethna/class/Plugin/{$ptype}",
  119.             );
  120.         $setting['local']['config'] = array(
  121.             'baseinstalldir' => '.',
  122.             );
  123.  
  124.         // 任意に $packagexml->doSomething() するための callback
  125.         $setting['master']['callback'] = array(
  126.             'addPackageDepWithChannel'
  127.                 => array('optional', 'ethna', 'pear.ethna.jp', '2.3.0'),
  128.             );
  129.         $setting['local']['callback'] = array(
  130.             // local 用のパッケージを master にインストールさせないための conflict
  131.             'addConflictingPackageDepWithChannel'
  132.                 => array('pear', 'pear.php.net'),
  133.             );
  134.         // }}}
  135.  
  136.  
  137.         // パッケージ作成
  138.         $this->pear =& new Ethna_PearWrapper();
  139.         $this->pear->init('master');
  140.         foreach ($targets as $target) {
  141.             $this->_makePackage($skelfile, $setting[$target], "$workdir/$target");
  142.         }
  143.     }
  144.     // }}}
  145.  
  146.     // {{{ _makePackage()
  147.     /**
  148.      * @access private
  149.      */
  150.     function &_makePackage($skelfile, $setting, $workdir)
  151.     {
  152.         if (Ethna_Util::mkdir($workdir, 0755) === false) {
  153.             return Ethna::raiseError("failed making working dir: $workdir.");
  154.         }
  155.  
  156.         // プラグインの元ファイルを作成
  157.         $rfp = fopen($skelfile, "r");
  158.         if ($rfp == false) {
  159.             return Ethna::raiseError("failed open skelton file: $skelfile.");
  160.         }
  161.         $outputfile = $setting['filename'];
  162.         $wfp = fopen("$workdir/$outputfile", "w");
  163.         if ($rfp == false) {
  164.             fclose($rfp);
  165.             return Ethna::raiseError("failed creating working file: $outputfile.");
  166.         }
  167.         for (;;) {
  168.             $s = fread($rfp, 4096);
  169.             if (strlen($s) == 0) {
  170.                 break;
  171.             }
  172.             foreach ($setting['macro'] as $k => $v) {
  173.                 $s = preg_replace("/{\\\$$k}/", $v, $s);
  174.             }
  175.             fwrite($wfp, $s);
  176.         }
  177.         fclose($wfp);
  178.         fclose($rfp);
  179.  
  180.         // package.xml を作る
  181.         $pkgconfig = array(
  182.             'packagedirectory' => $workdir,
  183.             'outputdirectory' => $workdir,
  184.             'ignore' => array('CVS/', '.cvsignore', '.svn/',
  185.                               'package.xml', 'package.ini', $setting['pkgname'].'-*.tgz'),
  186.             'filelistgenerator' => 'file',
  187.             'changelogoldtonew' => false,
  188.             );
  189.  
  190.         $packagexml =& new PEAR_PackageFileManager2();
  191.  
  192.         $pkgconfig = array_merge($pkgconfig, $setting['config']);
  193.         $packagexml->setOptions($pkgconfig);
  194.  
  195.         $packagexml->setPackage($setting['pkgname']);
  196.         $packagexml->setSummary($setting['summary']);
  197.         $packagexml->setNotes($setting['notes']);
  198.         $packagexml->setDescription($setting['description']);
  199.         $packagexml->setChannel($setting['channel']);
  200.         $packagexml->setAPIVersion($setting['version']);
  201.         $packagexml->setReleaseVersion($setting['version']);
  202.         $packagexml->setReleaseStability($setting['state']);
  203.         $packagexml->setAPIStability($setting['state']);
  204.         $packagexml->setPackageType('php');
  205.         foreach ($setting['maintainers'] as $m) {
  206.             $packagexml->addMaintainer($m['role'], $m['user'], $m['name'],
  207.                                        $m['email'], $m['active']);
  208.         }
  209.         $packagexml->setLicense($setting['license']['name'],
  210.                                 $setting['license']['uri']);
  211.  
  212.         $packagexml->addRole('css', 'php');
  213.         $packagexml->addRole('tpl', 'php');
  214.         $packagexml->addRole('ethna', 'php');
  215.         $packagexml->addRole('sh', 'script');
  216.         $packagexml->addRole('bat', 'script');
  217.  
  218.         $packagexml->setPhpDep('4.1.0');
  219.         $packagexml->setPearinstallerDep('1.3.5');
  220.  
  221.         $packagexml->generateContents();
  222.  
  223.         foreach ($setting['callback'] as $method => $params) {
  224.             $r = call_user_func_array(array(&$packagexml, $method), $params);
  225.         }
  226.  
  227.         $r = $packagexml->writePackageFile();
  228.         if (PEAR::isError($r)) {
  229.             return Ethna::raiseError($r->getMessage, $r->getCode());
  230.         }
  231.  
  232.         // package を作る
  233.         $r = $this->pear->_run('package', array(), array("$workdir/package.xml"));
  234.         if (PEAR::isError($r)) {
  235.             return Ethna::raiseError($r->getMessage, $r->getCode());
  236.         }
  237.  
  238.         if (Ethna_Util::purgeDir($workdir) === false) {
  239.             return Ethna::raiseError("failed cleaning up working dir: $workdir.");
  240.         }
  241.     }
  242.     // }}}
  243.  
  244.     // {{{ _parseArgList()
  245.     /**
  246.      * @access private
  247.      */
  248.     function &_parseArgList()
  249.     {
  250.         $r =& $this->_getopt(array('inifile=', 'skelfile=', 'workdir='));
  251.         if (Ethna::isError($r)) {
  252.             return $r;
  253.         }
  254.         list($opt_list, $arg_list) = $r;
  255.  
  256.         // inifile
  257.         if (isset($opt_list['inifile'])
  258.             && is_readable(end($opt_list['inifile']))) {
  259.             $ini = parse_ini_file(end($opt_list['inifile']), true);
  260.         } else {
  261.             return Ethna::raiseError('give a valid inifile.');
  262.         }
  263.  
  264.         // skelfile
  265.         if (isset($opt_list['skelfile'])
  266.             && is_readable(end($opt_list['skelfile']))) {
  267.             $skelfile = end($opt_list['skelfile']);
  268.         } else {
  269.             return Ethna::raiseError('give a valid filename of plugin skelton file.');
  270.         }
  271.  
  272.         // workdir
  273.         if (isset($opt_list['workdir'])) {
  274.             $workdir = end($opt_list['workdir']);
  275.         } else {
  276.             $workdir = getcwd();
  277.         }
  278.  
  279.         return array($ini, $skelfile, $workdir);
  280.     }
  281.     // }}}
  282.  
  283.     // {{{ getDescription()
  284.     /**
  285.      *  @access public
  286.      */
  287.     function getDescription()
  288.     {
  289.         return <<<EOS
  290. make plugin package:
  291.     {$this->id} [-i|--inifile=file] [-s|--skelfile=file] [-w|--workdir=dir]
  292.  
  293. EOS;
  294.     }
  295.     // }}}
  296. }
  297. // }}}
  298. ?>

Documentation generated on Fri, 11 Nov 2011 04:00:31 +0900 by phpDocumentor 1.4.3