]> git.sven.stormbind.net Git - sven/vym.git/blob - bugagent.cpp
Import Upstream version 2.6.11
[sven/vym.git] / bugagent.cpp
1 #include "bugagent.h"\r
2 \r
3 #include "branchitem.h"\r
4 #include "mainwindow.h"\r
5 #include "vymmodel.h"\r
6 \r
7 #include <QHash>\r
8 \r
9 extern Main *mainWindow;\r
10 extern QDir vymBaseDir;\r
11 extern bool debug;\r
12 \r
13 \r
14 BugAgent::BugAgent (BranchItem *bi,const QString &u)\r
15 {\r
16     if (!bi) \r
17     {\r
18         qWarning ("Const BugAgent: bi==NULL");\r
19         delete (this);\r
20         return;\r
21     }\r
22     branchID=bi->getID();\r
23     VymModel *model=bi->getModel();\r
24     modelID=model->getModelID();\r
25 \r
26     //qDebug()<<"Constr. BugAgent for "<<branchID;\r
27 \r
28     url=u;\r
29 \r
30     QStringList args;\r
31 \r
32     if (url.contains("show_bug"))\r
33     {\r
34         missionType=SingleBug;\r
35         QRegExp rx("(\\d+)");\r
36         if (rx.indexIn(url) !=-1)\r
37         {\r
38             bugID=rx.cap(1);\r
39             args<<bugID;\r
40         } else\r
41         {\r
42             qDebug()<<"BugAgent: No bugID found in: "<<url;\r
43             delete (this);\r
44             return;\r
45         }\r
46 \r
47     } else if (u.contains("buglist.cgi"))\r
48     {\r
49         missionType=Query; //FIXME-3 query not supported yet by new bugger\r
50         args<<"--query";\r
51         args<<url;\r
52     } else\r
53     {\r
54         qDebug()<<"Unknown Bugzilla command:\n"<<url;\r
55         delete (this);\r
56         return;\r
57     }\r
58         \r
59 \r
60     bugScript=vymBaseDir.path()+"/scripts/bugger";\r
61 \r
62     p=new VymProcess;\r
63 \r
64     connect (p, SIGNAL (finished(int,QProcess::ExitStatus) ), \r
65         this, SLOT (processFinished(int,QProcess::ExitStatus) ));\r
66 \r
67     p->start (bugScript,args);\r
68     if (!p->waitForStarted())\r
69     {\r
70         qWarning()<<"BugAgent::getBugzillaData couldn't start "<<bugScript;\r
71         return;\r
72     }   \r
73 \r
74     // Visual hint that we are doing something  // FIXME-4 show spinner instead?\r
75     if (missionType==SingleBug)\r
76         model->setHeading ("Updating: "+bi->getHeadingPlain(),bi );//FIXME-4 translation needed?\r
77         \r
78 }\r
79 \r
80 BugAgent::~BugAgent ()\r
81 {\r
82     //qDebug()<<"Destr. BugAgent for "<<branchID;\r
83     delete p;\r
84 }\r
85 \r
86 void BugAgent::processFinished(int exitCode, QProcess::ExitStatus exitStatus)\r
87 {\r
88     if (exitStatus==QProcess::NormalExit)\r
89     {\r
90         result=p->getStdout().split("\n");\r
91         QString err=p->getErrout();\r
92         if (!err.isEmpty())\r
93             qWarning() << "BugAgent Error: "<<err;\r
94         else \r
95             processBugzillaData ();\r
96 \r
97     } else      \r
98         qWarning()<< "BugAgent: Process finished with exitCode="<<exitCode;\r
99     deleteLater();\r
100 }\r
101 \r
102 \r
103 void BugAgent::processBugzillaData()\r
104 {\r
105     // Find model from which we had been started\r
106     VymModel *model=mainWindow->getModel (modelID);\r
107     if (model)\r
108     {\r
109         // and find branch which triggered this mission\r
110         BranchItem *missionBI=(BranchItem*)(model->findID (branchID));      \r
111         if (missionBI)\r
112         {\r
113             // Here we go...\r
114 \r
115             QRegExp re("(\\d*):(\\S*):\"(.*)\"");\r
116             re.setMinimal(false);\r
117             bug_desc.clear();\r
118             bug_prio.clear();\r
119             bug_sev.clear();\r
120             bug_deltats.clear();\r
121             bug_status.clear();\r
122             bug_whiteboard.clear();\r
123 \r
124             QStringList bugs; \r
125             foreach (QString line,result)\r
126             {\r
127                 if (debug) qDebug()<<"BugAgent::procBugData  line="<<line;\r
128                 if (re.indexIn(line) !=-1) \r
129                 {\r
130                     if (re.cap(2)=="short_desc") \r
131                     {\r
132                         bugs.append(re.cap(1));\r
133                         bug_desc[re.cap(1)]=re.cap(3).replace("\\\"","\"");\r
134                     }   \r
135                     else if (re.cap(2)=="priority") \r
136                         bug_prio[re.cap(1)]=re.cap(3).left(2);\r
137                     else if (re.cap(2)=="bug_severity") \r
138                     {\r
139                         if (re.cap(3)=="Critical")\r
140                             bug_sev[re.cap(1)]="S1";\r
141                         else if (re.cap(3)=="Major")\r
142                             bug_sev[re.cap(1)]="S2";\r
143                         else if (re.cap(3)=="Normal")\r
144                             bug_sev[re.cap(1)]="S3";\r
145                         else if (re.cap(3)=="Minor")\r
146                             bug_sev[re.cap(1)]="S4";\r
147                         else if (re.cap(3)=="Enhancement")\r
148                             bug_sev[re.cap(1)]="S5";\r
149                         else \r
150                         {\r
151                             qWarning()<<"BugAgent: Bugzilla returned severity "<<re.cap(3);\r
152                             bug_sev[re.cap(1)]=re.cap(3);\r
153                         }\r
154                     }   \r
155                     else if (re.cap(2)=="delta_ts") \r
156                         bug_deltats[re.cap(1)]=re.cap(3);\r
157                     else if (re.cap(2)=="bug_status") \r
158                         bug_status[re.cap(1)]=re.cap(3);\r
159                     else if (re.cap(2)=="status_whiteboard") \r
160                         bug_whiteboard[re.cap(1)]=re.cap(3);\r
161                 }\r
162             }\r
163             if (bug_desc.count()<=0)\r
164                 qWarning()<<"BugAgent: Couldn't find data";\r
165             else if (missionType==SingleBug)\r
166             {\r
167                 // Only single bug changed\r
168                 QString b=bugs.first();\r
169                 setModelBugzillaData (model, missionBI,b);\r
170             } else\r
171             {\r
172                 // Process results of query\r
173                 BranchItem *newbi;\r
174                 foreach (QString b,bugs)\r
175                 {\r
176                     //qDebug ()<<" -> "<<b<<" "<<bug_desc[b];\r
177                     newbi=model->addNewBranch(missionBI);    \r
178                     newbi->setURL ("https://bugzilla.novell.com/show_bug.cgi?id="+b);\r
179                     if (!newbi)\r
180                         qWarning()<<"BugAgent: Couldn't create new branch?!";\r
181                     else\r
182                         setModelBugzillaData (model, newbi,b);\r
183                 }\r
184             } \r
185         } else\r
186             qWarning ()<<"BugAgent: Found model, but not branch #"<<branchID;\r
187     } else\r
188         qWarning ()<<"BugAgent: Couldn't find model #"<<modelID;\r
189 \r
190 \r
191 }\r
192 \r
193 void BugAgent::setModelBugzillaData (VymModel *model, BranchItem *bi, const QString &bugID)\r
194 {\r
195     QString ps=bug_prio[bugID];\r
196     if (bug_whiteboard[bugID].contains ("PNEW")) ps=ps+"/"+bug_sev[bugID];\r
197     if (bug_status[bugID]=="CLOSED" \r
198         || bug_status[bugID]=="VERIFIED"\r
199         || bug_status[bugID]=="RESOLVED")\r
200     {\r
201     model->setHeadingPlainText ("("+ps+") - " + bugID + " - " + bug_desc[bugID],bi);\r
202         model->colorSubtree (Qt::blue,bi);\r
203     }else   \r
204     model->setHeadingPlainText (ps+ " - " + bugID + " - " + bug_desc[bugID],bi);\r
205 }\r
206 \r