#!/usr/bin/lua
-- Expand abbreviations from
-- https://en.opensuse.org/openSUSE:Packaging_Patches_guidelines#Current_set_of_abbreviations
local lpeg = require 'lpeg'
local P,C,Cs,Cf,R,S = lpeg.P, lpeg.C, lpeg.Cs, lpeg.Cf, lpeg.R, lpeg.S
local tokens = {
NONHASH = C((1 - S("#!@"))^1), -- any nonempty string not containing #
AT = S("@"), -- @ separator
DOL = S("!"), -- ! separator
SEP = S("#-"), -- separators, can be # or -
NUM = C(R("09")^1), -- nonempty digit string
WORD = C(R("AZ","az","09","__")^1), -- nonempty word
JIRID = C(R("AZ","az","09","--")^1) -- nonempty word
}
local patterns = {
["bgo%SEP%NUM"] = "https://bugzilla.gnome.org/show_bug.cgi?id=%1",
["bpo%SEP%NUM"] = "https://bugs.python.org/issue%1",
["bko%SEP%NUM"] = "https://bugzilla.kernel.org/show_bug.cgi?id=%1",
["bmo%SEP%NUM"] = "https://bugzilla.mozilla.org/show_bug.cgi?id=%1",
["boo%SEP%NUM"] = "https://bugzilla.opensuse.org/show_bug.cgi?id=%1",
["bnc%SEP%NUM"] = "https://bugzilla.novell.com/show_bug.cgi?id=%1",
["bsc%SEP%NUM"] = "https://bugzilla.suse.com/show_bug.cgi?id=%1",
["bds%SEP%NUM"] = "https://build.suse.de/request/show/%1",
["isr%SEP%NUM"] = "https://build.suse.de/request/show/%1",
["ssr%SEP%NUM"] = "https://build.suse.de/request/show/%1",
["bdo%SEP%NUM"] = "https://build.opensuse.org/request/show/%1",
["sr%SEP%NUM"] = "https://build.opensuse.org/request/show/%1",
["jsc%SEP%JIRID"] = "https://jira.suse.com/browse/%1",
["gh%SEP%NONHASH%SEP%WORD"] = "https://github.com/%1/issues/%2",
["gh%SEP%NONHASH%AT%WORD"] = "https://github.com/%1/commit/%2",
["gh%SEP%NONHASH%DOL%WORD"] = "https://github.com/%1/discussions/%2",
["gl%SEP%NONHASH%SEP%WORD"] = "https://gitlab.com/%1/issues/%2",
["gl%SEP%NONHASH%DOL%WORD"] = "https://gitlab.com/%1/-/merge_requests/%2",
["bt%SEP%NONHASH%SEP%WORD"] = "https://bitbucket.org/%1/issues/%2",
["sh%SEP%NUM"] = "http://sourceforge.net/support/tracker.php?aid=%1",
["shb%SEP%NONHASH%SEP%NUM"] = "https://sourceforge.net/p/%1/bugs/%2/",
["shp%SEP%NONHASH%SEP%NUM"] = "https://sourceforge.net/p/%1/patches/%2/",
["sht%SEP%NONHASH%SEP%NUM"] = "https://sourceforge.net/p/%1/tickets/%2/",
["lp%SEP%NUM"] = "https://launchpad.net/bugs/%1",
["rh%SEP%NUM"] = "https://bugzilla.redhat.com/show_bug.cgi?id=%1",
["rhbz%SEP%NUM"] = "https://bugzilla.redhat.com/show_bug.cgi?id=%1",
["tdf%SEP%NUM"] = "https://bugs.documentfoundation.org/show_bug.cgi?id=%1",
["pep%SEP%NUM"] = "https://www.python.org/dev/peps/pep-%1",
["ffn%SEP%NUM"] = "https://www.fanfiction.net/s/%1",
["ao3%SEP%NUM"] = "https://archiveofourown.org/works/%1",
["boost%SEP%NUM"] = "https://svn.boost.org/trac/boost/%1",
["RT%SEP%NUM"] = "https://rt.cpan.org/Public/%1",
["deb%SEP%NUM"] = "https://bugs.debian.org/%1",
["fdo%SEP%NUM"] = "https://bugs.freedesktop.org/%1",
["glfo%SEP%NONHASH%SEP%NUM"] = "https://gitlab.freedesktop.org/%1/issues/%2",
["gcc%SEP%NUM"] = "https://gcc.gnu.org/bugzilla/%1",
["glgo%SEP%NONHASH%SEP%NUM"] = "https://gitlab.gnome.org/%1/issues/%2",
["kde%SEP%NUM"] = "https://bugs.kde.org/%1",
["obs%SEP%NUM"] = "https://api.github.com/repos/openSUSE/open-build-service/issues/%1",
["build%SEP%NUM"] = "https://api.github.com/repos/openSUSE/obs-build/issues/%1",
["osc%SEP%NUM"] = "https://api.github.com/repos/openSUSE/osc/issues/%1",
["poo%SEP%NUM"] = "https://progress.opensuse.org/issues/%1",
["lf%SEP%NUM"] = "https://developerbugs.linux-foundation.org/%1",
["coo%SEP%NONHASH%SEP%NUM"] = "https://code.opensuse.org/%1/issue/%2",
}
-- 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)
local in_url = arg[1]
-- print("in_url = " .. in_url)
local out_url = pat:match(in_url:lower())
-- print("out_url = " .. out_url)
if out_url == in_url:lower() then
out_url = in_url
end
-- print("out_url = " .. out_url)
local open_util = "xdg-open "
if os.execute('type flatpak-xdg-open >/dev/null 2>/dev/null') then
open_util = "flatpak-xdg-open "
end
os.execute(open_util .. out_url)