blob: 90ab4ef0ab2a57dc929ba6211baa10220ff21f4f [file] [log] [blame]
class Wunderbar::JsonBuilder
def task(title, &block)
if not @task
# dry run: collect up a list of tasks
@_target[:tasklist] ||= []
@_target[:tasklist] << {title: title, form: []}
block.call
elsif @task == title
# actual run
block.call
@task = nil
end
end
def _input *args
return if @task
@_target[:tasklist].last[:form] << ['input', '', *args]
end
def _textarea *args
return if @task
@_target[:tasklist].last[:form] << ['textarea', *args]
end
def _message mail
if @task
super
else
@_target[:tasklist].last[:form] << ['textarea', mail.to_s.strip, rows: 20]
end
end
def form &block
block.call
end
def complete &block
return unless @task
if block.arity == 1
Dir.mktmpdir do |dir|
block.call dir
end
else
block.call
end
end
def _transcript *args
return unless @task
super
end
def _backtrace *args
return unless @task
super
end
def svn *args
args << svnauth if env.password and %(checkout update commit).include?(args.first)
_.system! 'svn', *args
end
def svn!(command,path,options={})
options[:env] = env if env.password and %(checkout update commit).include?(command)
ASF::SVN.svn_!(command,path,_,options)
end
def svnauth
[
'--non-interactive',
'--no-auth-cache',
'--username', env.user.dup.untaint, # could be frozen
'--password', env.password.dup.untaint
]
end
# Commit new file(s) and update associated index
# e.g. add ccla.pdf, ccla.pdf.asc to documents/cclas/xyz/ and update officers/cclas.txt
# Parameters:
# index_dir - SVN alias of directory containing the index (e.g. foundation or officers)
# index_name - name of index file to update (e.g. cclas.txt)
# docdir - SVN alias for document directory (e.g. cclas)
# docname - document name (as per email)
# docsig - document signature (as per email - may be null)
# outfilename - name of output file (without extension)
# outfileext - output file extension (of main file)
# emessage - the email message
# svnmessage - the svn commit message
# block - the block which is passed the contents of the index file to be updated
def svn_multi(index_dir, index_name, docdir, docname, docsig, outfilename, outfileext, emessage, svnmessage, &block)
rc = nil
Dir.mktmpdir do |tmpdir|
rc = ASF::SVN.multiUpdate_(ASF::SVN.svnpath!(index_dir, index_name), svnmessage, env, _,{tmpdir: tmpdir}) do |text|
extras = []
# write the attachments as file(s)
dest = emessage.write_att(tmpdir, docname, docsig)
Wunderbar.warn dest.inspect
if dest.size > 1 # write to a container directory
unless outfilename =~ /\A[a-zA-Z][-.\w]+\z/ # previously done by write_svn
raise IOError.new("invalid filename: #{outfilename}")
end
container = ASF::SVN.svnpath!(docdir, outfilename)
extras << ['mkdir', container]
dest.each do |name, file, content_type|
if docdir == 'iclas' && outfileext # special processing for output name
if name == docname
name = "icla%s" % outfileext
elsif name == docsig
name = "icla%s.asc" % outfileext
else
Wunderbar.warn "Cannot recognise #{name} as #{docname} or #{docsig}"
end
end
outpath = File.join(container, name)
# N.B. file cannot exist here, because the directory was created as part of the same commit
extras << ['put', file, outpath]
extras << ['propset', 'svn:mime-type', content_type, outpath]
end
else
name, file, content_type = dest.flatten
outpath = ASF::SVN.svnpath!(docdir,"#{outfilename}#{outfileext}")
# TODO does it matter that the revision is not known?
if ASF::SVN.exist?(outpath, nil, env)
raise IOError.new("#{outpath} already exists!")
else
extras << ['put', file, outpath]
extras << ['propset', 'svn:mime-type', content_type, outpath]
end
end
text = yield text # update the index
[text, extras]
end
end
rc
end
def template(name)
path = File.expand_path("../templates/#{name}", __FILE__.untaint)
ERB.new(File.read(path.untaint).untaint).result(binding)
end
end