3 code to fetch ticket info...
7 public class RooRepo : Object
12 public string id; // not really important that they are numbers..
13 public string project_id;
14 public string description;
15 public string shortname;
20 public class RooOption : Object
23 public string id; // not really important that they are numbers..
25 public string display_name;
27 public RooOption (string id, string name, string display_name)
31 this.display_name = name;
37 static RooTicket _RooTicket;
41 public class RooTicket : Object
53 //const string baseurl = "https://roojs.com/admin.php/Ro/mtrack_ticket";
54 const string roourl = "https://roojs.com/admin.php/Roo";
55 public static RooTicket singleton()
57 if (_RooTicket == null) {
58 _RooTicket = new RooTicket();
59 _RooTicket.tickets = new Gee.ArrayList<RooTicket>();
61 _RooTicket.repos = new Gee.ArrayList<RooRepo>();
62 _RooTicket.loadRepos(); // initalize it..
66 public Gee.ArrayList<RooTicket> tickets; // only available for singletonn.
68 public Gee.ArrayList<RooRepo> repos; // only available for singletonn.
70 public Gee.ArrayList<RooOption> milestones;
71 public Gee.ArrayList<RooOption> priorities;
72 public Gee.ArrayList<RooOption> serverities;
73 public Gee.ArrayList<RooOption> classifications;
74 public Gee.ArrayList<RooOption> developers;
77 public string username = ""; // only available for singletonn.
78 public string password = ""; // only available for singletonn.
81 public string id; // not really important that they are numbers..
82 public string summary;
83 public string description;
84 public string project_id_name;
87 public string summaryToBranchName()
89 // first 5 words of summary..
90 var regex = new Regex ("[^A-Za-z0-9 ]+");
91 var str = regex.replace(this.summary, this.summary.length,0, "");
92 string[] words = Regex.split_simple ("[ \t]+", str);
94 for (var i =0; i< (words.length > 5 ? 5 : words.length); i++) {
95 ret += ret.length > 0 ? "_" : "";
100 public string usernameLocal()
102 // git username is an email addres... - so this reutrns the local part..
103 //?? assumes that all members are under the same domain... normally the case......
104 return RooTicket.singleton().username.split("@")[0];
108 public Gee.ArrayList<RooOption> readJsonArray(Json.Array a)
110 var ret = new Gee.ArrayList<RooOption>();
111 for(var i = 0; i < a.get_length(); i++) {
112 var t = a.get_object_element(i);
113 ret.add(new RooOption(
114 t.get_string_member("id"),
115 t.get_string_member("name"),
116 t.get_string_member("display_name")
123 public RooTicket addTicket(Json.Object t)
125 var add = new RooTicket();
126 add.id = t.get_string_member("id");
127 add.summary = t.get_string_member("summary");
128 add.description = t.get_string_member("description");
129 add.project_id_name = t.get_string_member("project_id_name");
130 this.tickets.add(add);
131 GLib.debug("ADD ticket %s : %s : %s", add.id, add.summary, add.project_id_name);
135 public RooRepo addRepo(Json.Object t)
137 var add = new RooRepo();
138 add.id = t.get_string_member("id");
139 add.shortname = t.get_string_member("shortname");
140 add.description = t.get_string_member("description");
141 add.project_id = t.get_string_member("project_id");
143 GLib.debug("ADD project %s : %s : %s", add.id, add.shortname, add.project_id);
147 public RooProject? getProjectByRepo(GitRepo repo)
149 var rt = RooTicket.singleton();
151 if (rt.repos.size < 1) {
157 foreach(var roo_repo in rt.repos) {
158 if (roo_repo.shortname == repo.name) {
159 pid = roo_repo.project_id;
164 GLib.debug("getProjectByRepo: repo has no project");
167 // get project by id...
168 foreach(var roo_project in RooProjects.projects()) {
169 if (roo_project.id == pid) {
170 GLib.debug("getProjectByRepo: project_id = %s", pid);
174 GLib.debug("getProjectByRepo: can not find project");
180 public static RooTicket fakeTicket()
182 var t = new RooTicket();
186 t.project_id_name = "";
187 RooTicket.singleton().tickets.add(t);
192 public RooTicket? getById(string id)
194 foreach(var t in this.tickets) {
200 return RooTicket.fakeTicket();
203 return this.loadTicket(id);
209 public RooTicket? loadTicket(string id)
212 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
213 table.insert("_id",id);
215 var params = Soup.Form.encode_hash(table);
216 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
217 GLib.debug("request %s", url);
219 var session = new Soup.Session ();
221 var message = new Soup.Message ("GET", url);
222 RooTicket.setAuth(message);
223 session.send_message (message);
226 var data = (string) message.response_body.flatten().data;
227 GLib.debug("got %s", data);
229 var parser = new Json.Parser ();
230 parser.load_from_data (data, -1);
232 var response = parser.get_root().get_object();
233 var status = response.get_boolean_member("success");
236 GLib.error(response.get_string_member("errorMsg"));
239 var rd = response.get_object_member ("data");
241 return this.addTicket(rd);
246 GLib.error(e.message);
251 public void loadTickets(string project_id, Who who, Status status)
253 RooTicket.singleton().tickets = new Gee.ArrayList<RooTicket>();
256 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
258 table.insert("_developer", who.to_string().down().substring(15));
260 table.insert("query[viewtype]", status.to_string().down().substring(18));
262 table.insert("limit","200");
263 table.insert("sort","summary");
264 table.insert("dir","ASC");
266 if (project_id != "") {
267 table.insert("project_id",project_id);
271 var params = Soup.Form.encode_hash(table);
273 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
275 GLib.debug("request %s", url);
277 var session = new Soup.Session ();
279 var message = new Soup.Message ("GET", url);
282 RooTicket.setAuth(message);
284 session.send_message (message);
286 var data = (string) message.response_body.flatten().data;
287 //GLib.debug("got %s", data);
289 var parser = new Json.Parser ();
290 parser.load_from_data (data, -1);
292 var response = parser.get_root().get_object();
293 var success = response.get_boolean_member("success");
296 GLib.error(response.get_string_member("errorMsg"));
299 var rd = response.get_array_member ("data");
301 // got a valid result...
302 var _this = RooTicket.singleton();
303 for(var i = 0; i < rd.get_length(); i++) {
304 _this.addTicket(rd.get_object_element(i));
309 GLib.error(e.message);
316 public void loadRepos()
318 RooTicket.singleton().repos = new Gee.ArrayList<RooRepo>();
321 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
324 table.insert("limit","200");
325 table.insert("sort","shortname");
326 table.insert("dir","ASC");
328 var params = Soup.Form.encode_hash(table);
330 var url = "%s/%s?%s" . printf(roourl, "mtrack_repos", params);
332 GLib.debug("request %s", url);
334 var session = new Soup.Session ();
336 var message = new Soup.Message ("GET", url);
339 RooTicket.setAuth(message);
341 session.send_message (message);
343 var data = (string) message.response_body.flatten().data;
344 //GLib.debug("got %s", data);
346 var parser = new Json.Parser ();
347 parser.load_from_data (data, -1);
349 var response = parser.get_root().get_object();
350 var status = response.get_boolean_member("success");
353 GLib.error(response.get_string_member("errorMsg"));
356 var rd = response.get_array_member ("data");
358 // got a valid result...
359 var _this = RooTicket.singleton();
360 for(var i = 0; i < rd.get_length(); i++) {
361 _this.addRepo(rd.get_object_element(i));
366 GLib.error(e.message);
371 public void loadProjectOptions(string pid)
373 var rt = RooTicket.singleton();
374 rt.milestones = new Gee.ArrayList<RooOption>();
375 rt.priorities = new Gee.ArrayList<RooOption>();
376 rt.serverities = new Gee.ArrayList<RooOption>();
377 rt.classifications = new Gee.ArrayList<RooOption>();
378 rt.developers = new Gee.ArrayList<RooOption>();
386 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
388 table.insert("_options_for",pid);
390 var params = Soup.Form.encode_hash(table);
392 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
394 GLib.debug("request %s", url);
396 var session = new Soup.Session ();
398 var message = new Soup.Message ("GET", url);
401 RooTicket.setAuth(message);
403 session.send_message (message);
405 var data = (string) message.response_body.flatten().data;
406 //GLib.debug("got %s", data);
408 var parser = new Json.Parser ();
409 parser.load_from_data (data, -1);
411 var response = parser.get_root().get_object();
412 var status = response.get_boolean_member("success");
415 GLib.error(response.get_string_member("errorMsg"));
418 var rd = response.get_object_member ("data");
420 rt.milestones = this.readJsonArray( rd.get_array_member("milestone"));
421 rt.priorities = this.readJsonArray( rd.get_array_member("priority"));
422 rt.serverities = this.readJsonArray( rd.get_array_member("severity"));
423 rt.classifications = this.readJsonArray( rd.get_array_member("classification"));
424 rt.developers = this.readJsonArray( rd.get_array_member("developer"));
429 // got a valid result...
433 GLib.error(e.message);
439 public static void setAuth(Soup.Message message)
441 var rs = RooTicket.singleton();
442 if (rs.username.length < 1) {
444 GLib.FileUtils.get_contents(GLib.Environment.get_home_dir() + "/.netrc", out str);
445 var lines = str.split("\n");
446 for(var i=0; i< lines.length; i++) {
447 // assumes one line per entry.. if not we are buggered...
448 GLib.debug("got %s" , lines[i]);
450 var bits = Regex.split_simple ("[ \t]+", lines[i].strip());
451 if (bits.length < 6 || bits[0] != "machine" || bits[1] != "git.roojs.com") {
454 GLib.debug("found password?");
455 // we are gussing....
457 RooTicket.singleton().username = bits[3];
458 RooTicket.singleton().password = bits[5];
463 var authCode = Base64.encode ("%s:%s".printf(rs.username, rs.password).data);
464 message.request_headers.append("Authorization", "Basic %s".printf(authCode));
470 public void close(string commits)
472 if (this.id == "-1") {
475 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
476 table.insert("id",id);
477 table.insert("status_name","resolved");
478 table.insert("reason","fixed by Commits: %s".printf(commits));
479 var params = Soup.Form.encode_hash(table);
481 GLib.debug("request POST %s / %s", roourl, id);
483 var session = new Soup.Session ();
485 var message = new Soup.Message ("POST", roourl + "/mtrack_ticket");
486 RooTicket.setAuth(message);
488 message.set_request ("application/x-www-form-urlencoded", Soup.MemoryUse.STATIC, params.data);
489 session.send_message (message);
492 var data = (string) message.response_body.flatten().data;
493 GLib.debug("got %s", data);
495 var parser = new Json.Parser ();
496 parser.load_from_data (data, -1);
498 var response = parser.get_root().get_object();
499 var status = response.get_boolean_member("success");
502 GLib.error(response.get_string_member("errorMsg"));
510 GLib.error(e.message);
515 public string createTicket(
519 string classification_id,
526 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
528 table.insert("project_id", project_id);
529 table.insert("milestone_id", milestone_id);
530 table.insert("priority_id", priority_id);
531 table.insert("classification_id", classification_id);
532 table.insert("developer_id", developer_id);
533 table.insert("summary", summary);
534 table.insert("description", description);
536 var params = Soup.Form.encode_hash(table);
538 GLib.debug("request POST %s / %s", roourl, id);
540 var session = new Soup.Session ();
542 var message = new Soup.Message ("POST", roourl + "/mtrack_ticket");
543 RooTicket.setAuth(message);
545 message.set_request ("application/x-www-form-urlencoded", Soup.MemoryUse.STATIC, params.data);
546 session.send_message (message);
549 var data = (string) message.response_body.flatten().data;
550 GLib.debug("got %s", data);
552 var parser = new Json.Parser ();
553 parser.load_from_data (data, -1);
555 var response = parser.get_root().get_object();
556 var status = response.get_boolean_member("success");
559 GLib.error(response.get_string_member("errorMsg"));
562 var rd = response.get_object_member ("data");
563 return rd.get_string_member("id");
568 GLib.error(e.message);