Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
/**
3
 * PEAR_Command_Common base class
4
 *
5
 * PHP versions 4 and 5
6
 *
7
 * @category   pear
8
 * @package    PEAR
9
 * @author     Stig Bakken <ssb@php.net>
10
 * @author     Greg Beaver <cellog@php.net>
11
 * @copyright  1997-2009 The Authors
12
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
13
 * @version    CVS: $Id: Common.php 313023 2011-07-06 19:17:11Z dufuz $
14
 * @link       http://pear.php.net/package/PEAR
15
 * @since      File available since Release 0.1
16
 */
17
 
18
/**
19
 * base class
20
 */
21
require_once 'PEAR.php';
22
 
23
/**
24
 * PEAR commands base class
25
 *
26
 * @category   pear
27
 * @package    PEAR
28
 * @author     Stig Bakken <ssb@php.net>
29
 * @author     Greg Beaver <cellog@php.net>
30
 * @copyright  1997-2009 The Authors
31
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
32
 * @version    Release: 1.9.4
33
 * @link       http://pear.php.net/package/PEAR
34
 * @since      Class available since Release 0.1
35
 */
36
class PEAR_Command_Common extends PEAR
37
{
38
    /**
39
     * PEAR_Config object used to pass user system and configuration
40
     * on when executing commands
41
     *
42
     * @var PEAR_Config
43
     */
44
    var $config;
45
    /**
46
     * @var PEAR_Registry
47
     * @access protected
48
     */
49
    var $_registry;
50
 
51
    /**
52
     * User Interface object, for all interaction with the user.
53
     * @var object
54
     */
55
    var $ui;
56
 
57
    var $_deps_rel_trans = array(
58
                                 'lt' => '<',
59
                                 'le' => '<=',
60
                                 'eq' => '=',
61
                                 'ne' => '!=',
62
                                 'gt' => '>',
63
                                 'ge' => '>=',
64
                                 'has' => '=='
65
                                 );
66
 
67
    var $_deps_type_trans = array(
68
                                  'pkg' => 'package',
69
                                  'ext' => 'extension',
70
                                  'php' => 'PHP',
71
                                  'prog' => 'external program',
72
                                  'ldlib' => 'external library for linking',
73
                                  'rtlib' => 'external runtime library',
74
                                  'os' => 'operating system',
75
                                  'websrv' => 'web server',
76
                                  'sapi' => 'SAPI backend'
77
                                  );
78
 
79
    /**
80
     * PEAR_Command_Common constructor.
81
     *
82
     * @access public
83
     */
84
    function PEAR_Command_Common(&$ui, &$config)
85
    {
86
        parent::PEAR();
87
        $this->config = &$config;
88
        $this->ui = &$ui;
89
    }
90
 
91
    /**
92
     * Return a list of all the commands defined by this class.
93
     * @return array list of commands
94
     * @access public
95
     */
96
    function getCommands()
97
    {
98
        $ret = array();
99
        foreach (array_keys($this->commands) as $command) {
100
            $ret[$command] = $this->commands[$command]['summary'];
101
        }
102
 
103
        return $ret;
104
    }
105
 
106
    /**
107
     * Return a list of all the command shortcuts defined by this class.
108
     * @return array shortcut => command
109
     * @access public
110
     */
111
    function getShortcuts()
112
    {
113
        $ret = array();
114
        foreach (array_keys($this->commands) as $command) {
115
            if (isset($this->commands[$command]['shortcut'])) {
116
                $ret[$this->commands[$command]['shortcut']] = $command;
117
            }
118
        }
119
 
120
        return $ret;
121
    }
122
 
123
    function getOptions($command)
124
    {
125
        $shortcuts = $this->getShortcuts();
126
        if (isset($shortcuts[$command])) {
127
            $command = $shortcuts[$command];
128
        }
129
 
130
        if (isset($this->commands[$command]) &&
131
              isset($this->commands[$command]['options'])) {
132
            return $this->commands[$command]['options'];
133
        }
134
 
135
        return null;
136
    }
137
 
138
    function getGetoptArgs($command, &$short_args, &$long_args)
139
    {
140
        $short_args = '';
141
        $long_args = array();
142
        if (empty($this->commands[$command]) || empty($this->commands[$command]['options'])) {
143
            return;
144
        }
145
 
146
        reset($this->commands[$command]['options']);
147
        while (list($option, $info) = each($this->commands[$command]['options'])) {
148
            $larg = $sarg = '';
149
            if (isset($info['arg'])) {
150
                if ($info['arg']{0} == '(') {
151
                    $larg = '==';
152
                    $sarg = '::';
153
                    $arg = substr($info['arg'], 1, -1);
154
                } else {
155
                    $larg = '=';
156
                    $sarg = ':';
157
                    $arg = $info['arg'];
158
                }
159
            }
160
 
161
            if (isset($info['shortopt'])) {
162
                $short_args .= $info['shortopt'] . $sarg;
163
            }
164
 
165
            $long_args[] = $option . $larg;
166
        }
167
    }
168
 
169
    /**
170
    * Returns the help message for the given command
171
    *
172
    * @param string $command The command
173
    * @return mixed A fail string if the command does not have help or
174
    *               a two elements array containing [0]=>help string,
175
    *               [1]=> help string for the accepted cmd args
176
    */
177
    function getHelp($command)
178
    {
179
        $config = &PEAR_Config::singleton();
180
        if (!isset($this->commands[$command])) {
181
            return "No such command \"$command\"";
182
        }
183
 
184
        $help = null;
185
        if (isset($this->commands[$command]['doc'])) {
186
            $help = $this->commands[$command]['doc'];
187
        }
188
 
189
        if (empty($help)) {
190
            // XXX (cox) Fallback to summary if there is no doc (show both?)
191
            if (!isset($this->commands[$command]['summary'])) {
192
                return "No help for command \"$command\"";
193
            }
194
            $help = $this->commands[$command]['summary'];
195
        }
196
 
197
        if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) {
198
            foreach($matches[0] as $k => $v) {
199
                $help = preg_replace("/$v/", $config->get($matches[1][$k]), $help);
200
            }
201
        }
202
 
203
        return array($help, $this->getHelpArgs($command));
204
    }
205
 
206
    /**
207
     * Returns the help for the accepted arguments of a command
208
     *
209
     * @param  string $command
210
     * @return string The help string
211
     */
212
    function getHelpArgs($command)
213
    {
214
        if (isset($this->commands[$command]['options']) &&
215
            count($this->commands[$command]['options']))
216
        {
217
            $help = "Options:\n";
218
            foreach ($this->commands[$command]['options'] as $k => $v) {
219
                if (isset($v['arg'])) {
220
                    if ($v['arg'][0] == '(') {
221
                        $arg = substr($v['arg'], 1, -1);
222
                        $sapp = " [$arg]";
223
                        $lapp = "[=$arg]";
224
                    } else {
225
                        $sapp = " $v[arg]";
226
                        $lapp = "=$v[arg]";
227
                    }
228
                } else {
229
                    $sapp = $lapp = "";
230
                }
231
 
232
                if (isset($v['shortopt'])) {
233
                    $s = $v['shortopt'];
234
                    $help .= "  -$s$sapp, --$k$lapp\n";
235
                } else {
236
                    $help .= "  --$k$lapp\n";
237
                }
238
 
239
                $p = "        ";
240
                $doc = rtrim(str_replace("\n", "\n$p", $v['doc']));
241
                $help .= "        $doc\n";
242
            }
243
 
244
            return $help;
245
        }
246
 
247
        return null;
248
    }
249
 
250
    function run($command, $options, $params)
251
    {
252
        if (empty($this->commands[$command]['function'])) {
253
            // look for shortcuts
254
            foreach (array_keys($this->commands) as $cmd) {
255
                if (isset($this->commands[$cmd]['shortcut']) && $this->commands[$cmd]['shortcut'] == $command) {
256
                    if (empty($this->commands[$cmd]['function'])) {
257
                        return $this->raiseError("unknown command `$command'");
258
                    } else {
259
                        $func = $this->commands[$cmd]['function'];
260
                    }
261
                    $command = $cmd;
262
 
263
                    //$command = $this->commands[$cmd]['function'];
264
                    break;
265
                }
266
            }
267
        } else {
268
            $func = $this->commands[$command]['function'];
269
        }
270
 
271
        return $this->$func($command, $options, $params);
272
    }
273
}