Conflicts:
	contrib/README
	widgets/uptime.lua
This commit is contained in:
Jörg Thalheim 2012-09-04 10:10:11 +02:00
commit 0156fd36f9
6 changed files with 227 additions and 10 deletions

18
CHANGES
View File

@ -2,6 +2,24 @@
Full changelog is available online:
http://git.sysphere.org/vicious/log/?showmsg=1
---------------------------------------------------
da37c09 mdir: add support for maildir whitespaces
eba6eb0 README: prefer vicious in global space
c28bac5 uptime: metatable bugfix after lua52 port fixed by Jorg Thalheim
3b161ff contrib: document how to enable contributed widgets
e1c7c47 os: change os.getenv init to allow standalone usage of os widget
1a7b430 contrib: initialization bugfix after lua52 port
4caf95b README: update initialization instructions
80d523a bat: metatable bugfix after lua52 port
e929bea widgets: cleanup behind the last commit 363c03e
363c03e Fixed io.lines() bug
8e35a98 Ported vicious.contrib to lua 5.2
41cc2c0 Ported vicious.widgets module to lua 5.2
b6b5290 Ported vicious module to lua 5.2
0741531 cpufreq: skip redudant freq variable check
97e54d6 cpufreq: rework new exception handlers
30db4be cpufreq: handle not existing frequency/governer
13cec6d pkg: update 'Arch S' substitution lines
2d8d7d7 Next release, tag 2.0.4
f972955 README: update thermal documentation
5605030 thermal: change coretemp default, allow file as widget argument
7a3699c division by zero, if battery is full charged

2
README
View File

@ -35,7 +35,7 @@ your memory.
Then add the following to the top of your rc.lua:
local vicious = require("vicious")
vicious = require("vicious")
Once you create a widget (a textbox, graph or a progressbar) call
vicious.register() to register it with Vicious:

View File

@ -13,7 +13,7 @@ To use contrib widgets uncomment the line that loads them in
init.lua. Or you can load them in your rc.lua after you require
Vicious:
local vicious = require("vicious")
vicious = require("vicious")
vicious.contrib = require("vicious.contrib")
@ -99,6 +99,12 @@ vicious.contrib.wpa
- takes the interface as an argument, i.e "wlan0" or "wlan1"
- returns a table with string keys: {ssid}, {qual}, {ip}, {bssid}
vicious.contrib.buildbot
- provides last build status for configured buildbot builders (http://trac.buildbot.net/)
- returns build status in the format: [<builderName>.<currentBuildNumber>.<lastSuccessfulBuildNumber>]
- if <currentBuildNumber> is the same as <lastSuccessfulBuildNumber> only one number is displayed
- <buildNumber> colors: red - failed, green - successful, yellow - in progress
- it depends on lua json parser (e.g. liblua5.1-json on Ubuntu 12.04)
Usage examples
--------------
@ -109,3 +115,11 @@ Pulse Audio widget
awful.button({ }, 4, function () vicious.contrib.pulse.add(5,"alsa_output.pci-0000_00_1b.0.analog-stereo") end),
awful.button({ }, 5, function () vicious.contrib.pulse.add(-5,"alsa_output.pci-0000_00_1b.0.analog-stereo") end)
))
Buildbot widget
local buildbotwidget = widget({ type = "textbox" })
local buildbotwidget_warg = {
{builder="coverage", url="http://buildbot.buildbot.net"},
{builder="tarball-slave", url="http://buildbot.buildbot.net"}
}
vicious.register(buildbotwidget, vicious.contrib.buildbot, "$1,", 3600, buildbotwidget_warg)

186
contrib/buildbot.lua Normal file
View File

@ -0,0 +1,186 @@
---------------------------------------------------
-- Licensed under the GNU General Public License v2
-- * (c) 2012, Andrzje Bieniek <andyhelp@gmail.com>
---------------------------------------------------
-- {{{ Grab environment
local setmetatable = setmetatable
local pcall = pcall
local json_status, json = pcall(require, "json")
local io = { popen = io.popen }
local pairs = pairs
local assert = assert
-- }}}
local bb = {} --list of all buildbot builders
local bs = {OK=1, FAILED=2, RUNNING=3}
local bc = {"green", "red", "yellow"}
module("vicious.contrib.buildbot")
BB = {}
BB.__index = BB
function BB.create(url, builder)
local b = {}
setmetatable(b,BB)
b.url = url -- buildbot url
b.builder = builder -- builder name
b.lastChecked = 0 -- last checked build number
b.lastSuccessful = 0 -- last successful build number
b.lastResult = nil -- last json parsed result
b.lastError = nil -- last error string or nil if no error
return b
end
function BB:_queryBuildbot(build_number)
local f = io.popen("curl --connect-timeout 1 "..self.url.."/json/builders/"..self.builder.."/builds/"..build_number)
local jsbuilder = f:read("*all")
f:close()
if #jsbuilder == 0 then
return false, "can't read from url"
end
local result_status, result = pcall(json.decode, jsbuilder, false)
if not result_status then
return false, "can't parse json data"
end
return true, result
end
function BB:_getBuildStatus(result)
if #result['text'] > 0 then
local text = result['text']
if text[1] == "build" and text[2] == "successful" and #text == 2 then
--successful
return bs.OK
else
--failed
return bs.FAILED
end
else
--in progress
return bs.RUNNING
end
end
-- Function queries buildbot to refresh builds status.
-- * if build is successful or failed it will not be queried again, number is stored in lasteChecked
-- * up to 10 last builds will be checked to find last successful build
function BB:refresh()
local last_pass_fail = 0
local nr = -1
local last_result
local iter_counter = 0
self.lastError = nil
self.lastResult = nil
--- there is a gap to fill in, iterate all not checked builds starting from latest
while nr > self.lastChecked or nr == -1 do
local r_status, r = self:_queryBuildbot(nr)
local s
if not r_status then
self.lastError = r
return
end
s = self:_getBuildStatus(r)
if not last_result then
last_result = r
end
nr = r['number']
assert(nr > 0)
if last_pass_fail == 0 and (s == bs.OK or s == bs.FAILED) then
last_pass_fail = nr
end
if s == bs.OK then --successful
self.lastSuccessful = nr
break;
end
nr = nr - 1
iter_counter = iter_counter + 1
if iter_counter > 10 then --check max last 10 builds when searching for successful build
break;
end
end
if last_pass_fail ~= 0 then
self.lastChecked = last_pass_fail
end
if last_result then
self.lastResult = last_result
end
end
function BB:getLastSuccessful()
return self.lastSuccessful
end
function BB:getCurrent()
return self.lastResult['number']
end
function BB:getCurrentStatus()
return self:_getBuildStatus(self.lastResult)
end
function BB:getBuilder()
return self.builder
end
function BB:getError()
return self.lastError
end
local function getBuilderStatus(b)
local s = "[" .. b:getBuilder()
--check if json library was loaded correctly
if not json_status then
return s .. ".<span color=\"orange\">can't find libluaX.X-json</span>]"
end
local err = b:getError()
if err then
return s .. ".<span color=\"orange\">" .. err .. "</span>]"
end
if b:getLastSuccessful() ~= 0 then
success_build_nr_str = "<span color=\"green\">".. b:getLastSuccessful() .."</span>"
else
success_build_nr_str = "-"
end
local current_build_color = bc[b:getCurrentStatus()]
current_build_nr_str = "<span color=\""..current_build_color.."\">"..b:getCurrent().."</span>"
if current_build_color ~= "green" then
s = s .. "." .. current_build_nr_str
end
return s .. "." .. success_build_nr_str .. "]"
end
-- {{{ Buildbot widget type
local function worker(format, warg)
if #bb == 0 then --fill up bb with builders when worker function is run for the first time
for i,v in pairs(warg) do
bb[#bb+1] = BB.create(v["url"], v["builder"])
end
end
local str = ""
for i,v in pairs(bb) do
v:refresh()
str = str .. " " .. getBuilderStatus(v)
end
return {str .. " "}
end
-- }}}
setmetatable(_M, { __call = function(_, ...) return worker(...) end })

View File

@ -24,12 +24,12 @@ local function worker(format, warg)
for i=1, #warg do
-- Recursively find new messages
local f = io.popen("find "..warg[i].." -type f -wholename '*/new/*'")
local f = io.popen("find '"..warg[i].."' -type f -wholename '*/new/*'")
for line in f:lines() do count.new = count.new + 1 end
f:close()
-- Recursively find "old" messages lacking the Seen flag
local f = io.popen("find "..warg[i].." -type f -regex '.*/cur/.*2,[^S]*$'")
local f = io.popen("find '"..warg[i].."' -type f -regex '.*/cur/.*2,[^S]*$'")
for line in f:lines() do count.cur = count.cur + 1 end
f:close()
end

View File

@ -33,5 +33,4 @@ local function worker(format)
end
-- }}}
setmetatable(uptime, { __call = function(_, ...) return worker(...) end })
return uptime
return setmetatable(uptime, { __call = function(_, ...) return worker(...) end })