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).
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
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
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
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+)")
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