$this->pkginfo['configure_options'][] = $attribs;
}
break;
+ case 'provides':
+ if (empty($attribs['type']) || empty($attribs['name'])) {
+ break;
+ }
+ $attribs['explicit'] = true;
+ $this->pkginfo['provides']["$attribs[type];$attribs[name]"] = $attribs;
+ break;
}
}
}
$ret .= "$indent </configureoptions>\n";
}
+ if (isset($pkginfo['provides'])) {
+ foreach ($pkginfo['provides'] as $key => $what) {
+ $ret .= "$indent <provides type=\"$what[type]\" ";
+ $ret .= "name=\"$what[name]\" />\n";
+ }
+ }
if (isset($pkginfo['filelist'])) {
$ret .= "$indent <filelist>\n";
foreach ($pkginfo['filelist'] as $file => $fa) {
foreach ($info['filelist'] as $file => $fa) {
if (empty($fa['role'])) {
$errors[] = "file $file: missing role";
+ continue;
} elseif (!in_array($fa['role'], $_PEAR_Common_file_roles)) {
$errors[] = "file $file: invalid role, should be one of: ".implode(' ', $_PEAR_Common_file_roles);
}
+ if ($fa['role'] == 'php') {
+ $srcinfo = $this->analyzeSourceCode($file);
+ $this->buildProvidesArray($srcinfo);
+ }
// (ssb) Any checks we can do for baseinstalldir?
// (cox) Perhaps checks that either the target dir and
// baseInstall doesn't cointain "../../"
}
}
+ $pn = $info['package'];
+ $pnl = strlen($pn);
+ foreach ($this->pkginfo['provides'] as $key => $what) {
+ if (isset($what['explicit'])) {
+ // skip conformance checks if the provides entry is
+ // specified in the package.xml file
+ continue;
+ }
+ extract($what);
+ if ($type == 'class') {
+ if (!strncasecmp($name, $pn, $pnl)) {
+ continue;
+ }
+ $warnings[] = "in $file: class \"$name\" not prefixed with package name \"$pn\"";
+ } elseif ($type == 'function') {
+ if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) {
+ continue;
+ }
+ $warnings[] = "in $file: function \"$name\" not prefixed with package name \"$pn\"";
+ }
+ //print "$file: provides $what[type] $what[name]\n";
+ }
return true;
}
+ // }}}
+ // {{{ buildProvidesArray()
+
+ /**
+ * Build a "provides" array from data returned by
+ * analyzeSourceCode(). The format of the built array is like
+ * this:
+ *
+ * array(
+ * 'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
+ * ...
+ * )
+ *
+ *
+ * @param array $srcinfo array with information about a source file
+ * as returned by the analyzeSourceCode() method.
+ *
+ * @return void
+ *
+ * @access public
+ *
+ */
+ function buildProvidesArray($srcinfo)
+ {
+ foreach ($srcinfo['declared_classes'] as $class) {
+ $key = "class;$class";
+ if (isset($this->pkginfo['provides'][$key])) {
+ continue;
+ }
+ $this->pkginfo['provides'][$key] =
+ array('type' => 'class', 'name' => $class);
+ //var_dump($key, $this->pkginfo['provides'][$key]);
+ }
+ foreach ($srcinfo['declared_methods'] as $class => $methods) {
+ foreach ($methods as $method) {
+ $function = "$class::$method";
+ $key = "function;$function";
+ if ($method{0} == '_' || !strcasecmp($method, $class) ||
+ isset($this->pkginfo['provides'][$key])) {
+ continue;
+ }
+ $this->pkginfo['provides'][$key] =
+ array('type' => 'function', 'name' => $function);
+ //var_dump($key, $this->pkginfo['provides'][$key]);
+ }
+ }
+ foreach ($srcinfo['declared_functions'] as $function) {
+ $key = "function;$function";
+ if ($function{0} == '_' || isset($this->pkginfo['provides'][$key])) {
+ continue;
+ }
+ $this->pkginfo['provides'][$key] =
+ array('type' => 'function', 'name' => $function);
+ //var_dump($key, $this->pkginfo['provides'][$key]);
+ }
+ }
+
// }}}
// {{{ analyzeSourceCode()
$tokens = token_get_all($contents);
/*
for ($i = 0; $i < sizeof($tokens); $i++) {
- list($token, $data) = $tokens[$i];
+ @list($token, $data) = $tokens[$i];
if (is_string($token)) {
var_dump($token);
} else {
$used_functions = array();
$nodeps = array();
for ($i = 0; $i < sizeof($tokens); $i++) {
- list($token, $data) = $tokens[$i];
+ if (is_array($tokens[$i])) {
+ list($token, $data) = $tokens[$i];
+ } else {
+ $token = $tokens[$i];
+ $data = '';
+ }
switch ($token) {
+ case T_CURLY_OPEN:
+ case T_DOLLAR_OPEN_CURLY_BRACES:
case '{': $brace_level++; continue 2;
case '}':
$brace_level--;