diff options
-rw-r--r-- | gerrit-widget/README.md | 3 | ||||
-rw-r--r-- | jira-widget/jira-mark-gradient-blue.svg | 1 | ||||
-rw-r--r-- | jira-widget/jira.lua | 202 |
3 files changed, 206 insertions, 0 deletions
diff --git a/gerrit-widget/README.md b/gerrit-widget/README.md index 7c9f32d..5682b9b 100644 --- a/gerrit-widget/README.md +++ b/gerrit-widget/README.md @@ -8,6 +8,7 @@ It is possible to customize widget by providing a table with all or some of the | Name | Default | Description | |---|---|---| +| `icon`| `/.config/awesome/awesome-wm-widgets/gerrit-widget/gerrit_icon.svg| Path to the icon| | `host` | Required | Ex https://gerrit.tmnt.com | | `query` | `is:reviewer AND status:open AND NOT is:wip` | Query to retrieve reviews | @@ -18,6 +19,8 @@ It is possible to customize widget by providing a table with all or some of the ## Installation +1. This widget relies on Gerrit [REST API](https://gerrit-review.googlesource.com/Documentation/rest-api.html), so you need to have a permission to access it. You also need to setup [netrc](https://ec.haxx.se/usingcurl-netrc.html), as widget uses curl to communicate with API and you have to be authenticated. + 1. Download json parser for lua from [github.com/rxi/json.lua](https://github.com/rxi/json.lua) and place it under **~/.config/awesome/** (don't forget to star a repo): ```bash diff --git a/jira-widget/jira-mark-gradient-blue.svg b/jira-widget/jira-mark-gradient-blue.svg new file mode 100644 index 0000000..74ea729 --- /dev/null +++ b/jira-widget/jira-mark-gradient-blue.svg @@ -0,0 +1 @@ +<svg id="Logos" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80" height="80" viewBox="0 0 80 80"><defs><style>.cls-1{fill:#2684ff;}.cls-2{fill:url(#New_Gradient_Swatch_1);}.cls-3{fill:url(#New_Gradient_Swatch_1-2);}</style><linearGradient id="New_Gradient_Swatch_1" x1="57.65" y1="21.92" x2="43.31" y2="36.7" gradientUnits="userSpaceOnUse"><stop offset="0.18" stop-color="#0052cc"/><stop offset="1" stop-color="#2684ff"/></linearGradient><linearGradient id="New_Gradient_Swatch_1-2" x1="41.91" y1="38.81" x2="25.34" y2="54.94" xlink:href="#New_Gradient_Swatch_1"/></defs><title>jira-icon-gradient-blue</title><path class="cls-1" d="M72.12,5.07H38.41A15.21,15.21,0,0,0,53.62,20.28h6.21v6A15.21,15.21,0,0,0,75,41.48V8A2.92,2.92,0,0,0,72.12,5.07Z"/><path class="cls-2" d="M55.44,21.86H21.73A15.21,15.21,0,0,0,36.94,37.07h6.21v6A15.22,15.22,0,0,0,58.36,58.28V24.78A2.92,2.92,0,0,0,55.44,21.86Z"/><path class="cls-3" d="M38.75,38.65H5A15.22,15.22,0,0,0,20.26,53.86h6.21v6A15.21,15.21,0,0,0,41.68,75.07V41.58A2.93,2.93,0,0,0,38.75,38.65Z"/></svg>
\ No newline at end of file diff --git a/jira-widget/jira.lua b/jira-widget/jira.lua new file mode 100644 index 0000000..d60aa77 --- /dev/null +++ b/jira-widget/jira.lua @@ -0,0 +1,202 @@ +------------------------------------------------- +-- Jira Widget for Awesome Window Manager +-- Shows the number of currently assigned issues +-- More details could be found here: +-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/jira-widget + +-- @author Pavel Makhov +-- @copyright 2019 Pavel Makhov +------------------------------------------------- + +local awful = require("awful") +local wibox = require("wibox") +local watch = require("awful.widget.watch") +local json = require("json") +local spawn = require("awful.spawn") +local naughty = require("naughty") +local gears = require("gears") +local beautiful = require("beautiful") +local gfs = require("gears.filesystem") +local gs = require("gears.string") + +local HOME_DIR = os.getenv("HOME") + +local GET_ISSUES_CMD = [[bash -c "curl -s -X GET -n %s/rest/api/2/search?%s"]] +local DOWNLOAD_AVATAR_CMD = [[bash -c "curl -n --create-dirs -o %s/.cache/awmw/jira-widget/avatars/%s %s"]] + +local jira_widget = {} + +local function worker(args) + + local args = args or {} + + local icon = args.icon or HOME_DIR .. '/.config/awesome/awesome-wm-widgets/jira-widget/jira-mark-gradient-blue.svg' + local host = args.host or naughty.notify{preset = naughty.config.presets.critical, text = 'Gerrit host is unknown'} + local query = args.query or 'jql=assignee=currentuser()+AND+resolution=Unresolved' + + local current_number_of_reviews + local previous_number_of_reviews = 0 + + local rows = { + { widget = wibox.widget.textbox }, + layout = wibox.layout.fixed.vertical, + } + + local popup = awful.popup{ + visible = true, + ontop = true, + visible = false, + shape = gears.shape.rounded_rect, + border_width = 1, + border_color = beautiful.bg_focus, + maximum_width = 400, + preferred_positions = top, + offset = { y = 5 }, + widget = {} + } + + jira_widget = wibox.widget { + { + { + image = icon, + widget = wibox.widget.imagebox + }, + margins = 4, + layout = wibox.container.margin + }, + { + id = "txt", + widget = wibox.widget.textbox + }, + { + id = "new_rev", + widget = wibox.widget.textbox + }, + layout = wibox.layout.fixed.horizontal, + set_text = function(self, new_value) + self.txt.text = new_value + end, + set_unseen_review = function(self, is_new_review) + self.new_rev.text = is_new_review and '*' or '' + end + } + + local update_widget = function(widget, stdout, stderr, _, _) + local result = json.decode(stdout) + + current_number_of_reviews = rawlen(result.issues) + + --if current_number_of_reviews > previous_number_of_reviews then + -- widget:set_unseen_review(true) + -- naughty.notify{ + -- icon = HOME_DIR ..'/.config/awesome/awesome-wm-widgets/gerrit-widget/gerrit_icon.svg', + -- title = 'New Incoming Review', + -- text = reviews[1].project .. '\n' .. get_name_by_id(reviews[1].owner._account_id) .. reviews[1].subject .. '\n', + -- run = function() spawn.with_shell("google-chrome https://" .. host .. '/' .. reviews[1]._number) end + -- } + ----end + -- + --previous_number_of_reviews = current_number_of_reviews + widget:set_text(current_number_of_reviews) + -- + for i = 0, #rows do rows[i]=nil end + for _, issue in ipairs(result.issues) do + local path_to_avatar = os.getenv("HOME") ..'/.cache/awmw/jira-widget/avatars/' .. issue.fields.assignee.key + + if not gfs.file_readable(path_to_avatar) then + spawn.easy_async(string.format( + DOWNLOAD_AVATAR_CMD, + HOME_DIR, + issue.fields.assignee.key, + issue.fields.assignee.avatarUrls['48x48'])) + end + + local row = wibox.widget { + { + { + { + { + resize = true, + image = path_to_avatar, + forced_width = 40, + forced_height = 40, + widget = wibox.widget.imagebox + }, + margins = 8, + layout = wibox.container.margin + }, + { + { + markup = '<b>' .. issue.key .. '</b>', + align = 'center', + widget = wibox.widget.textbox + }, + { + text = issue.fields.summary, + widget = wibox.widget.textbox + }, + { + text = issue.fields.status.name, + widget = wibox.widget.textbox + }, + layout = wibox.layout.align.vertical + }, + spacing = 8, + layout = wibox.layout.fixed.horizontal + }, + margins = 8, + layout = wibox.container.margin + }, + widget = wibox.container.background + } + + row:connect_signal("button::release", function(_, _, _, button) + spawn.with_shell("google-chrome https://" .. host .. '/' .. issue._number) + end) + + row:connect_signal("mouse::enter", function(c) c:set_bg(beautiful.bg_focus) end) + row:connect_signal("mouse::leave", function(c) c:set_bg(beautiful.bg_normal) end) + + row:buttons( + awful.util.table.join( + awful.button({}, 1, function() + spawn.with_shell("google-chrome " .. host .. '/browse/' .. issue.key) + popup.visible = false + end), + awful.button({}, 3, function() + spawn.with_shell("echo 'git-review -d " .. issue._number .."' | xclip -selection clipboard") + popup.visible = false + end) + ) + ) + + table.insert(rows, row) + end + + popup:setup(rows) + end + + jira_widget:buttons( + awful.util.table.join( + awful.button({}, 1, function() + --jira_widget:set_unseen_review(false) + if popup.visible then + popup.visible = not popup.visible + else + popup:move_next_to(mouse.current_widget_geometry) + end + end) + ) + ) + --naughty.notify{ + -- text = string.format(GET_ISSUES_CMD, host, query:gsub(" ", "+")), + -- run = function() spawn.with_shell("echo '" .. string.format(GET_ISSUES_CMD, host, query:gsub(" ", "+")) .. "' | xclip -selection clipboard") end + --} + watch(string.format(GET_ISSUES_CMD, host, query:gsub(' ', '+') + :gsub('%(', '\\(') + :gsub('%)', '\\)')), + 10, update_widget, jira_widget) + return jira_widget +end + +return setmetatable(jira_widget, { __call = function(_, ...) return worker(...) end }) |