summaryrefslogtreecommitdiff
path: root/gerrit-widget/gerrit.lua
blob: e2d0e02e86d82ac6f82922c398f8dc06c84f6d60 (plain)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
-------------------------------------------------
-- Gerrit Widget for Awesome Window Manager
-- Shows the number of currently assigned reviews
-- More details could be found here:
-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/gerrit-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 path_to_icons = "/usr/share/icons/Arc/status/symbolic/"

local GET_CHANGES_CMD = [[bash -c "curl -s -X GET -n https://%s/a/changes/\\?q\\=%s | tail -n +2"]]
local GET_USERNAME_CMD = [[bash -c "curl -s -X GET -n https://%s/accounts/%s/name | tail -n +2 | sed 's/\"//g'"]]

local gerrit_widget = {}
local name_dict = {}

local function worker(args)

    local args = args or {}

    local host = args.host or naughty.notify{preset = naughty.config.presets.critical, text = 'Gerrit host is unknown'}
    local query = args.query or 'is:reviewer AND status:open AND NOT is:wip'

    local reviews
    local current_number_of_reviews
    local previous_number_of_reviews = 0

    local rows = {
        {
            text = 'asdR',
            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,
        preferred_positions = top,
        widget = {}
    }

    gerrit_widget = wibox.widget {
        --{
            id = txt,
            widget = wibox.widget.textbox
        --},
        --{
        --    image = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/gerrit-widget/Gerrit_icon.svg',
        --    widget = wibox.widget.imagebox
        --},
        --layout = wibox.layout.fixed.horizontal,
    }

    local function get_name_by_id(id)
        res = name_dict[id]
        if res == nil then
            res = ''
            spawn.easy_async(string.format(GET_USERNAME_CMD, host, id), function(stdout, stderr, reason, exit_code)
                name_dict[tonumber(id)] = string.gsub(stdout, "\n", "")
            end)
        end
        return res
    end

    local update_graphic = function(widget, stdout, _, _, _)
        reviews = json.decode(stdout)

        current_number_of_reviews = rawlen(reviews)

        if current_number_of_reviews > previous_number_of_reviews then
            naughty.notify{
                icon = os.getenv("HOME") ..'/.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.text = current_number_of_reviews

        count = #rows
        for i=0, count do rows[i]=nil end
        for _, review in ipairs(reviews) do
            local row = wibox.widget {
                {
                    {
                        {
                            text = review.project .. ' / ' .. get_name_by_id(review.owner._account_id),
                            widget = wibox.widget.textbox
                        },
                        {
                            text = review.subject,
                            widget = wibox.widget.textbox
                        },
                        layout = wibox.layout.align.vertical
                    },
                    margins = 5,
                    layout = wibox.container.margin
                },
                widget = wibox.container.background
            }

            row:connect_signal("button::release", function(_, _, _, button)
                spawn.with_shell("google-chrome https://" .. host .. '/' .. review._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)

            table.insert(rows, row)
        end

        popup:setup(rows)
    end

    gerrit_widget:buttons(
        awful.util.table.join(
            awful.button({}, 1, function()
                --awful.placement.top_right(w, { margins = {top = 25, right = 10}, parent = awful.screen.focused() })
                --w.visible = not w.visible
                awful.placement.top_right(popup, { margins = { top = 25, right = 10}, parent = awful.screen.focused() })
                popup.visible = not popup.visible
                --ww:move_next_to(gerrit_widget)
                --awful.placement.next_to(ww, gerrit_widget)
            end)
        )
    )

    watch(string.format(GET_CHANGES_CMD, host, query:gsub(" ", "+")), 5, update_graphic, gerrit_widget)
    return gerrit_widget
end

return setmetatable(gerrit_widget, { __call = function(_, ...) return worker(...) end })