#include "bug-agent.h"
#include "branchitem.h"
#include "mainwindow.h"
#include "vymmodel.h"
#include <QHash>
extern Main *mainWindow;
extern QDir vymBaseDir;
extern bool debug;
BugAgent::BugAgent (BranchItem *bi,const QString &u)
{
if (!bi)
{
qWarning ("Const BugAgent: bi==NULL");
delete (this);
return;
}
branchID=bi->getID();
VymModel *model = bi->getModel();
modelID = model->getModelID();
//qDebug()<<"Constr. BugAgent for "<<branchID;
url = u;
QStringList args;
if (url.contains("show_bug"))
{
missionType = SingleBug;
QRegExp rx("(\\d+)");
if (rx.indexIn(url) != -1)
{
bugID = rx.cap(1);
args << bugID;
} else
{
qDebug() << "BugAgent: No bugID found in: " << url;
delete (this);
return;
}
} else if (u.contains("buglist.cgi"))
{
missionType = Query; //FIXME-3 query not supported yet by new bugger
args << "--query";
args << url;
} else
{
qDebug() << "Unknown Bugzilla command:\n"<<url;
delete (this);
return;
}
bugScript = vymBaseDir.path() + "/scripts/bugger";
p = new VymProcess;
connect (p, SIGNAL (finished(int, QProcess::ExitStatus) ),
this, SLOT (processFinished(int, QProcess::ExitStatus) ));
p->start (bugScript, args);
if (!p->waitForStarted())
{
qWarning() << "BugAgent::getBugzillaData couldn't start " << bugScript;
return;
}
// Visual hint that we are doing something // FIXME-4 show spinner instead?
if (missionType == SingleBug)
model->setHeading ("Updating: " + bi->getHeadingPlain(), bi ); //FIXME-4 translation needed?
}
BugAgent::~BugAgent ()
{
//qDebug()<<"Destr. BugAgent for "<<branchID;
delete p;
}
void BugAgent::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
if (exitStatus == QProcess::NormalExit)
{
result=p->getStdout().split("\n");
QString err = p->getErrout();
if (!err.isEmpty())
qWarning() << "BugAgent Error: " << err;
else
processBugzillaData ();
} else
qWarning() << "BugAgent: Process finished with exitCode=" << exitCode;
deleteLater();
}
void BugAgent::processBugzillaData()
{
// Find model from which we had been started
VymModel *model = mainWindow->getModel (modelID);
if (model)
{
// and find branch which triggered this mission
BranchItem *missionBI = (BranchItem*)(model->findID (branchID));
if (missionBI)
{
// Here we go...
QRegExp re("(\\d*):(\\S*):\"(.*)\"");
re.setMinimal(false);
bug_desc.clear();
bug_prio.clear();
bug_sev.clear();
bug_deltats.clear();
bug_status.clear();
bug_whiteboard.clear();
QStringList bugs;
foreach (QString line,result)
{
if (debug) qDebug() << "BugAgent::procBugData line="<<line;
if (re.indexIn(line) != -1)
{
if (re.cap(2) == "short_desc")
{
bugs.append(re.cap(1));
bug_desc[re.cap(1)] = re.cap(3).replace("\\\"","\"");
}
else if (re.cap(2) == "priority")
bug_prio[re.cap(1)] = re.cap(3).left(2);
else if (re.cap(2) == "bug_severity")
{
if (re.cap(3) == "Critical")
bug_sev[re.cap(1)] = "S1";
else if (re.cap(3) == "Major")
bug_sev[re.cap(1)] = "S2";
else if (re.cap(3) == "Normal")
bug_sev[re.cap(1)] = "S3";
else if (re.cap(3) == "Minor")
bug_sev[re.cap(1)] = "S4";
else if (re.cap(3) == "Enhancement")
bug_sev[re.cap(1)] = "S5";
else
{
qWarning() << "BugAgent: Bugzilla returned severity " << re.cap(3);
bug_sev[re.cap(1)] = re.cap(3);
}
}
else if (re.cap(2) == "delta_ts")
bug_deltats[re.cap(1)] = re.cap(3);
else if (re.cap(2) == "bug_status")
bug_status[re.cap(1)] = re.cap(3);
else if (re.cap(2) == "status_whiteboard")
bug_whiteboard[re.cap(1)] = re.cap(3);
}
}
if (bug_desc.count() <= 0 )
qWarning() << "BugAgent: Couldn't find data";
else if (missionType == SingleBug)
{
// Only single bug changed
QString b = bugs.first();
setModelBugzillaData (model, missionBI, b);
} else
{
// Process results of query
BranchItem *newbi;
foreach (QString b,bugs)
{
//qDebug ()<<" -> "<<b<<" "<<bug_desc[b];
newbi = model->addNewBranch(missionBI);
newbi->setURL ("https://bugzilla.novell.com/show_bug.cgi?id="+b);
if (!newbi)
qWarning() << "BugAgent: Couldn't create new branch?!";
else
setModelBugzillaData (model, newbi,b);
}
}
} else
qWarning () << "BugAgent: Found model, but not branch #" << branchID;
} else
qWarning () << "BugAgent: Couldn't find model #" << modelID;
}
void BugAgent::setModelBugzillaData (VymModel *model, BranchItem *bi, const QString &bugID)
{
QString ps = bug_prio[bugID];
if (bug_whiteboard[bugID].contains ("PNEW")) ps = ps + "/" + bug_sev[bugID];
if (bug_status[bugID] == "CLOSED"
|| bug_status[bugID] == "VERIFIED"
|| bug_status[bugID] == "RESOLVED")
{
model->setHeadingPlainText ("(" + ps + ") - " + bugID + " - " + bug_desc[bugID], bi);
model->colorSubtree (Qt::blue, bi);
} else
model->setHeadingPlainText (ps + " - " + bugID + " - " + bug_desc[bugID], bi);
}