plugins/trac.lua

Mon, 08 Nov 2010 23:34:15 +0100

author
Kim Alvefur <zash@zash.se>
date
Mon, 08 Nov 2010 23:34:15 +0100
changeset 39
b80a9b1d73f1
child 43
dd99a0dde016
permissions
-rw-r--r--

plugins.trac: New plugin to fetch ticket info from trac

39
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 --local bugs = {};
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local s_match = string.match;
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local t_insert = table.insert;
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local to_json = require "json".encode;
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 function riddim.plugins.trac(bot)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local trac = bot.config.trac;
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 if not trac then return end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 --require "net.httpclient_listener";
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 local http = --require("net.http");
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 { request = function(url, iduno, callback)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local data = io.popen("curl -s " .. url):read("*a");
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 return callback(data, 200);
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 end; }
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 bot:hook("commands/ticket", function(command)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 if not command.param then return end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 local bug_id = s_match(command.param, "%d+");
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 if not bug_id then return end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 local format = s_match(command.param, "%w+$");
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 local url = trac .. '/ticket/' .. bug_id;
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 http.request(url .. '?format=csv', nil, function (data, code)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 if code ~= 200 then return end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 if data:sub(1,3) ~= "id," then return end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 local ticket = map_table(parse_csv(data));
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 command:reply(
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 format == "raw" and to_json(ticket) or
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 ticket[format] or
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 ( ticket.component .. " / "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 .. ticket.summary .. ": "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 .. (ticket.status == "closed"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 and ticket.resolution
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 or ticket.status == "assigned" and ""
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 or ticket.status) .. " "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 .. ticket.priority .. " "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 .. ticket.type ..
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 ( ticket.status == "assigned"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 and " assigned till ".. ticket.owner or "")
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 .. " - <" .. url .. ">"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 ));
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 end);
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 end);
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 function parse_csv(s)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 s = s -- ending comma
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 local t, l = {{}}, 1 -- table to collect fields
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 local fieldstart = 1
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 repeat
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 -- next field is quoted? (start with `"'?)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 if string.find(s, '^"', fieldstart) then
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 local a, c
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 local i = fieldstart
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 repeat
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 -- find closing quote
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 a, i, c = string.find(s, '"("?)', i+1)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 until c ~= '"' -- quote not followed by quote?
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 if not i then error('unmatched "') end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 local f = string.sub(s, fieldstart+1, i-1)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 if not t[l] then t[l] = {} end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 table.insert(t[l], (string.gsub(f, '""', '"')))
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 fieldstart = string.find(s, ',', i) + 1
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 else -- unquoted; find next comma
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 local nexti = math.min(string.find(s, ',', fieldstart) or #s, string.find(s, "\r\n", fieldstart) or #s)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 if not t[l] then t[l] = {} end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 table.insert(t[l], string.sub(s, fieldstart, nexti-1))
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 if string.sub(s, nexti, nexti +1) == "\r\n" then l = l + 1; nexti = nexti +1 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 fieldstart = nexti + 1
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 until fieldstart > string.len(s)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 return t
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 function map_table(t)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 local ret = {};
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 if not t[1] then return nil end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 if not t[2] then return nil end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 for i,v in ipairs(t[1]) do
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 ret[t[1][i]] = t[2][i] or "";
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 return ret
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85

mercurial