summaryrefslogtreecommitdiffstats
path: root/acfupdate-model.lua
diff options
context:
space:
mode:
Diffstat (limited to 'acfupdate-model.lua')
-rw-r--r--acfupdate-model.lua180
1 files changed, 102 insertions, 78 deletions
diff --git a/acfupdate-model.lua b/acfupdate-model.lua
index 99e7451..be4f3ef 100644
--- a/acfupdate-model.lua
+++ b/acfupdate-model.lua
@@ -2,6 +2,10 @@ module (..., package.seeall)
-- Load libraries
require("fs")
+require("processinfo")
+
+local packagename = "subversion"
+local svnurl = "svn://svn.alpinelinux.org/acf/"
-- ################################################################################
-- LOCAL FUNCTIONS
@@ -13,103 +17,123 @@ local function querycmd ( cmdline )
return cmd_result
end
+local function svndir(archive)
+ local retval = "/usr/share/acf/"
+ if archive == "skins/" then
+ retval = retval.."www/skins/"
+ elseif archive and archive ~= "core/" then
+ retval = retval.."app/"..archive
+ end
+ return retval
+end
+
+local function determinerepository(repository)
+ if not repository then
+ -- try to determine the archive from svn
+ local cmdresult = querycmd("/usr/bin/svn info "..svndir())
+ if string.find(cmdresult, "Repository Root:") then
+ repository = string.match(cmdresult, "Repository Root:%s+(%S+)")
+ -- or if not defined, use the default
+ else
+ repository = svnurl
+ end
+ end
+ return repository
+end
+
-- ################################################################################
-- PUBLIC FUNCTIONS
+function read(repository)
+ repository = determinerepository(repository)
+ local status = {}
-function get (self)
- local svnurl = "svn://svn.alpinelinux.org/acf/"
- return querycmd("/usr/bin/svn list -v " .. svnurl )
-end
+ local value, errtxt = processinfo.package_version(packagename)
+ status.version = cfe({
+ label="Program version",
+ value=value,
+ errtxt=errtxt,
+ })
+
+ status.repository = cfe({ value=repository, label="SVN Repository" })
+ if "" == querycmd("/usr/bin/svn list "..repository) then
+ status.repository.errtxt = "Repository cannot be reached"
+ end
+
+ return cfe({ type="group", value=status, descr="ACF Update Info" })
+end
-function update (self)
- local svnurl = "svn://svn.alpinelinux.org/acf/"
- local updates = {}
+function update(repository, sessiondata)
+ repository = determinerepository(repository)
local cmdresult = {}
- updates.svnurl = svnurl
- for list in string.gmatch((querycmd("/usr/bin/svn list " .. svnurl )), "%S+") do
- local updateresult = ""
- if (list == "core/") then
- updateresult = querycmd("/usr/bin/svn up /usr/share/acf/ 2>&1")
- elseif (list == "skins/") and ( fs.is_dir("/usr/share/acf/www/" .. list)) then
- updateresult = querycmd("/usr/bin/svn up /usr/share/acf/www/skins 2>&1")
- elseif (list == "skins/") and not ( fs.is_dir("/usr/share/acf/www/" .. list)) then
- updateresult = querycmd("/usr/bin/svn co " .. svnurl .. list .."trunk/ /usr/share/acf/www/" .. list .. " 2>&1")
- elseif (list == "skins/") then
- updateresult = querycmd("/usr/bin/svn up /usr/share/acf/www/skins 2>&1")
- elseif ( fs.is_dir("/usr/share/acf/app/" .. list)) then
- updateresult = querycmd("/usr/bin/svn up /usr/share/acf/app/" .. list .. " 2>&1")
- elseif (list ~= "sandbox/") then
- updateresult = querycmd("/usr/bin/svn co " .. svnurl .. list .."trunk/ /usr/share/acf/app/" .. list .. " 2>&1")
+ local mustrestart
+
+ function work(list)
+ local dir = svndir(list)
+ -- If we have the directory already, but not from archive, delete it
+ if posix.stat(dir) and not posix.stat(dir..".svn") then
+ querycmd("rm -r "..dir)
+ if list == "core/" then
+ -- We have to restart the web server because we've just deleted the
+ mustrestart = true
+ end
end
+ local updateresult = querycmd("/usr/bin/svn co "..repository.."/"..list.."trunk "..dir.." 2>&1")
-- Hide projects without updates
- if (string.match(updateresult, "^At revision.*")) then updateresult = "" end
+ if (string.match(updateresult, "^Checked out revision.*")) then updateresult = "" end
table.insert(cmdresult, {name=list, updates=updateresult})
end
- updates.cmdresult = cmdresult
- return updates
-end
-function diffs (self)
- local svnurl = "svn://svn.alpinelinux.org/acf/"
- local updates = {}
- local cmdresult = {}
- updates.svnurl = svnurl
- table.insert(cmdresult, {name="INFORMATION", updates="<p class=attention>Important information.</p><p>In the following output all html-brackets < and > are replaced to [ and ].<BR>This is to be able to display the diffs in text (perhibit the browser to display the diff as graphics).</p>"})
- for list in string.gmatch((querycmd("/usr/bin/svn list " .. svnurl )), "%S+") do
- local updateresult = ""
- if (list == "core/") then
- updateresult = querycmd("/usr/bin/svn -rHEAD diff /usr/share/acf/ 2>&1")
- elseif ( fs.is_dir("/usr/share/acf/app/" .. list)) then
- updateresult = querycmd("/usr/bin/svn -rHEAD diff /usr/share/acf/app/" .. list .. " 2>&1")
+ if "" ~= querycmd("/usr/bin/svn list "..repository) then
+ work("core/")
+ for list in string.gmatch((querycmd("/usr/bin/svn list " .. repository )), "%S+") do
+ if list~="core/" and list~="sandbox/" then
+ work(list)
+ end
end
- updateresult = string.gsub(updateresult,"<","[")
- updateresult = string.gsub(updateresult,">","]")
- table.insert(cmdresult, {name=list, updates=updateresult})
end
- updates.cmdresult = cmdresult
- return updates
+ -- Destroy the menu and permissions session data so it's recalculated
+ if sessiondata then sessiondata.menu = nil end
+ if sessiondata then sessiondata.permissions = nil end
+
+ if mustrestart then
+ -- FIXME
+ --processinfo.daemoncontrol("mini_httpd", "restart")
+ end
+
+ return cfe({ type="structure", value=cmdresult, label="SVN update Result"})
end
-function status (self)
- local svnurl = "svn://svn.alpinelinux.org/acf/"
- local updates = {}
+function diffs(repository)
+ repository = determinerepository(repository)
local cmdresult = {}
- updates.svnurl = svnurl
- for list in string.gmatch((querycmd("/usr/bin/svn list " .. svnurl )), "%S+") do
- local updateresult = ""
- if (list == "core/") then
- updateresult = querycmd("/usr/bin/svn st -u /usr/share/acf/ 2>&1")
- elseif ( fs.is_dir("/usr/share/acf/app/" .. list)) then
- updateresult = querycmd("/usr/bin/svn st -u /usr/share/acf/app/" .. list .. " 2>&1")
+ for list in string.gmatch((querycmd("/usr/bin/svn list " .. repository )), "%S+") do
+ if (list ~= "sandbox/") then
+ local updateresult = querycmd("/usr/bin/svn diff "..svndir(list).." 2>&1")
+ if updateresult ~= "" then
+ table.insert(cmdresult, {name=list, updates=updateresult})
+ end
end
- -- Hide projects without diffs
- if (string.match(updateresult, "^Status against revision.*")) then updateresult = "" end
- table.insert(cmdresult, {name=list, updates=updateresult})
end
- updates.cmdresult = cmdresult
- return updates
+ return cfe({ type="structure", value=cmdresult, label="SVN diff Result" })
end
-function log (self)
- local svnurl = "svn://svn.alpinelinux.org/acf/"
- local updates = {}
+
+function status(repository)
+ repository = determinerepository(repository)
local cmdresult = {}
- local enddate = tostring(os.date("%Y-%m-%d", (os.time() - (3600 * 24) * 7)))
- local svnresult = querycmd("/usr/bin/svn log -v -rHEAD:{".. enddate .. "} " .. svnurl )
- local svnheader = os.date("%Y-%m-%d")
- local svnupdates = ""
- table.insert(cmdresult, {name="INFORMATION", updates="<p>This is the result of svn log 1 week back in time.</p><p> svn log -v -rHEAD:{".. enddate .. "} " .. svnurl .. "</p>"})
-
- for v in string.gmatch(svnresult,"(.-\n)") do
- local svnheader_tmp = string.match(v, "r%d+%s+.-(%d+%-%d+%-%d+)")
- if (svnheader_tmp) and (svnheader_tmp ~= svnheader) then
- table.insert(cmdresult,{
- ["updates"] = svnupdates,
- ["name"] = svnheader, })
- svnheader = svnheader_tmp
- svnupdates = ""
+ for list in string.gmatch((querycmd("/usr/bin/svn list " .. repository )), "%S+") do
+ if (list ~= "sandbox/") then
+ local updateresult = querycmd("/usr/bin/svn st -u "..svndir(list).." 2>&1")
+ -- Hide projects without diffs
+ if (string.match(updateresult, "^Status against revision.*")) then updateresult = "" end
+ table.insert(cmdresult, {name=list, updates=updateresult})
end
- svnupdates = svnupdates .. v
end
- updates.cmdresult = cmdresult
- return updates
+ return cfe({ type="structure", value=cmdresult, label="SVN status Result" })
+end
+
+function log (repository)
+ repository = determinerepository(repository)
+ local enddate = tostring(os.date("%Y-%m-%d", (os.time() - (3600 * 24) * 7)))
+ local svnresult = querycmd("/usr/bin/svn log -v -rHEAD:{".. enddate .. "} " .. repository )
+ return cfe({ type="longtext", value=svnresult, label="SVN log Result" })
end