
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 <math> 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
|