A modest collection of PHP libraries used at SparkFun.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

196 lines
5.6 KiB

<?php
namespace SparkLib;
use SparkLib\Fail;
use SparkLib\jsonRPC\Client;
/**
* Wrap various API calls to a Bugzilla installation.
*/
class Bugzilla {
protected $_uri = null;
// TODO
protected $_user = null;
protected $_passwd = null;
/**
* Get an instance of Bugzilla for the given installation URI.
*/
public function __construct ($uri)
{
$this->_uri = $uri;
}
/**
* Return an object representing a single bug.
*
* @param $id integer bug id
* @return stdClass bug for given id
* @return false if no such bug found
*/
public function bug ($id)
{
$client = new Client($this->_uri . 'jsonrpc.cgi');
try {
$result = $client->__call('Bug.get', array(array('ids' => array($id))));
} catch (\Exception $e) {
Fail::log($e);
return false;
}
// send back a stdClass for the first bug in the results
return (object)($result['bugs'][0]);
}
/**
* Return an array of objects representing search results.
*
* See: http://www.bugzilla.org/docs/4.2/en/html/api/Bugzilla/WebService/Bug.html#search
*
* @param array $params search fields => values
* @return array of stdClass bug objects for given search
* @return boolean false if search failed altogether (I think)
*/
public function search (array $params, $return_count_only = false)
{
$client = new Client($this->_uri . 'jsonrpc.cgi');
try {
$result = ($client->__call('Bug.search', array($params)));
} catch (\Exception $e) {
Fail::log($e);
return false;
}
if ($return_count_only)
return count($result['bugs']);
$bugs = array();
for($i = 0, $c = count($result['bugs']); $i < $c; ++$i) {
$bugs[] = (object)$result['bugs'][$i];
}
return $bugs;
}
/**
* Sort and return an array of objects representing search results.
*
* Usage: Bugzilla::sortBugs($bugs, 'priority', SORT_ASC, 'last_change_time', SORT_DESC);
* ...where $bugs is an array of stdClass objects representing bugs (e.g. the output of Bugzilla->search())
*
* @return array of stdClass bug objects for given search
*/
public static function sortBugs ()
{
// Pull unsorted bug array off the front of the argument list
$args = func_get_args();
$bugs = array_shift($args);
// Trivial case: kick back out if there are no bugs to sort
if (! count($bugs))
return $bugs;
// Build the sort arrays!
//
// We start with an unsorted array ($bugs) and an alternating list of fields and directions (priority, SORT_ASC...)
// For array_multisort we want a single array of arguments that looks like this:
//
// [ [Bug 0 field 0 value, Bug 1 field 0 value, ...], direction 0, [Bug 0 field 1 value, Bug 1 field 1 value, ...], direction 1, ... ]
//
// We do this in place by walking our array of arguments (which is already in the right order)
// and turning each field name string into its corresponding array of field values from the unsorted bug list
foreach ($args as $n => $field) {
if (is_string($field)) {
if (!strlen($field) || !isset($bugs[0]->$field))
throw new Exception ("Invalid sort field: " . $field);
$tmp = array();
foreach ($bugs as $b => $bug)
$tmp[$b] = $bug->$field;
$args[$n] = $tmp;
}
}
// Attach the unsorted bug list by reference onto the end of our arguments array.
// array_multisort sorts arguments in order, so the last argument needs to be the master unserted list.
// It also sorts arguments in place, hence why they must be passed by reference.
$args[] = &$bugs;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
/**
* Search for a substring in a custom field. Returns an array of simple
* bug objects extracted from CSV. (XML can suck it.)
*
* @param string $field to search
* @param string $string to search for
* @return array of stdClass bug objects
*/
public function searchCustomField ($field, $string, $new_only = false)
{
$search_url = 'buglist.cgi?query_format=advanced&f1=cf_'
. urlencode($field)
. '&v1='
. urlencode($string)
. '&o1=regexp&order=Bug&ctype=csv';
if ($new_only) {
$search_url .= '&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED';
}
$csv = file_get_contents($this->_uri . $search_url);
$bugs = array();
$rows = explode("\n", $csv);
$fields = str_getcsv(array_shift($rows));
foreach ($rows as &$row) {
$values = str_getcsv($row);
$bug = array();
foreach ($values as $idx => $value) {
$bug[ $fields[$idx] ] = $value;
}
$bugs[] = (object)$bug; // make a stdClass instance
}
return $bugs;
}
/**
* Return a list of open bugs CC'd to a user.
*
* @param string $user
* @return array of stdClass bug objects
*/
public function searchCC ($user)
{
$search_url = 'buglist.cgi?query_format=advanced&emailcc1=1'
. '&email1=' . urlencode($user)
. '&emailtype1=substring&order=Bug&ctype=csv'
. '&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED';
$csv = file_get_contents($this->_uri . $search_url);
$bugs = array();
$rows = explode("\n", $csv);
$fields = str_getcsv(array_shift($rows));
foreach ($rows as &$row) {
$values = str_getcsv($row);
$bug = array();
foreach ($values as $idx => $value) {
$bug[ $fields[$idx] ] = $value;
}
$bugs[] = (object)$bug; // make a stdClass instance
}
return $bugs;
}
}