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($workdir0755=== 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($rfp4096);
  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