Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Wikipedia: Mediawiki-CVS

SVN: [115435] trunk/tools/bugzilla/client

 

 

Wikipedia mediawiki-cvs RSS feed   Index | Next | Previous | View Threaded


mah at svn

May 25, 2012, 8:42 AM

Post #1 of 1 (61 views)
Permalink
SVN: [115435] trunk/tools/bugzilla/client

https://www.mediawiki.org/wiki/Special:Code/MediaWiki/115435

Revision: 115435
Author: mah
Date: 2012-05-25 15:42:15 +0000 (Fri, 25 May 2012)
Log Message:
-----------
add misc junk

Modified Paths:
--------------
trunk/tools/bugzilla/client/bugzilla.php
trunk/tools/bugzilla/client/jsonRPCClient.php
trunk/tools/bugzilla/client/main.php

Added Paths:
-----------
trunk/tools/bugzilla/client/BugzillaEmailParser.php
trunk/tools/bugzilla/client/assigned.php
trunk/tools/bugzilla/client/bug-init.php
trunk/tools/bugzilla/client/bz-mailer.php
trunk/tools/bugzilla/client/components.php
trunk/tools/bugzilla/client/duplicates.php
trunk/tools/bugzilla/client/fixme.php
trunk/tools/bugzilla/client/gmaneWebClient.php
trunk/tools/bugzilla/client/last-year.php
trunk/tools/bugzilla/client/mwApiClient.php
trunk/tools/bugzilla/client/parse-mbox.php
trunk/tools/bugzilla/client/patch-finder.php
trunk/tools/bugzilla/client/revert-bad-bugs.php
trunk/tools/bugzilla/client/revert-troll.php
trunk/tools/bugzilla/client/unassign-default.php
trunk/tools/bugzilla/client/upload-stats.php
trunk/tools/bugzilla/client/wmf-terms.php


Property changes on: trunk/tools/bugzilla/client/BugzillaEmailParser.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/assigned.php
===================================================================
--- trunk/tools/bugzilla/client/assigned.php (rev 0)
+++ trunk/tools/bugzilla/client/assigned.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,79 @@
+#!/usr/bin/php
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+foreach(getFixmes() as $author => $revs) {
+ sendMail($author, $revs);
+}
+
+function getFixmes() {
+ ini_set("user_agent", "hexmode's FIXME mailer");
+ $page = file_get_contents("http://www.mediawiki.org/wiki/Special:Code/MediaWiki/status/fixme?limit=100");
+
+ $fixes = explode("<tr class=\"mw-codereview-status-fixme\">\n", $page);
+ array_shift($fixes); /* We don't care about what comes before the table of FIXMEs */
+
+ $bit = array();
+ foreach($fixes as $fix) {
+ $f = explode("</td>\n", $fix);
+ $r = array();
+ preg_match("/>([0-9]+)</", $f[0], $r);
+ $rev = $r[1];
+ preg_match('/class="TablePager_col_cr_message">(.*)/', $f[4], $r);
+ $msg = preg_replace("/<[^>]*>/", "", html_entity_decode($r[1]));
+ preg_match('/class="TablePager_col_cr_author.*author=([^"]+)"/', $f[5], $r);
+ $author = $r[1];
+
+ $bit[$author][$rev] = $msg;
+ }
+
+ return $bit;
+}
+
+function getUserinfo( $author ) {
+ $ui = file_get_contents("http://svn.wikimedia.org/svnroot/mediawiki/USERINFO/$author");
+ $ret = array();
+ foreach(explode("\n", $ui) as $l) {
+ if($l != "") {
+ list($name, $data) = explode(":", $l, 2);
+ $data = trim($data);
+ $name = trim($name);
+ if($name == "email") {
+ $data = preg_replace("/ .?dot.? /i", '.',
+ preg_replace("/ .?at.? /i", '@',
+ preg_replace("/ who is a user at the host called /i", '@', $data)));
+ }
+ $ret[$name] = $data;
+ }
+ }
+
+ if(!isset($ret['name'])) {
+ $ret['name'] = $author;
+ }
+
+ return $ret;
+}
+
+function sendMail($author, $revs) {
+ static $template;
+
+ if ($template == null) {
+ $template = file_get_contents("template.txt");
+ }
+ $user = getUserinfo($author);
+
+ $commits = " Rev #: Commit message\n";
+ foreach($revs as $r => $msg) {
+ $commits .= "r{$r}: $msg\n";
+ }
+
+ $msg = sprintf($template, $user['name'], $author, $commits);
+
+ if( !isset($user['email']) || stristr( $user['email'], '@' ) !== false ) {
+ echo "Please send a message to $author:\n$commits";
+ } else {
+ #mail( $user['email'], "Please fix your FIXMEs", $commits, false, "-f mhershberger [at] wikimedia"
+ }
+}
\ No newline at end of file


Property changes on: trunk/tools/bugzilla/client/assigned.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/bug-init.php
===================================================================
--- trunk/tools/bugzilla/client/bug-init.php (rev 0)
+++ trunk/tools/bugzilla/client/bug-init.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,55 @@
+#!/usr/bin/php -f
+<?php
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn";
+require_once "gmaneWebClient.php";
+
+$csv = fopen("first-bug.csv", "w");
+$fp = fopen("first-bug.txt", "r");
+
+fputcsv($csv, array("id", 'date', "subject", "reason", 'type', 'watch-reason', 'product', 'component',
+ 'keywords', 'severity', 'who', 'status', 'priority', 'assigned-to', 'target-milestone', 'changed-fields'));
+
+while($f = fgets($fp)) {
+ $f = chop($f);
+ $match = array();
+ $subject = "";
+ if ( file_exists( $f ) ) {
+ $bug = new GmaneMessage(file_get_contents($f));
+ $subject = quoted_printable_decode( $bug->header["subject"][0] );
+ if(substr($subject, 0, 15) == "=?iso-8859-1?q?") {
+ $subject = str_replace(array("_"), " ", substr($subject, 15));
+ }
+
+ preg_match('#.Bug (\d*).\s*New:\s*(.*)#ms', $subject, $match);
+ }
+ if(isset($match[1])) {
+ $b[] = $match[1];
+ $b[] = $bug->header['date'][0];
+ $b[] = str_replace(array(" ", "\n"), ' ', $match[2]);
+ foreach($bug->header as $name => $val) {
+ if( substr( $name, 0, 11 ) === "x-bugzilla-" ) {
+ $head = substr( $name, 11 );
+ $header[$head] = $val[0];
+ }
+ }
+ $b[] = $header['reason'];
+ $b[] = $header['type'];
+ $b[] = $header['watch-reason'];
+ $b[] = $header['product'];
+ $b[] = $header['component'];
+ $b[] = $header['keywords'];
+ $b[] = $header['severity'];
+ $b[] = $header['who'];
+ $b[] = $header['status'];
+ $b[] = $header['priority'];
+ $b[] = $header['assigned-to'];
+ $b[] = $header['target-milestone'];
+ $b[] = $header['changed-fields'];
+
+ fputcsv($csv, $b);
+ $b = array();
+ } else {
+ echo "$f: $subject\n";
+ }
+}


Property changes on: trunk/tools/bugzilla/client/bug-init.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Modified: trunk/tools/bugzilla/client/bugzilla.php
===================================================================
--- trunk/tools/bugzilla/client/bugzilla.php 2012-05-25 11:03:05 UTC (rev 115434)
+++ trunk/tools/bugzilla/client/bugzilla.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -41,6 +41,14 @@
return $bug;
}

+ public function getPatches() {
+ var_dump( $this->id );exit;
+ }
+
+ public function getAttachments() {
+ return $this->bz->getBugAttachments( $this->id );
+ }
+
public function getComments() {
return $this->bz->getBugComments( $this->id );
}
@@ -118,14 +126,14 @@
}
}
}
- foreach($dep as $id => $none) {
+ foreach($dep as $id => $none) {
$this->dependency[] = new BugzillaBug( $id, $this->bz );
}
}
return $this->dependency;
}

- public function undoLastChangeIfBy( $email ) {
+ public function undoLastChangeIfBy( $email, $fakeIt = "" ) {
$hist = $this->getHistory();
$change = array_pop( $hist['bugs'][0]['history'] );
$reverse = array();
@@ -133,9 +141,13 @@
if( $change['who'] == $email ) {
echo "{$this->id}: Undoing last change by $email made at {$change['when']}:\n";
foreach($change['changes'] as $c) {
- $reverse = array_merge( $reverse, $this->addResetField( $c ) );
+ $reverse = array_merge( $reverse, $this->addResetField( $c ) );
}
- return $this->bz->update( $this->id, $reverse );
+ if( $fakeIt === "" ) {
+ return $this->bz->update( $this->id, $reverse );
+ } else {
+ var_dump($reverse);
+ }
} else {
return false;
}
@@ -174,12 +186,30 @@
return null;
}

+ public function deleteComment( $id ) {
+ return $this->bz->deleteComment( $this->id, $id );
+ }
+
public function addResetField( $changeLog ) {
if( $this->bz->isListField( $changeLog['field_name'] ) ) {
- return array( $changeLog['field_name'] =>
- array( "add" => (array)$changeLog['removed'], "remove" => (array)$changeLog['added'] ) );
+ $add = explode( ", ", $changeLog['removed'] );
+ $remove = explode( ", ", $changeLog['added'] );
+
+ if( $add[0] !== "" ) {
+ $changes["add"] = $add;
+ }
+ if( $remove[0] !== "" ) {
+ $changes['remove'] = $remove;
+ }
+
+ return array( $changeLog['field_name'] => $changes );
} else {
- return array( $changeLog['field_name'] => $changeLog['removed'] );
+ $v = $changeLog['removed'];
+ $f = $changeLog['field_name'];
+ if( $f === "bug_status" && ( $v === "NEW" || $v === "ASSIGNED" ) ) {
+ $v = "REOPENED";
+ }
+ return array( $f => $v );
}
}

@@ -242,7 +272,7 @@
}

foreach($results['bugs'] as $bug) {
- $this->data[] = BugzillaBug::newFromQuery($this->bz, $bug);
+ $this->data[] = BugzillaBug::newFromQuery( $this->bz, $bug );
}
}
}
@@ -270,6 +300,27 @@
}
}

+class BugzillaPatchIterator extends BugzillaSearchIterator {
+ private function fetchNext( ) {
+ if( $this->offset == count( $this->data ) && !$this->eol && $this->offset % $this->limit === 0 ) {
+ $results = $this->bz->search( $this->conditions );
+
+ $this->conditions['offset'] += $this->limit;
+
+ if( count( $results['bugs'] ) < $this->limit ) {
+ $this->eol = true;
+ }
+
+ foreach($results['bugs'] as $bug) {
+ $check = BugzillaBug::newFromQuery($this->bz, $bug);
+ foreach( $check->getPatches( $this->conditions[ 'last_change_time' ] ) as $patch) {
+ $this->data[] = $patch;
+ }
+ }
+ }
+ }
+}
+
class BugzillaWebClient {
private $bz = null;
private $lists = array( "blocks", "depends_on", "cc", "groups", "keywords", "see_also" );
@@ -281,6 +332,12 @@
}
}

+ public function deleteComment( $bugId, $id ) {
+ $url = sprintf( "https://bugzilla.wikimedia.org/deletecomment.cgi?bug_id=%d&id=%d", $bugId, $id );
+ $h = MWHttpRequest::factory( $url );
+ return $this->bz->executeWithCookies( $h );
+ }
+
public function isListField( $field ) {
return in_array( $field, $this->lists );
}
@@ -302,13 +359,26 @@
}
}

+ public function getBugAttachments( $id, $attachments = null ) {
+ $args['ids'] = (array)$id;
+ if ( $attachments !== null ) {
+ $args['attachment_ids'] = (array)$attachments;
+ }
+ $ret = $this->bz->__call(
+ "Bug.comments", $args );
+
+ if( !is_array( $id ) ) {
+ $ret = $ret['bugs'][$id];
+ }
+
+ return $ret;
+ }
+
public function getBugComments( $id ) {
$ret = $this->bz->__call(
"Bug.comments", array( "ids" => (array)$id ) );
if( !is_array( $id ) ) {
$ret = $ret['bugs'][$id]['comments'];
- } else {
- throw new Exception("ugh!");
}
return $ret;
}

Added: trunk/tools/bugzilla/client/bz-mailer.php
===================================================================
--- trunk/tools/bugzilla/client/bz-mailer.php (rev 0)
+++ trunk/tools/bugzilla/client/bz-mailer.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,1242 @@
+<?php
+$settings = array(
+ array('name' => "General", 'parent' => 'CiviCRM',
+ 'desc' => "Any Wikimedia specific issues. After they have been confirmed as core issues .. they should be moved to the core CiviCRM bug tracker.",
+ 'owner' => "arichards\x40wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+ array('name' => "jheora", 'parent' => 'Cortado',
+ 'desc' => "Theora (video) decoder",
+ 'owner' => "tstarling\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "jorbis", 'parent' => 'Cortado',
+ 'desc' => "Vorbis (audio) decoder",
+ 'owner' => "tstarling\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "JST", 'parent' => 'Cortado',
+ 'desc' => "Stream manager",
+ 'owner' => "tstarling\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "User interface", 'parent' => 'Cortado',
+ 'desc' => "Cortado user interface",
+ 'owner' => "tstarling\x40wikimedia.org",
+ 'cc' => ""),
+ array('name' => "General", 'parent' => 'dbzip2',
+ 'desc' => "General issues with dbzip2",
+ 'owner' => "brion\x40wikimedia.org",
+ 'cc' => "brion\x40wikimedia.org"),
+ array('name' => "API", 'parent' => 'Mediawiki',
+ 'desc' => "MediaWiki\'s bot API, accessible via api.php",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "Bryan.TongMinh\x40Gmail.com, roan.kattouw\x40gmail.com, sam\x40reedyboy.net, soxred93\x40gmail.com, vasilvv\x40gmail.com"),
+array('name' => "Blocking",'parent' => 'Mediawiki',
+ 'desc' => "Blocking, unblocking, all that stuff",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Categories",'parent' => 'Mediawiki',
+ 'desc' => "All issues relating to categories.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Change Tagging",'parent' => 'Mediawiki',
+ 'desc' => "Issues with revision/log/change tags added by edit filters (AbuseFilter, TorBlock, etc).",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org"),
+array('name' => "Database",'parent' => 'Mediawiki',
+ 'desc' => "Back-end database issues: SQL errors, compatibility, etc.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Deleting",'parent' => 'Mediawiki',
+ 'desc' => "Issues related to deleting and undeleting/restoring pages and revisions (via action=delete and Special:Undelete).",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Device compatibility",'parent' => 'Mediawiki',
+ 'desc' => "Bug reports related to use cases that do not give expected output for MediaWiki pages output devices like web browsers, printers, or speakers.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "DjVu",'parent' => 'Mediawiki',
+ 'desc' => "All issues related to DjVu",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Documentation",'parent' => 'Mediawiki',
+ 'desc' => "All documentation, including that on MediaWiki.org",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Email",'parent' => 'Mediawiki',
+ 'desc' => "Issues relating to the email notification features and email address verification (Special:Confirmemail etc.)",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Export/Import",'parent' => 'Mediawiki',
+ 'desc' => "Issues relating to Special:Export and Special:Import",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "General/Unknown",'parent' => 'Mediawiki',
+ 'desc' => "All issues that did not fit into any of the other components.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "History/Diffs",'parent' => 'Mediawiki',
+ 'desc' => "All issues relating to the page displaying an article\'s history and the page displaying differences between two revisions.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Images and files",'parent' => 'Mediawiki',
+ 'desc' => "Image and uploaded file management (thumbnails etc.)",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "Bryan.TongMinh\x40Gmail.com"),
+array('name' => "Installation",'parent' => 'Mediawiki',
+ 'desc' => "Installation, setup, and upgrade procedure.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "innocentkiller\x40gmail.com"),
+array('name' => "Internationalization",'parent' => 'Mediawiki',
+ 'desc' => "All issues relating to internationalization, localization, translation, and the MediaWiki namespace.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Javascript",'parent' => 'Mediawiki',
+ 'desc' => "MediaWiki\'s Javascript infrastructure",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "tparscal\x40wikimedia.org"),
+array('name' => "Language converter",'parent' => 'Mediawiki',
+ 'desc' => "Script conversion for Chinese and Serbian.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "PhiLiP.NPC\x40Gmail.com"),
+array('name' => "Maintenance scripts",'parent' => 'Mediawiki',
+ 'desc' => "Command-line maintenance scripts for various tasks.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "innocentkiller\x40gmail.com"),
+array('name' => "Modern skin",'parent' => 'Mediawiki',
+ 'desc' => "The \"Modern\" skin.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "r.tarnell\x40IEEE.ORG"),
+array('name' => "Page editing",'parent' => 'Mediawiki',
+ 'desc' => "All issues relating to the edit screen, edit conflicts, and saving edits.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Page protection",'parent' => 'Mediawiki',
+ 'desc' => "Protection and unprotection of pages, and issues with protected pages",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Parser",'parent' => 'Mediawiki',
+ 'desc' => "Issues relating to the process that converts wiki syntax into HTML.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Recent changes",'parent' => 'Mediawiki',
+ 'desc' => "Bug reports and feature requests related to the special page RecentChanges.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Redirects",'parent' => 'Mediawiki',
+ 'desc' => "All issues relating to redirects.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Resource Loader",'parent' => 'Mediawiki',
+ 'desc' => "The resource loader that handles page resources, such as CSS and Javascript",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "roan.kattouw\x40gmail.com, tparscal\x40wikimedia.org"),
+array('name' => "Revision deletion",'parent' => 'Mediawiki',
+ 'desc' => "Hiding and unhiding of individual page revisions, log entries and usernames and revision suppression.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "aschulz4587\x40gmail.com"),
+array('name' => "Search",'parent' => 'Mediawiki',
+ 'desc' => "Issues relating to the search engine. Note that Wikimedia web sites do not use the default MediaWiki search engine; please file bugs against the Lucene Search component in the Extensions product instead.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Special pages",'parent' => 'Mediawiki',
+ 'desc' => "All special pages (Wanted pages, Orphans, etc.). Recent changes and Watchlist have their own component.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Syndication",'parent' => 'Mediawiki',
+ 'desc' => "MediaWiki\'s handling of RSS and Atom feeds",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Templates",'parent' => 'Mediawiki',
+ 'desc' => "All issues relating to templates and template inclusion.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Unit tests",'parent' => 'Mediawiki',
+ 'desc' => "Unit testing suite, based on PHPUnit",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "mah\x40everybody.org"),
+array('name' => "Uploading",'parent' => 'Mediawiki',
+ 'desc' => "File upload interface at Special:Upload",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "Bryan.TongMinh\x40Gmail.com"),
+array('name' => "User interface",'parent' => 'Mediawiki',
+ 'desc' => "Issues relating to the user interface and skins, including Monobook, Classic, Nostalgia, Cologne Blue, DaVinci, etc.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "User login",'parent' => 'Mediawiki',
+ 'desc' => "Account creation, login, etc.\r\n\r\nSettings bugs in this component should be migrated to the User preferences component.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "User preferences",'parent' => 'Mediawiki',
+ 'desc' => "All issues relating to user preferences (please migrate user settings bugs in the User login/settings component to this one)",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org"),
+array('name' => "Vector Skin",'parent' => 'Mediawiki',
+ 'desc' => "The Vector skin",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "asharma\x40wikimedia.org, tparscal\x40wikimedia.org"),
+array('name' => "Watchlist",'parent' => 'Mediawiki',
+ 'desc' => "Bug reports and feature requests related to the special page Watchlist.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "general",'parent' => 'mwdumper',
+ 'desc' => "Anything that doesn\'t fit somewhere else",
+ 'owner' => "brion\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "GUI",'parent' => 'mwdumper',
+ 'desc' => "The Swing graphical user interface",
+ 'owner' => "brion\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "Add media wizard",'parent' => 'MWEmbed',
+ 'desc' => "The \x3ca href=\"http://www.mediawiki.org/wiki/Extension:Add_Media_Wizard\">add media wizard\x3c/a> supports searching repositories, inline uploading and basic resource transformations for inline inserting of media into articles",
+ 'owner' => "dale\x40ucsc.edu",'parent' => 'MWEmbed',
+ 'cc' => ""),
+array('name' => "Firefogg",'parent' => 'MWEmbed',
+ 'desc' => "Firefogg is the firefox browser extension that we use for client side transcoding of video and chunked uploads of large media files.",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+array('name' => "General/Unknown",'parent' => 'MWEmbed',
+ 'desc' => "Bugs relatated to mwEmbed that cannot be categorised or should still be categorised.",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+array('name' => "Script loader",'parent' => 'MWEmbed',
+ 'desc' => "The \x3ca href=\"http://www.mediawiki.org/wiki/ScriptLoader\">script loader\x3c/a> localises, packages and gzips multiple JavaScript files in a single request.",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+array('name' => "Sequence editor",'parent' => 'MWEmbed',
+ 'desc' => "The \x3ca href=\"http://www.mediawiki.org/wiki/Extension:Sequencer\">Sequencer editor\x3c/a> is a in-browser video editor.",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+array('name' => "Timed text",'parent' => 'MWEmbed',
+ 'desc' => "These correspond to bugs around video timed text parsing display, and editing.",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+array('name' => "Video player",'parent' => 'MWEmbed',
+ 'desc' => "The JavaScript player used for embedded video playback",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+ array('name' => "AcaWiki",'parent' => 'Wikimedia',
+ 'desc' => "AcaWiki site migration and setup issues.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Blog",'parent' => 'Wikimedia',
+ 'desc' => "\x3ca href=\"http://blog.wikimedia.org\">Wikimedia Blog\x3c/a>",
+ 'owner' => "gpaumier\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "Bugzilla",'parent' => 'Wikimedia',
+ 'desc' => "Configuration problems with MediaWiki\'s Bugzilla bug tracker.\r\n\r\nNOTE: Please don\'t report bugs in the underlying Bugzilla system. Those bugreports should go to http://bugzilla.mozilla.org/ !",
+ 'owner' => "mhershberger\x40wikimedia.org",
+ 'cc' => "innocentkiller\x40gmail.com, sam\x40reedyboy.net"),
+array('name' => "DNS",'parent' => 'Wikimedia',
+ 'desc' => "Issues relating to the nameserver configuration.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Downloads",'parent' => 'Wikimedia',
+ 'desc' => "Public data dumps at download.wikimedia.org",
+ 'owner' => "tfinc\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "Extension setup",'parent' => 'Wikimedia',
+ 'desc' => "New extensions to get installed or enabled. Just like \'Site request\' but more specific.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Fundraising - misc",'parent' => 'Wikimedia',
+ 'desc' => "A catch-all for miscellaneous fundraising-related components not covered by mediawiki extensions and civicrm",
+ 'owner' => "arichards\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "Fundraising Requirements",'parent' => 'Wikimedia',
+ 'desc' => "User stories for the annual fundraiser",
+ 'owner' => "tfinc\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "General/Unknown",'parent' => 'Wikimedia',
+ 'desc' => "All issues that don\'t not fit into any of the other components.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Interwiki links",'parent' => 'Wikimedia',
+ 'desc' => "Inter-language and inter-wiki links.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "IRC",'parent' => 'Wikimedia',
+ 'desc' => "Issues with the irc.wikimedia.org Recent Changes feeds and bot tools on irc.freenode.net not covered elsewhere.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Language setup",'parent' => 'Wikimedia',
+ 'desc' => "New languages or fixes to language settings.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "lucene-search-2",'parent' => 'Wikimedia',
+ 'desc' => "Issues with the lucene-search-2 backend.",
+ 'owner' => "rainman\x40EUnet.rs",
+ 'cc' => ""),
+array('name' => "Mailing lists",'parent' => 'Wikimedia',
+ 'desc' => "Issues relating to the mailing lists at http://mail.wikipedia.org/",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "OTRS",'parent' => 'Wikimedia',
+ 'desc' => "Wikimedia\'s OTRS service and setup",
+ 'owner' => "tstarling\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "Prototype server",'parent' => 'Wikimedia',
+ 'desc' => "Bugs relating to the test deployments at prototype.wikimedia.org",
+ 'owner' => "roan.kattouw\x40gmail.com",
+ 'cc' => "pdhanda\x40wikimedia.org"),
+array('name' => "Site logos",'parent' => 'Wikimedia',
+ 'desc' => "Problem with any Wikimedia project site logos",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Site requests",'parent' => 'Wikimedia',
+ 'desc' => "Requests for config changes for the sites hosted by the Wikimedia Foundation.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "SSL related",'parent' => 'Wikimedia',
+ 'desc' => "Issues about https://secure.wikimedia.org/ , HTTPS site wide or SSL certificates.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Subversion",'parent' => 'Wikimedia',
+ 'desc' => "Wikimedia-operated Subversion server and repositories",
+ 'owner' => "rlane32\x40gmail.com",
+ 'cc' => "innocentkiller\x40gmail.com"),
+array('name' => "Testing Infrastructure",'parent' => 'Wikimedia',
+ 'desc' => "\x3ca href=\"http://ci.tesla.usability.wikimedia.org/cruisecontrol/index\">Cruise Control\x3c/a>, \x3ca href=\"toolserver.org/~krinkle/testswarm\">Test Swarm\x3c/a> etc etc",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Usage Statistics",'parent' => 'Wikimedia',
+ 'desc' => "The usage statistics at http://stats.wikimedia.org/",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "User survey",'parent' => 'Wikimedia',
+ 'desc' => "For issues relating to the general Wikipedian user survey.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "WAP mobile gateway",'parent' => 'Wikimedia',
+ 'desc' => "WAP interface for mobile access at *.wap.wikipedia.org",
+ 'owner' => "tstarling\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "wikibugs IRC bot",'parent' => 'Wikimedia',
+ 'desc' => "wikibugs, the IRC bug spamming script",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "code-utils",'parent' => 'Wikimedia Tools',
+ 'desc' => "Various PHP code utilities like check-vars.php and stylize.php",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "PhotoCommons",'parent' => 'Wikimedia Tools',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/PhotoCommons\">PhotoCommons\x3c/a> WordPress Extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "huskyr\x40gmail.com, krinklemail\x40gmail.com"),
+array('name' => "WikiSnaps",'parent' => 'Wikimedia Tools',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/WikiSnaps\">WikiSnaps\x3c/a> iPhone app",
+ 'owner' => "hartman\x40videolan.org",
+ 'cc' => ""),
+array('name' => "[Other]",'parent' => 'Wikimedia Tools',
+ 'desc' => "All other tools not covered by a specific product",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "android",'parent' => 'Wikipedia mobile',
+ 'desc' => "Wikipedia mobile Android application",
+ 'owner' => "preilly\x40wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+array('name' => "iphone",'parent' => 'Wikipedia mobile',
+ 'desc' => "Wikipedia mobile iPhone application",
+ 'owner' => "preilly\x40wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+array('name' => "server",'parent' => 'Wikipedia mobile',
+ 'desc' => "Mobile Server",
+ 'owner' => "preilly\x40wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+array('name' => "General",'parent' => 'XML Snapshots',
+ 'desc' => "Any issues related to dumpHTML should be moved to MediaWiki extensions. Issues for MW export should go to Import/Export\r\n\r\nOtherwise they should go here.",
+ 'owner' => "ariel\x40wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+array('name' => "ABC", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:ABC\">ABC\x3c/a> extension",
+ 'owner' => "r.tarnell\x40IEEE.ORG",
+ 'cc' => ""),
+array('name' => "AbsenteeLandlord", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:AbsenteeLandlord\">AbsenteeLandlord\x3c/a> extension",
+ 'owner' => "t.laqua\x40gmail.com",
+ 'cc' => ""),
+array('name' => "AbuseFilter", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:AbuseFilter\">AbuseFilter\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org"),
+array('name' => "ActiveAbstract", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:ActiveAbstract\">ActiveAbstract\x3c/a> extension",
+ 'owner' => "jeluf\x40gmx.de",
+ 'cc' => "brion\x40wikimedia.org"),
+array('name' => "AddMediaWizard", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "AddMediaWizard Extension",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+array('name' => "AdminLinks", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Admin_Links\">AdminLinks\x3c/a> extension",
+ 'owner' => "yaron57\x40gmail.com",
+ 'cc' => ""),
+array('name' => "AdvancedMeta", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Advanced_Meta\">AdvancedMeta\x3c/a> Extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "AdvancedRandom", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The AdvancedRandom special page extension.",
+ 'owner' => "avarab\x40gmail.com",
+ 'cc' => ""),
+array('name' => "AdvancedSearch", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:AdvancedSearch\">AdvancedSearch\x3c/a> extension",
+ 'owner' => "roan.kattouw\x40gmail.com",
+ 'cc' => ""),
+array('name' => "AjaxLogin", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "AjaxLogin extension allows users to log in through an AJAX pop-up box. Instead of being taken to Special:UserLogin when they click \"Log in / Register\", an AJAX pop-up box will be presented to them.",
+ 'owner' => "jack\x40countervandalism.net",
+ 'cc' => "korczynski\x40gmail.com"),
+array('name' => "AntiSpoof", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Username similarity checker; rejects spoofed usernames on registration.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "soxred93\x40gmail.com"),
+array('name' => "APC", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:APC\">APC\x3c/a> extension",
+ 'owner' => "niklas.laxstrom\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "ApiSandbox", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:ApiSandbox\">ApiSandbox\x3c/a> Extension",
+ 'owner' => "maxsem.wiki\x40gmail.com",
+ 'cc' => "sam\x40reedyboy.net"),
+array('name' => "ArticleFeedback", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Issues related to the \x3ca>ArticleFeedback\x3c/a> extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "dtaraborelli\x40wikimedia.org, krinklemail\x40gmail.com, roan.kattouw\x40gmail.com"),
+array('name' => "AskSQL", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The AskSQL special page extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Babel", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Babel\">Babel\x3c/a> extension",
+ 'owner' => "robert\x40rhl.me.uk",
+ 'cc' => ""),
+array('name' => "BackAndForth", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The BackAndForth extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "BadImages", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Bad Image List extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "BookManager", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:BookManager\">BookManager\x3c/a> extension",
+ 'owner' => "raylton.sousa\x40gmail.com",
+ 'cc' => ""),
+array('name' => "BotQuery", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The bot query API (query.php)",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "CategoryOnUpload", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:CategoryOnUpload\">CategoryOnUpload\x3c/a> extension",
+ 'owner' => "robert\x40rhl.me.uk",
+ 'cc' => ""),
+array('name' => "CategoryStepper", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:CategoryStepper\">CategoryStepper\x3c/a> extension",
+ 'owner' => "robert\x40rhl.me.uk",
+ 'cc' => ""),
+array('name' => "CategoryTree", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:CategoryTree\">CategoryTree\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "brightbyte\x40gmail.com"),
+array('name' => "CentralAuth", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Wikimedia\'s unified login extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org, vasilvv\x40gmail.com"),
+array('name' => "CentralNotice", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Centralised notice extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "rkaldari\x40wikimedia.org"),
+array('name' => "CharInsert", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The CharInsert extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "brion\x40wikimedia.org"),
+array('name' => "CheckUser", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The CheckUser special page extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "aschulz4587\x40gmail.com"),
+array('name' => "Cite", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The \x3ca href=\"http://meta.wikimedia.org/wiki/Cite\">Cite\x3c/a> special page and parser hook extensions.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "CLDR", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:CLDR\">CLDR\x3c/a> extension",
+ 'owner' => "niklas.laxstrom\x40gmail.com",
+ 'cc' => ""),
+array('name' => "CodeReview", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "CodeReview extension for SVN post-commit review.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "innocentkiller\x40gmail.com, sam\x40reedyboy.net"),
+array('name' => "Collection", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Page collection extension for PDF/ODT generation via PediaPress\'s mwlib backend. Primarily for the Special:Book frontend. Note there is an \x3ca href=\"http://code.pediapress.com/wiki/report\">upstream bug tracker\x3c/a> maintained by PediaPress folks separately.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "development\x40pediapress.com"),
+array('name' => "Configure", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Configure\">Configure extension\x3c/a> to MediaWiki",
+ 'owner' => "ialex.wiki\x40gmail.com",
+ 'cc' => ""),
+array('name' => "ConfirmAccount", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:ConfirmAccount\">ConfirmAccount\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "aschulz4587\x40gmail.com"),
+array('name' => "ConfirmEdit (CAPTCHA extension)", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The ConfirmEdit CAPTCHA extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "ContributionReporting", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "ContributionStatistics, ContributionTrackingStatistics, FundraiserStats",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+array('name' => "ContributionScores", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Contribution_Scores\">ContributionScores\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "t.laqua\x40gmail.com"),
+array('name' => "ContributionTracking", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Fundraising information tracking/display frontend.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+array('name' => "Contributors", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Contributors extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "CooperationStatistics", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:CooperationStatistics\">CooperationStatistics\x3c/a> extension",
+ 'owner' => "alfred.maghi\x40gmail.com",
+ 'cc' => ""),
+array('name' => "CountEdits", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "CountEdits extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "CrossNamespaceLinks", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The CrossNamespaceLinks special page extension.",
+ 'owner' => "avarab\x40gmail.com",
+ 'cc' => ""),
+array('name' => "CustomUserSignup", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:CustomUserSignup\">http://www.mediawiki.org/wiki/Extension:CustomUserSignup\x3c/a>",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "ngautam\x40wikimedia.org"),
+array('name' => "DataTransfer", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Data_Transfer\">DataTransfer\x3c/a> extension",
+ 'owner' => "yaron57\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "DeletedContributions", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The DeletedContributions extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "DeleteQueue", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:DeleteQueue\">DeleteQueue\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org"),
+array('name' => "Desysop", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Desysop extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "DidYouMean", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "DidYouMean experimental extension",
+ 'owner' => "hippytrail\x40gmail.com",
+ 'cc' => ""),
+array('name' => "DiscussionThreading", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:DiscussionThreading\">DiscussionThreading\x3c/a> extension",
+ 'owner' => "jack.pond\x40psitex.com",
+ 'cc' => ""),
+array('name' => "DismissableSiteNotice", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Dismissable Site Notice extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "DonationInterface", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Modular payment gateway with support for PayPal.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "arichards\x40wikimedia.org, tfinc\x40wikimedia.org"),
+array('name' => "DoubleWiki", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The DoubleWiki extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Drafts", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Drafts\">Drafts\x3c/a> extension",
+ 'owner' => "tparscal\x40wikimedia.org",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "DumpHTML", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Static HTML dump generator extension component",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+array('name' => "DynamicPageList", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "DynamicPageList extension (not DynamicPageList2, which is not in use at Wikimedia)",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "bawolff+wn\x40gmail.com"),
+array('name' => "DynamicPageList2", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Dynamic page list. Two!",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "EasyTimeline", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The EasyTimeline extension.",
+ 'owner' => "erikzachte\x40infodisiac.com",
+ 'cc' => ""),
+array('name' => "Edit Messages", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:EditMessages\">Edit Messages\x3c/a> extension",
+ 'owner' => "tstarling\x40wikimedia.org",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "Editcount", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Editcount special page extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Eval", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Eval special page extension.",
+ 'owner' => "avarab\x40gmail.com",
+ 'cc' => ""),
+array('name' => "ExpandTemplates", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "ExpandTemplates extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "ExtensionDistributor", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:ExtensionDistributor\">ExtensionDistributor\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "Extensions requests", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Requests for new extensions.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "External editors", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Manual:External_editors\">External editors\x3c/a>",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "FCKeditor", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "FCKeditor WYSIWYG extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "FlaggedRevs", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:FlaggedRevs\">FlaggedRevs\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "aschulz4587\x40gmail.com, asharma\x40wikimedia.org, innocentkiller\x40gmail.com, pdhanda\x40wikimedia.org, robla\x40wikimedia.org"),
+array('name' => "FootNote", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "FootNote extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "FundraiserPortal", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "FundraiserPortal extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "tparscal\x40wikimedia.org"),
+array('name' => "Gadgets", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "User-organized JavaScript gadgets extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "brightbyte\x40gmail.com, krinklemail\x40gmail.com, maxsem.wiki\x40gmail.com"),
+array('name' => "General/Unknown", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "All issues that did not fit into any of the other components.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "GeoLite", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Geo redirection service",
+ 'owner' => "tfinc\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "GIS", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The GIS extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "GlobalBlocking", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:GlobalBlocking\">GlobalBlocking\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org"),
+array('name' => "GlobalUsage", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:GlobalUsage\">GlobalUsage\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "Bryan.TongMinh\x40Gmail.com"),
+array('name' => "Glossary", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Glossary\">Glossary extension\x3c/a> (not maintained in Wikimedia SVN)",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "GoogleMaps", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Google_Maps\">GoogleMaps\x3c/a> extension",
+ 'owner' => "emmiller\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "GroupPermissionsManager", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:GroupPermissionsManager\">GroupPermissionsManager\x3c/a> extension",
+ 'owner' => "skizzerz\x40gmail.com",
+ 'cc' => ""),
+array('name' => "Highlight", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Highlight parser hook extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "ImageMap", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:ImageMap\">ImageMap\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "ImportFreeImages", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "ImportFreeImages extension",
+ 'owner' => "Bryan.TongMinh\x40Gmail.com",
+ 'cc' => ""),
+array('name' => "IndexFunction", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:IndexFunction\">IndexFunction extension\x3c/a>",
+ 'owner' => "mrzmanwiki\x40gmail.com",
+ 'cc' => ""),
+array('name' => "InlineEditor", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "InlineEditor Extension",
+ 'owner' => "jp.posma\x40gmail.com",
+ 'cc' => ""),
+array('name' => "InlineScripts", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Victor\'s InlineScripts extension",
+ 'owner' => "vasilvv\x40gmail.com",
+ 'cc' => ""),
+array('name' => "Inputbox", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:InputBox\">InputBox\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Interlanguage", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Interlanguage\">Interlanguage\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "Interwiki (extension)", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Interwiki\">Interwiki\x3c/a> extension",
+ 'owner' => "soxred93\x40gmail.com",
+ 'cc' => ""),
+array('name' => "Invitations", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Invitations\">Invitations\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org"),
+array('name' => "LabeledSectionTransclusion", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Labeled_Section_Transclusion\">Labeled section transclusion\x3c/a> extension to MediaWiki",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "ssanbeg\x40web.de"),
+array('name' => "LanguageSelector", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:LanguageSelector\">LanguageSelector\x3c/a> extension",
+ 'owner' => "brightbyte\x40gmail.com",
+ 'cc' => ""),
+array('name' => "LinkSearch", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "LinkSearch extension",
+ 'owner' => "brion\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "LiquidThreads", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "LiquidThreads advanced discussion extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org, bharris\x40wikimedia.org"),
+array('name' => "LiveTranslate", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Live_Translate\">LiveTranslate\x3c/a> extension",
+ 'owner' => "jeroen_dedauw\x40yahoo.com",
+ 'cc' => ""),
+array('name' => "LocalisationUpdate", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "LocalisationUpdate",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "tom.maaswinkel\x4012wiki.eu"),
+array('name' => "LogEntry", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:LogEntry\">LogEntry\x3c/a> extension",
+ 'owner' => "tparscal\x40wikimedia.org",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "LookupUser", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:LookupUser\">LookupUser\x3c/a> extension",
+ 'owner' => "tstarling\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "Lua", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Lua\">Lua\x3c/a> extension",
+ 'owner' => "fran\x40dumetella.net",
+ 'cc' => ""),
+array('name' => "Lucene Search", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Lucene Search extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "rainman\x40EUnet.rs"),
+array('name' => "Maintenance", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Maintenance\">Maintenance\x3c/a> extension",
+ 'owner' => "mediawiki\x40ryandesign.com",
+ 'cc' => ""),
+array('name' => "Makebot", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Special:Makebot extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Makesysop", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Makesysop special page extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Maps", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Maps\">Maps\x3c/a> extension",
+ 'owner' => "jeroen_dedauw\x40yahoo.com",
+ 'cc' => ""),
+array('name' => "Math (texvc)", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The texvc module which renders &lt;math&gt; formulae.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "MediaFunctions", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:MediaFunctions\">MediaFunctions\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "MetadataEdit", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:MetadataEdit\">MetadataEdit\x3c/a> extension",
+ 'owner' => "ialex.wiki\x40gmail.com",
+ 'cc' => ""),
+array('name' => "MetaVidWiki", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Semantic video goodness!",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+array('name' => "MobileFrontend", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "PHP extension for mobile gateway",
+ 'owner' => "preilly\x40wikimedia.org",
+ 'cc' => "tfinc\x40wikimedia.org"),
+array('name' => "MostRevisors", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:MostRevisors\">MostRevisors\x3c/a> extension",
+ 'owner' => "alfred.maghi\x40gmail.com",
+ 'cc' => ""),
+array('name' => "MultiBoilerplate", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:MultiBoilerplate\">MultiBoilerplate\x3c/a> extension",
+ 'owner' => "robert\x40rhl.me.uk",
+ 'cc' => ""),
+array('name' => "MultiUpload", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:MultiUpload\">MultiUpload \x3c/a> extension",
+ 'owner' => "tderouin\x40gmail.com",
+ 'cc' => ""),
+array('name' => "MWSearch", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:MWSearch\">MWSearch\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "rainman\x40EUnet.rs"),
+array('name' => "Narayam", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Narayam\">Narayam\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "junu.pv\x40gmail.com"),
+array('name' => "NewestPages", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The NewestPages extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "robchur\x40gmail.com"),
+array('name' => "Newuserlog", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Newuserlog extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "NewUserNotif", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:New User Email Notification\">New User Email Notification\x3c/a> extension",
+ 'owner' => "jack.pond\x40psitex.com",
+ 'cc' => ""),
+array('name' => "Nogomatch", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Nogomatch logging extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "NSFileRepo", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:NSFileRepo\">NSFileRepo\x3c/a> extension",
+ 'owner' => "jack.pond\x40psitex.com",
+ 'cc' => ""),
+array('name' => "Nuke", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Nuke special page extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "OAI", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "OAI-PMH repository and harvester",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "brion\x40wikimedia.org"),
+array('name' => "OggHandler", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Ogg metadata & player extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "OmegaWiki", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.omegawiki.org\">OmegaWiki\x3c/a> website (using Wikidata)",
+ 'owner' => "robert\x40rhl.me.uk",
+ 'cc' => ""),
+array('name' => "OnlineStatus", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:OnlineStatus\">OnlineStatus\x3c/a> extension",
+ 'owner' => "ialex.wiki\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "OpenID", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "OpenID extension",
+ 'owner' => "mail\x40tgries.de",
+ 'cc' => ""),
+array('name' => "OpenSearchXml", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:OpenSearchXml\">OpenSearchXml\x3c/a> extension",
+ 'owner' => "brion\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "OpenStackManager", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "OpenStackManager extension",
+ 'owner' => "rlane32\x40gmail.com",
+ 'cc' => ""),
+array('name' => "Oversight", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "HideRevision and other Oversight components",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "brion\x40wikimedia.org"),
+array('name' => "PackageForce", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:PackageForce\">PackageForce\x3c/a> extension",
+ 'owner' => "svippy\x40gmail.com",
+ 'cc' => ""),
+array('name' => "PageCSS", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The PageCSS parser hook extension.",
+ 'owner' => "avarab\x40gmail.com",
+ 'cc' => ""),
+array('name' => "PagedTiffHandler", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:PagedTiffHandler\">PagedTiffHandler\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "glaser\x40hallowelt.biz"),
+array('name' => "PageNotice", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:PageNotice\">PageNotice\x3c/a> extension",
+ 'owner' => "brightbyte\x40gmail.com",
+ 'cc' => ""),
+array('name' => "ParserFunctions", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "ParserFunctions extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "PasswordReset", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:PasswordReset\">PasswordReset\x3c/a> extension",
+ 'owner' => "t.laqua\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "Patroller", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Patroller extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "PdfHandler", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:PdfHandler\">PdfHandler\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Poem", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Poem\">Poem\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "ssanbeg\x40web.de"),
+array('name' => "Poll", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Poll extension",
+ 'owner' => "jan\x40jans-seite.de",
+ 'cc' => ""),
+array('name' => "PoolCounter", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "PoolCounter Extension",
+ 'owner' => "Platonides\x40gmail.com",
+ 'cc' => "tstarling\x40wikimedia.org"),
+array('name' => "Postcomment", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Postcomment\">Postcomment\x3c/a> extension",
+ 'owner' => "tderouin\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "Preloader", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Preloader extension in Subversion",
+ 'owner' => "robchur\x40gmail.com",
+ 'cc' => ""),
+array('name' => "ProofreadPage", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Proofread_Page\">ProofreadPage\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "thomasV1\x40gmx.de"),
+array('name' => "QPoll", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:QPoll\">QPoll extension\x3c/a>",
+ 'owner' => "questpc\x40rambler.ru",
+ 'cc' => ""),
+array('name' => "Quiz", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Quiz extension for MediaWiki",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "RandomImage", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "RandomImage extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "ReaderFeedback", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:ReaderFeedback\">ReaderFeedback\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "aschulz4587\x40gmail.com"),
+array('name' => "RecordAdmin", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:RecordAdmin\">Extension:RecordAdmin\x3c/a> - A special page for finding and editing record articles using forms",
+ 'owner' => "aran\x40organicdesign.co.nz",
+ 'cc' => ""),
+array('name' => "RefHelper", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:RefHelper\">RefHelper\x3c/a> extension",
+ 'owner' => "jonwilliford\x40gmail.com",
+ 'cc' => ""),
+array('name' => "RefreshSpecial", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:RefreshSpecial\">RefreshSpecial\x3c/a> extension",
+ 'owner' => "jack\x40countervandalism.net",
+ 'cc' => ""),
+array('name' => "RegexBlock", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:RegexBlock\">RegexBlock\x3c/a> extension",
+ 'owner' => "bartek\x40wikia-inc.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "Renameuser", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Renameuser special page extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "aschulz4587\x40gmail.com"),
+array('name' => "ReplaceText", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Replace_Text\">ReplaceText\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "yaron57\x40gmail.com"),
+array('name' => "RSS", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:RSS\">RSS\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "brightbyte\x40gmail.com, jack\x40countervandalism.net, jeroen_dedauw\x40yahoo.com, mah\x40everybody.org"),
+array('name' => "ScanSet", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The ScanSet parser hook extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "SecurePoll", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The SecurePoll extension, which supercedes the older BoardVote extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "tstarling\x40wikimedia.org"),
+array('name' => "SelectCategory", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:SelectCategory\">SelectCategory extension\x3c/a> to MediaWiki",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "leon\x40leonweber.de"),
+array('name' => "Semantic MediaWiki", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Semantic MediaWiki extension",
+ 'owner' => "markus\x40semantic-mediawiki.org",
+ 'cc' => "jeroen_dedauw\x40yahoo.com"),
+array('name' => "SemanticDrilldown", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Semantic_Drilldown\">Semantic Drilldown extension\x3c/a> for navigating semantic data.",
+ 'owner' => "yaron57\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "SemanticForms", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Semantic Forms extension for Semantic MediaWiki",
+ 'owner' => "yaron57\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "SemanticFormsInputs", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Semantic_Forms_Inputs\">SemanticFormsInputs\x3c/a> extension",
+ 'owner' => "f.trott\x40gmx.net",
+ 'cc' => ""),
+array('name' => "SemanticMaps", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Semantic_Maps\">Semantic Maps\x3c/a> extension",
+ 'owner' => "jeroen_dedauw\x40yahoo.com",
+ 'cc' => ""),
+array('name' => "SemanticResultFormats", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Contrib code for Semantic MediaWiki extensions.",
+ 'owner' => "jeroen_dedauw\x40yahoo.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org, yaron57\x40gmail.com"),
+array('name' => "SharedUserRights", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:SharedUserRights\">SharedUserRights\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "charlie\x40mudoo.net, lgarczewski\x40gmail.com"),
+array('name' => "SimpleSecurity", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:SimpleSecurity\">SimpleSecurity extension\x3c/a>",
+ 'owner' => "aran\x40organicdesign.co.nz",
+ 'cc' => ""),
+array('name' => "SiteMatrix", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Wikimedia site matrix",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "SlippyMaps", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "SlippyMaps extension and related components. See maps-l mailing list.",
+ 'owner' => "avarab\x40gmail.com",
+ 'cc' => "aude.wiki\x40gmail.com"),
+array('name' => "SmoothGallery", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:SmoothGallery\">SmoothGallery\x3c/a> extension",
+ 'owner' => "rlane32\x40gmail.com",
+ 'cc' => ""),
+array('name' => "SocialProfile", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:SocialProfile\">SocialProfile\x3c/a> extension",
+ 'owner' => "jack\x40countervandalism.net",
+ 'cc' => ""),
+array('name' => "Sort", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Sort extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Spam Blacklist", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Spam blacklist extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "StringFunctionsEscaped", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:StringFunctionsEscaped\">StringFunctionsEscaped\x3c/a> extension",
+ 'owner' => "jack.pond\x40psitex.com",
+ 'cc' => ""),
+array('name' => "SyntaxHighlight (GeSHi)", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Syntax highlighting parser hook extension using the GeSHi highlighting engine",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "soxred93\x40gmail.com"),
+array('name' => "Tasks", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Tasks extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Throttle", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The Throttle extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "TimedMediaHandler", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:TimedMediaHandler\">TimedMediaHandler\x3c/a> extension",
+ 'owner' => "dale\x40ucsc.edu",
+ 'cc' => ""),
+array('name' => "TitleBlacklist", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Title blacklist extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "vasilvv\x40gmail.com"),
+array('name' => "TitleKey", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:TitleKey\">TitleKey\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "brion\x40wikimedia.org"),
+array('name' => "TorBlock", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "TorBlock extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "agarrett\x40wikimedia.org"),
+array('name' => "Translate", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Translate\">Translate\x3c/a> extension",
+ 'owner' => "niklas.laxstrom\x40gmail.com",
+ 'cc' => "s.mazeland\x40xs4all.nl"),
+array('name' => "UniversalEditButton", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:UniversalEditButton\">UniversalEditButton\x3c/a> extension",
+ 'owner' => "brion\x40wikimedia.org",
+ 'cc' => ""),
+array('name' => "Uniwiki", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Category:Uniwiki\">Uniwiki\x3c/a> extension collection",
+ 'owner' => "robert\x40rhl.me.uk",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "UploadWizard", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "UploadWizard provides a multi-file, step-by-step JavaScript wizard to\r\nupload multimedia files to a MediaWiki website (Special:UploadWizard).",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "asharma\x40wikimedia.org, neilk\x40wikimedia.org"),
+array('name' => "UsabilityInitiative", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Issues related to the extensions developed by the \x3ca href=\"http://usability.wikimedia.org\">Wikimedia Usability Initiative\x3c/a> ( EditWarning, PrefStats, ClickTracking, etc.). Bugs for Vector and/or WikiEditor should be reported in their own components!",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "asharma\x40wikimedia.org, roan.kattouw\x40gmail.com, tparscal\x40wikimedia.org"),
+array('name' => "UsageStatistics", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://mediawiki.org/wiki/Extension:Usage_Statistics\">UsageStatistics\x3c/a> extension",
+ 'owner' => "gri6507\x40yahoo.com",
+ 'cc' => "alfred.maghi\x40gmail.com"),
+array('name' => "UserMerge", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:UserMerge\">UserMerge\x3c/a> Extension",
+ 'owner' => "mail\x40tgries.de",
+ 'cc' => ""),
+array('name' => "UsernameBlacklist", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Username Blacklist extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "UserRightsNotif", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:User_Rights_Email_Notification\">UserRightsNotif\x3c/a> extension",
+ 'owner' => "Abigor\x40forgotten-beauty.com",
+ 'cc' => ""),
+array('name' => "Vector", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Vector\">Vector\x3c/a> Extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "roan.kattouw\x40gmail.com, tparscal\x40wikimedia.org"),
+array('name' => "WebFonts", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:WebFonts\">WebFonts\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "WhiteList", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:WhiteList\">WhiteList\x3c/a> extension",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Widgets", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Widgets\">Widgets\x3c/a> extension",
+ 'owner' => "sergey.chernyshev\x40gmail.com",
+ 'cc' => "wikibugs-l\x40lists.wikimedia.org"),
+array('name' => "WikiBhasha", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:WikiBhasha\">WikiBhasha\x3c/a> extension to aide in translation of articles",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "s.mazeland\x40xs4all.nl, WBMSRI\x40microsoft.com"),
+array('name' => "Wikidata", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Wikidata",
+ 'owner' => "robert\x40rhl.me.uk",
+ 'cc' => ""),
+array('name' => "wikidiff2", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "C++ diff engine used on Wikimedia",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "tstarling\x40wikimedia.org"),
+array('name' => "WikiEditor", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "WikiEditor extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "roan.kattouw\x40gmail.com, tparscal\x40wikimedia.org"),
+array('name' => "WikiHiero", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "The WikiHiero (hieroglyphics) extension.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => ""),
+array('name' => "Wikilog", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:Wikilog\">Wikilog\x3c/a> extension",
+ 'owner' => "bugs\x40juliano.info",
+ 'cc' => ""),
+array('name' => "WikiLove", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Extension for adding positive feedback on user talk pages.",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "rkaldari\x40wikimedia.org"),
+array('name' => "WikiTextLoggedInOut", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "\x3ca href=\"http://www.mediawiki.org/wiki/Extension:WikiTextLoggedInOut\">WikiTextLoggedInOut\x3c/a> extension",
+ 'owner' => "jack\x40countervandalism.net",
+ 'cc' => ""),
+array('name' => "[other]", 'parent' => 'MediaWiki Extensions',
+ 'desc' => "Other extensions not in the list",
+ 'owner' => "wikibugs-l\x40lists.wikimedia.org",
+ 'cc' => "")
+);
+
+$admin = array(
+"agarrett [at] wikimedia",
+"brion [at] wikimedia",
+"hashar [at] free",
+"innocentkiller [at] gmail",
+"krinklemail [at] gmail",
+"mah [at] everybody",
+"r.tarnell [at] IEEE",
+"rhalsell [at] wikimedia",
+"rlane32 [at] gmail",
+"roan.kattouw [at] gmail",
+"robla [at] robla",
+"robla [at] wikimedia",
+"s.mazeland [at] xs4all",
+"sam [at] reedyboy",
+"tfinc [at] wikimedia",
+"tstarling [at] wikimedia",
+);
+
+$people = array();
+
+function incr($p) {
+ global $people;
+
+ if( !isset($people[$p]) ) {
+ $people[$p] = 1;
+ } else {
+ $people[$p]++;
+ }
+}
+
+foreach($settings as $b) {
+ $n = $b['parent']."/".$b['name'];
+ $mod[$n] = $b['desc'];
+ $owner[$b['owner']][] = $n;
+ incr($b['owner']);
+ foreach(preg_split("/, */", $b['cc']) as $c) {
+ if($c) {
+ $cc[$c][] = $n;
+ incr($c);
+ }
+ }
+}
+
+$non_admin_body = "
+As the Bugmeister for Wikimedia, one of the things I am doing right
+now is cleaning up CC lists and default assigments on the various
+components that we track in Bugzilla (see
+http://bugzilla.wikimedia.org/).
+
+Your email is listed as the default owner or a member of the default
+CC list of one or more components in Bugzilla. Please respond to this
+message to let me know which of these emails you want to continue
+getting. If I do not hear from you by August 1st, I will remove you
+from the following place(s):
+
+";
+
+$admin_body = "
+Since you are listed as an admin by Bugzilla, I'll assume that you
+have the ability to add or remove yourself from the following areas of
+Bugzilla. This email is simply a reminder.
+
+";
+
+asort($people);
+foreach($people as $n => $c) {
+ if ($n !== "wikibugs-l [at] lists" ) {
+ $headers = "To: $n\r\nFrom: Mark A. Hershberger <mhershberger [at] wikimedia>\r\nSubject: Email from Wikimedia's Bugzilla\r\n";
+ $email = "";
+ $isAdmin = in_array($n, $admin);
+
+ if($isAdmin) {
+ $email .= $admin_body;
+ } else {
+ $email .= $non_admin_body;
+ }
+
+ if(isset($owner[$n]))
+ foreach($owner[$n] as $m) {
+ $email .= " Owner of $m\n";
+ }
+
+ if(isset($cc[$n]))
+ foreach($cc[$n] as $m) {
+ $email .= " CC on $m\n";
+ }
+
+ if(!$isAdmin) {
+ $email .= "
+Again, please let me know by August 1st which, if any, of these you
+would like to keep.
+";
+ }
+
+ $email .= "
+Thanks,
+
+Mark A. Hershberger
+Bugmeister
+Wikimedia Foundation
+mhershberger [at] wikimedia
+717.271.1084
+";
+
+ mail( $n, "Email from Wikimedia's Bugzilla", $email, $headers, "-f mhershberger [at] wikipedia" );
+ file_put_contents("email/$n", $email);
+
+ }
+}


Property changes on: trunk/tools/bugzilla/client/bz-mailer.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/components.php
===================================================================
--- trunk/tools/bugzilla/client/components.php (rev 0)
+++ trunk/tools/bugzilla/client/components.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,14 @@
+#!/usr/bin/php
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'bugzilla.php';
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+$bz = new BugzillaWebClient( $u['url'].'/jsonrpc.cgi', $u['email'], $u['password'], $u['debug']);
+
+#$bug = new BugzillaBug( 29917, $bz );
+$bug = new BugzillaBug( 1, $bz );
+var_dump($bug->hasDefaultAssignee());
+var_dump($bug->getAssignee());


Property changes on: trunk/tools/bugzilla/client/components.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/duplicates.php
===================================================================
--- trunk/tools/bugzilla/client/duplicates.php (rev 0)
+++ trunk/tools/bugzilla/client/duplicates.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,56 @@
+#!/usr/bin/php
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'bugzilla.php';
+require_once 'wmf-terms.php'
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+$bz = new BugzillaWebClient( $u['url'].'/jsonrpc.cgi', $u['email'], $u['password'], $u['debug']);
+#$iter = new BugzillaSearchIterator( $bz, array( 'id' => $id ) );
+
+$bugList = array();
+$iter = new BugzillaSearchIterator( $bz, $terms );
+$bugCount = 0;
+$db = new SQLite3("./dupes");
+$r = $db->query("CREATE TABLE IF NOT EXISTS dupes ( bug INTEGER, dupe INTEGER )");
+if($r === false) {
+ echo $r->lastErrorMsg();
+ exit;
+}
+$r = $db->query("SELECT dupe FROM dupes");
+$seen = array();
+while($s = $r->fetchArray(SQLITE3_NUM)) {
+ $seen[$s[0]] = 1;
+}
+$db->close();
+
+foreach($iter as $bug) {
+ if ( isset($seen[$bug->getId()]) ) {
+ echo ".";
+ } else {
+ if($bug->isDuplicate()) {
+ $bugList[$bug->isDuplicate()][] = $bug->getId();
+ } else {
+ $bugList[$bug->getID()][] = $bug->getId();
+ }
+ $bugCount++;
+ if($bugCount % 100 == 0) {
+ echo "$bugCount \n";
+ $db = new SQLite3("./dupes");
+ foreach($bugList as $main => $dupe) {
+ foreach($dupe as $d) {
+ $r = $db->query("INSERT INTO dupes (bug, dupe) VALUES (".$main.",".$d.");");
+ if( $r === false ) {
+ echo "oops! '$main' -> '$d'\n";
+ echo $r->lastErrorMsg();
+ exit;
+ }
+ }
+ }
+ $db->close();
+ }
+ }
+}
+echo "Bug count: $bugCount\n";


Property changes on: trunk/tools/bugzilla/client/duplicates.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/fixme.php
===================================================================
--- trunk/tools/bugzilla/client/fixme.php (rev 0)
+++ trunk/tools/bugzilla/client/fixme.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,36 @@
+#!/usr/bin/php
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'mwApiClient.php';
+require_once 'bugzilla.php';
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+
+# find FIXMEs
+$iter = new mwApiClientIterator(new mwApiClient("http://bugzilla.wikimedia.org/", $u['email'], $u['password']));
+$iter->findState("FIXME");
+
+# iterate over list, group committers
+#
+foreach($iter as $bug) {
+ $message = "http://bugzilla.wikimedia.org/{$bug->getID()}";
+# $message .= " {$Bug->getPriorityText()} {$bug->getStatus()} {$bug->getSummary()}\n";
+ $message .= " ({$bug->getPriorityText()}) -- {$bug->getSummary()}\n";
+ $bugList[$bug->getPriority()][] = $message;
+}
+foreach($bugList as $cmp => $bugs) {
+ echo "== $cmp ==\n";
+ foreach($bugs as $m) {
+ echo $m;
+ }
+ echo "\n";
+}
+
+
+
+
+
+
+


Property changes on: trunk/tools/bugzilla/client/fixme.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/gmaneWebClient.php
===================================================================
--- trunk/tools/bugzilla/client/gmaneWebClient.php (rev 0)
+++ trunk/tools/bugzilla/client/gmaneWebClient.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,211 @@
+#!/usr/bin/php -f
+<?php
+
+require_once "$IP/includes/Defines.php";
+require_once "$IP/includes/AutoLoader.php";
+require_once "$IP/includes/GlobalFunctions.php";
+require_once "$IP/includes/DefaultSettings.php";
+
+class GmaneWebClient {
+ private $url;
+
+ function __construct( $url = "http://download.gmane.org/" ) {
+ $this->url = $url;
+ }
+
+ public function getMbox( $group, $count = 100, $start = 0 ) {
+ return new GmaneMbox( $group, $count, $this, $start );
+ }
+
+ public function getArchiveChunk( $group, $offset, $size ) {
+ echo "\n".$this->url . $group . "/$offset/".($offset+$size), "\n";
+ $h = HttpRequest::factory( $this->url . $group . "/$offset/".($offset+$size));
+ $status = $h->execute();
+ if( $status->isOK() ) {
+ $txt = $h->getContent();
+ return substr( $txt, 0, strlen( $txt ) - 1 );
+ } else {
+ throw new Exception($status->getMessage());
+ }
+ }
+}
+
+class GmaneMbox implements Iterator {
+ private $gmane;
+ private $chunkSize;
+ private $items = array();
+ private $group;
+ private $ptr = 0;
+ private $offset = 0;
+
+ public function __construct( $group, $count, GmaneWebClient $gmane, $start ) {
+ $this->gmane = $gmane;
+ $this->chunkSize = $count;
+ $this->group = $group;
+ $this->offset = $start;
+ }
+
+ public function rewind( ) {
+ $this->ptr = 0;
+ $this->chunk = array();
+ $this->fetchNext();
+ return true;
+ }
+
+ public function current( ) {
+ return new GmaneMessage( $this->items[$this->ptr] );
+ }
+
+ function key( ) {
+ return $this->ptr + $this->offset - 1;
+ }
+
+ function next( ) {
+ $this->ptr++;
+ if( $this->ptr >= count( $this->items ) ) {
+ $this->fetchNext();
+ }
+ }
+
+ function valid( ) {
+ return isset( $this->items[$this->ptr] );
+ }
+
+ static private function prefixChunk($a) {
+ if( substr( $a, 0, 5 ) === "From " ) return $a;
+ return "From $a";
+ }
+
+ function fetchNext( ) {
+ $chunk = $this->gmane->getArchiveChunk( $this->group, $this->offset, $this->chunkSize );
+ $chunks = array_map( array('self', 'prefixChunk'), preg_split("/^\n(From )/sm", $chunk, $this->chunkSize) );
+ $this->items = array_merge( $this->items, $chunks );
+
+ $this->offset += count($chunks);
+ $this->ptr++;
+ }
+}
+
+class GmaneMessage {
+ public $header;
+ public $body;
+ public $raw;
+ public $description;
+
+ public function __call($name, $args) {
+ if( isset( $this->header[ $name ][0] ) ) {
+ return $this->header[ $name ][0];
+ } elseif( isset( $this->header[ "x-bz-".strtolower($name) ][0] ) ) {
+ return $this->header[ "x-bz-".strtolower($name) ][0];
+ } else {
+ switch( $name ) {
+ case "who":
+ return $this->header[ "x-bz-reportedby" ][0];
+ case "version":
+ return "unspecified";
+ }
+ /* var_dump($this); */
+ /* var_dump($name); */
+ /* exit; */
+ }
+ }
+
+ public function __construct( $mail ) {
+ list($header, $body) = explode( "\n\n", $mail, 2 );
+
+ $this->raw = $mail;
+ $this->parseHeader( $header );
+ $this->body = $body;
+ }
+
+ public function parseHeader( $header ) {
+ $line = explode("\n", $header);
+ array_shift($line);
+ $field = null;
+ foreach($line as $l) {
+ if( substr($l, 0, 1) === "\t" || substr($l, 0, 1) === " " ) {
+ if( $field === null ) {
+ throw new Exception("Don't know what to do with this line: $l\n");
+ }
+ $last = array_pop( array_keys( $this->header[$field] ) );
+ $this->header[$field][$last] .= "\n$l";
+ } else {
+ list($field, $value) = explode(": ", $l, 2);
+ $field = strtolower($field);
+ $this->header[$field][] = $value;
+ }
+ }
+ $subject = quoted_printable_decode( $this->header["subject"][0] );
+ if(substr($subject, 0, 15) == "=?iso-8859-1?q?") {
+ $subject = str_replace(array("_"), " ", substr($subject, 15));
+ }
+ $this->header['date'][0] = strtotime( $this->header['date'][0] );
+ $this->header['subject'][0] = preg_replace( "/[\t\n]*/", "", $subject );
+
+ preg_match( "#^.Bug *([0-9]+)#", $this->header['subject'][0], $m );
+ if( isset( $m[1] ) ) {
+ $this->header['id'][0] = $m[1];
+ } else if ( stristr( $this->header['from'][0], 'SourceForge.net' ) ) {
+ preg_match( "#^\[ .*-([0-9]+) \]#", $this->header['subject'][0], $m );
+ $this->header['id'][0] = $m[1];
+ } else if ( stristr( $this->header['from'][0], 'bugzilla-daemon' ) &&
+ ( stristr( $this->header['subject'][0], 'Your account' ) ||
+ stristr( $this->header['subject'][0], 'Bugzilla Change Password Request' ) ||
+ stristr( $this->header['subject'][0], 'Password change request canceled' ) ) ) {
+ $this->header['id'][0] = null;
+ } else {
+ var_dump($this->raw);
+ exit;
+ }
+
+ if( strpos( $this->raw, "\n-- \n" ) !== false ) {
+ list($keep, $trash) = explode( "\n-- \n", quoted_printable_decode( $this->raw ) );
+ } else {
+ $keep = $this->raw;
+ }
+
+ $part = explode("\n\n", $keep, 4);
+
+ if( isset( $part[0] ) ) {
+ $header = $part[0];
+ } else {
+ var_dump($part);
+ echo "$count\n";
+ exit;
+ }
+
+ if( isset( $part[1] ) ) {
+ $url = $part[1];
+ } else {
+ var_dump($part);
+ echo "$count\n";
+ exit;
+ }
+
+ if( isset( $part[2] ) ) {
+ $fields = $part[2];
+ }
+
+ if( isset( $part[3] ) ) {
+ $body = $part[3];
+ } else {
+ $body = $part[2];
+ $fields = null;
+ }
+
+ if( $fields ) {
+ foreach(explode("\n", $fields) as $f) {
+ preg_match( "#[ \t]+([^ \t:]+): ([^ ]+)#", $f, $m );
+ if( isset( $m[2] ) ) {
+ $this->header["x-bz-".strtolower($m[1])][0] = $m[2];
+ }
+ }
+ }
+ $this->description = $body;
+ }
+}
+
+class BugzillaDupe {
+ public function __call($name, $args) {
+ }
+}
\ No newline at end of file


Property changes on: trunk/tools/bugzilla/client/gmaneWebClient.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Modified: trunk/tools/bugzilla/client/jsonRPCClient.php
===================================================================
--- trunk/tools/bugzilla/client/jsonRPCClient.php 2012-05-25 11:03:05 UTC (rev 115434)
+++ trunk/tools/bugzilla/client/jsonRPCClient.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -115,11 +115,9 @@
// performs the HTTP POST
$h = MWHttpRequest::factory($this->url, array('method' => "POST", 'postData' => $request));
$h->setHeader('Content-Type', "application/json");
- if(!$this->cookieJar) $this->cookieJar = $h->getCookieJar();
- $h->setCookieJar($this->cookieJar);
- $status = $h->execute();
- $this->cookieJar = $h->getCookieJar();

+ $status = $this->executeWithCookies( $h );
+
$response = $h->getContent();

if ( $status->isOk() ) {
@@ -156,4 +154,12 @@
return true;
}
}
-}
+
+ public function executeWithCookies( $handle ) {
+ if(!$this->cookieJar) $this->cookieJar = $handle->getCookieJar();
+ $handle->setCookieJar($this->cookieJar);
+ $status = $handle->execute();
+ $this->cookieJar = $handle->getCookieJar();
+ return $status;
+ }
+}
\ No newline at end of file

Added: trunk/tools/bugzilla/client/last-year.php
===================================================================
--- trunk/tools/bugzilla/client/last-year.php (rev 0)
+++ trunk/tools/bugzilla/client/last-year.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,30 @@
+#!/usr/bin/php
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'bugzilla.php';
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+$bz = new BugzillaWebClient( $u['url'].'/jsonrpc.cgi', $u['email'], $u['password'], $u['debug']);
+
+$message = "";
+$iter = new BugzillaSearchIterator( $bz, array("last_change_time" => "2010-06-01T00:00:00Z"));
+$fp = fopen('changes.csv', 'a');
+fputcsv($fp, array("bug id", "time", "who", "field", "removed", "added"));
+foreach( $iter as $bug ) {
+ $id = $bug->getID();
+ echo "Checking bug #$id ...\n";
+
+ foreach($bug->getHistory() as $txn) {
+ $time = $txn['when'];
+ $who = $txn['who'];
+ foreach($txn['changes'] as $change) {
+ $field = $change['field_name'];
+ $removed = $change['removed'];
+ $added = $change['added'];
+ fputcsv($fp, array($id, $time, $who, $field, $removed, $added));
+ }
+ }
+}
+


Property changes on: trunk/tools/bugzilla/client/last-year.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Modified: trunk/tools/bugzilla/client/main.php
===================================================================
--- trunk/tools/bugzilla/client/main.php 2012-05-25 11:03:05 UTC (rev 115434)
+++ trunk/tools/bugzilla/client/main.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -1,133 +1,40 @@
#!/usr/bin/php
<?php

+define('LAST_CHECK', 'bz-last-check.txt');
+
define('MEDIAWIKI', true);
-$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+$IP = "/home/mah/work/code/mediawiki/core"; # root of your mw installation ... we use the HTTPClient class

require_once 'bugzilla.php';
$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
$bz = new BugzillaWebClient( $u['url'].'/jsonrpc.cgi', $u['email'], $u['password'], $u['debug']);
-#$iter = new BugzillaSearchIterator( $bz, array( 'id' => $id ) );
+date_default_timezone_set( 'UTC' );
+if( file_exists( LAST_CHECK ) ) {
+ $time = file_get_contents( LAST_CHECK );
+ if( $time === false ) {
+ throw new Exception( "No time" );
+ }
+ $time = unserialize( $time );
+} else {
+ $time = strftime( '%FT00:00:00-0000' );
+}

$terms = array(
- "component" => array(
- # From Mobile:
- 'android', 'iphone', 'server',
+ 'last_change_time' => $time,
+);

- # From MediaWiki:
- 'API', 'Blocking', 'Categories', 'Change Tagging', 'Database', 'Deleting', 'Device compatibility', 'DjVu',
- 'Documentation', 'Email', 'Export/Import', 'General/Unknown', 'History/Diffs', 'Images and files', 'Installation',
- 'Internationalization', 'Javascript', 'Language converter', 'Maintenance scripts', 'Modern skin', 'Page editing',
- 'Page protection', 'Page rendering', 'Recent changes', 'Redirects', 'Resource Loader', 'Revision deletion', 'Search',
- 'Special pages', 'Syndication', 'Templates', 'Unit tests', 'Uploading', 'User interface', 'User login', 'User preferences',
- 'Vector Skin', 'Watchlist',
+$iter = new BugzillaPatchIterator( $bz, $terms );

- # From WMF extensions
- "AbuseFilter",
- "AntiSpoof",
- "ArticleAssessmentPilot",
- "ArticleFeedback",
- "CategoryTree",
- "CentralAuth",
- "CentralNotice",
- "CharInsert",
- "CheckUser",
- "Cite",
- "ClickTracking",
- "ClientSide",
- "CodeReview",
- "Collection",
- "CommunityVoice",
- "ConfirmEdit",
- "ContactPage",
- "ContributionTracking",
- "DismissableSiteNotice",
- "Donation","Form",
- "DynamicPageList",
- "FundraiserPortal",
- "Gadgets",
- "GlobalBlocking",
- "GlobalUsage",
- "ImageMap",
- "Inputbox",
- "Installation",
- "Internationalization",
- "LabeledSectionTransclusion",
- "LandingCheck",
- "LiquidThreads",
- "LocalisationUpdate",
- "Lucene Search",
- "Narayam",
- "NewUserMessage",
- "Nuke",
- "OAI",
- "OggHandler",
- "Oversight",
- "PagedTiffHandler",
- "ParserFunctions",
- "PdfHandler",
- "PhotoCommons",
- "Poem",
- "PrefStats",
- "PrefSwitch",
- "PrefSwitch",
- "ProofreadPage",
- "Quiz",
- "RSS",
- "ReaderFeedback",
- "Renameuser",
- "SecurePoll",
- "SiteMatrix",
- "Spam Blacklist",
- "Syndication",
- "SyntaxHighlight (GeSHi)",
- "TitleBlacklist",
- "TitleKey",
- "TorBlock",
- "UploadWizard",
- "UploadWizard",
- "UsabilityInitiative",
- "Use","SpecialCite",
- "UserDailyContribs",
- "UsernameBlacklist",
- "VariablePage",
- "Vector",
- "WikiEditor",
- "WikiHiero",
- "WikimediaMobile",
- "[other]",
+# iterate over a list of patches
+foreach( $iter as $it ) {
+# Find the files modified
+ var_dump( $it );

- # From Security
- "General",
-
- # From Wikimedia Tools
- 'PhotoCommons', 'WikiSnaps',
-
- # From Wikipedia
- # 'AcaWiki', 'Bugzilla',
- 'DNS', 'Downloads', 'Extension setup', 'Fundraising Requirements',
- 'Interwiki links', 'IRC', 'Language setup', 'lucene-search-2', 'Mailing lists', 'OTRS', 'Prototype server',
- #'Site logos', 'Site requests',
- 'SSL related', 'Subversion', 'Usage Statistics', 'User survey', 'WAP mobile gateway',
- #'wikibugs IRC bot'
- ),
- "product" => array("MediaWiki", "MediaWiki extensions", "Security", "Wikimedia", "Wikimedia Tools", "Wikipedia Mobile"),
- "severity" => array("blocker", "critical", "major", "normal", "minor", "trivial"),
- "status" => array("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED"),
- "priority" => array("Highest", "High", "Normal"),
-);
-
-$bugList = array();
-$iter = new BugzillaSearchIterator( $bz, $terms );
-foreach($iter as $bug) {
- $bugList[$bug->getAssignee()][] = $bug;
+# Branch with bug/#/comment#
+# Apply patch
+# Commit with comment + message patch comes from
+# git-review
}

-foreach($bugList as $assignee => $bugs) {
- $message = "$assignee\n";
- foreach($bugs as $bug) {
- $message .= " http://bugzilla.wikimedia.org/{$bug->getID()}\n";
-# $message .= " {$bug->getPriorityText()} {$bug->getStatus()} {$bug->getSummary()}\n";
- }
- echo $message;
-}
+file_put_contents( LAST_CHECK, serialize( strftime( '%FT%T-0000' ) ) );

Added: trunk/tools/bugzilla/client/mwApiClient.php
===================================================================
--- trunk/tools/bugzilla/client/mwApiClient.php (rev 0)
+++ trunk/tools/bugzilla/client/mwApiClient.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,321 @@
+#!/usr/bin/php -f
+<?php
+
+require_once "$IP/includes/Defines.php";
+require_once "$IP/includes/AutoLoader.php";
+require_once "$IP/includes/GlobalFunctions.php";
+require_once "$IP/includes/DefaultSettings.php";
+
+class mwApiClientIterator implements Iterator {
+ private $api;
+ private $data;
+ private $limit = 50;
+ private $offset = null;
+ private $items = array();
+ private $method = "GET";
+ private $state = "new";
+
+ public function __construct( mwApiClient $api, $offset = null ) {
+ $this->api = $api;
+
+ $this->data['lelimit'] = $this->limit;
+ $this->data['lestart'] = $offset;
+ $this->offset = $offset;
+ }
+
+ public function findState( $type ) {
+ $this->method = "POST";
+ $this->state = $type;
+ }
+
+ public function rewind( ) {
+ $this->ptr = 0;
+ $this->fetchNext();
+ return true;
+ }
+
+ public function current( ) {
+ return $this->items[$this->ptr];
+ }
+
+ function key( ) {
+ return $this->ptr + $this->offset - 1;
+ }
+
+ function next( ) {
+ $this->ptr++;
+ if( $this->ptr >= count( $this->items ) ) {
+ $this->fetchNext();
+ }
+ }
+
+ function valid( ) {
+ return isset( $this->items[$this->ptr] );
+ }
+
+ private function fetchNext( ) {
+ if( $this->offset !== false ) {
+ $this->data['lestart'] = $this->offset;
+ $status = $this->api->request( $this->data );
+
+ $res = $this->api->getResult( $this->method, $this->state );
+ if( isset( $res['query-continue']['logevents']['lestart'] ) ) {
+ $this->offset = $res['query-continue']['logevents']['lestart'];
+ } else {
+ $this->offset = false;
+ }
+
+ $events = array();
+
+ if( isset( $res['query'] ) ) {
+ foreach( $res['query']['logevents'] as $e ) {
+ if($e['pageid'] == 0) {
+ $ret = $this->resolveTitle( $e['title'] );
+ }
+
+ $events[] = $e;
+ }
+ }
+ $this->fetchImageInfo( $events );
+ }
+ }
+
+ private function fetchImageInfo( $partial, $depth = 0 ) {
+ $images = array();
+
+ $f = function ($v) {return $v['pageid'];};
+
+ $q = implode("|", array_map($f, $partial));
+
+ $res = $this->api->request(
+ array("action" => "query",
+ "pageids" => $q,
+ "prop" => "imageinfo",
+ "format" => "json",
+ "iiprop" => "size") );
+ if( !isset( $res ) ) {
+ throw new Exception( var_export( $res ) );
+ }
+ if( !isset($res['query']) || !isset($res['query']['pages']) ) {
+ var_dump($res);
+ throw new Exception("Strangeness!");
+ }
+ foreach(array_values($res['query']['pages']) as $file) {
+ if( isset( $file['missing'] ) && $file['missing'] === "" && isset( $file['title'] ) ) {
+ $ret = $this->resolveTitle( $file['title'] );
+ if(!isset($ret['imageinfo'][0]['size'])) $ret['imageinfo'][0]['size'] = 0;
+ $images[$file['pageid']] = $this->fileToArray( $ret );
+
+ } else if( isset( $file['missing'] ) && !isset( $file['title'] ) ) {
+ # nothing here
+ } else if( !isset( $file['imagerepository'] ) || $file['imagerepository'] === "" ) {
+ # probably deleted
+ } else if( !isset( $file['imageinfo'] ) ) {
+ var_dump($file);
+ var_dump($res);
+ throw new Exception("Missing ImageInfo");
+ } else
+ $images[$file['pageid']]['imageinfo'] = $file['imageinfo'];
+ }
+ foreach($partial as $file) {
+ if(isset($file['pageid']) && isset($images[$file['pageid']]['imageinfo']) && $images[$file['pageid']]['imageinfo']) {
+ $images[$file['pageid']] = array_merge( $images[$file['pageid']], $this->fileToArray( $file ));
+
+ } else if ($file['pageid'] !== 0 && isset($file['imageinfo'])) {
+ var_dump($file);
+ throw new Exception("How did I end up here?");
+
+ } else if( !isset($file['imageinfo']) ) {
+ $ret = $this->resolveTitle( $file['title'] );
+ $images[$file['pageid']] = $this->fileToArray( $ret );
+
+ } else {
+ echo "Incomplete: {$file['title']}/{$file['pageid']}\n";
+ }
+
+ if( $file['pageid'] == 0 && substr($images[0]['comment'],0,7) !== "DELETE:" ) {
+ /* TODO Figure out something better */
+ unset($images[0]);
+ }
+
+ if( !isset( $file['title'] ) ) {
+ var_dump($file);
+ throw new Exception("Missing Title");
+ }
+ }
+ krsort($images);
+ $this->items = array_merge( $this->items, array_values($images) );
+ }
+
+ private function fileToArray( $file ) {
+ $fields = array( "title", "timestamp", "pageid", "user", "comment" );
+ $ret = array();
+
+ foreach($fields as $f) {
+ if(!isset($file[$f])) {
+ echo "Missing field '$f'\n";
+ $ret[$f] = "";
+ } else {
+ $ret[$f] = $file[$f];
+ }
+ }
+ if( isset($file['imageinfo']) ) {
+ $ret['imageinfo'] = $file['imageinfo'];
+ }
+ return $ret;
+ }
+
+ private function resolveTitle( $title, $imageinfo = true ) {
+ $ret = array();
+ $res = $this->api->request(
+ array("action" => "query",
+ "list" => "logevents",
+ "letitle" => "$title",
+ "ledir" => "newer",
+ "format" => "json") );
+
+ foreach($res['query']['logevents'] as $l) {
+ $ret['timestamp'] = $l['timestamp'];
+ $ret['user'] = $l['user'];
+ $ret['title'] = $l['title'];
+ $ret['pageid'] = $l['pageid'];
+ $ret['comment'] = $l['comment'];
+ if( isset( $l['action'] ) ) {
+ if($l['action'] == "move") {
+ $ret['comment'] = "MOVED: {$l['move']['new_title']} -- {$ret['comment']}";
+ echo "MOVED: $title to {$l['move']['new_title']}\n";
+ if($imageinfo) {
+ list($ret['pageid'], $ret['imageinfo']) = $this->getImageInfo($l['move']['new_title']);
+ if(!isset($ret['imageinfo'][0]['size'])) $ret['imageinfo'][0]['size'] = 0;
+ } else {
+ $r = $this->resolveTitle($l['move']['new_title']);
+ $ret['title'] = $r['title'];
+ $ret['pageid'] = $r['pageid'];
+ }
+ } else if($l['action'] == "upload"
+ || $l['action'] == "patrol"
+ || $l['action'] == "delete"
+ || $l['action'] == "restore"
+ || $l['action'] == "protect"
+ || $l['action'] == "unprotect"
+ || $l['action'] == 'overwrite') {
+ $action = strtoupper($l['action']);
+
+ $ret['comment'] = "$action: {$ret['comment']}";
+ if(!isset($ret['imageinfo'])) $ret['imageinfo'][0]['size'] = 0;
+ echo "$action: $title\n";
+ } else {
+ $ret['comment'] = "UNKNOWN ACTION: {$l['action']} -- {$ret['comment']}";
+ $ret['imageinfo'][0]['size'] = 0;
+
+ echo "??? {$l['action']}: $title\n";
+ }
+ }
+ }
+
+ return $ret;
+ }
+
+ private function getImageInfo( $title ) {
+ $res = $this->api->request(
+ array("action" => "query",
+ "titles" => $title,
+ "prop" => "imageinfo",
+ "format" => "json",
+ "iiprop" => "size") );
+
+ $page = array_values($res['query']['pages']);
+ if ( isset($page['imageinfo'][0]) ) {
+ return array($page['pageid'], $page['imageinfo']);
+ } else if ( isset($page[0]['imageinfo']) ) {
+ return array($page[0]['pageid'], $page[0]['imageinfo']);
+ } else if ( isset( $page[0]['imagerepository'] ) && $page[0]['imagerepository'] === "" ){
+ return array($page[0]['pageid'], array("size" => 0 ) );
+ } else {
+ var_dump($page);
+ throw new Exception("Should never get here");
+ }
+ }
+}
+
+class mwApiClient {
+ private $api = null;
+ private $url = null;
+ private $cookieJar = null;
+ private $result;
+ private static $productList = array();
+
+ public function __construct( $url, $user = null, $password = null, $debug = false ) {
+
+ $this->url = $url;
+
+ if($user && $password) {
+ $this->request(
+ array("action" => "login",
+ "lgname" => $user,
+ "format" => "json",
+ "lgpassword" => $password ) );
+
+ $res = $this->result;
+ if( isset($res['login']['result']) && $res['login']['result'] == 'NeedToken' ) {
+ $this->request(
+ array("action" => "login",
+ "lgname" => $user,
+ "format" => "json",
+ "lgtoken" => $res['login']['token'],
+ "lgpassword" => $password ) );
+
+ }
+ }
+ }
+
+ public function request( $request ) {
+ $h = MWHttpRequest::factory($this->url, array('method' => "POST", 'postData' => $request));
+
+ if(!$this->cookieJar) $this->cookieJar = $h->getCookieJar();
+ $h->setCookieJar($this->cookieJar);
+ $status = $h->execute();
+
+ /* Weirdly get an error here sometimes */
+ if( !$status->isOK() && $h->getStatus() == 200 ) {
+ sleep(10);
+ $status = $h->execute();
+ }
+ $this->cookieJar = $h->getCookieJar();
+ $this->result = json_decode( $h->getContent(), true );
+
+ if( !$status->isOK() ) {
+ throw new Exception("Problem with request: ". $h->getContent(). ": ". $h->getStatus());
+ }
+
+ if( isset( $this->result['error']['info'] ) ) {
+ throw new Exception("error: ". $this->result['error']['info']);
+ }
+ return $this->result;
+ }
+
+ public function getResult( ) {
+ return $this->result;
+ }
+
+ public function listUploadsFrom($userName) {
+ return new mwApiClientIterator($this, array(
+ "action" => "query",
+ "list" => "logevents",
+ "leuser" => $userName,
+ "leaction" => "upload/upload",
+ "prop" => "info",
+ "format" => "json"
+ )
+ );
+ }
+
+ public function listAllUploads( $offset = null ) {
+ return new mwApiClientIterator($this, array(
+ "action" => "query",
+ "list" => "logevents",
+ "leaction" => "upload/upload",
+ "format" => "json"
+ ), $offset );
+ }
+}
\ No newline at end of file


Property changes on: trunk/tools/bugzilla/client/mwApiClient.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/parse-mbox.php
===================================================================
--- trunk/tools/bugzilla/client/parse-mbox.php (rev 0)
+++ trunk/tools/bugzilla/client/parse-mbox.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,69 @@
+#!/usr/bin/php -r
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'gmaneWebClient.php';
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+$gmane = new GmaneWebClient( );
+if( file_exists("count") ) {
+ $start = file_get_contents("count") - 100;
+} else {
+ $start = 0;
+}
+
+$iter = $gmane->getMbox( $u['group'], 100, $start );
+
+$count = $start;
+$out = "";
+$len = 0;
+$bad = 0;
+$skip = 10; # print a nl every 10th item
+foreach( $iter as $mail ) {
+ $count++;
+ if( preg_match( "/bugzilla.wikimedia.org/", $mail->body ) ) {
+ /* echo "\nCount: $count\n"; */
+ /* echo $mail->header["subject"][0], "\n"; */
+ /* echo $mail->header["from"][0], "\n"; */
+ /* echo $mail->header["to"][0], "\n\n"; */
+ /* echo $mail->body; */
+ $dir = "bugzilla-mail";
+
+ $md5 = md5($mail->raw);
+ $old_subdir = substr($md5, 0, 2);
+ $subdir = substr($md5, 0, 2) . "/". substr($md5, 2, 2);
+ if( !file_exists( "$dir/$subdir" ) ) {
+ mkdir( "$dir/$subdir", 0755, true );
+ }
+
+ $m = trim( $mail->header["message-id"][0], "<>/" );
+ $out = "$count: $m";
+ if( file_exists( "$dir/$old_subdir/$m" ) ) {
+ if( !rename( "$dir/$old_subdir/$m", "$dir/$subdir/$m" ) ) {
+ echo "\nfailure moving $dir/$old_subdir/$m\n";
+ exit;
+ }
+ $out = "moving from one deep: $out";
+ } else if( file_exists( "$dir/$m" ) ) {
+ if( !rename( "$dir/$m", "$dir/$subdir/$m" ) ) {
+ echo "\nfailure moving $dir/$m\n";
+ exit;
+ }
+ $out = "moving: $out";
+ } else if( ! file_exists( "$dir/$subdir/$m" ) ) {
+ file_put_contents( "$dir/$subdir/$m", $mail->raw );
+ file_put_contents( "count", $count );
+ } else {
+ $out = "already got it: $out";
+ }
+
+ if( $count % $skip == 0 ) {
+ echo "\n";
+ } else {
+ echo "\r". str_repeat( " ", $len ). "\r";
+ }
+ echo $out;
+ $len = strlen($out);
+ }
+}


Property changes on: trunk/tools/bugzilla/client/parse-mbox.php
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/patch-finder.php
===================================================================
--- trunk/tools/bugzilla/client/patch-finder.php (rev 0)
+++ trunk/tools/bugzilla/client/patch-finder.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,26 @@
+#!/usr/bin/php
+<?php
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/core"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'bugzilla.php';
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+$bz = new BugzillaWebClient( $u['url'].'/jsonrpc.cgi', $u['email'], $u['password'], $u['debug']);
+
+$terms = array(
+ "resolution" => array( "" ),
+ "product" => array( "MediaWiki", "MediaWiki extensions" ),
+);
+
+$bugList = array();
+$iter = new BugzillaSearchIterator( $bz, $terms );
+$message = "";
+$count = 0 ;
+foreach($iter as $bug) {
+ $message .= "http://bugzilla.wikimedia.org/{$bug->getID()} -- {$bug->getAssignee()}\n";
+ $message .= " {$bug->getSummary()}\n";
+ $count++;
+ if ($count == 10) exit;
+}
+
+echo "$message\n";


Property changes on: trunk/tools/bugzilla/client/patch-finder.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/revert-bad-bugs.php
===================================================================
--- trunk/tools/bugzilla/client/revert-bad-bugs.php (rev 0)
+++ trunk/tools/bugzilla/client/revert-bad-bugs.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,47 @@
+#!/usr/bin/php
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'bugzilla.php';
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+$bz = new BugzillaWebClient( $u['url'].'/jsonrpc.cgi', $u['email'], $u['password'], $u['debug']);
+
+$terms = array(
+ "component" => array("Generic"),
+ "product" => array("Wikipedia App"),
+);
+$iter = new BugzillaSearchIterator( $bz, $terms );
+
+$found = array();
+foreach($iter as $bug) {
+ foreach( $bug->getHistory() as $message ) {
+ $message = $message[0]['history'];
+
+ $not_found = true;
+ $action = array_pop( $message );
+ while( $not_found && $action ) {
+
+ if( $action['who'] === 'mah [at] everybody' &&
+ substr( $action['when'], 0, 10 ) === '2012-02-17' ) {
+
+ foreach( $action['changes'] as $c ) {
+ if( $c['removed'] === 'generic' &&
+ $c['added'] === 'Wikimedia' &&
+ $c['field_name'] === 'component' ) {
+ $not_found = false;
+ }
+ }
+ }
+
+ $action = array_pop( $message );
+ }
+
+ if( ! $not_found ) {
+ $found[] = $bug->getID();
+ echo "*** {$bug->getID()}: {$bug->getSummary()}\n";
+ }
+ }
+}
+echo implode( ",", $found ), "\n";


Property changes on: trunk/tools/bugzilla/client/revert-bad-bugs.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/revert-troll.php
===================================================================
--- trunk/tools/bugzilla/client/revert-troll.php (rev 0)
+++ trunk/tools/bugzilla/client/revert-troll.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,26 @@
+#!/usr/bin/php
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'bugzilla.php';
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+$bz = new BugzillaWebClient( $u['url'].'/jsonrpc.cgi', $u['email'], $u['password'], $u['debug']);
+$terms = array(
+#3922, 12344, 13602, 18463, 18526, 18861, 19262, 20476, 23730, 25763, 26233, 27418,
+ "id" => array( 27488, 29038, 29197, 29277, 29408, 29461, 29574, 29731, 29784, 29921, 30052, 30235, 30425, 30787, 31122, 31173, 31255, 31680, 31697, 31795, 31945, 31962, 32013, 32023, 32056, 32229, 32551, 32711, 32760, 32827, 32868, 32949, 32951, 33322, 33388, 33437, 33506, 33564, 33580, 33762, 34055 ),
+);
+
+$troll = "john.next [at] gmx";
+$iter = new BugzillaSearchIterator( $bz, $terms );
+foreach($iter as $bug) {
+ echo "Reverting {$bug->getID()}\n";
+ $bug->undoLastChangeIfBy( $troll );
+ foreach($bug->getComments() as $c) {
+ if( $c['author'] === $troll ) {
+ echo "\tdeleting {$c['id']}\n";
+ $bug->deleteComment( $c['id'] );
+ }
+ }
+}


Property changes on: trunk/tools/bugzilla/client/revert-troll.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/unassign-default.php
===================================================================
--- trunk/tools/bugzilla/client/unassign-default.php (rev 0)
+++ trunk/tools/bugzilla/client/unassign-default.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,510 @@
+#!/usr/bin/php
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'bugzilla.php';
+$u = parse_ini_file(getenv('HOME')."/.bugzilla.ini");
+$bz = new BugzillaWebClient( $u['url'].'/jsonrpc.cgi', $u['email'], $u['password'], $u['debug']);
+
+$a['Bryan.TongMinh [at] Gmail'][] = 23136;
+$a['Bryan.TongMinh [at] Gmail'][] = 23947;
+$a['Bryan.TongMinh [at] Gmail'][] = 24761;
+$a['Bryan.TongMinh [at] Gmail'][] = 26608;
+$a['Bryan.TongMinh [at] Gmail'][] = 27161;
+$a['PhiLiP.NPC [at] Gmail'][] = 23871;
+$a['PhiLiP.NPC [at] Gmail'][] = 24040;
+$a['PhiLiP.NPC [at] Gmail'][] = 24281;
+$a['PhiLiP.NPC [at] Gmail'][] = 24409;
+$a['PhiLiP.NPC [at] Gmail'][] = 24521;
+$a['PhiLiP.NPC [at] Gmail'][] = 24742;
+$a['PhiLiP.NPC [at] Gmail'][] = 24798;
+$a['PhiLiP.NPC [at] Gmail'][] = 25326;
+$a['PhiLiP.NPC [at] Gmail'][] = 25497;
+$a['PhiLiP.NPC [at] Gmail'][] = 25537;
+$a['PhiLiP.NPC [at] Gmail'][] = 27109;
+$a['Simetrical+wikibugs [at] gmail'][] = 10663;
+$a['agarrett [at] wikimedia'][] = 28551;
+$a['agarrett [at] wikimedia'][] = 28579;
+$a['agarrett [at] wikimedia'][] = 28664;
+$a['agarrett [at] wikimedia'][] = 28712;
+$a['agarrett [at] wikimedia'][] = 28724;
+$a['agarrett [at] wikimedia'][] = 28746;
+$a['agarrett [at] wikimedia'][] = 28761;
+$a['agarrett [at] wikimedia'][] = 28802;
+$a['agarrett [at] wikimedia'][] = 28826;
+$a['amiller [at] wikimedia'][] = 24476;
+$a['amiller [at] wikimedia'][] = 25072;
+$a['amiller [at] wikimedia'][] = 25073;
+$a['amiller [at] wikimedia'][] = 25074;
+$a['arichards [at] wikimedia'][] = 25429;
+$a['aschulz4587 [at] gmail'][] = 16306;
+$a['aschulz4587 [at] gmail'][] = 18454;
+$a['aschulz4587 [at] gmail'][] = 19081;
+$a['aschulz4587 [at] gmail'][] = 19964;
+$a['aschulz4587 [at] gmail'][] = 22890;
+$a['aschulz4587 [at] gmail'][] = 22931;
+$a['aschulz4587 [at] gmail'][] = 23135;
+$a['aschulz4587 [at] gmail'][] = 23334;
+$a['aschulz4587 [at] gmail'][] = 23594;
+$a['aschulz4587 [at] gmail'][] = 23633;
+$a['aschulz4587 [at] gmail'][] = 23651;
+$a['aschulz4587 [at] gmail'][] = 23721;
+$a['aschulz4587 [at] gmail'][] = 24482;
+$a['aschulz4587 [at] gmail'][] = 24894;
+$a['aschulz4587 [at] gmail'][] = 25763;
+$a['aschulz4587 [at] gmail'][] = 26966;
+$a['aschulz4587 [at] gmail'][] = 27873;
+$a['bawolff+wn [at] gmail'][] = 25012;
+$a['brightbyte [at] gmail'][] = 15553;
+$a['brightbyte [at] gmail'][] = 16266;
+$a['brightbyte [at] gmail'][] = 17782;
+$a['brightbyte [at] gmail'][] = 17783;
+$a['brightbyte [at] gmail'][] = 17939;
+$a['brightbyte [at] gmail'][] = 19151;
+$a['brightbyte [at] gmail'][] = 19410;
+$a['brightbyte [at] gmail'][] = 21800;
+$a['brightbyte [at] gmail'][] = 22798;
+$a['brightbyte [at] gmail'][] = 23359;
+$a['brightbyte [at] gmail'][] = 23771;
+$a['brightbyte [at] gmail'][] = 25152;
+$a['brightbyte [at] gmail'][] = 26405;
+$a['brightbyte [at] gmail'][] = 26847;
+$a['brightbyte [at] gmail'][] = 27512;
+$a['brion [at] wikimedia'][] = 12878;
+$a['brion [at] wikimedia'][] = 16122;
+$a['brion [at] wikimedia'][] = 16900;
+$a['brion [at] wikimedia'][] = 17059;
+$a['brion [at] wikimedia'][] = 19054;
+$a['brion [at] wikimedia'][] = 19079;
+$a['brion [at] wikimedia'][] = 20035;
+$a['brion [at] wikimedia'][] = 21096;
+$a['brion [at] wikimedia'][] = 23354;
+$a['brion [at] wikimedia'][] = 23609;
+$a['brion [at] wikimedia'][] = 25854;
+$a['brion [at] wikimedia'][] = 26304;
+$a['brion [at] wikimedia'][] = 26795;
+$a['brion [at] wikimedia'][] = 27048;
+$a['church.of.emacs.ml [at] gmail'][] = 25592;
+$a['denny.vrandecic [at] kit'][] = 24507;
+$a['development [at] pediapress'][] = 24512;
+$a['development [at] pediapress'][] = 24972;
+$a['development [at] pediapress'][] = 25442;
+$a['development [at] pediapress'][] = 26330;
+$a['development [at] pediapress'][] = 26448;
+$a['development [at] pediapress'][] = 26533;
+$a['development [at] pediapress'][] = 26775;
+$a['development [at] pediapress'][] = 27462;
+$a['development [at] pediapress'][] = 27624;
+$a['development [at] pediapress'][] = 27952;
+$a['development [at] pediapress'][] = 28056;
+$a['development [at] pediapress'][] = 28057;
+$a['development [at] pediapress'][] = 28058;
+$a['development [at] pediapress'][] = 28059;
+$a['development [at] pediapress'][] = 28060;
+$a['development [at] pediapress'][] = 28061;
+$a['development [at] pediapress'][] = 28063;
+$a['development [at] pediapress'][] = 28064;
+$a['development [at] pediapress'][] = 28066;
+$a['development [at] pediapress'][] = 28118;
+$a['development [at] pediapress'][] = 28206;
+$a['development [at] pediapress'][] = 28361;
+$a['glaser [at] hallowelt'][] = 24984;
+$a['gmaxwell [at] gmail'][] = 11253;
+$a['gmaxwell [at] gmail'][] = 11259;
+$a['huskyr [at] gmail'][] = 27816;
+$a['innocentkiller [at] gmail'][] = 22753;
+$a['innocentkiller [at] gmail'][] = 23122;
+$a['innocentkiller [at] gmail'][] = 26172;
+$a['innocentkiller [at] gmail'][] = 26712;
+$a['mah [at] everybody'][] = 26492;
+$a['mah [at] everybody'][] = 26510;
+$a['maxsem.wiki [at] gmail'][] = 22010;
+$a['neilk [at] wikimedia'][] = 23672;
+$a['neilk [at] wikimedia'][] = 24701;
+$a['neilk [at] wikimedia'][] = 24702;
+$a['neilk [at] wikimedia'][] = 24704;
+$a['neilk [at] wikimedia'][] = 24758;
+$a['neilk [at] wikimedia'][] = 24759;
+$a['neilk [at] wikimedia'][] = 24760;
+$a['neilk [at] wikimedia'][] = 24935;
+$a['neilk [at] wikimedia'][] = 25902;
+$a['neilk [at] wikimedia'][] = 25966;
+$a['neilk [at] wikimedia'][] = 26010;
+$a['neilk [at] wikimedia'][] = 26049;
+$a['neilk [at] wikimedia'][] = 26050;
+$a['neilk [at] wikimedia'][] = 26054;
+$a['neilk [at] wikimedia'][] = 26063;
+$a['neilk [at] wikimedia'][] = 26065;
+$a['neilk [at] wikimedia'][] = 26072;
+$a['neilk [at] wikimedia'][] = 26073;
+$a['neilk [at] wikimedia'][] = 26079;
+$a['neilk [at] wikimedia'][] = 26100;
+$a['neilk [at] wikimedia'][] = 26107;
+$a['neilk [at] wikimedia'][] = 26167;
+$a['neilk [at] wikimedia'][] = 26186;
+$a['neilk [at] wikimedia'][] = 26342;
+$a['neilk [at] wikimedia'][] = 26500;
+$a['neilk [at] wikimedia'][] = 26502;
+$a['neilk [at] wikimedia'][] = 26504;
+$a['neilk [at] wikimedia'][] = 26505;
+$a['neilk [at] wikimedia'][] = 27260;
+$a['neilk [at] wikimedia'][] = 27270;
+$a['neilk [at] wikimedia'][] = 27274;
+$a['neilk [at] wikimedia'][] = 27286;
+$a['neilk [at] wikimedia'][] = 27305;
+$a['neilk [at] wikimedia'][] = 27313;
+$a['neilk [at] wikimedia'][] = 27314;
+$a['neilk [at] wikimedia'][] = 27316;
+$a['neilk [at] wikimedia'][] = 27500;
+$a['neilk [at] wikimedia'][] = 27735;
+$a['neilk [at] wikimedia'][] = 27800;
+$a['neilk [at] wikimedia'][] = 27801;
+$a['neilk [at] wikimedia'][] = 27876;
+$a['neilk [at] wikimedia'][] = 27942;
+$a['neilk [at] wikimedia'][] = 27995;
+$a['neilk [at] wikimedia'][] = 28036;
+$a['neilk [at] wikimedia'][] = 28196;
+$a['neilk [at] wikimedia'][] = 28197;
+$a['neilk [at] wikimedia'][] = 28198;
+$a['neilk [at] wikimedia'][] = 28199;
+$a['neilk [at] wikimedia'][] = 28232;
+$a['neilk [at] wikimedia'][] = 28269;
+$a['neilk [at] wikimedia'][] = 28322;
+$a['neilk [at] wikimedia'][] = 28325;
+$a['neilk [at] wikimedia'][] = 28448;
+$a['neilk [at] wikimedia'][] = 28456;
+$a['neilk [at] wikimedia'][] = 28523;
+$a['neilk [at] wikimedia'][] = 28525;
+$a['neilk [at] wikimedia'][] = 28731;
+$a['neilk [at] wikimedia'][] = 28740;
+$a['neilk [at] wikimedia'][] = 28810;
+$a['neilk [at] wikimedia'][] = 28818;
+$a['neilk [at] wikimedia'][] = 28850;
+$a['nkomura [at] gmail'][] = 28638;
+$a['nkomura [at] gmail'][] = 28640;
+$a['pvora [at] wikimedia'][] = 19757;
+$a['r.tarnell [at] IEEE'][] = 14831;
+$a['r.tarnell [at] IEEE'][] = 18779;
+$a['r.tarnell [at] IEEE'][] = 19295;
+$a['r.tarnell [at] IEEE'][] = 19497;
+$a['r.tarnell [at] IEEE'][] = 20848;
+$a['rainman [at] EUnet'][] = 17217;
+$a['rainman [at] EUnet'][] = 17942;
+$a['rainman [at] EUnet'][] = 20173;
+$a['rainman [at] EUnet'][] = 20375;
+$a['rainman [at] EUnet'][] = 20636;
+$a['rainman [at] EUnet'][] = 20637;
+$a['rainman [at] EUnet'][] = 21031;
+$a['rainman [at] EUnet'][] = 21062;
+$a['rainman [at] EUnet'][] = 21274;
+$a['rainman [at] EUnet'][] = 21276;
+$a['rainman [at] EUnet'][] = 21717;
+$a['rainman [at] EUnet'][] = 22269;
+$a['rainman [at] EUnet'][] = 22272;
+$a['rainman [at] EUnet'][] = 22433;
+$a['rainman [at] EUnet'][] = 22515;
+$a['rainman [at] EUnet'][] = 23108;
+$a['rainman [at] EUnet'][] = 23527;
+$a['rainman [at] EUnet'][] = 23629;
+$a['rainman [at] EUnet'][] = 24775;
+$a['rainman [at] EUnet'][] = 25278;
+$a['rainman [at] EUnet'][] = 26443;
+$a['rainman [at] EUnet'][] = 26997;
+$a['rainman [at] EUnet'][] = 27337;
+$a['rainman [at] EUnet'][] = 28657;
+$a['rhalsell [at] wikimedia'][] = 17768;
+$a['rlane32 [at] gmail'][] = 28469;
+$a['rodrigofera [at] gmail'][] = 15534;
+$a['soxred93 [at] gmail'][] = 20656;
+$a['soxred93 [at] gmail'][] = 20657;
+$a['soxred93 [at] gmail'][] = 20760;
+$a['soxred93 [at] gmail'][] = 22785;
+$a['soxred93 [at] gmail'][] = 23674;
+$a['soxred93 [at] gmail'][] = 24385;
+$a['soxred93 [at] gmail'][] = 25384;
+$a['soxred93 [at] gmail'][] = 25547;
+$a['soxred93 [at] gmail'][] = 25704;
+$a['soxred93 [at] gmail'][] = 26860;
+$a['soxred93 [at] gmail'][] = 27714;
+$a['ssanbeg [at] web'][] = 21339;
+$a['ssanbeg [at] web'][] = 23407;
+$a['tfinc [at] wikimedia'][] = 27939;
+$a['tfinc [at] wikimedia'][] = 28799;
+$a['thomasV1 [at] gmx'][] = 23040;
+$a['thomasV1 [at] gmx'][] = 23049;
+$a['thomasV1 [at] gmx'][] = 24322;
+$a['thomasV1 [at] gmx'][] = 24896;
+$a['thomasV1 [at] gmx'][] = 26881;
+$a['thomasV1 [at] gmx'][] = 27455;
+$a['thomasV1 [at] gmx'][] = 27640;
+$a['thomasV1 [at] gmx'][] = 27678;
+$a['thomasV1 [at] gmx'][] = 28102;
+$a['thomasV1 [at] gmx'][] = 28403;
+$a['tparscal [at] wikimedia'][] = 18789;
+$a['tparscal [at] wikimedia'][] = 19190;
+$a['tparscal [at] wikimedia'][] = 19786;
+$a['tparscal [at] wikimedia'][] = 20234;
+$a['tparscal [at] wikimedia'][] = 20319;
+$a['tparscal [at] wikimedia'][] = 20602;
+$a['tparscal [at] wikimedia'][] = 20607;
+$a['tparscal [at] wikimedia'][] = 20842;
+$a['tparscal [at] wikimedia'][] = 20898;
+$a['tparscal [at] wikimedia'][] = 20919;
+$a['tparscal [at] wikimedia'][] = 21039;
+$a['tparscal [at] wikimedia'][] = 21051;
+$a['tparscal [at] wikimedia'][] = 21177;
+$a['tparscal [at] wikimedia'][] = 21204;
+$a['tparscal [at] wikimedia'][] = 21511;
+$a['tparscal [at] wikimedia'][] = 21782;
+$a['tparscal [at] wikimedia'][] = 21820;
+$a['tparscal [at] wikimedia'][] = 22201;
+$a['tparscal [at] wikimedia'][] = 22291;
+$a['tparscal [at] wikimedia'][] = 22377;
+$a['tparscal [at] wikimedia'][] = 22412;
+$a['tparscal [at] wikimedia'][] = 22450;
+$a['tparscal [at] wikimedia'][] = 22461;
+$a['tparscal [at] wikimedia'][] = 22464;
+$a['tparscal [at] wikimedia'][] = 22466;
+$a['tparscal [at] wikimedia'][] = 22478;
+$a['tparscal [at] wikimedia'][] = 22479;
+$a['tparscal [at] wikimedia'][] = 22487;
+$a['tparscal [at] wikimedia'][] = 22488;
+$a['tparscal [at] wikimedia'][] = 22498;
+$a['tparscal [at] wikimedia'][] = 22557;
+$a['tparscal [at] wikimedia'][] = 22566;
+$a['tparscal [at] wikimedia'][] = 22632;
+$a['tparscal [at] wikimedia'][] = 22775;
+$a['tparscal [at] wikimedia'][] = 22814;
+$a['tparscal [at] wikimedia'][] = 22955;
+$a['tparscal [at] wikimedia'][] = 22986;
+$a['tparscal [at] wikimedia'][] = 23007;
+$a['tparscal [at] wikimedia'][] = 23019;
+$a['tparscal [at] wikimedia'][] = 23023;
+$a['tparscal [at] wikimedia'][] = 23052;
+$a['tparscal [at] wikimedia'][] = 23053;
+$a['tparscal [at] wikimedia'][] = 23062;
+$a['tparscal [at] wikimedia'][] = 23064;
+$a['tparscal [at] wikimedia'][] = 23065;
+$a['tparscal [at] wikimedia'][] = 23094;
+$a['tparscal [at] wikimedia'][] = 23141;
+$a['tparscal [at] wikimedia'][] = 23154;
+$a['tparscal [at] wikimedia'][] = 23200;
+$a['tparscal [at] wikimedia'][] = 23265;
+$a['tparscal [at] wikimedia'][] = 23266;
+$a['tparscal [at] wikimedia'][] = 23271;
+$a['tparscal [at] wikimedia'][] = 23273;
+$a['tparscal [at] wikimedia'][] = 23275;
+$a['tparscal [at] wikimedia'][] = 23386;
+$a['tparscal [at] wikimedia'][] = 23479;
+$a['tparscal [at] wikimedia'][] = 23484;
+$a['tparscal [at] wikimedia'][] = 23499;
+$a['tparscal [at] wikimedia'][] = 23509;
+$a['tparscal [at] wikimedia'][] = 23512;
+$a['tparscal [at] wikimedia'][] = 23518;
+$a['tparscal [at] wikimedia'][] = 23522;
+$a['tparscal [at] wikimedia'][] = 23539;
+$a['tparscal [at] wikimedia'][] = 23553;
+$a['tparscal [at] wikimedia'][] = 23571;
+$a['tparscal [at] wikimedia'][] = 23579;
+$a['tparscal [at] wikimedia'][] = 23590;
+$a['tparscal [at] wikimedia'][] = 23591;
+$a['tparscal [at] wikimedia'][] = 23612;
+$a['tparscal [at] wikimedia'][] = 23624;
+$a['tparscal [at] wikimedia'][] = 23626;
+$a['tparscal [at] wikimedia'][] = 23675;
+$a['tparscal [at] wikimedia'][] = 23702;
+$a['tparscal [at] wikimedia'][] = 23783;
+$a['tparscal [at] wikimedia'][] = 23824;
+$a['tparscal [at] wikimedia'][] = 23826;
+$a['tparscal [at] wikimedia'][] = 23877;
+$a['tparscal [at] wikimedia'][] = 23879;
+$a['tparscal [at] wikimedia'][] = 23880;
+$a['tparscal [at] wikimedia'][] = 23901;
+$a['tparscal [at] wikimedia'][] = 23905;
+$a['tparscal [at] wikimedia'][] = 23913;
+$a['tparscal [at] wikimedia'][] = 23943;
+$a['tparscal [at] wikimedia'][] = 23955;
+$a['tparscal [at] wikimedia'][] = 23956;
+$a['tparscal [at] wikimedia'][] = 23981;
+$a['tparscal [at] wikimedia'][] = 23985;
+$a['tparscal [at] wikimedia'][] = 23994;
+$a['tparscal [at] wikimedia'][] = 24021;
+$a['tparscal [at] wikimedia'][] = 24041;
+$a['tparscal [at] wikimedia'][] = 24060;
+$a['tparscal [at] wikimedia'][] = 24069;
+$a['tparscal [at] wikimedia'][] = 24070;
+$a['tparscal [at] wikimedia'][] = 24103;
+$a['tparscal [at] wikimedia'][] = 24117;
+$a['tparscal [at] wikimedia'][] = 24150;
+$a['tparscal [at] wikimedia'][] = 24151;
+$a['tparscal [at] wikimedia'][] = 24152;
+$a['tparscal [at] wikimedia'][] = 24170;
+$a['tparscal [at] wikimedia'][] = 24183;
+$a['tparscal [at] wikimedia'][] = 24191;
+$a['tparscal [at] wikimedia'][] = 24194;
+$a['tparscal [at] wikimedia'][] = 24367;
+$a['tparscal [at] wikimedia'][] = 24402;
+$a['tparscal [at] wikimedia'][] = 24481;
+$a['tparscal [at] wikimedia'][] = 24488;
+$a['tparscal [at] wikimedia'][] = 24489;
+$a['tparscal [at] wikimedia'][] = 24493;
+$a['tparscal [at] wikimedia'][] = 24495;
+$a['tparscal [at] wikimedia'][] = 24509;
+$a['tparscal [at] wikimedia'][] = 24515;
+$a['tparscal [at] wikimedia'][] = 24528;
+$a['tparscal [at] wikimedia'][] = 24544;
+$a['tparscal [at] wikimedia'][] = 24577;
+$a['tparscal [at] wikimedia'][] = 24581;
+$a['tparscal [at] wikimedia'][] = 24591;
+$a['tparscal [at] wikimedia'][] = 24592;
+$a['tparscal [at] wikimedia'][] = 24660;
+$a['tparscal [at] wikimedia'][] = 24667;
+$a['tparscal [at] wikimedia'][] = 24713;
+$a['tparscal [at] wikimedia'][] = 24739;
+$a['tparscal [at] wikimedia'][] = 24753;
+$a['tparscal [at] wikimedia'][] = 24779;
+$a['tparscal [at] wikimedia'][] = 25068;
+$a['tparscal [at] wikimedia'][] = 25127;
+$a['tparscal [at] wikimedia'][] = 25184;
+$a['tparscal [at] wikimedia'][] = 25202;
+$a['tparscal [at] wikimedia'][] = 25223;
+$a['tparscal [at] wikimedia'][] = 25257;
+$a['tparscal [at] wikimedia'][] = 25280;
+$a['tparscal [at] wikimedia'][] = 25316;
+$a['tparscal [at] wikimedia'][] = 25394;
+$a['tparscal [at] wikimedia'][] = 25458;
+$a['tparscal [at] wikimedia'][] = 25510;
+$a['tparscal [at] wikimedia'][] = 25572;
+$a['tparscal [at] wikimedia'][] = 25575;
+$a['tparscal [at] wikimedia'][] = 25608;
+$a['tparscal [at] wikimedia'][] = 25617;
+$a['tparscal [at] wikimedia'][] = 25724;
+$a['tparscal [at] wikimedia'][] = 25845;
+$a['tparscal [at] wikimedia'][] = 26034;
+$a['tparscal [at] wikimedia'][] = 26291;
+$a['tparscal [at] wikimedia'][] = 26292;
+$a['tparscal [at] wikimedia'][] = 26349;
+$a['tparscal [at] wikimedia'][] = 26350;
+$a['tparscal [at] wikimedia'][] = 26384;
+$a['tparscal [at] wikimedia'][] = 26459;
+$a['tparscal [at] wikimedia'][] = 26544;
+$a['tparscal [at] wikimedia'][] = 26571;
+$a['tparscal [at] wikimedia'][] = 26617;
+$a['tparscal [at] wikimedia'][] = 26621;
+$a['tparscal [at] wikimedia'][] = 26665;
+$a['tparscal [at] wikimedia'][] = 26798;
+$a['tparscal [at] wikimedia'][] = 26803;
+$a['tparscal [at] wikimedia'][] = 26804;
+$a['tparscal [at] wikimedia'][] = 26818;
+$a['tparscal [at] wikimedia'][] = 26878;
+$a['tparscal [at] wikimedia'][] = 26901;
+$a['tparscal [at] wikimedia'][] = 26914;
+$a['tparscal [at] wikimedia'][] = 27025;
+$a['tparscal [at] wikimedia'][] = 27072;
+$a['tparscal [at] wikimedia'][] = 27231;
+$a['tparscal [at] wikimedia'][] = 27281;
+$a['tparscal [at] wikimedia'][] = 27366;
+$a['tparscal [at] wikimedia'][] = 27395;
+$a['tparscal [at] wikimedia'][] = 27418;
+$a['tparscal [at] wikimedia'][] = 27427;
+$a['tparscal [at] wikimedia'][] = 27432;
+$a['tparscal [at] wikimedia'][] = 27487;
+$a['tparscal [at] wikimedia'][] = 27509;
+$a['tparscal [at] wikimedia'][] = 27603;
+$a['tparscal [at] wikimedia'][] = 27647;
+$a['tparscal [at] wikimedia'][] = 27654;
+$a['tparscal [at] wikimedia'][] = 27764;
+$a['tparscal [at] wikimedia'][] = 27766;
+$a['tparscal [at] wikimedia'][] = 27771;
+$a['tparscal [at] wikimedia'][] = 27933;
+$a['tparscal [at] wikimedia'][] = 27999;
+$a['tparscal [at] wikimedia'][] = 28351;
+$a['tparscal [at] wikimedia'][] = 28475;
+$a['tparscal [at] wikimedia'][] = 28563;
+$a['tparscal [at] wikimedia'][] = 28693;
+$a['tparscal [at] wikimedia'][] = 28716;
+$a['tparscal [at] wikimedia'][] = 28750;
+$a['tparscal [at] wikimedia'][] = 28758;
+$a['tparscal [at] wikimedia'][] = 28789;
+$a['tparscal [at] wikimedia'][] = 28835;
+$a['tparscal [at] wikimedia'][] = 28846;
+$a['tstarling [at] wikimedia'][] = 11250;
+$a['tstarling [at] wikimedia'][] = 13422;
+$a['tstarling [at] wikimedia'][] = 13512;
+$a['tstarling [at] wikimedia'][] = 16475;
+$a['tstarling [at] wikimedia'][] = 17558;
+$a['tstarling [at] wikimedia'][] = 17706;
+$a['tstarling [at] wikimedia'][] = 18967;
+$a['tstarling [at] wikimedia'][] = 18980;
+$a['tstarling [at] wikimedia'][] = 19549;
+$a['tstarling [at] wikimedia'][] = 20023;
+$a['tstarling [at] wikimedia'][] = 20156;
+$a['tstarling [at] wikimedia'][] = 21542;
+$a['tstarling [at] wikimedia'][] = 21654;
+$a['tstarling [at] wikimedia'][] = 22622;
+$a['tstarling [at] wikimedia'][] = 22805;
+$a['tstarling [at] wikimedia'][] = 23585;
+$a['tstarling [at] wikimedia'][] = 23727;
+$a['tstarling [at] wikimedia'][] = 24015;
+$a['tstarling [at] wikimedia'][] = 24091;
+$a['tstarling [at] wikimedia'][] = 24483;
+$a['tstarling [at] wikimedia'][] = 25755;
+$a['tstarling [at] wikimedia'][] = 26960;
+$a['vasilvv [at] gmail'][] = 15821;
+$a['vasilvv [at] gmail'][] = 20298;
+$a['vasilvv [at] gmail'][] = 20461;
+$a['vasilvv [at] gmail'][] = 20695;
+$a['vasilvv [at] gmail'][] = 20852;
+$a['vasilvv [at] gmail'][] = 20954;
+$a['vasilvv [at] gmail'][] = 21206;
+$a['vasilvv [at] gmail'][] = 21481;
+$a['vasilvv [at] gmail'][] = 22317;
+$a['vasilvv [at] gmail'][] = 22673;
+$a['vasilvv [at] gmail'][] = 23046;
+$a['vasilvv [at] gmail'][] = 23243;
+$a['vasilvv [at] gmail'][] = 23279;
+$a['vasilvv [at] gmail'][] = 23280;
+$a['vasilvv [at] gmail'][] = 23391;
+$a['vasilvv [at] gmail'][] = 23478;
+$a['vasilvv [at] gmail'][] = 23601;
+$a['vasilvv [at] gmail'][] = 23653;
+$a['vasilvv [at] gmail'][] = 23654;
+$a['vasilvv [at] gmail'][] = 23821;
+$a['vasilvv [at] gmail'][] = 24148;
+$a['vasilvv [at] gmail'][] = 24351;
+$a['vasilvv [at] gmail'][] = 25168;
+$a['vasilvv [at] gmail'][] = 25733;
+$a['vasilvv [at] gmail'][] = 26463;
+$a['vasilvv [at] gmail'][] = 26476;
+$a['vasilvv [at] gmail'][] = 27031;
+$a['vasilvv [at] gmail'][] = 27142;
+$a['vasilvv [at] gmail'][] = 27551;
+$a['vasilvv [at] gmail'][] = 27721;
+$a['vasilvv [at] gmail'][] = 28095;
+$a['vasilvv [at] gmail'][] = 28185;
+$a['vasilvv [at] gmail'][] = 28186;
+
+$bugList = array();
+foreach( $a as $email => $bugIds ) {
+ foreach( $bugIds as $id ) {
+ $bug = new BugzillaBug( $id, $bz );
+ if( $bug->isOpen() ) {
+ if( $bug->getAssignee() === $email ) {
+ $bugList[] = $id;
+ } else {
+ echo "Bug #$id has already been reassigned to {$bug->getAssignee()} from $email\n";
+ }
+ } else {
+ echo "Bug #$id is not open. Not re-assigning.\n";
+ }
+ }
+}
+var_dump($bugList);
+exit;
+var_dump(
+ $bz->update( $bugList,
+ array( "assigned_to" => "wikibugs-l [at] lists",
+ "comment" => "Unassigning default assignments. http://article.gmane.org/gmane.science.linguistics.wikipedia.technical/54734",
+ "status" => "NEW" )));
\ No newline at end of file


Property changes on: trunk/tools/bugzilla/client/unassign-default.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/upload-stats.php
===================================================================
--- trunk/tools/bugzilla/client/upload-stats.php (rev 0)
+++ trunk/tools/bugzilla/client/upload-stats.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,102 @@
+#!/usr/bin/php -f
+<?php
+
+define('MEDIAWIKI', true);
+$IP = "/home/mah/work/code/mediawiki/mw-svn"; # root of your mw installation ... we use the HTTPClient class
+
+require_once 'mwApiClient.php';
+
+function lastLine($file, $numLines = 1) {
+ if(file_exists($file)) {
+ $fp = fopen($file, "r");
+ $chunk = 4096;
+ $fs = sprintf("%u", filesize($file));
+ $max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);
+
+ $data = "";
+ for ($len = 0; $len < $max; $len += $chunk) {
+ $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;
+
+ fseek($fp, ($len + $seekSize) * -1, SEEK_END);
+ $data = fread($fp, $seekSize) . $data;
+
+ if (substr_count($data, "\n") >= $numLines + 1) {
+ preg_match("!(.*?\n){".($numLines)."}$!", $data, $match);
+ fclose($fp);
+ return $match[0];
+ }
+ }
+ fclose($fp);
+ return $data;
+ } else {
+ return null;
+ }
+}
+
+$u = parse_ini_file(getenv('HOME')."/.wikimedia.ini");
+$api = new mwApiClient( $u['url'].'api.php', $u['user'], $u['password'], $u['debug']);
+
+$ret = lastLine("chart.csv");
+$f = array(null, null, null, null, null, null);
+if($ret) {
+ $f = str_getcsv($ret);
+}
+#$iter = $api->listUploadsFrom( "BotMultichillT" );
+
+$offset = $f[5];
+
+$otime = null;
+$fp = null;
+if ( !file_exists("chart.csv") ) {
+ $fp = fopen("chart.csv", "w");
+ fputcsv($fp, array("pageid", "User", "Title", "Comment", "Unix Epoch", "Timestamp on file", "size", "Delta in s", "rate (size/delta)"));
+} else {
+ $fp = fopen("chart.csv", "a");
+}
+
+while(1) {
+ try {
+ $iter = $api->listAllUploads( $offset );
+
+ foreach( $iter as $i ) {
+
+ if ( isset( $i['imageinfo'] ) &&
+ isset( $i['imageinfo'][0] ) &&
+ isset( $i['imageinfo'][0]['size'] ) ) {
+ $row = array($i['pageid']);
+ $row[] = $i['user'];
+ $row[] = $i['title'];
+ $row[] = str_replace("\n", '\n', $i['comment']);
+ $row[] = strtotime($i['timestamp']);
+ $row[] = $i['timestamp'];
+ $offset = $i['timestamp'];
+ $row[] = $i['imageinfo'][0]['size'];
+ $time = strtotime($i['timestamp']);
+ $delta = 0;
+ $rate = 0;
+ if($otime) { /* skip first response since we have no delta */
+ $delta = $otime-$time;
+ if( $delta !== 0 ) {
+ $rate = $i['imageinfo'][0]['size']/$delta;
+ } else {
+ $rate = 0;
+ }
+
+ $row[] = $delta;
+ $row[] = $rate;
+
+ echo "{$row[2]}\n";
+ fputcsv($fp, $row);
+ }
+
+ $otime = $time;
+ } else {
+ echo "Problem!\n";
+ var_dump($i);
+ }
+ }
+ } catch (Exception $e) {
+ echo "Got an exception!\n";
+ echo $e->getTraceAsString();
+ }
+}


Property changes on: trunk/tools/bugzilla/client/upload-stats.php
___________________________________________________________________
Added: svn:eol-syle
+ native

Added: trunk/tools/bugzilla/client/wmf-terms.php
===================================================================
--- trunk/tools/bugzilla/client/wmf-terms.php (rev 0)
+++ trunk/tools/bugzilla/client/wmf-terms.php 2012-05-25 15:42:15 UTC (rev 115435)
@@ -0,0 +1,111 @@
+<?php
+$terms = array(
+ "component" => array(
+ # From Mobile:
+ 'android', 'iphone', 'server',
+
+ # From MediaWiki:
+ 'API', 'Blocking', 'Categories', 'Change Tagging', 'Database', 'Deleting', 'Device compatibility', 'DjVu',
+ 'Documentation', 'Email', 'Export/Import', 'General/Unknown', 'History/Diffs', 'Images and files', 'Installation',
+ 'Internationalization', 'Javascript', 'Language converter', 'Maintenance scripts', 'Modern skin', 'Page editing',
+ 'Page protection', 'Page rendering', 'Recent changes', 'Redirects', 'Resource Loader', 'Revision deletion', 'Search',
+ 'Special pages', 'Syndication', 'Templates', 'Unit tests', 'Uploading', 'User interface', 'User login', 'User preferences',
+ 'Vector Skin', 'Watchlist',
+
+ # From WMF extensions
+ "AbuseFilter",
+ "AntiSpoof",
+ "ArticleAssessmentPilot",
+ "ArticleFeedback",
+ "CategoryTree",
+ "CentralAuth",
+ "CentralNotice",
+ "CharInsert",
+ "CheckUser",
+ "Cite",
+ "ClickTracking",
+ "ClientSide",
+ "CodeReview",
+ "Collection",
+ "CommunityVoice",
+ "ConfirmEdit",
+ "ContactPage",
+ "ContributionTracking",
+ "DismissableSiteNotice",
+ "Donation","Form",
+ "DynamicPageList",
+ "FundraiserPortal",
+ "Gadgets",
+ "GlobalBlocking",
+ "GlobalUsage",
+ "ImageMap",
+ "Inputbox",
+ "Installation",
+ "Internationalization",
+ "LabeledSectionTransclusion",
+ "LandingCheck",
+ "LiquidThreads",
+ "LocalisationUpdate",
+ "Lucene Search",
+ "MobileFrontend",
+ "Moodbar",
+ "Narayam",
+ "NewUserMessage",
+ "Nuke",
+ "OAI",
+ "OggHandler",
+ "Oversight",
+ "PagedTiffHandler",
+ "ParserFunctions",
+ "PdfHandler",
+ "PhotoCommons",
+ "Poem",
+ "PrefStats",
+ "PrefSwitch",
+ "PrefSwitch",
+ "ProofreadPage",
+ "Quiz",
+ "RSS",
+ "ReaderFeedback",
+ "Renameuser",
+ "SecurePoll",
+ "SiteMatrix",
+ "Spam Blacklist",
+ "Syndication",
+ "SyntaxHighlight (GeSHi)",
+ "TitleBlacklist",
+ "TitleKey",
+ "TorBlock",
+ "UploadWizard",
+ "UsabilityInitiative",
+ "Use","SpecialCite",
+ "UserDailyContribs",
+ "UsernameBlacklist",
+ "VariablePage",
+ "Vector",
+ "WikiEditor",
+ "WikiHiero",
+ "WikimediaMobile",
+ "[other]",
+
+ # From Security
+ "General",
+
+ # From Wikimedia Tools
+ 'PhotoCommons', 'WikiSnaps',
+
+ # From Wikipedia
+ # 'AcaWiki', 'Bugzilla',
+ 'DNS', 'Downloads', 'Extension setup', 'Fundraising Requirements',
+ 'Interwiki links', 'IRC', 'Language setup', 'lucene-search-2', 'Mailing lists', 'OTRS', 'Prototype server',
+ 'Site logos', 'Site requests',
+ 'SSL related', 'Subversion', 'Usage Statistics', 'User survey', 'WAP mobile gateway',
+ 'wikibugs IRC bot'
+ ),
+ "product" => array("MediaWiki", "MediaWiki extensions", "Security", "Wikimedia", "Wikimedia Tools", "Wikipedia Mobile"),
+ "resolution" => array(""),
+ /* "severity" => array("blocker", "critical", "major", "normal", "minor", "trivial", "enhancement"), */
+ /* "status" => array("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED"), */
+ /* "priority" => array("Highest", "High", "Normal"), */
+ /* "priority" => array("Lowest", "Low"), */
+);


Property changes on: trunk/tools/bugzilla/client/wmf-terms.php
___________________________________________________________________
Added: svn:eol-syle
+ native


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS [at] lists
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Wikipedia mediawiki-cvs RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.