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 loadProjects()
318 RooTicket.singleton().projects = new Gee.ArrayList<RooProject>();
321 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
323 table.insert("query[project_filter]","P,N,U");
324 table.insert("limit","200");
325 table.insert("sort","name");
326 table.insert("dir","ASC");
328 var params = Soup.Form.encode_hash(table);
330 var url = "%s/%s?%s" . printf(roourl, "core_project", 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.addProject(rd.get_object_element(i));
366 GLib.error(e.message);
371 public void loadRepos()
373 RooTicket.singleton().repos = new Gee.ArrayList<RooRepo>();
376 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
379 table.insert("limit","200");
380 table.insert("sort","shortname");
381 table.insert("dir","ASC");
383 var params = Soup.Form.encode_hash(table);
385 var url = "%s/%s?%s" . printf(roourl, "mtrack_repos", params);
387 GLib.debug("request %s", url);
389 var session = new Soup.Session ();
391 var message = new Soup.Message ("GET", url);
394 RooTicket.setAuth(message);
396 session.send_message (message);
398 var data = (string) message.response_body.flatten().data;
399 //GLib.debug("got %s", data);
401 var parser = new Json.Parser ();
402 parser.load_from_data (data, -1);
404 var response = parser.get_root().get_object();
405 var status = response.get_boolean_member("success");
408 GLib.error(response.get_string_member("errorMsg"));
411 var rd = response.get_array_member ("data");
413 // got a valid result...
414 var _this = RooTicket.singleton();
415 for(var i = 0; i < rd.get_length(); i++) {
416 _this.addRepo(rd.get_object_element(i));
421 GLib.error(e.message);
426 public void loadProjectOptions(string pid)
428 var rt = RooTicket.singleton();
429 rt.milestones = new Gee.ArrayList<RooOption>();
430 rt.priorities = new Gee.ArrayList<RooOption>();
431 rt.serverities = new Gee.ArrayList<RooOption>();
432 rt.classifications = new Gee.ArrayList<RooOption>();
433 rt.developers = new Gee.ArrayList<RooOption>();
441 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
443 table.insert("_options_for",pid);
445 var params = Soup.Form.encode_hash(table);
447 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
449 GLib.debug("request %s", url);
451 var session = new Soup.Session ();
453 var message = new Soup.Message ("GET", url);
456 RooTicket.setAuth(message);
458 session.send_message (message);
460 var data = (string) message.response_body.flatten().data;
461 //GLib.debug("got %s", data);
463 var parser = new Json.Parser ();
464 parser.load_from_data (data, -1);
466 var response = parser.get_root().get_object();
467 var status = response.get_boolean_member("success");
470 GLib.error(response.get_string_member("errorMsg"));
473 var rd = response.get_object_member ("data");
475 rt.milestones = this.readJsonArray( rd.get_array_member("milestone"));
476 rt.priorities = this.readJsonArray( rd.get_array_member("priority"));
477 rt.serverities = this.readJsonArray( rd.get_array_member("severity"));
478 rt.classifications = this.readJsonArray( rd.get_array_member("classification"));
479 rt.developers = this.readJsonArray( rd.get_array_member("developer"));
484 // got a valid result...
488 GLib.error(e.message);
494 public static void setAuth(Soup.Message message)
496 var rs = RooTicket.singleton();
497 if (rs.username.length < 1) {
499 GLib.FileUtils.get_contents(GLib.Environment.get_home_dir() + "/.netrc", out str);
500 var lines = str.split("\n");
501 for(var i=0; i< lines.length; i++) {
502 // assumes one line per entry.. if not we are buggered...
503 GLib.debug("got %s" , lines[i]);
505 var bits = Regex.split_simple ("[ \t]+", lines[i].strip());
506 if (bits.length < 6 || bits[0] != "machine" || bits[1] != "git.roojs.com") {
509 GLib.debug("found password?");
510 // we are gussing....
512 RooTicket.singleton().username = bits[3];
513 RooTicket.singleton().password = bits[5];
518 var authCode = Base64.encode ("%s:%s".printf(rs.username, rs.password).data);
519 message.request_headers.append("Authorization", "Basic %s".printf(authCode));
525 public void close(string commits)
527 if (this.id == "-1") {
530 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
531 table.insert("id",id);
532 table.insert("status_name","resolved");
533 table.insert("reason","fixed by Commits: %s".printf(commits));
534 var params = Soup.Form.encode_hash(table);
536 GLib.debug("request POST %s / %s", roourl, id);
538 var session = new Soup.Session ();
540 var message = new Soup.Message ("POST", roourl + "/mtrack_ticket");
541 RooTicket.setAuth(message);
543 message.set_request ("application/x-www-form-urlencoded", Soup.MemoryUse.STATIC, params.data);
544 session.send_message (message);
547 var data = (string) message.response_body.flatten().data;
548 GLib.debug("got %s", data);
550 var parser = new Json.Parser ();
551 parser.load_from_data (data, -1);
553 var response = parser.get_root().get_object();
554 var status = response.get_boolean_member("success");
557 GLib.error(response.get_string_member("errorMsg"));
565 GLib.error(e.message);
570 public string createTicket(
574 string classification_id,
581 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
583 table.insert("project_id", project_id);
584 table.insert("milestone_id", milestone_id);
585 table.insert("priority_id", priority_id);
586 table.insert("classification_id", classification_id);
587 table.insert("developer_id", developer_id);
588 table.insert("summary", summary);
589 table.insert("description", description);
591 var params = Soup.Form.encode_hash(table);
593 GLib.debug("request POST %s / %s", roourl, id);
595 var session = new Soup.Session ();
597 var message = new Soup.Message ("POST", roourl + "/mtrack_ticket");
598 RooTicket.setAuth(message);
600 message.set_request ("application/x-www-form-urlencoded", Soup.MemoryUse.STATIC, params.data);
601 session.send_message (message);
604 var data = (string) message.response_body.flatten().data;
605 GLib.debug("got %s", data);
607 var parser = new Json.Parser ();
608 parser.load_from_data (data, -1);
610 var response = parser.get_root().get_object();
611 var status = response.get_boolean_member("success");
614 GLib.error(response.get_string_member("errorMsg"));
617 var rd = response.get_object_member ("data");
618 return rd.get_string_member("id");
623 GLib.error(e.message);