lib/reap/project/announce.rb in reap-9.3.5 vs lib/reap/project/announce.rb in reap-9.4.0
- old
+ new
@@ -1,205 +1,75 @@
+require 'reap/announcement'
+
module Reap
class Project
-
- # Make a release announcement. Generates and can email release
- # announcements. The announcement if built from the README file
- # unless another file is specified.
- #
- # This will subsititue the first line mathing /please see notes/i
+
+ # Generate and email a release announcement. The announcement
+ # text is read from ANNOUNCE{.txt} or another template file
+ # is specified, or if no template is given, the announcemnet
+ # is automatically built from project metadata, ant the
+ # CHANGES and NOTES files.
+ #
+ # Templates support metadata substitutions using $name$ syntax.
+ # Also, it will subsititue the first line matching /please see notes/i
# for the notelog. And /please see change/i for the changelog.
- #
+ #
# The following settings apply:
- #
- # title Project title.
- # subtitle Brief one-line description.
- # version Project version.
- # description Long description of project.
- # homepage Project homepage web address.
- # slogan Motto for you project.
- # memo File that contains announcement message.
- # template Announcement template file, rather then README.
- # mail_to Email address(es) to send announcemnt.
- #
- # If <em>mail_to</em> is set then these also apply:
- #
- # from Message FROM address [email].
- # subject Subject of email message ([ANN] title verison).
- # server Email server to route message.
- # port Email server's port.
- # domain Email server's domain name.
- # account Email account name [email].
- # login Login type: plain, cram_md5 or login.
- # secure Uses TLS security, true or false?
- #
- # A template file can be specified that uses "$setting" as
- # substitutes for poject information.
+ #
+ # template Announcement template file (ANNOUNCE.txt).
+ # to Email address(es) to send announcemnt.
+ #
+ # If <em>mailto</em> is set then these also apply:
+ #
+ # from Message FROM address [email].
+ # subject Subject of email message ([ANN] title verison).
+ # server Email server to route message.
+ # port Email server's port.
+ # domain Email server's domain name.
+ # account Email account name [email].
+ # login Login type: plain, cram_md5 or login.
+ # secure Uses TLS security, true or false?
+ #
+ # The announcement will be printed to standard out before sending
+ # so it can be verified.
def announce(options=nil)
- options = configure_options(options, 'announce', 'mail')
+ options = configure_options(options, 'announce')
- message = announce_message(options)
+ announcement = Announcement.new do |ann|
+ ann.cutoff = options['cutoff']
+ ann.template = options['template']
+ ann.metadata = metadata
+ end
- options = options.to_ostruct
-
- mail_to = options.mail_to
- mail_from = options.mail_from
- subject = options.subject # Subject line (default is "ANN: project version").
- server = options.server # Email server
- port = options.port # Emails server port (default is usually correct).
- account = options.account # Email account name (defaults to mail_from).
- domain = options.domain # User domain (not sure why SMTP requires this?)
- login = options.login # Login type (plain, login)
- secure = options.secure # Use TLS/SSL true or false?
- password = options.password || ENV['EMAIL_PASSWORD']
-
- title = options.title || metadata.title
- version = options.versoin || metadata.version
-
- # defaults
- subject ||= "%s, v%s release"
- account ||= mail_from
-
- subject = subject % [title, version]
-
if dryrun?
- puts "email '#{subject}'"
- puts "\n#{message}\n\n" if verbose?
+ puts "\n#{announcement.message}\n\n" if verbose?
else
- puts "\n#{message}\n\n"
- if mail_to
- ans = ask("Would you like to email this announcement?", "yN")
- case ans.downcase
- when 'y', 'yes'
- email(message,
- :to => mail_to,
- :from => mail_from,
- :subject => subject,
- :server => server,
- :port => port,
- :domain => domain,
- :account => account,
- :login => login,
- :secure => secure,
- :password => password
- )
- end
- end
+ puts "\n#{announcement.message}\n\n"
end
- end
- # Make a release announcement. Generates and can email a release
- # announcements. These are nicely formated message and can
- # email the message to the specified address(es).
- #
- # The following settings apply:
- #
- # template Announcement file/template.
- # cutoff Max number of lines of changelog to show.
- #
- # A template file can be specified that uses "$setting" as
- # substitutes for poject information.
+ options['message'] = announcement.message
+ options['version'] = metadata.version
- def announce_message(options={})
- config = settings['announce'] || {}
- options = config.merge(options).to_ostruct
+ options['title'] ||= metadata.title
+ options['subject'] ||= "%s, v%s release"
+ options['subject'] = options['subject'] % [ options['title'], metadata.version ]
- cutoff = options.cutoff || 30
- template = options.template || "{ANNOUNCE}{,.txt}"
+ actions = []
+ select = options['hosts']
- #config['mail_to'] = nil if keys['mail_to'].empty?
-
- # Build message
-
- # template
- template = Dir.glob(options.template.to_s, File::FNM_CASEFOLD).first
-
- if template
- readme = File.read(template)
- readme = unfold_paragraphs(readme)
- else
- readme = ''
- readme << "= #{metadata.title} v#{metadata.version}\n\n"
- readme << " #{metadata.homepage}\n\n"
- readme << "#{metadata.description}\n\n"
- readme << "Please see the NOTES file.\n\n"
- readme << "== CHANGES\n\n"
- readme << "Please see the CHANGES file.\n"
- end
-
- # changelog
- file = Dir.glob('change{s,log}{,.txt}', File::FNM_CASEFOLD)[0]
- changelog = file ? File.read(file).strip : ''
- #changelog = unfold_paragraphs(changelog)
- changelog = changelog.split("\n")[0..cutoff].join("\n")
-
- # noteslog
- file = Dir.glob('note{s,log}{,.txt}', File::FNM_CASEFOLD)[0]
- notelog = file ? File.read(file).strip : ''
- notelog = unfold_paragraphs(notelog)
-
- # Strip tiny version zero.
- #if keys['version'] =~ /[.].*?[.]/
- # keys['version'] = keys['version'].chomp('.0')
- #end
-
- # Make announcement message
- message = readme.dup
-
- #message.gsub!('$readme$', readme || '')
- message.sub!(/^\s*please\ see(\ the)?\ notes(.*?)$/i, "\n" + notelog) if notelog
- message.sub!(/^\s*please\ see(\ the)?\ change(.*?)$/i, "\n" + changelog) if changelog
-
- template = message.dup
-
- template.scan(/\$(\w+?)\$/m) do |key|
- #key = key.strip
- name = $1.strip #key[1..-1]
- if metadata.respond_to?(name.downcase)
- value = metadata.send(name.downcase)
- message.gsub!("$#{name}$", value.to_s.strip)
- else
- puts "Warning: Unknown project field -- #{name}."
+ hosts(select).each do |host|
+ if host.respond_to?(:announce)
+ if host.announce_confirm?(options)
+ actions << lambda{ host.announce(options) }
+ end
end
end
- message.gsub!(/(^|[ ])[$].*?(?=[ ]|$)/,'') # remove unused vars
- message.gsub!(/\n\s*\n\s*\n/m,"\n\n") # remove any triple blank lines
- message.rstrip!
-
- return message
+ actions.each{ |a| a.call }
end
- def unfold_paragraphs(string)
- blank = false
- text = ''
- string.split(/\n/).each do |line|
- if /\S/ !~ line
- text << "\n\n"
- blank = true
- else
- if /^(\s+|[*])/ =~ line
- text << (line.rstrip + "\n")
- else
- text << (line.rstrip + " ")
- end
- blank = false
- end
- end
- return text
- end
-
end
end
-
- # keys = {}
- # keys['from'] = info.email
- # keys.update info.gather('mail')
- # keys.update info.gather('announce')
- # keys.update info.select(
- # :project, :version, :title, :subtitle, :description,
- # :homepage, :download, :slogan
- # )
- # keys.update override if override