cellog          Sun Apr  8 02:32:24 2007 UTC

  Modified files:              
    /CVSROOT/pear       addkarma.php 
  Log:
  feature completion :)
  
   - smart sensing of existing karma
   - smart sensing of super-karma (won't add pear/Foo
      if the user has pear/ karma)
   - smart appending to existing karma group for new user
   - smart detection of karma groups
   - smart removal of unnecessary sub-karma (removes
      pear/Foo if user is upgraded to pear/ karma)
   - add in-file docs
  
http://cvs.php.net/viewvc.cgi/CVSROOT/pear/addkarma.php?r1=1.2&r2=1.3&diff_format=u
Index: CVSROOT/pear/addkarma.php
diff -u CVSROOT/pear/addkarma.php:1.2 CVSROOT/pear/addkarma.php:1.3
--- CVSROOT/pear/addkarma.php:1.2       Sat Apr  7 20:40:29 2007
+++ CVSROOT/pear/addkarma.php   Sun Apr  8 02:32:24 2007
@@ -1,4 +1,41 @@
 <?php
+/**
+ * Karma manager for PEAR
+ * 
+ * This file is used to add or upgrade karma to a CVS user for any pear-related
+ * repository managed by the avail file (not CVSROOT/pear - that is managed in
+ * CVSROOT/pear/group by hand).
+ * 
+ * To use, simply type:
+ * 
+ * php addkarma.php handle dir1[,dir2[,dir3...]]
+ * 
+ * To add karma for a top-level directory like "pear", append / like:
+ * 
+ * php addkarma.php handle pear/
+ * 
+ * The script is smart enough to detect an attempt to give unnecessary karma.
+ * If a user has karma for pear/, and karma is requested for pear/Foo, the 
script
+ * will exit with a message saying this is unnecessary.
+ * 
+ * The script is also smart enough to detect an existing line (for instance, 
if you
+ * wish to add karma for "pear,peardoc") and will detect the correct line 
regardless
+ * of input order, so that this works:
+ * 
+ * php addkarma.php handle peardoc/,pear/
+ * 
+ * as well as:
+ * 
+ * php addkarma.php handle pear/,peardoc/
+ * 
+ * Both statements will add a handle to the long pear,peardoc avail statement.
+ * 
+ * If a user is upgraded (given karma for pear/ when they before had only karma
+ * for pear/subdir), the script will remove the karma for pear/subdir.
+ * 
+ * Always do cvs diff -u avail prior to committing to ensure changes are as
+ * expected!
+ */
 if (!isset($_SERVER['argv'])) {
     die("Must use CLI\n");
 }
@@ -8,6 +45,7 @@
 if (!strpos($_SERVER['argv'][2], '/')) {
     die("usage: addkarma.php handle directory,directory (use directory/ for 
top-level)\n");
 }
+$handle = $_SERVER['argv'][1];
 $newinfo = array();
 $karma = array();
 $new = new SplFileObject(dirname(__FILE__) . '/avail');
@@ -35,7 +73,7 @@
     $peoples = explode(',', $line[0]);
     foreach ($peoples as $person) {
         foreach ($modules as $module) {
-            if ($person == $_SERVER['argv'][1]) {
+            if ($person == $handle) {
                 $karma[] = $module;
             }
             $newinfo[$person][$module] = 1;
@@ -56,7 +94,7 @@
 }
 $modules = explode(',', $_SERVER['argv'][2]);
 array_walk($modules, create_function('&$a,$b', '$a = trim($a,"/");'));
-$need = array();
+$need = $remove = array();
 foreach ($modules as $module) {
     $test = explode('/', $module);
     // test karma for directory and for parent directories
@@ -79,6 +117,82 @@
     }
     $need[] = $module;
 }
+if (count($need)) {
+    foreach ($karma as $module) {
+        $test = explode('/', $module);
+        array_pop($test);
+        // test to see if karma grants more than existing
+        // i.e. give pear/ karma, and the user already has pear/Foo karma
+        while (is_array($test) && count($test)) {
+            $mod = implode('/', $test);
+            if (in_array($mod, $need)) {
+                $remove[] = $module;
+                echo 'removing ', $module,
+                     ' karma (adding ', $mod, " karma)\n";
+                continue 2;
+            }
+            array_pop($test);
+        }
+    }
+    if (count($remove)) {
+        $flipkarma = array_flip($karma);
+    }
+    foreach ($remove as $module) {
+        unset($karma[$flipkarma[$module]]);
+        foreach ($modulelines[$module] as $linenum) {
+            if (!$lines[$linenum]['processed']) continue;
+            if (in_array($handle, $lines[$linenum]['processed']['people'])) {
+                if (count($lines[$linenum]['processed']['people']) == 1) {
+                    // only 1 handle for this line (our dude)
+                    if (count($lines[$linenum]['processed']['modules']) == 1) {
+                        // this line is avail|dude|module and will become 
avail||module
+                        // so erase it
+                        $lines[$linenum]['line'] = '';
+                        $lines[$linenum]['processed'] = false;
+                        continue;
+                    } else {
+                        // this line contains other karma information i.e.
+                        // avail|dude|module,module2
+                        // remove the module only, leaving avail|dude|module2
+                        foreach ($lines[$linenum]['processed']['modules'] as 
$i => $b) {
+                            if ($b == $module) {
+                                
unset($lines[$linenum]['processed']['modules'][$i]);
+                                $lines[$linenum]['processed']['rawmodules'] =
+                                    implode(',', 
$lines[$linenum]['processed']['modules']);
+                                $lines[$linenum]['line'] = 'avail|' .
+                                    $handle . '|' . 
+                                    
$lines[$linenum]['processed']['rawmodules'] .
+                                    "\n";
+                                continue 2;
+                            }
+                        }
+                    }
+                }
+                // if we reach here, there is more than 1 handle on this line 
i.e.
+                // avail|dude,somebodyelse|module
+                foreach ($lines[$linenum]['processed']['people'] as $i => $b) {
+                    // remove dude
+                    if ($b == $handle) {
+                        unset($lines[$linenum]['processed']['people'][$i]);
+                        break;
+                    }
+                }
+                if (!count($lines[$linenum]['processed']['people'])) {
+                    // delete this line, no handles left on it i.e.
+                    // avail||module
+                    $lines[$linenum]['line'] = '';
+                    $lines[$linenum]['processed'] = false;
+                    continue;
+                }
+                // if we reach here, we've deleted dude and left:
+                // avail|somebodyelse|module
+                $lines[$linenum]['line'] = 'avail|' .
+                    implode(',', $lines[$linenum]['processed']['people']) .
+                    '|' . $lines[$linenum]['processed']['rawmodules'] . "\n";
+            }
+        }
+    }
+}
 function combinations($need, $top = true)
 {
     if (count($need) == 1) {
@@ -104,13 +218,16 @@
     $possibilities = combinations($need);
     // check for combos like pear,peardoc
     foreach ($possibilities as $possible) {
+        if (is_array($possible)) {
+            $possible = $possible[0];
+        }
         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  ",
+    echo 'adding ', implode(',', $modules), ' karma for ' . $handle . "\n";
+    echo $handle, " now has karma for: \n  ", implode(',', $modules), "\n  ",
          implode("\n  ", $karma) . "\n";
     foreach ($need as $mod) {
         if (isset($modulelines[$mod])) {
@@ -120,14 +237,14 @@
             }
             $lines[$newline]['line'] = 'avail|' .
                 implode(',', $lines[$newline]['processed']['people']) . ',' .
-                $_SERVER['argv'][1] .
+                $handle .
                 '|' . $lines[$newline]['processed']['rawmodules'] . "\n";
         } else {
-            $lines[] = array('line' => "avail|" . $_SERVER['argv'][1] . '|' . 
$mod . "\n",
+            $lines[] = array('line' => "avail|" . $handle . '|' . $mod . "\n",
                 'processed' => false);
         }
     }
-    $lines[] = array('line' => "\n# vim:set ft=conf sw=2 ts=2 et:\n", 
'processed' => false);
+    $lines[] = array('line' => "# 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

Reply via email to