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..
24 public string display_name;
26 public RooOption (string id, string name)
29 this.display_name = name;
35 public class RooProject : Object
37 public string id; // not really important that they are numbers..
45 static RooTicket _RooTicket;
49 public class RooTicket : Object
60 //const string baseurl = "https://roojs.com/admin.php/Ro/mtrack_ticket";
61 const string roourl = "https://roojs.com/admin.php/Roo";
62 public static RooTicket singleton()
64 if (_RooTicket == null) {
65 _RooTicket = new RooTicket();
66 _RooTicket.tickets = new Gee.ArrayList<RooTicket>();
67 _RooTicket.projects = new Gee.ArrayList<RooProject>();
68 _RooTicket.repos = new Gee.ArrayList<RooRepo>();
69 _RooTicket.loadRepos(); // initalize it..
73 public Gee.ArrayList<RooTicket> tickets; // only available for singletonn.
74 public Gee.ArrayList<RooProject> projects; // only available for singletonn.
75 public Gee.ArrayList<RooRepo> repos; // only available for singletonn.
77 public Gee.ArrayList<RooOption> milestones;
78 public Gee.ArrayList<RooOption> priorities;
79 public Gee.ArrayList<RooOption> serverities;
80 public Gee.ArrayList<RooOption> classifications;
81 public Gee.ArrayList<RooOption> developers;
84 public string username = ""; // only available for singletonn.
85 public string password = ""; // only available for singletonn.
88 public string id; // not really important that they are numbers..
89 public string summary;
90 public string description;
91 public string project_id_name;
94 public string summaryToBranchName()
96 // first 5 words of summary..
97 var regex = new Regex ("[^A-Za-z0-9 ]+");
98 var str = regex.replace(this.summary, this.summary.length,0, "");
99 string[] words = Regex.split_simple ("[ \t]+", str);
101 for (var i =0; i< (words.length > 5 ? 5 : words.length); i++) {
102 ret += ret.length > 0 ? "_" : "";
107 public string usernameLocal()
109 // git username is an email addres... - so this reutrns the local part..
110 //?? assumes that all members are under the same domain... normally the case......
111 return RooTicket.singleton().username.split("@")[0];
115 public Gee.ArrayList<RooOption> readJsonArray(Json.Array a)
117 var ret = new Gee.ArrayList<RooOption>();
118 for(var i = 0; i < a.get_length(); i++) {
119 var t = a.get_object_element(i);
120 ret.add(new RooOption(
121 t.get_string_member("id"),
122 t.get_string_member("display_name")
129 public RooTicket addTicket(Json.Object t)
131 var add = new RooTicket();
132 add.id = t.get_string_member("id");
133 add.summary = t.get_string_member("summary");
134 add.description = t.get_string_member("description");
135 add.project_id_name = t.get_string_member("project_id_name");
136 this.tickets.add(add);
137 GLib.debug("ADD ticket %s : %s : %s", add.id, add.summary, add.project_id_name);
140 public RooProject addProject(Json.Object t)
142 var add = new RooProject();
143 add.id = t.get_string_member("id");
144 add.name = t.get_string_member("name");
145 add.type = t.get_string_member("type");
146 add.code = t.get_string_member("code");
147 this.projects.add(add);
148 GLib.debug("ADD project %s : %s : %s", add.id, add.code, add.name);
152 public RooRepo addRepo(Json.Object t)
154 var add = new RooRepo();
155 add.id = t.get_string_member("id");
156 add.shortname = t.get_string_member("shortname");
157 add.description = t.get_string_member("description");
158 add.project_id = t.get_string_member("project_id");
160 GLib.debug("ADD project %s : %s : %s", add.id, add.shortname, add.project_id);
164 public RooProject? getProjectByRepo(GitRepo repo)
166 var rt = RooTicket.singleton();
168 if (rt.repos.size < 1) {
171 if (rt.projects.size < 1) {
176 foreach(var roo_repo in rt.repos) {
177 if (roo_repo.shortname == repo.name) {
178 pid = roo_repo.project_id;
183 GLib.debug("getProjectByRepo: repo has no project");
186 // get project by id...
187 foreach(var roo_project in rt.projects) {
188 if (roo_project.id == pid) {
189 GLib.debug("getProjectByRepo: project_id = %s", pid);
193 GLib.debug("getProjectByRepo: can not find project");
199 public static RooTicket fakeTicket()
201 var t = new RooTicket();
205 t.project_id_name = "";
206 RooTicket.singleton().tickets.add(t);
211 public RooTicket? getById(string id)
213 foreach(var t in this.tickets) {
219 return RooTicket.fakeTicket();
222 return this.loadTicket(id);
228 public RooTicket? loadTicket(string id)
231 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
232 table.insert("_id",id);
234 var params = Soup.Form.encode_hash(table);
235 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
236 GLib.debug("request %s", url);
238 var session = new Soup.Session ();
240 var message = new Soup.Message ("GET", url);
241 RooTicket.setAuth(message);
242 session.send_message (message);
245 var data = (string) message.response_body.flatten().data;
246 GLib.debug("got %s", data);
248 var parser = new Json.Parser ();
249 parser.load_from_data (data, -1);
251 var response = parser.get_root().get_object();
252 var status = response.get_boolean_member("success");
255 GLib.error(response.get_string_member("errorMsg"));
258 var rd = response.get_object_member ("data");
260 return this.addTicket(rd);
265 GLib.error(e.message);
270 public void loadTickets(string project_id, NotMe not_me, Closed closed)
272 RooTicket.singleton().tickets = new Gee.ArrayList<RooTicket>();
275 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
276 if (not_me == NotMe.FALSE) {
277 table.insert("query[viewtype]","me");
281 if (closed == Closed.TRUE) {
282 table.insert("query[viewtype]","me");
287 table.insert("limit","999");
288 table.insert("sort","summary");
289 table.insert("dir","ASC");
291 if (project_id != "") {
292 table.insert("project_id",project_id);
296 var params = Soup.Form.encode_hash(table);
298 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
300 GLib.debug("request %s", url);
302 var session = new Soup.Session ();
304 var message = new Soup.Message ("GET", url);
307 RooTicket.setAuth(message);
309 session.send_message (message);
311 var data = (string) message.response_body.flatten().data;
312 //GLib.debug("got %s", data);
314 var parser = new Json.Parser ();
315 parser.load_from_data (data, -1);
317 var response = parser.get_root().get_object();
318 var status = response.get_boolean_member("success");
321 GLib.error(response.get_string_member("errorMsg"));
324 var rd = response.get_array_member ("data");
326 // got a valid result...
327 var _this = RooTicket.singleton();
328 for(var i = 0; i < rd.get_length(); i++) {
329 _this.addTicket(rd.get_object_element(i));
334 GLib.error(e.message);
341 public void loadProjects()
343 RooTicket.singleton().projects = new Gee.ArrayList<RooProject>();
346 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
348 table.insert("query[project_filter]","P,N,U");
349 table.insert("limit","999");
350 table.insert("sort","name");
351 table.insert("dir","ASC");
353 var params = Soup.Form.encode_hash(table);
355 var url = "%s/%s?%s" . printf(roourl, "core_project", params);
357 GLib.debug("request %s", url);
359 var session = new Soup.Session ();
361 var message = new Soup.Message ("GET", url);
364 RooTicket.setAuth(message);
366 session.send_message (message);
368 var data = (string) message.response_body.flatten().data;
369 //GLib.debug("got %s", data);
371 var parser = new Json.Parser ();
372 parser.load_from_data (data, -1);
374 var response = parser.get_root().get_object();
375 var status = response.get_boolean_member("success");
378 GLib.error(response.get_string_member("errorMsg"));
381 var rd = response.get_array_member ("data");
383 // got a valid result...
384 var _this = RooTicket.singleton();
385 for(var i = 0; i < rd.get_length(); i++) {
386 _this.addProject(rd.get_object_element(i));
391 GLib.error(e.message);
396 public void loadRepos()
398 RooTicket.singleton().repos = new Gee.ArrayList<RooRepo>();
401 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
404 table.insert("limit","999");
405 table.insert("sort","shortname");
406 table.insert("dir","ASC");
408 var params = Soup.Form.encode_hash(table);
410 var url = "%s/%s?%s" . printf(roourl, "mtrack_repos", params);
412 GLib.debug("request %s", url);
414 var session = new Soup.Session ();
416 var message = new Soup.Message ("GET", url);
419 RooTicket.setAuth(message);
421 session.send_message (message);
423 var data = (string) message.response_body.flatten().data;
424 //GLib.debug("got %s", data);
426 var parser = new Json.Parser ();
427 parser.load_from_data (data, -1);
429 var response = parser.get_root().get_object();
430 var status = response.get_boolean_member("success");
433 GLib.error(response.get_string_member("errorMsg"));
436 var rd = response.get_array_member ("data");
438 // got a valid result...
439 var _this = RooTicket.singleton();
440 for(var i = 0; i < rd.get_length(); i++) {
441 _this.addRepo(rd.get_object_element(i));
446 GLib.error(e.message);
451 public void loadProjectOptions(string pid)
454 var rt = RooTicket.singleton();
456 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
458 table.insert("_options_for",pid);
460 var params = Soup.Form.encode_hash(table);
462 var url = "%s/%s?%s" . printf(roourl, "mtrack_ticket", params);
464 GLib.debug("request %s", url);
466 var session = new Soup.Session ();
468 var message = new Soup.Message ("GET", url);
471 RooTicket.setAuth(message);
473 session.send_message (message);
475 var data = (string) message.response_body.flatten().data;
476 //GLib.debug("got %s", data);
478 var parser = new Json.Parser ();
479 parser.load_from_data (data, -1);
481 var response = parser.get_root().get_object();
482 var status = response.get_boolean_member("success");
485 GLib.error(response.get_string_member("errorMsg"));
488 var rd = response.get_object_member ("data");
490 rt.milestones = this.readJsonArray( rd.get_array_member("milestone"));
491 rt.priorities = this.readJsonArray( rd.get_array_member("priority"));
492 rt.serverities = this.readJsonArray( rd.get_array_member("severity"));
493 rt.classifications = this.readJsonArray( rd.get_array_member("classification"));
494 rt.developers = this.readJsonArray( rd.get_array_member("developer"));
499 // got a valid result...
500 var _this = RooTicket.singleton();
501 for(var i = 0; i < rd.get_length(); i++) {
502 _this.addRepo(rd.get_object_element(i));
507 GLib.error(e.message);
513 public static void setAuth(Soup.Message message)
515 var rs = RooTicket.singleton();
516 if (rs.username.length < 1) {
518 GLib.FileUtils.get_contents(GLib.Environment.get_home_dir() + "/.netrc", out str);
519 var lines = str.split("\n");
520 for(var i=0; i< lines.length; i++) {
521 // assumes one line per entry.. if not we are buggered...
522 GLib.debug("got %s" , lines[i]);
524 var bits = Regex.split_simple ("[ \t]+", lines[i].strip());
525 if (bits.length < 6 || bits[0] != "machine" || bits[1] != "git.roojs.com") {
528 GLib.debug("found password?");
529 // we are gussing....
531 RooTicket.singleton().username = bits[3];
532 RooTicket.singleton().password = bits[5];
537 var authCode = Base64.encode ("%s:%s".printf(rs.username, rs.password).data);
538 message.request_headers.append("Authorization", "Basic %s".printf(authCode));
544 public void close(string commits)
546 if (this.id == "-1") {
549 var table = new GLib.HashTable<string, string>(str_hash, str_equal);
550 table.insert("id",id);
551 table.insert("status_name","resolved");
552 table.insert("reason","fixed by Commits: %s".printf(commits));
553 var params = Soup.Form.encode_hash(table);
555 GLib.debug("request POST %s / %s", roourl, id);
557 var session = new Soup.Session ();
559 var message = new Soup.Message ("POST", roourl + "/mtrack_ticket");
560 RooTicket.setAuth(message);
562 message.set_request ("application/x-www-form-urlencoded", Soup.MemoryUse.STATIC, params.data);
563 session.send_message (message);
566 var data = (string) message.response_body.flatten().data;
567 GLib.debug("got %s", data);
569 var parser = new Json.Parser ();
570 parser.load_from_data (data, -1);
572 var response = parser.get_root().get_object();
573 var status = response.get_boolean_member("success");
576 GLib.error(response.get_string_member("errorMsg"));
584 GLib.error(e.message);