plugins/trac.lua

Tue, 09 Nov 2010 17:57:44 +0100

author
Kim Alvefur <zash@zash.se>
date
Tue, 09 Nov 2010 17:57:44 +0100
changeset 43
dd99a0dde016
parent 39
b80a9b1d73f1
child 115
6498ca5ed831
permissions
-rw-r--r--

plugins.trac: Remove curl hack

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
43
dd99a0dde016 plugins.trac: Remove curl hack
Kim Alvefur <zash@zash.se>
parents: 39
diff changeset
10 require "net.httpclient_listener";
dd99a0dde016 plugins.trac: Remove curl hack
Kim Alvefur <zash@zash.se>
parents: 39
diff changeset
11 local http = require("net.http");
39
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 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
14 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
15 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
16 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
17 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
18 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
19 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
20 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
21 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
22 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
23 command:reply(
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 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
25 ticket[format] or
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 ( ticket.component .. " / "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 .. ticket.summary .. ": "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 .. (ticket.status == "closed"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 and ticket.resolution
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 or ticket.status == "assigned" and ""
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 or ticket.status) .. " "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 .. ticket.priority .. " "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 .. ticket.type ..
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 ( ticket.status == "assigned"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 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
36 .. " - <" .. url .. ">"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 ));
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 end);
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 end);
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 end
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 function parse_csv(s)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 s = s -- ending comma
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 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
45 local fieldstart = 1
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 repeat
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 -- 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
48 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
49 local a, c
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 local i = fieldstart
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 repeat
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 -- find closing quote
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 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
54 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
55 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
56 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
57 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
58 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
59 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
60 else -- unquoted; find next comma
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 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
62 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
63 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
64 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
65 fieldstart = nexti + 1
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 until fieldstart > string.len(s)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 return t
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 function map_table(t)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 local ret = {};
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 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
74 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
75
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 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
77 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
78 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 return ret
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81

mercurial