cvs: phpdoc /scripts/iniupdate .cvsignore README cvs-get-release generate_changelog.php ini-update.php ini_search_lib.php insert_db.php make_db.php
update-all update_db.php version4.tags version5.tags
| From: | Nuno Lopes | Date: | Tue, 22 Feb 2005 17:54:59 +0000 |
| Subject: | cvs: phpdoc /scripts/iniupdate .cvsignore README cvs-get-release generate_changelog.php ini-update.php ini_search_lib.php insert_db.php make_db.php update-all update_db.php version4.tags version5.tags |
||
| Groups: | php.doc | ||
| Request: | Send a blank email to phpdoc+get-969366725@lists.php.net to get a copy of this message | ||
nlopess Tue Feb 22 12:54:59 2005 EDT
Added files:
/phpdoc/scripts/iniupdate .cvsignore README cvs-get-release
generate_changelog.php ini-update.php
ini_search_lib.php insert_db.php
make_db.php update-all update_db.php
version4.tags version5.tags
Log:
commit script to update ini.xml files
contains code by Jakub
http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/.cvsignore?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/.cvsignore +++ phpdoc/scripts/iniupdate/.cvsignore sources *.sqlite http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/generate_changelog.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/generate_changelog.php +++ phpdoc/scripts/iniupdate/generate_changelog.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ /** converts a tag like php_5_0_0 into a version like 5.0.0 */ function tag2version($tag) { $s = strtr(substr($tag, 4), '_', '.'); return substr($s, 2) == 'cvs' ? $s{0} . '-cvs' : $s; } /** checks if an ini setting has changed its value in PHP 5 */ function check_php4($array) { foreach($array as $key => $val) { if (substr($key, 0, 5) != 'php_4') { continue; } if ($val) { if (isset($old)) { if ($val != $old) { return ''; } } else { $old = $val; } } } if (isset($old) && $old != $array['php_5_0_0'] && $array['php_5_0_0']) { return "$old in PHP 4."; } } /** return when the option become available */ function available_since($array) { if ($array['php_4_0_0']) { return ''; } foreach($array as $key => $val) { if ($val) { return 'Available since PHP ' . tag2version($key) . '.'; } } } /** check for changes between versions */ function last_version($array) { $php4 = check_php4($array); $str = ''; foreach($array as $key => $val) { if ($php4 && substr($key, 0, 5) == 'php_4') { continue; } if ($val) { if (isset($old)) { if ($val != $old) { $str .= " $old in PHP <= " . tag2version($old_tag) . '.'; } } $old = $val; $old_tag = $key; } } return $php4 . $str; } /** generate the changelog column */ function generate_changelog($array) { array_shift($array); return trim(last_version($array) . ' ' . available_since($array)); } $error = ''; if (!$idx = sqlite_open('ini_changelog.sqlite', 0666, $error)) { die("Couldn't open the DB: $error"); } $q = sqlite_unbuffered_query($idx, 'SELECT * FROM changelog'); /* This hack is needed because sqlite 2 sort case-sensitive */ while($row = sqlite_fetch_array($q, SQLITE_ASSOC)) { uksort($row, 'strnatcmp'); $info[$row['name']] = $row; } uksort($info, 'strnatcasecmp'); foreach ($info as $row) { $changelog[$row['name']] = generate_changelog($row); } if (!isset($included)) { foreach ($changelog as $key => $val) { echo "$key : $val\n"; } } sqlite_close($idx); ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/ini-update.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/ini-update.php +++ phpdoc/scripts/iniupdate/ini-update.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | | Jakub Vrána <vrana@php.net> | +----------------------------------------------------------------------+ */ /* Configuration Options */ $php_src_dir = '../../../php-src'; //php-src path $pecl_dir = '../../../pecl'; //pecl path $phpdoc_dir = '../../'; //phpdoc path /******* END of configurations *****/ /* Search for INI entrys and C macros in php-src/pecl directory */ function recurse($dir) { global $array, $replace; if (!$dh = opendir($dir)) { die ("couldn't open the specified dir ($dir)"); } while (($file = readdir($dh)) !== false) { if($file == '.' || $file == '..') { continue; } $path = $dir . '/' .$file; if(is_dir($path)) { recurse($path); } else { $file = file_get_contents($path); /* delete comments */ $file = preg_replace('@(//.*$)|(/\*.*\*/)@SmsU', '', $file); /* The MAGIC Regexp :) */ if(preg_match_all('/(?:PHP|ZEND)_INI_(?:ENTRY(?:_EX)?|BOOLEAN)\s*\(\s*"([^"]+)"\s*,\s*("\S*"|[^,]+)\s*,\s*([^,]+)/S', $file, $matches)) { $count = count($matches[0]); for($i=0;$i<$count;$i++) { $default = htmlspecialchars($matches[2][$i], ENT_NOQUOTES); $permissions = preg_replace(array('/\s+/', '/ZEND/'), array('', 'PHP'), $matches[3][$i]); $permissions = ($permissions == 'PHP_INI_PERDIR|PHP_INI_SYSTEM' || $permissions == 'PHP_INI_SYSTEM|PHP_INI_PERDIR') ? 'PHP_INI_PERDIR' : $permissions; $array[] = $matches[1][$i] . '-!!-' . $default . '-!!-' . $permissions; } } //end of the magic regex /* search for C macros */ if(preg_match_all('/#\s*define\s+(\S{5,})[ \t]+(.+)/S', $file, $matches)) { $count = count($matches[0]); for($i=0;$i<$count;$i++) { $replace[$matches[1][$i]] = rtrim($matches[2][$i]); } } // end of macros } //!is_dir() } //while() loop closedir($dh); } /* Fix ini.xml files */ function fix_ini_xml($filename) { global $info; $original = $file = file_get_contents($filename); // insert the changelog column if it doesn't exist $file = preg_replace('@<tgroup\s+cols=[\'"]3[\'"]>(\s*<thead>\s*<row>\s*<entry>&?Name;?</entry>\s*<entry>&?Default;?</entry>(\s*)<entry>&?Changeable;?</entry>)(\s*</row>\s*</thead>)@US', '<tgroup cols="4">\1\2<entry>Changelog</entry>\3', $file); // remove old permissions constants usage about PHP_INI_PERDIR $file = preg_replace('/(?:PHP_INI_SYSTEM\s*\|\s*)?PHP_INI_PERDIR(?:\s*\|\s*PHP_INI_SYSTEM)?/', 'PHP_INI_PERDIR', $file); preg_match_all('@<tbody>.+</tbody>@USs', $file, $matches); foreach ($matches[0] as $match) { preg_match_all('@<row>.+</row>@USs', $match, $matches_row); foreach ($matches_row[0] as $match_row) { preg_match_all('@<entry>.+</entry>@USs', $match_row, $matches_entry); foreach ($matches_entry as $val) { // create changelog column if (count($val) == 3) { $file = preg_replace("@(<row>\s*$val[0]\s*$val[1](\s*)$val[2])(\s*</row>)@", '\1\2<entry></entry>\3', $file); $val[3] = '<entry></entry>'; } // now update the info $entry = substr($val[0], 7, -8); if (isset($info[$entry])) { $file = preg_replace("@(<row>\s*$val[0]\s*)$val[1](\s*)$val[2](\s*)$val[3](\s*</row>)@", "\\1<entry>{$info[$entry]['default']}</entry>\\2<entry>{$info[$entry]['permissions']}</entry>\\3<entry>{$info[$entry]['changelog']}</entry>\\4", $file); } } } } // if the file was modified, write the changes if ($original != $file) { file_put_contents($filename, $file); } } /* Start the main program */ $array = array(); $replace = array(); recurse($php_src_dir); recurse($pecl_dir); natcasesort($array); $string = ''; // get the changelog info $included = true; require('./generate_changelog.php'); unset($info, $included, $error, $row); /* &php.ini; only */ $special = array('disable_functions' => 1, 'disable_classes' => 1, 'expose_php' => 1); /* Find links to documentation */ $links = array(); $link_files = array(); $ini_files = glob("$phpdoc_dir/en/reference/*/ini.xml"); $ini_files[] = "$phpdoc_dir/en/features/safe-mode.xml"; $ini_files[] = "$phpdoc_dir/en/appendices/ini.xml"; foreach ($ini_files as $filename) { preg_match_all('~<varlistentry id="(ini.[^"]*)">(.*)</varlistentry>~USs', file_get_contents($filename), $matches, PREG_SET_ORDER); foreach ($matches as $varlistentry) { preg_match_all('~<term>.*<parameter>(.*)</parameter>~USs', $varlistentry[2], $matches2); foreach ($matches2[1] as $parameter) { $links[trim($parameter)] = $varlistentry[1]; $link_files[trim($parameter)] = $filename; } } } /* Generate the XML code */ foreach($array as $key => $value) { $arr = explode('-!!-', $value); $entry = $arr[0]; if(isset($info[$entry])) { continue; } /* link entries */ if (isset($links[$entry])) { $entry = '<link linkend="' . $links[$entry] . '">' . $entry . '</link>'; unset($link_files[$arr[0]]); } /* replace macros and make the $default var */ $new = $arr[1]; do { $old = $new; $new = strtr($new,$replace); } while($new != $old); $default = $new; if(preg_match_all('/"([^"]+)"/S', $default, $match) > 1) { $default = '"'; foreach($match[1] as $add) { $default .= $add; } $default .= '"'; } // replace the @PREFIX@ stuff $default = preg_replace(array('~@PREFIX@~i', '~[\\\\]{2}~'), array('/path/to/php', '/'), $default); /* end of $default stuff */ $permissions = isset($special[$arr[0]]) ? '&php.ini; only' : $arr[2]; $info[$arr[0]]['default'] = $default; $info[$arr[0]]['permissions'] = $permissions; $info[$arr[0]]['changelog'] = isset($changelog[$arr[0]]) ? $changelog[$arr[0]] : ''; $string .= ' <row>' . PHP_EOL. " <entry>$entry</entry>" . PHP_EOL. " <entry>$default</entry>" . PHP_EOL. " <entry>$permissions</entry>" . PHP_EOL. " <entry>{$info[$arr[0]]['changelog']}</entry>" . PHP_EOL. ' </row>'.PHP_EOL; } /* Print unmatched links */ $deprecated = array('track_vars', 'debugger.host', 'debugger.port', 'debugger.enabled', 'sesam_oml', 'sesam_configfile', 'sesam_messagecatalog', 'gpc_order', 'allow_webdav_methods'); foreach ($deprecated as $val) { unset($link_files[$val]); } if ($link_files) { echo "Warning - unmatched links:\n"; foreach ($link_files as $ini => $file) { echo str_pad("$ini", 30, " ", STR_PAD_RIGHT) . " => " . substr($file, strlen($phpdoc_dir)+4) . "\n"; } } /* Now write the final result */ $file = file_get_contents("$phpdoc_dir/en/appendices/ini.xml"); $pos = strpos($file, '<tbody>', strpos($file, '<title>Configuration options</title>')) + strlen('<tbody>'); $pos2 = strpos($file, '</tbody>', $pos); file_put_contents("$phpdoc_dir/en/appendices/ini.xml", substr($file, 0, $pos) . PHP_EOL . $string . ' ' . substr($file, $pos2)); /* fix ini.xml files (if needed) */ foreach ($ini_files as $file) { fix_ini_xml($file); } ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/ini_search_lib.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/ini_search_lib.php +++ phpdoc/scripts/iniupdate/ini_search_lib.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ function recurse($dir) { global $array; if (!$dh = opendir($dir)) { die ("couldn't open the specified dir ($dir)"); } while (($file = readdir($dh)) !== false) { if($file == '.' || $file == '..') { continue; } $path = $dir . '/' .$file; if(is_dir($path)) { recurse($path); } else { $file = file_get_contents($path); /* delete comments */ $file = preg_replace('@(//.*$)|(/\*.*\*/)@SmsU', '', $file); /* The MAGIC Regexp :) */ if(preg_match_all('/(?:PHP|ZEND)_INI_(?:ENTRY(?:_EX)?|BOOLEAN)\s*\(\s*"([^"]+)"\s*,\s*("\S*"|[^,]+)\s*,\s*([^,]+)/S', $file, $matches)) { $count = count($matches[0]); for($i=0;$i<$count;$i++) { $default = htmlspecialchars($matches[2][$i], ENT_NOQUOTES); $permissions = preg_replace(array('/\s+/', '/ZEND/'), array('', 'PHP'), $matches[3][$i]); $permissions = ($permissions == 'PHP_INI_PERDIR|PHP_INI_SYSTEM' || $permissions == 'PHP_INI_SYSTEM|PHP_INI_PERDIR') ? 'PHP_INI_PERDIR' : $permissions; $array[] = array($matches[1][$i], $permissions); } } //end of the magic regex } //!is_dir() } //while() loop closedir($dh); } ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/insert_db.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/insert_db.php +++ phpdoc/scripts/iniupdate/insert_db.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ require './ini_search_lib.php'; function insert_in_db($tag) { global $array, $idx; $sql = ''; $sanity = array(); foreach ($array as $entry) { if (isset($sanity[$entry[0]])) { continue; } $sanity[$entry[0]] = 1; if ($a= sqlite_single_query($idx, "SELECT name FROM changelog WHERE name='{$entry[0]}'")) { $sql .= "UPDATE changelog SET $tag='{$entry[1]}' WHERE name='{$entry[0]}';"; } else { $sql .= "INSERT INTO changelog (name, $tag) VALUES ('{$entry[0]}', '{$entry[1]}');"; } } sqlite_query($idx, $sql); } $error = ''; $db_open = isset($idx) ? true : false; if (!$db_open && !$idx = sqlite_open('ini_changelog.sqlite', 0666, $error)) { die("Couldn't create the DB: $error"); } if (!isset($tags)) { $tags[] = 'php_4_cvs'; $tags[] = 'php_5_cvs'; $tags = array_merge($tags, array_map('rtrim', array_merge(file('version4.tags'), file('version5.tags')))); } foreach($tags as $tag) { $array = array(); recurse("./sources/$tag"); insert_in_db($tag); echo "$tag\n"; } if (!$db_open) { sqlite_close($idx); } ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/make_db.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/make_db.php +++ phpdoc/scripts/iniupdate/make_db.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ $error = ''; $db_open = isset($idx) ? true : false; if (!$db_open && !$idx = sqlite_open('ini_changelog.sqlite', 0666, $error)) { die("Couldn't create the DB: $error"); } $sql = 'CREATE TABLE changelog ( name TEXT PRIMARY KEY,'; $tags[] = 'php_4_cvs'; $tags[] = 'php_5_cvs'; $tags = array_merge($tags, array_map('rtrim', array_merge(file('version4.tags'), file('version5.tags')))); foreach($tags as $tag) { $sql .= "$tag TEXT,"; } $sql = substr($sql, 0, -1) . ');'; sqlite_query($idx, $sql); if (!$db_open) { sqlite_close($idx); } ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/update_db.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/update_db.php +++ phpdoc/scripts/iniupdate/update_db.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ $error = ''; copy('ini_changelog.sqlite', 'backup.sqlite'); if (!$idx = sqlite_open('ini_changelog.sqlite', 0666, $error)) { die("Couldn't create the DB: $error"); } $olddata = sqlite_fetch_all(sqlite_query($idx, 'SELECT * FROM changelog'), SQLITE_ASSOC); $columns = sqlite_fetch_array(sqlite_query($idx, 'SELECT * FROM changelog LIMIT 1'), SQLITE_ASSOC); sqlite_query($idx, 'DROP TABLE changelog; VACUUM;'); // make a new table. this also fills the $tags array include './make_db.php'; $sql = ''; foreach ($olddata as $row) { $keys = ''; foreach ($row as $key => $val) { $keys .= ",$key"; } $keys = substr($keys, 1); $sql .= "INSERT INTO changelog ($keys) VALUES (\"" . implode('", "', $row) . '");'; } sqlite_query($idx, $sql); $tmp = $tags; $tags = array('php_4_cvs', 'php_5_cvs'); foreach($tmp as $tag) { if (!isset($columns[$tag])) { $tags[] = $tag; } } // finally recurse through the new PHP versions include './insert_db.php'; sqlite_close($idx); ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/version4.tags?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/version4.tags +++ phpdoc/scripts/iniupdate/version4.tags php_4_0_0 php_4_0_1 php_4_0_2 php_4_0_3 php_4_0_4 php_4_0_5 php_4_0_6 php_4_1_0 php_4_1_1 php_4_1_2 php_4_2_0 php_4_2_1 php_4_2_2 php_4_2_3 php_4_3_0 php_4_3_1 php_4_3_2 php_4_3_3 php_4_3_4 php_4_3_5 php_4_3_6 php_4_3_7 php_4_3_8 php_4_3_9 php_4_3_10 http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/version5.tags?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/version5.tags +++ phpdoc/scripts/iniupdate/version5.tags php_5_0_0 php_5_0_1 php_5_0_2 php_5_0_3
http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/.cvsignore?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/.cvsignore +++ phpdoc/scripts/iniupdate/.cvsignore sources *.sqlite http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/generate_changelog.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/generate_changelog.php +++ phpdoc/scripts/iniupdate/generate_changelog.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ /** converts a tag like php_5_0_0 into a version like 5.0.0 */ function tag2version($tag) { $s = strtr(substr($tag, 4), '_', '.'); return substr($s, 2) == 'cvs' ? $s{0} . '-cvs' : $s; } /** checks if an ini setting has changed its value in PHP 5 */ function check_php4($array) { foreach($array as $key => $val) { if (substr($key, 0, 5) != 'php_4') { continue; } if ($val) { if (isset($old)) { if ($val != $old) { return ''; } } else { $old = $val; } } } if (isset($old) && $old != $array['php_5_0_0'] && $array['php_5_0_0']) { return "$old in PHP 4."; } } /** return when the option become available */ function available_since($array) { if ($array['php_4_0_0']) { return ''; } foreach($array as $key => $val) { if ($val) { return 'Available since PHP ' . tag2version($key) . '.'; } } } /** check for changes between versions */ function last_version($array) { $php4 = check_php4($array); $str = ''; foreach($array as $key => $val) { if ($php4 && substr($key, 0, 5) == 'php_4') { continue; } if ($val) { if (isset($old)) { if ($val != $old) { $str .= " $old in PHP <= " . tag2version($old_tag) . '.'; } } $old = $val; $old_tag = $key; } } return $php4 . $str; } /** generate the changelog column */ function generate_changelog($array) { array_shift($array); return trim(last_version($array) . ' ' . available_since($array)); } $error = ''; if (!$idx = sqlite_open('ini_changelog.sqlite', 0666, $error)) { die("Couldn't open the DB: $error"); } $q = sqlite_unbuffered_query($idx, 'SELECT * FROM changelog'); /* This hack is needed because sqlite 2 sort case-sensitive */ while($row = sqlite_fetch_array($q, SQLITE_ASSOC)) { uksort($row, 'strnatcmp'); $info[$row['name']] = $row; } uksort($info, 'strnatcasecmp'); foreach ($info as $row) { $changelog[$row['name']] = generate_changelog($row); } if (!isset($included)) { foreach ($changelog as $key => $val) { echo "$key : $val\n"; } } sqlite_close($idx); ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/ini-update.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/ini-update.php +++ phpdoc/scripts/iniupdate/ini-update.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | | Jakub Vrána <vrana@php.net> | +----------------------------------------------------------------------+ */ /* Configuration Options */ $php_src_dir = '../../../php-src'; //php-src path $pecl_dir = '../../../pecl'; //pecl path $phpdoc_dir = '../../'; //phpdoc path /******* END of configurations *****/ /* Search for INI entrys and C macros in php-src/pecl directory */ function recurse($dir) { global $array, $replace; if (!$dh = opendir($dir)) { die ("couldn't open the specified dir ($dir)"); } while (($file = readdir($dh)) !== false) { if($file == '.' || $file == '..') { continue; } $path = $dir . '/' .$file; if(is_dir($path)) { recurse($path); } else { $file = file_get_contents($path); /* delete comments */ $file = preg_replace('@(//.*$)|(/\*.*\*/)@SmsU', '', $file); /* The MAGIC Regexp :) */ if(preg_match_all('/(?:PHP|ZEND)_INI_(?:ENTRY(?:_EX)?|BOOLEAN)\s*\(\s*"([^"]+)"\s*,\s*("\S*"|[^,]+)\s*,\s*([^,]+)/S', $file, $matches)) { $count = count($matches[0]); for($i=0;$i<$count;$i++) { $default = htmlspecialchars($matches[2][$i], ENT_NOQUOTES); $permissions = preg_replace(array('/\s+/', '/ZEND/'), array('', 'PHP'), $matches[3][$i]); $permissions = ($permissions == 'PHP_INI_PERDIR|PHP_INI_SYSTEM' || $permissions == 'PHP_INI_SYSTEM|PHP_INI_PERDIR') ? 'PHP_INI_PERDIR' : $permissions; $array[] = $matches[1][$i] . '-!!-' . $default . '-!!-' . $permissions; } } //end of the magic regex /* search for C macros */ if(preg_match_all('/#\s*define\s+(\S{5,})[ \t]+(.+)/S', $file, $matches)) { $count = count($matches[0]); for($i=0;$i<$count;$i++) { $replace[$matches[1][$i]] = rtrim($matches[2][$i]); } } // end of macros } //!is_dir() } //while() loop closedir($dh); } /* Fix ini.xml files */ function fix_ini_xml($filename) { global $info; $original = $file = file_get_contents($filename); // insert the changelog column if it doesn't exist $file = preg_replace('@<tgroup\s+cols=[\'"]3[\'"]>(\s*<thead>\s*<row>\s*<entry>&?Name;?</entry>\s*<entry>&?Default;?</entry>(\s*)<entry>&?Changeable;?</entry>)(\s*</row>\s*</thead>)@US', '<tgroup cols="4">\1\2<entry>Changelog</entry>\3', $file); // remove old permissions constants usage about PHP_INI_PERDIR $file = preg_replace('/(?:PHP_INI_SYSTEM\s*\|\s*)?PHP_INI_PERDIR(?:\s*\|\s*PHP_INI_SYSTEM)?/', 'PHP_INI_PERDIR', $file); preg_match_all('@<tbody>.+</tbody>@USs', $file, $matches); foreach ($matches[0] as $match) { preg_match_all('@<row>.+</row>@USs', $match, $matches_row); foreach ($matches_row[0] as $match_row) { preg_match_all('@<entry>.+</entry>@USs', $match_row, $matches_entry); foreach ($matches_entry as $val) { // create changelog column if (count($val) == 3) { $file = preg_replace("@(<row>\s*$val[0]\s*$val[1](\s*)$val[2])(\s*</row>)@", '\1\2<entry></entry>\3', $file); $val[3] = '<entry></entry>'; } // now update the info $entry = substr($val[0], 7, -8); if (isset($info[$entry])) { $file = preg_replace("@(<row>\s*$val[0]\s*)$val[1](\s*)$val[2](\s*)$val[3](\s*</row>)@", "\\1<entry>{$info[$entry]['default']}</entry>\\2<entry>{$info[$entry]['permissions']}</entry>\\3<entry>{$info[$entry]['changelog']}</entry>\\4", $file); } } } } // if the file was modified, write the changes if ($original != $file) { file_put_contents($filename, $file); } } /* Start the main program */ $array = array(); $replace = array(); recurse($php_src_dir); recurse($pecl_dir); natcasesort($array); $string = ''; // get the changelog info $included = true; require('./generate_changelog.php'); unset($info, $included, $error, $row); /* &php.ini; only */ $special = array('disable_functions' => 1, 'disable_classes' => 1, 'expose_php' => 1); /* Find links to documentation */ $links = array(); $link_files = array(); $ini_files = glob("$phpdoc_dir/en/reference/*/ini.xml"); $ini_files[] = "$phpdoc_dir/en/features/safe-mode.xml"; $ini_files[] = "$phpdoc_dir/en/appendices/ini.xml"; foreach ($ini_files as $filename) { preg_match_all('~<varlistentry id="(ini.[^"]*)">(.*)</varlistentry>~USs', file_get_contents($filename), $matches, PREG_SET_ORDER); foreach ($matches as $varlistentry) { preg_match_all('~<term>.*<parameter>(.*)</parameter>~USs', $varlistentry[2], $matches2); foreach ($matches2[1] as $parameter) { $links[trim($parameter)] = $varlistentry[1]; $link_files[trim($parameter)] = $filename; } } } /* Generate the XML code */ foreach($array as $key => $value) { $arr = explode('-!!-', $value); $entry = $arr[0]; if(isset($info[$entry])) { continue; } /* link entries */ if (isset($links[$entry])) { $entry = '<link linkend="' . $links[$entry] . '">' . $entry . '</link>'; unset($link_files[$arr[0]]); } /* replace macros and make the $default var */ $new = $arr[1]; do { $old = $new; $new = strtr($new,$replace); } while($new != $old); $default = $new; if(preg_match_all('/"([^"]+)"/S', $default, $match) > 1) { $default = '"'; foreach($match[1] as $add) { $default .= $add; } $default .= '"'; } // replace the @PREFIX@ stuff $default = preg_replace(array('~@PREFIX@~i', '~[\\\\]{2}~'), array('/path/to/php', '/'), $default); /* end of $default stuff */ $permissions = isset($special[$arr[0]]) ? '&php.ini; only' : $arr[2]; $info[$arr[0]]['default'] = $default; $info[$arr[0]]['permissions'] = $permissions; $info[$arr[0]]['changelog'] = isset($changelog[$arr[0]]) ? $changelog[$arr[0]] : ''; $string .= ' <row>' . PHP_EOL. " <entry>$entry</entry>" . PHP_EOL. " <entry>$default</entry>" . PHP_EOL. " <entry>$permissions</entry>" . PHP_EOL. " <entry>{$info[$arr[0]]['changelog']}</entry>" . PHP_EOL. ' </row>'.PHP_EOL; } /* Print unmatched links */ $deprecated = array('track_vars', 'debugger.host', 'debugger.port', 'debugger.enabled', 'sesam_oml', 'sesam_configfile', 'sesam_messagecatalog', 'gpc_order', 'allow_webdav_methods'); foreach ($deprecated as $val) { unset($link_files[$val]); } if ($link_files) { echo "Warning - unmatched links:\n"; foreach ($link_files as $ini => $file) { echo str_pad("$ini", 30, " ", STR_PAD_RIGHT) . " => " . substr($file, strlen($phpdoc_dir)+4) . "\n"; } } /* Now write the final result */ $file = file_get_contents("$phpdoc_dir/en/appendices/ini.xml"); $pos = strpos($file, '<tbody>', strpos($file, '<title>Configuration options</title>')) + strlen('<tbody>'); $pos2 = strpos($file, '</tbody>', $pos); file_put_contents("$phpdoc_dir/en/appendices/ini.xml", substr($file, 0, $pos) . PHP_EOL . $string . ' ' . substr($file, $pos2)); /* fix ini.xml files (if needed) */ foreach ($ini_files as $file) { fix_ini_xml($file); } ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/ini_search_lib.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/ini_search_lib.php +++ phpdoc/scripts/iniupdate/ini_search_lib.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ function recurse($dir) { global $array; if (!$dh = opendir($dir)) { die ("couldn't open the specified dir ($dir)"); } while (($file = readdir($dh)) !== false) { if($file == '.' || $file == '..') { continue; } $path = $dir . '/' .$file; if(is_dir($path)) { recurse($path); } else { $file = file_get_contents($path); /* delete comments */ $file = preg_replace('@(//.*$)|(/\*.*\*/)@SmsU', '', $file); /* The MAGIC Regexp :) */ if(preg_match_all('/(?:PHP|ZEND)_INI_(?:ENTRY(?:_EX)?|BOOLEAN)\s*\(\s*"([^"]+)"\s*,\s*("\S*"|[^,]+)\s*,\s*([^,]+)/S', $file, $matches)) { $count = count($matches[0]); for($i=0;$i<$count;$i++) { $default = htmlspecialchars($matches[2][$i], ENT_NOQUOTES); $permissions = preg_replace(array('/\s+/', '/ZEND/'), array('', 'PHP'), $matches[3][$i]); $permissions = ($permissions == 'PHP_INI_PERDIR|PHP_INI_SYSTEM' || $permissions == 'PHP_INI_SYSTEM|PHP_INI_PERDIR') ? 'PHP_INI_PERDIR' : $permissions; $array[] = array($matches[1][$i], $permissions); } } //end of the magic regex } //!is_dir() } //while() loop closedir($dh); } ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/insert_db.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/insert_db.php +++ phpdoc/scripts/iniupdate/insert_db.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ require './ini_search_lib.php'; function insert_in_db($tag) { global $array, $idx; $sql = ''; $sanity = array(); foreach ($array as $entry) { if (isset($sanity[$entry[0]])) { continue; } $sanity[$entry[0]] = 1; if ($a= sqlite_single_query($idx, "SELECT name FROM changelog WHERE name='{$entry[0]}'")) { $sql .= "UPDATE changelog SET $tag='{$entry[1]}' WHERE name='{$entry[0]}';"; } else { $sql .= "INSERT INTO changelog (name, $tag) VALUES ('{$entry[0]}', '{$entry[1]}');"; } } sqlite_query($idx, $sql); } $error = ''; $db_open = isset($idx) ? true : false; if (!$db_open && !$idx = sqlite_open('ini_changelog.sqlite', 0666, $error)) { die("Couldn't create the DB: $error"); } if (!isset($tags)) { $tags[] = 'php_4_cvs'; $tags[] = 'php_5_cvs'; $tags = array_merge($tags, array_map('rtrim', array_merge(file('version4.tags'), file('version5.tags')))); } foreach($tags as $tag) { $array = array(); recurse("./sources/$tag"); insert_in_db($tag); echo "$tag\n"; } if (!$db_open) { sqlite_close($idx); } ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/make_db.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/make_db.php +++ phpdoc/scripts/iniupdate/make_db.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ $error = ''; $db_open = isset($idx) ? true : false; if (!$db_open && !$idx = sqlite_open('ini_changelog.sqlite', 0666, $error)) { die("Couldn't create the DB: $error"); } $sql = 'CREATE TABLE changelog ( name TEXT PRIMARY KEY,'; $tags[] = 'php_4_cvs'; $tags[] = 'php_5_cvs'; $tags = array_merge($tags, array_map('rtrim', array_merge(file('version4.tags'), file('version5.tags')))); foreach($tags as $tag) { $sql .= "$tag TEXT,"; } $sql = substr($sql, 0, -1) . ');'; sqlite_query($idx, $sql); if (!$db_open) { sqlite_close($idx); } ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/update_db.php?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/update_db.php +++ phpdoc/scripts/iniupdate/update_db.php <?php /* +----------------------------------------------------------------------+ | ini doc settings updater | +----------------------------------------------------------------------+ | Copyright (c) 1997-2005 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Nuno Lopes <nlopess@php.net> | +----------------------------------------------------------------------+ */ $error = ''; copy('ini_changelog.sqlite', 'backup.sqlite'); if (!$idx = sqlite_open('ini_changelog.sqlite', 0666, $error)) { die("Couldn't create the DB: $error"); } $olddata = sqlite_fetch_all(sqlite_query($idx, 'SELECT * FROM changelog'), SQLITE_ASSOC); $columns = sqlite_fetch_array(sqlite_query($idx, 'SELECT * FROM changelog LIMIT 1'), SQLITE_ASSOC); sqlite_query($idx, 'DROP TABLE changelog; VACUUM;'); // make a new table. this also fills the $tags array include './make_db.php'; $sql = ''; foreach ($olddata as $row) { $keys = ''; foreach ($row as $key => $val) { $keys .= ",$key"; } $keys = substr($keys, 1); $sql .= "INSERT INTO changelog ($keys) VALUES (\"" . implode('", "', $row) . '");'; } sqlite_query($idx, $sql); $tmp = $tags; $tags = array('php_4_cvs', 'php_5_cvs'); foreach($tmp as $tag) { if (!isset($columns[$tag])) { $tags[] = $tag; } } // finally recurse through the new PHP versions include './insert_db.php'; sqlite_close($idx); ?> http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/version4.tags?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/version4.tags +++ phpdoc/scripts/iniupdate/version4.tags php_4_0_0 php_4_0_1 php_4_0_2 php_4_0_3 php_4_0_4 php_4_0_5 php_4_0_6 php_4_1_0 php_4_1_1 php_4_1_2 php_4_2_0 php_4_2_1 php_4_2_2 php_4_2_3 php_4_3_0 php_4_3_1 php_4_3_2 php_4_3_3 php_4_3_4 php_4_3_5 php_4_3_6 php_4_3_7 php_4_3_8 php_4_3_9 php_4_3_10 http://cvs.php.net/co.php/phpdoc/scripts/iniupdate/version5.tags?r=1.1&p=1 Index: phpdoc/scripts/iniupdate/version5.tags +++ phpdoc/scripts/iniupdate/version5.tags php_5_0_0 php_5_0_1 php_5_0_2 php_5_0_3