#!/usr/bin/env php * @return map */ function parse_compat_info(array $compat) { return array( 'ext.name' => $compat['ext.name'], 'ext.min' => nonempty($compat['ext.min'], null), 'ext.max' => nonempty($compat['ext.max'], null), 'php.min' => nonempty($compat['php.min'], null), 'php.max' => nonempty($compat['php.max'], null), ); } $client = new \Bartlett\Reflect\Client(); $api = $client->api('reference'); foreach ($api->dir() as $extension) { $result = $api->show( $extension->name, false, false, false, true, true, true, true, true); foreach ($result['constants'] as $constant => $compat) { $output['constants'][$constant] = parse_compat_info($compat); } foreach ($result['functions'] as $function => $compat) { $output['functions'][$function] = parse_compat_info($compat); if (idx($compat, 'parameters')) { $output['params'][$function] = explode(', ', $compat['parameters']); } } foreach ($result['classes'] as $class => $compat) { $output['classes'][$class] = parse_compat_info($compat); } foreach ($result['interfaces'] as $interface => $compat) { $output['interfaces'][$interface] = parse_compat_info($compat); } foreach ($result['methods'] as $class => $methods) { $output['methods'][$class] = array(); foreach ($methods as $method => $compat) { $output['methods'][$class][$method] = parse_compat_info($compat); } } foreach ($result['static methods'] as $class => $methods) { $output['static_methods'][$class] = array(); foreach ($methods as $method => $compat) { $output['static_methods'][$class][$method] = parse_compat_info($compat); } } } ksort($output['params']); ksort($output['functions']); ksort($output['classes']); ksort($output['interfaces']); ksort($output['constants']); // Grepped from PHP Manual. // TODO: Can we get this from PHP CompatInfo? // See https://github.com/llaville/php-compat-info/issues/185. $output['functions_windows'] = array( 'apache_child_terminate' => false, 'chroot' => false, 'getrusage' => false, 'imagecreatefromxpm' => false, 'lchgrp' => false, 'lchown' => false, 'nl_langinfo' => false, 'strptime' => false, 'sys_getloadavg' => false, 'checkdnsrr' => '5.3.0', 'dns_get_record' => '5.3.0', 'fnmatch' => '5.3.0', 'getmxrr' => '5.3.0', 'getopt' => '5.3.0', 'imagecolorclosesthwb' => '5.3.0', 'inet_ntop' => '5.3.0', 'inet_pton' => '5.3.0', 'link' => '5.3.0', 'linkinfo' => '5.3.0', 'readlink' => '5.3.0', 'socket_create_pair' => '5.3.0', 'stream_socket_pair' => '5.3.0', 'symlink' => '5.3.0', 'time_nanosleep' => '5.3.0', 'time_sleep_until' => '5.3.0', ); Filesystem::writeFile( phutil_get_library_root('phutil').'/../'.$target, id(new PhutilJSON())->encodeFormatted($output)); echo pht('Done.')."\n";