cellog Sat Apr 7 20:40:29 2007 UTC
Modified files:
/CVSROOT/pear addkarma.php
Log:
improve addkarma dramatically
http://cvs.php.net/viewvc.cgi/CVSROOT/pear/addkarma.php?r1=1.1&r2=1.2&diff_format=u
Index: CVSROOT/pear/addkarma.php
diff -u CVSROOT/pear/addkarma.php:1.1 CVSROOT/pear/addkarma.php:1.2
--- CVSROOT/pear/addkarma.php:1.1 Sat Apr 7 04:46:22 2007
+++ CVSROOT/pear/addkarma.php Sat Apr 7 20:40:29 2007
@@ -11,7 +11,13 @@
$newinfo = array();
$karma = array();
$new = new SplFileObject(dirname(__FILE__) . '/avail');
-foreach ($new as $line) {
+$lines = array();
+$modulelines = array();
+foreach ($new as $i => $line) {
+ if (trim($line) == '# vim:set ft=conf sw=2 ts=2 et:') {
+ continue;
+ }
+ $lines[$i] = array('line' => $line, 'processed' => false);
$line = trim($line);
if (!strlen($line) || $line[0] == '#' || $line == 'unavail') {
continue;
@@ -35,6 +41,18 @@
$newinfo[$person][$module] = 1;
}
}
+ if (!isset($modulelines[$line[1]])) {
+ $modulelines[$line[1]] = array();
+ }
+ $modulelines[$line[1]][] = $i;
+ foreach ($modules as $module) {
+ if (!isset($modulelines[$module])) {
+ $modulelines[$module] = array();
+ }
+ $modulelines[$module][] = $i;
+ }
+ $lines[$i]['processed'] = array('rawmodules' => $line[1],
+ 'modules' => $modules, 'people' => $peoples);
}
$modules = explode(',', $_SERVER['argv'][2]);
array_walk($modules, create_function('&$a,$b', '$a = trim($a,"/");'));
@@ -61,14 +79,55 @@
}
$need[] = $module;
}
+function combinations($need, $top = true)
+{
+ if (count($need) == 1) {
+ return array($need);
+ }
+ $ret = array();
+ $max = count($need) - 1;
+ for ($i = 0; $i <= $max; $i++) {
+ $newarr = $need;
+ $first = array($need[$i]);
+ unset($newarr[$i]);
+ $newarr = array_values($newarr);
+ $combos = combinations($newarr, false);
+ foreach ($combos as $combo) {
+ $x = array_merge($first, $combo);
+ if ($top) $x = implode(',', $x);
+ $ret[] = $x;
+ }
+ }
+ return $ret;
+}
if (count($need)) {
- echo 'adding karma for ' . implode(',', $modules) . "\n";
- clearstatcache();
- $fp = fopen(dirname(__FILE__) . '/avail', 'r+');
- // strlen("\n# vim:set ft=conf sw=2 ts=2 et:\n")
- fseek($fp, -33, SEEK_END);
- ftruncate($fp, ftell($fp));
- fwrite($fp, "avail|" . $_SERVER['argv'][1] . '|' . implode(',', $need) .
- "\n# vim:set ft=conf sw=2 ts=2 et:\n");
- fclose($fp);
+ $possibilities = combinations($need);
+ // check for combos like pear,peardoc
+ foreach ($possibilities as $possible) {
+ if ($possible && isset($modulelines[$possible])) {
+ $need = $modules = array($possible);
+ break;
+ }
+ }
+ echo 'adding ' . $_SERVER['argv'][1] . ' karma for ' . implode(',',
$modules) . "\n";
+ echo "user now has karma for: \n ", implode(',', $modules), "\n ",
+ implode("\n ", $karma) . "\n";
+ foreach ($need as $mod) {
+ if (isset($modulelines[$mod])) {
+ $newline = -1;
+ while ($newline == -1 || !$lines[$newline]['processed']) {
+ $newline = array_pop($modulelines[$mod]);
+ }
+ $lines[$newline]['line'] = 'avail|' .
+ implode(',', $lines[$newline]['processed']['people']) . ',' .
+ $_SERVER['argv'][1] .
+ '|' . $lines[$newline]['processed']['rawmodules'] . "\n";
+ } else {
+ $lines[] = array('line' => "avail|" . $_SERVER['argv'][1] . '|' .
$mod . "\n",
+ 'processed' => false);
+ }
+ }
+ $lines[] = array('line' => "\n# vim:set ft=conf sw=2 ts=2 et:\n",
'processed' => false);
+ array_walk($lines, create_function('&$a,&$b','$a = $a[\'line\'];'));
+ file_put_contents(dirname(__FILE__) . '/avail', implode('', $lines));
}
\ No newline at end of file
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php