aboutsummaryrefslogtreecommitdiffstats
path: root/osurl
blob: e688de2d1dd412a667de61439240e2a382aee1fb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/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",
	["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]))