blob: f28c8df9b17721805cd9bce27eda95aea3081c06 [file] [log] [blame]
# get entry for @userid
require 'wunderbar'
user = ASF::Person.find(@userid)
entry = user.members_txt(true)
raise Exception.new("Unable to find member entry for #{@userid}") unless entry
USERID = user.id.dup.untaint # might be frozen
USERMAIL = "#{USERID}@apache.org".untaint
USERNAME = user.cn.untaint
TIMESTAMP = (DateTime.now.strftime "%Y-%m-%d %H:%M:%S").untaint
# identify file to be updated
members_txt = ASF::SVN.svnpath!('foundation', 'members.txt').untaint
# construct commit message
message = "Action #{@action} for #{USERID}"
# update members.txt only for secretary actions
if @action == 'emeritus' or @action == 'active' or @action == 'deceased'
ASF::SVN.multiUpdate_ members_txt, message, env, _ do |text|
# remove user's entry
unless text.sub! entry, '' # e.g. if the workspace was out of date
raise Exception.new("Failed to remove existing entry -- try refreshing")
end
extra = []
# determine where to put the entry
if @action == 'emeritus'
index = text.index(/^\s\*\)\s/, text.index(/^Emeritus/))
entry.sub! %r{\s*/\* deceased, .+?\*/},'' # drop the deceased comment if necessary
# if pending emeritus request was found, move it to emeritus
# If emeritus request was found, move it to emeritus
filename = ASF::EmeritusRequestFiles.extractfilename(@emeritusfileurl)
if filename
extra << ['mv', @emeritusfileurl, ASF::SVN.svnpath!('emeritus', filename)]
end
elsif @action == 'active'
index = text.index(/^\s\*\)\s/, text.index(/^Active/))
entry.sub! %r{\s*/\* deceased, .+?\*/},'' # drop the deceased comment if necessary
# if emeritus file was found, move it to emeritus-reinstated
filename = ASF::EmeritusFiles.extractfilename(@emeritusfileurl)
if filename
extra << ['mv', @emeritusfileurl, ASF::SVN.svnpath!('emeritus-reinstated', filename)]
end
elsif @action == 'deceased'
index = text.index(/^\s\*\)\s/, text.index(/^Deceased/))
entry.sub! %r{\n}, " /* deceased, #{@dod} */\n" # add the deceased comment
end
# perform the insertion
text.insert index, entry
# return the updated (and normalized) text and extra svn command
[text, extra]
end
end
# Owner operations
if @action == 'rescind_emeritus'
# TODO handle case where rescinded file already exists
ASF::SVN.svn_!('mv', [@emeritusfileurl, ASF::SVN.svnurl('emeritus-requests-rescinded')], _, {env:env, msg:message})
elsif @action == 'request_emeritus'
# Create mail to secretary requesting emeritus
template, err =
ASF::SVN.svn('cat', ASF::SVN.svnpath!('foundation', 'emeritus-request.txt').untaint, {env:env})
raise RuntimeError.new("Failed to read emeritus-request.txt: " + err) unless template
centered_id = "#{USERID}".center(55, '_')
centered_name = "#{USERNAME}".center(55, '_')
centered_date ="#{TIMESTAMP}".center(55, '_')
signed_request = template
.gsub('Apache id: _______________________________________________________',
('Apache id: ' + centered_id))
.gsub('Full name: _______________________________________________________',
('Full name: ' + centered_name))
.gsub('Signed: __________________________________________________________',
'Signed by validated user at: ________Whimsy www/committer_________')
.gsub('Date: _________________________________',
('Date: _______' + centered_date))
ASF::Mail.configure
mail = Mail.new do
to "secretary@apache.org"
cc "#{USERNAME}<#{USERMAIL}>"
from "#{USERMAIL}"
subject "Emeritus request from #{USERNAME}"
text_part do
body "Please accept my emeritus request, which is attached.\n\nRegards,\n\n#{USERNAME}\n\n"
end
end
mail.attachments["#{USERID}.txt"] = signed_request.untaint
mail.deliver!
elsif @action == 'request_reinstatement'
ASF::Mail.configure
mail = Mail.new do
to "secretary@apache.org"
cc "#{USERNAME}<#{USERMAIL}>"
from "#{USERMAIL}"
subject "Emeritus reinstatement request from #{USERNAME}"
text_part do
body "I respectfully request reinstatement to full membership.\n\nRegards,\n\n#{USERNAME}"
end
end
mail.deliver!
end
# return updated committer info
_committer Committer.serialize(@userid, env)