From 35cf97571cae7e4ddf893c15b31f78dc67babd6a Mon Sep 17 00:00:00 2001 From: Tobias Ulmer Date: Wed, 6 Nov 2013 17:12:05 +0100 Subject: [PATCH] Move e2lib.svn() into the SVN plugin Signed-off-by: Tobias Ulmer --- generic/e2lib.lua | 43 ----------------------- plugins/svn.lua | 88 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 73 insertions(+), 58 deletions(-) diff --git a/generic/e2lib.lua b/generic/e2lib.lua index d441534..66c7d6c 100644 --- a/generic/e2lib.lua +++ b/generic/e2lib.lua @@ -1808,49 +1808,6 @@ function e2lib.call_tool_argv(tool, argv) return true end ---- call a tool with argv and capture output --- @param tool string: tool name as registered in the tools library --- @param argv table: a vector of (string) arguments --- @param capturefn function called for ever chunk of output --- @return bool --- @return string: the last line ouf captured output -function e2lib.call_tool_argv_capture(tool, argv, capturefn) - local rc, re, cmd, flags, call - - cmd, re = tools.get_tool(tool) - if not cmd then - return false, re - end - - flags, re = tools.get_tool_flags(tool) - if not flags then - return false, re - end - - call = string.format("%s %s", e2lib.shquote(cmd), flags) - - for _,arg in ipairs(argv) do - assert(type(arg) == "string") - call = call .. " " .. e2lib.shquote(arg) - end - - rc, re = e2lib.callcmd_capture(call, capturefn) - if rc ~= 0 then - return false, re - end - - return true -end - ---- call the svn command --- @param argv table: vector with arguments for svn --- @return bool -function e2lib.svn(argv) - assert(type(argv) == "table") - - return e2lib.call_tool_argv("svn", argv) -end - --- Change permission mode of file. -- @param path Path to file. -- @param mode Permission mode, may be "644" or "ugo+rwx" (string). diff --git a/plugins/svn.lua b/plugins/svn.lua index 7e7e3b1..f482557 100644 --- a/plugins/svn.lua +++ b/plugins/svn.lua @@ -73,6 +73,73 @@ local function mksvnurl(surl) return string.format("%s://%s/%s", transport, u.server, u.path) end +--- Call the svn command. +-- @param argv table: vector with arguments for svn +-- @return True on success, false on error or when svn returned with exit +-- status other than 0. +-- @return Error object on failure. +local function svn_tool(argv, workdir) + assert(type(argv) == "table") + assert(workdir == nil or type(workdir) == "string") + + local rc, re + local svn, flags, svncmd, out, fifo + + svncmd = {} + out = {} + fifo = {} + + svn, re = tools.get_tool("svn") + if not svn then + return false, re + end + + table.insert(svncmd, svn) + + flags, re = tools.get_tool_flags("svn") + if not flags then + return false, re + end + + for _,flag in ipairs(flags) do + table.insert(svncmd, flag) + end + + for _,arg in ipairs(argv) do + table.insert(svncmd, arg) + end + + local function capture(msg) + if msg == "" then + return + end + + if #fifo > 4 then + table.remove(fifo, 1) + end + + e2lib.log(3, msg) + table.insert(fifo, msg) + table.insert(out, msg) + end + + rc, re = e2lib.callcmd_capture(svncmd, capture, workdir) + if not rc then + return false, err.new("svn command %q failed to execute", + table.concat(svncmd, " ")):cat(re) + + elseif rc ~= 0 then + local e = err.new("svn command %q failed with exit status %d", + table.concat(svncmd, " "), rc) + for _,v in ipairs(fifo) do + e:append("%s", v) + end + return false, e + end + + return true, nil, table.concat(out) +end + function svn.fetch_source(info, sourcename) local rc, re = svn.validate_source(info, sourcename) if not rc then @@ -93,7 +160,7 @@ function svn.fetch_source(info, sourcename) local argv = { "checkout", svnurl, info.root .. "/" .. src.working } - rc, re = e2lib.svn(argv) + rc, re = svn_tool(argv) if not rc then return false, e:cat(re) end @@ -126,7 +193,7 @@ function svn.prepare_source(info, sourcename, source_set, build_path) end local argv = { "export", svnurl .. "/" .. rev, build_path .. "/" .. sourcename } - rc, re = e2lib.svn(argv) + rc, re = svn_tool(argv) if not rc then return false, e:cat(re) end @@ -277,19 +344,10 @@ function svn.sourceid(info, sourcename, source_set) err.new("svn sourceid can't handle source_set %q", source_set) end - local function cfn(data) - e2lib.logf(3, "%s", data) - if out then - out = out .. data - else - out = data - end - end - - rc, re = e2lib.call_tool_argv_capture("svn", argv, cfn) + rc, re, out = svn_tool(argv) if not rc then - re = err.new("retrieving revision for tag or branch failed") - return false, re:append("%s", out) + return false, + err.new("retrieving revision for tag or branch failed"):cat(re) end svnrev = string.match(out, "Last Changed Rev: (%d+)") @@ -379,7 +437,7 @@ function svn.update(info, sourcename) if not rc then return false, e:cat(re) end - rc, re = e2lib.svn({ "update", }) + rc, re = svn_tool({ "update", }) if not rc then return false, e:cat(re) end -- 2.39.5