#!/usr/bin/lua
local lpeg = require 'lpeg'
local P,C,Cs,Cf,R = lpeg.P, lpeg.C, lpeg.Cs, lpeg.Cf, lpeg.R
local tokens = {
NONHASH = C((1 - P("#"))^1), -- any nonempty string not containing #
NUM = C(R("09")^1), -- nonempty digit string
WORD = C(R("AZ","az","09","__")^1) -- nonempty word
}
local patterns = {
["bgo#%NUM"] = "http://bugzilla.gnome.org/show_bug.cgi?id=%1",
["bpo#%NUM"] = "https://bugs.python.org/issue%1",
["bko#%NUM"] = "http://bugzilla.kernel.org/show_bug.cgi?id=%1",
["bmo#%NUM"] = "http://bugzilla.mozilla.org/show_bug.cgi?id=%1",
["boo#%NUM"] = "http://bugzilla.opensuse.org/show_bug.cgi?id=%1",
["bsc#%NUM"] = "http://bugzilla.suse.com/show_bug.cgi?id=%1",
["gh#%NONHASH#%WORD"] = "https://github.com/%1/issues/%2",
["lp#%NUM"] = "https://launchpad.net/bugs/%1",
["rh#%NUM"] = "http://bugzilla.redhat.com/show_bug.cgi?id=%1",
}
-- turn "foo#%BLAH" into a pattern that matches everything literally except
-- %BLAH
local makepat = Cf(
(
((P("%") * C(R("AZ")^1)) / tokens) -- %BLAH is from tokens
+ (P"%%" / function() return P"%" end) -- %% treat as literal %
+ (C(P(1)) / P) -- anything else is literal
)^0,
function(a,b) return a * b end)
local function make_pattern(str)
return assert(makepat:match(str), "invalid pattern")
end
local bugpat = P(false)
for k,v in pairs(patterns) do
bugpat = bugpat + (make_pattern(k) / v)
end
local pat = Cs((bugpat + P(1))^0)
os.execute("xdg-open " .. pat:match(arg[1]))