This is an automated email from the ASF dual-hosted git repository.

sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/whimsy.git


The following commit(s) were added to refs/heads/master by this push:
     new 6aa7e09  Trailing spaces
6aa7e09 is described below

commit 6aa7e09ad75d740320ac7e38c4fbc6bedbd7fbe7
Author: Sebb <[email protected]>
AuthorDate: Tue Sep 22 17:26:59 2020 +0100

    Trailing spaces
---
 lib/whimsy/asf/agenda.rb                           |  2 +-
 lib/whimsy/asf/agenda/discussion.rb                |  2 +-
 lib/whimsy/asf/board.rb                            |  2 +-
 lib/whimsy/asf/committee.rb                        | 12 ++++-----
 lib/whimsy/asf/documents.rb                        |  4 +--
 lib/whimsy/asf/forms.rb                            |  2 +-
 lib/whimsy/asf/forms2.rb                           |  2 +-
 lib/whimsy/asf/git.rb                              |  2 +-
 lib/whimsy/asf/ldap.rb                             | 10 +++----
 lib/whimsy/asf/mail.rb                             |  4 +--
 lib/whimsy/asf/mlist.rb                            | 10 +++----
 lib/whimsy/asf/nominees.rb                         |  2 +-
 lib/whimsy/asf/orgchart.rb                         | 12 ++++-----
 lib/whimsy/asf/podling.rb                          |  4 +--
 lib/whimsy/asf/svn.rb                              | 31 +++++++++++-----------
 lib/whimsy/asf/themes.rb                           | 14 +++++-----
 lib/whimsy/asf/watch.rb                            |  2 +-
 lib/whimsy/cache.rb                                |  4 +--
 lib/whimsy/logparser.rb                            | 22 +++++++--------
 lib/whimsy/sitestandards.rb                        | 16 +++++------
 tools/collate_minutes.rb                           |  2 +-
 tools/comdevtalks.rb                               |  4 +--
 tools/download_check.rb                            | 16 +++++------
 tools/mboxhdr2csv.rb                               |  8 +++---
 tools/namemap.rb                                   | 22 +++++++--------
 tools/ponyapi.rb                                   |  8 +++---
 tools/ponypoop.rb                                  | 14 +++++-----
 tools/pubsub2rake.rb                               |  4 +--
 tools/site-scan.rb                                 |  4 +--
 www/apmail/mods.cgi                                |  4 +--
 www/board/agenda/models/agenda.rb                  |  2 +-
 www/board/agenda/models/minutes.rb                 |  2 +-
 www/board/agenda/routes.rb                         |  4 +--
 www/board/agenda/views/actions/commit.json.rb      |  2 +-
 www/board/agenda/views/actions/feedback.json.rb    |  2 +-
 www/board/agenda/views/actions/post-data.json.rb   |  4 +--
 www/board/agenda/views/actions/publish.json.rb     |  2 +-
 www/board/agenda/views/buttons/post.js.rb          | 14 +++++-----
 .../agenda/views/buttons/publish-minutes.js.rb     |  2 +-
 www/board/agenda/views/layout/footer.js.rb         |  2 +-
 www/board/agenda/views/layout/main.js.rb           |  2 +-
 www/board/agenda/views/models/agenda.js.rb         |  2 +-
 www/board/agenda/views/models/chat.js.rb           |  2 +-
 www/board/agenda/views/pages/adjournment.js.rb     |  2 +-
 www/board/agenda/views/pages/fy23.js.rb            |  2 +-
 www/board/agenda/views/pages/report.js.rb          |  2 +-
 www/board/agenda/views/pages/secrets.js.rb         |  2 +-
 www/board/calendar.cgi                             |  4 +--
 www/brand/list.cgi                                 |  2 +-
 www/brand/replyedit.cgi                            |  2 +-
 www/brand/replylist.cgi                            |  2 +-
 www/brand/replyui.cgi                              |  4 +--
 www/committers/index.cgi                           |  2 +-
 www/committers/subscribe.cgi                       | 16 +++++------
 www/committers/tm-report.cgi                       |  8 +++---
 www/events/other.cgi                               |  4 +--
 www/fundraising/invoice.cgi                        |  4 +--
 www/incubator/graduated.cgi                        |  2 +-
 www/incubator/signoff.cgi                          | 16 +++++------
 www/members/archivers.cgi                          | 10 +++----
 www/members/attendance-xcheck.cgi                  |  2 +-
 www/members/inactive.cgi                           |  2 +-
 www/members/index.cgi                              |  2 +-
 www/members/meeting-util.rb                        |  6 ++---
 www/members/meeting.cgi                            | 14 +++++-----
 www/members/memberless-pmcs.cgi                    |  2 +-
 www/members/mentor-update.cgi                      | 14 +++++-----
 www/members/namediff.cgi                           |  8 +++---
 www/members/nominations.cgi                        |  2 +-
 www/members/non-participants.cgi                   | 14 +++++-----
 www/members/proxy.cgi                              | 20 +++++++-------
 www/members/repo-use.cgi                           |  4 +--
 www/members/security-subs.cgi                      |  2 +-
 www/members/watch.cgi                              | 16 +++++------
 www/officers/acreq.cgi                             |  4 +--
 www/officers/index.cgi                             |  2 +-
 www/officers/surveys.cgi                           |  4 +--
 www/pods.cgi                                       |  2 +-
 www/roster/models/committee.rb                     |  4 +--
 www/roster/models/nonpmc.rb                        |  4 +--
 www/roster/models/orgchart.rb                      |  2 +-
 www/roster/models/ppmc.rb                          |  4 +--
 www/roster/public_committee_info.rb                |  2 +-
 www/roster/public_icla_info.rb                     |  2 +-
 www/roster/public_json_common.rb                   |  4 +--
 www/roster/views/actions/fullname.json.rb          |  2 +-
 www/roster/views/committees.html.rb                |  6 ++---
 www/roster/views/committerSearch.js.rb             |  2 +-
 www/roster/views/duties.html.rb                    |  4 +--
 www/roster/views/iclaSearch.js.rb                  |  2 +-
 www/roster/views/index.html.rb                     |  4 +--
 www/roster/views/members.html.rb                   |  4 +--
 www/roster/views/nonpmc/committers.js.rb           |  2 +-
 www/roster/views/nonpmcs.html.rb                   |  4 +--
 www/roster/views/orgchart.html.rb                  |  2 +-
 www/roster/views/person/forms.js.rb                |  2 +-
 www/roster/views/person/github.js.rb               |  2 +-
 www/roster/views/person/main.js.rb                 |  4 +--
 www/roster/views/pmc/committers.js.rb              |  2 +-
 www/roster/views/podlings.html.rb                  |  2 +-
 www/roster/views/polyfill.js.rb                    |  2 +-
 www/roster/views/ppmc/committers.js.rb             |  2 +-
 www/roster/views/ppmc/members.js.rb                |  4 +--
 www/roster/views/ppmc/mentors.js.rb                |  4 +--
 www/roster/views/ppmcs.html.rb                     |  4 +--
 www/secretary/icla-parse.cgi                       |  8 +++---
 www/secretary/iclaparser.rb                        |  8 +++---
 www/secretary/ldap-check-committers.cgi            |  2 +-
 www/secretary/ldap-check.cgi                       |  8 +++---
 www/secretary/ldap-names.cgi                       | 24 ++++++++---------
 www/secretary/memapp_check.cgi                     |  2 +-
 www/secretary/public-names.cgi                     |  4 +--
 www/secretary/workbench/parsemail.rb               |  2 +-
 www/secretary/workbench/views/actions/ccla.json.rb |  2 +-
 .../workbench/views/actions/parse-icla.json.rb     |  6 ++---
 www/secretary/workbench/views/forms/ccla.js.rb     |  2 +-
 www/secretary/workbench/views/forms/grant.js.rb    |  2 +-
 www/secretary/workbench/views/parts.js.rb          |  2 +-
 www/secretary/workbench/views/tasklist.html.rb     |  2 +-
 www/site.cgi                                       |  2 +-
 www/status/index.cgi                               |  2 +-
 www/status/monitors/git.rb                         |  4 +--
 www/status/monitors/svn.rb                         |  2 +-
 www/test/example.cgi                               |  4 +--
 124 files changed, 330 insertions(+), 331 deletions(-)

diff --git a/lib/whimsy/asf/agenda.rb b/lib/whimsy/asf/agenda.rb
index 774c23f..1c3b3f3 100644
--- a/lib/whimsy/asf/agenda.rb
+++ b/lib/whimsy/asf/agenda.rb
@@ -85,7 +85,7 @@ class ASF::Board::Agenda
   def parse(file, quick=false)
     @file = file
     @quick = quick
-    
+
     if not @file.valid_encoding?
       filter = Proc.new {|c| c.unpack('U').first rescue 0xFFFD}
       @file = @file.chars.map(&filter).pack('U*').force_encoding('utf-8')
diff --git a/lib/whimsy/asf/agenda/discussion.rb 
b/lib/whimsy/asf/agenda/discussion.rb
index 5df8a3a..c49cf85 100644
--- a/lib/whimsy/asf/agenda/discussion.rb
+++ b/lib/whimsy/asf/agenda/discussion.rb
@@ -6,7 +6,7 @@ class ASF::Board::Agenda
   parse do
     discussion = @file.split(/^ \d. Discussion Items\n/,2).last.
       split(/^ \d. .*Action Items/,2).first
-    
+
     if discussion !~ /\A\s{3,5}[0-9A-Z]\.\s/
 
       # One (possibly empty) item for all Discussion Items
diff --git a/lib/whimsy/asf/board.rb b/lib/whimsy/asf/board.rb
index 90625a2..275f20c 100644
--- a/lib/whimsy/asf/board.rb
+++ b/lib/whimsy/asf/board.rb
@@ -144,7 +144,7 @@ module ASF
     def self.directorInitials(id)
       DIRECTOR_MAP[id] && DIRECTOR_MAP[id][INITIALS]
     end 
-    
+
     # Return the first name for the uid
     # Fails if there is no entry, so check first using directorHasId?
     def self.directorFirstName(id)
diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb
index 00c2853..9d641d5 100644
--- a/lib/whimsy/asf/committee.rb
+++ b/lib/whimsy/asf/committee.rb
@@ -606,9 +606,9 @@ module ASF
       return unless board
       file = File.join(board, 'committee-info.yaml')
       return unless File.exist? file
-  
+
       return @committee_metadata if @committee_metadata and 
@committee_metadata_mtime and File.mtime(file) <= @committee_metadata_mtime
-  
+
       @committee_metadata_mtime = File.mtime(file)
       @committee_metadata = YAML.load_file file
     end
@@ -619,20 +619,20 @@ module ASF
       load_committee_metadata[:tlps][committee] || 
load_committee_metadata[:cttees][committee] 
     end
 
-    
+
     # website for this committee.
     def site()
       meta = ASF::Committee.metadata(name)
       meta[:site] if meta
     end
-    
+
     # description for this committee.
     def description()
       meta = ASF::Committee.metadata(name)
       meta[:description] if meta
     end
 
-    
+
     # append the description for a new tlp committee.
     # this is intended to be called from todos.json.rb in the block for 
ASF::SVN.update
     def self.appendtlpmetadata(input,committee,description)
@@ -665,6 +665,6 @@ module ASF
       end
       output
     end
-    
+
   end
 end
diff --git a/lib/whimsy/asf/documents.rb b/lib/whimsy/asf/documents.rb
index 5836b6b..93e1e34 100644
--- a/lib/whimsy/asf/documents.rb
+++ b/lib/whimsy/asf/documents.rb
@@ -18,7 +18,7 @@ module ASF
     def self.exist?(name)
       self.listnames.include?(name)
     end
-    
+
   end
 
   # Common class for access to documents/cclas/
@@ -35,7 +35,7 @@ module ASF
     def self.exist?(name)
       self.listnames.include?(name)
     end
-    
+
   end
 
   # Common class for access to documents/iclas/ directory
diff --git a/lib/whimsy/asf/forms.rb b/lib/whimsy/asf/forms.rb
index 35a5d2e..409e8c7 100644
--- a/lib/whimsy/asf/forms.rb
+++ b/lib/whimsy/asf/forms.rb
@@ -68,7 +68,7 @@ class Wunderbar::HtmlMarkup
       _label.col_sm_offset_3.col_sm_9.strong.text_left label
     end
   end
-  
+
   # Display a single input control within a form; or if rows, then a textarea
   # @param name required string ID of control's label/id
   def _whimsy_forms_input(**args)
diff --git a/lib/whimsy/asf/forms2.rb b/lib/whimsy/asf/forms2.rb
index e26d14b..2bcbb26 100644
--- a/lib/whimsy/asf/forms2.rb
+++ b/lib/whimsy/asf/forms2.rb
@@ -64,7 +64,7 @@ class Wunderbar::HtmlMarkup
       _label.col_sm_offset_3.col_sm_9.strong.text_left text
     end
   end
-  
+
   # Display a single input control within a form; or if rows, then a textarea
   # @param name required string ID of control's label/id
   def _whimsy_forms_input(**args)
diff --git a/lib/whimsy/asf/git.rb b/lib/whimsy/asf/git.rb
index 3fbb367..47826ae 100644
--- a/lib/whimsy/asf/git.rb
+++ b/lib/whimsy/asf/git.rb
@@ -15,7 +15,7 @@ module ASF
 
     # path to the deployment branch on GitHub.
     INFRA_PUPPET = '/apache/infrastructure-puppet/deployment/'
-  
+
     # get a file live from infrastructure puppet (e.g. 'data/common.yaml')
     # issues a HTTP GET request, so may be slow and may fail.  For applications
     # that require faster and more dependable access,
diff --git a/lib/whimsy/asf/ldap.rb b/lib/whimsy/asf/ldap.rb
index e6dc4d9..c6bc48e 100644
--- a/lib/whimsy/asf/ldap.rb
+++ b/lib/whimsy/asf/ldap.rb
@@ -401,7 +401,7 @@ module ASF
   def self.committerids
     weakref(:committerids) {RoleGroup.find('committers').memberids}
   end
-  
+
   # Obtain a list of members from LDAP 
   # <tt>cn=member,ou=groups,dc=apache,dc=org</tt>
   # Note: includes some non-ASF member infrastructure contractors
@@ -697,7 +697,7 @@ module ASF
       else
         filter = "(|#{people.map {|person| "(uid=#{person.name})"}.join})"
       end
-      
+
       zero = Hash[attributes.map {|attribute| [attribute,nil]}]
 
       data = ASF.search_one(base, filter, attributes + ['uid'])
@@ -915,7 +915,7 @@ module ASF
           mod_add('gidNumber', nextgid.to_s),
         ]
       end
- 
+
       # fixed attributes
       attrs.merge!({
         'uidNumber' => nextuid.to_s,
@@ -1188,7 +1188,7 @@ module ASF
       owners.map {|uid| uid[/uid=(.*?),/,1]}
     end
 
-    
+
     # remove people from a project as owners and members in LDAP
     def remove(people)
       remove_owners(people)
@@ -1392,7 +1392,7 @@ module ASF
       members = weakref(:members) do
         ASF.search_one(base, "cn=#{name}", 'member').flatten
       end
-    
+
       members.map {|uid| uid[/uid=(.*?),/,1]}
     end
 
diff --git a/lib/whimsy/asf/mail.rb b/lib/whimsy/asf/mail.rb
index a556eb2..99ba5d1 100644
--- a/lib/whimsy/asf/mail.rb
+++ b/lib/whimsy/asf/mail.rb
@@ -137,7 +137,7 @@ module ASF
       allowed
     end
 
-    
+
     # common configuration for sending mail; loads <tt>:sendmail</tt>
     # configuration from <tt>~/.whimsy</tt> if available; otherwise default
     # to disable openssl verification as that is what it required in order
@@ -212,7 +212,7 @@ module ASF
       # Invalid; return input rather than failing
       return email
     end
-    
+
     private
 
     # Load the auto-subscription file
diff --git a/lib/whimsy/asf/mlist.rb b/lib/whimsy/asf/mlist.rb
index 1cdb1b2..029574c 100644
--- a/lib/whimsy/asf/mlist.rb
+++ b/lib/whimsy/asf/mlist.rb
@@ -62,7 +62,7 @@ module ASF
     # :subscriptions - an array of pairs: [list name, subscriber email]
     # N.B. not the same format as the moderates() method
     def self.subscriptions(emails, response = {})
-      
+
       return response unless File.exists? LIST_SUBS
 
       response[:subscriptions] = []
@@ -85,7 +85,7 @@ module ASF
     # :digests - an array of pairs: [list name, subscriber email]
     # N.B. not the same format as the moderates() method
     def self.digests(emails, response = {})
-      
+
       return response unless File.exists? LIST_DIGS
 
       response[:digests] = []
@@ -215,8 +215,8 @@ module ASF
     def self.list_subs(mail_domain, podling=false, list_subs=false)
       self.list_subscribers(mail_domain,podling,list_subs,true)
     end
-    
-    
+
+
     # returns the list time (defaulting to list-subs time if the marker is not 
present)
     def self.list_time
       File.mtime(LIST_TIME) rescue File.mtime(LIST_SUBS)
@@ -307,7 +307,7 @@ module ASF
       end
       return nil
     end
-    
+
     # Parses the list-mods/list-subs files
     # Param: type = 'mod' or 'sub' or 'dig'
     # Yields:
diff --git a/lib/whimsy/asf/nominees.rb b/lib/whimsy/asf/nominees.rb
index 6b7cf12..a3bd880 100644
--- a/lib/whimsy/asf/nominees.rb
+++ b/lib/whimsy/asf/nominees.rb
@@ -3,7 +3,7 @@ require 'weakref'
 module ASF
 
   class Person < Base
-  
+
     # Return a hash of nominated members.  Keys are ASF::Person objects,
     # values are the nomination text.
     def self.member_nominees
diff --git a/lib/whimsy/asf/orgchart.rb b/lib/whimsy/asf/orgchart.rb
index 7577b60..2ee0f66 100644
--- a/lib/whimsy/asf/orgchart.rb
+++ b/lib/whimsy/asf/orgchart.rb
@@ -2,14 +2,14 @@
 # Part of the whimsy/ASF module of classes that provide simple access to ASF
 # data.
 module ASF # :nodoc:
-  
+
   ##
   # Reads and provides access to the
   # <tt>officers/personnel-duties/ROLENAME.yaml</tt> files.
   class OrgChart
     @@duties = {}
     @@desc = {}
-    
+
     # parse any changed YAML role files.
     def self.load
       @@source ||= ASF::SVN['personnel-duties']
@@ -24,7 +24,7 @@ module ASF # :nodoc:
         data['mtime'] = File.mtime(file).to_f
         @@duties[name] = data
       end
-      
+
       file = File.join(@@source, 'README').untaint
       unless @@desc['mtime'] and @@desc['mtime'] > File.mtime(file).to_f
         data = Hash[*File.read(file).split(/^\[(.*)\]\n/)[1..-1].map(&:strip)]
@@ -34,10 +34,10 @@ module ASF # :nodoc:
           @@desc = data
         end
       end
-      
+
       @@duties
     end
-    
+
     ##
     # Access data from a specific role
     # :yield: Hash with ['info'] -> hash of info fields; plus any other 
[sections]
@@ -45,7 +45,7 @@ module ASF # :nodoc:
       self.load
       @@duties[name]
     end
-    
+
     ##
     # Access descriptions of the <tt>['info']</tt> section fields
     def self.desc
diff --git a/lib/whimsy/asf/podling.rb b/lib/whimsy/asf/podling.rb
index e5b945c..b116835 100644
--- a/lib/whimsy/asf/podling.rb
+++ b/lib/whimsy/asf/podling.rb
@@ -441,9 +441,9 @@ module ASF
     def namesearch
       Podling.namesearch[display_name]
     end
-    
+
     private
-    
+
     def self._list(status)
       list.select { |podling| podling.status == status }
     end
diff --git a/lib/whimsy/asf/svn.rb b/lib/whimsy/asf/svn.rb
index dbc6c35..751a4a8 100644
--- a/lib/whimsy/asf/svn.rb
+++ b/lib/whimsy/asf/svn.rb
@@ -94,7 +94,7 @@ module ASF
       if includeAll
         self._all_repo_entries
       else
-        self._all_repo_entries.reject{|k,v| v['depth'] == 'skip' or v['depth'] 
== 'delete'}
+        self._all_repo_entries.reject{|_k, v| v['depth'] == 'skip' or 
v['depth'] == 'delete'}
       end
     end
 
@@ -164,7 +164,7 @@ module ASF
 
     # find a local directory corresponding to a path in Subversion.  Returns
     # <tt>nil</tt> if not found.
-               # Excludes aliases
+    # Excludes aliases
     def self.find(name)
       return @testdata[name] if @testdata[name]
 
@@ -404,7 +404,7 @@ module ASF
     def self.svn(command, path , options = {})
       raise ArgumentError.new 'command must not be nil' unless command
       raise ArgumentError.new 'path must not be nil' unless path
-      
+
       # Deal with svn-only opts
       chdir = options.delete(:chdir)
       open_opts = {}
@@ -461,7 +461,7 @@ module ASF
       raise ArgumentError.new 'command must not be nil' unless command
       raise ArgumentError.new 'path must not be nil' unless path
       raise ArgumentError.new 'wunderbar (_) must not be nil' unless _
-      
+
       # Pick off the options specific to svn_ rather than svn
       sysopts = options.delete(:sysopts) || {}
       auth = options.delete(:auth)
@@ -572,7 +572,7 @@ module ASF
            user: user, password: pass})
 
         raise Exception.new("Update of committee-info.txt failed: #{err}") 
unless out
-        
+
       end
     end
 
@@ -660,7 +660,7 @@ module ASF
             {msg: msg.untaint, env: env})
 
         # fail if there are pending changes
-        out, err = self.svn('status', tmpfile || tmpdir) # Need to use svn 
rather than svn_ here
+        out, _err = self.svn('status', tmpfile || tmpdir) # Need to use svn 
rather than svn_ here
         unless rc == 0 && out && out.empty?
           raise "svn failure #{rc} #{path.inspect} #{out}"
         end
@@ -780,7 +780,7 @@ module ASF
       end
       throw IOError.new("Could not check if #{path} exists: #{err}")
     end    
-    
+
     # DRAFT DRAFT
     # create a new file and fail if it already exists
     # Parameters:
@@ -866,7 +866,6 @@ module ASF
         end
       end
       outputfile = File.join(tmpdir, basename).untaint
-      cmdfile = nil
 
       begin
 
@@ -896,7 +895,7 @@ module ASF
         extra.each do |cmd|
           cmds << cmd
         end
-        
+
         # Now commit everything
         if options[:dryrun]
           puts cmds # TODO: not sure this is correct for Wunderbar
@@ -909,7 +908,7 @@ module ASF
         FileUtils.rm_rf tmpdir unless options[:tmpdir]
       end
     end
-    
+
     EPOCH_SEP = ':' # separator
     EPOCH_TAG = 'epoch'+EPOCH_SEP # marker in file to show epochs are present
     EPOCH_LEN = EPOCH_TAG.size
@@ -992,12 +991,12 @@ module ASF
       else
         open(listfile) do |l|
           # fetch the file revision from the first line
-          _filerev = l.gets.chomp # TODO should we be checking _filerev?
-          if _filerev.start_with?(EPOCH_TAG)
+          filerev = l.gets.chomp # TODO should we be checking filerev?
+          if filerev.start_with?(EPOCH_TAG)
             if getEpoch
-              trimEpoch = -> l { l.split(EPOCH_SEP,2) } # return as array
+              trimEpoch = -> x { x.split(EPOCH_SEP,2) } # return as array
             else
-              trimEpoch = -> l { l.split(EPOCH_SEP,2)[1] } # strip the epoch
+              trimEpoch = -> x { x.split(EPOCH_SEP,2)[1] } # strip the epoch
             end
           else
             trimEpoch = nil
@@ -1018,7 +1017,7 @@ module ASF
     # Does this host's installation of SVN support --password-from-stdin?
     def self.passwordStdinOK?()
       return @svnHasPasswordFromStdin unless @svnHasPasswordFromStdin.nil?
-        out, err, status = Open3.capture3('svn','help','cat', '-v')
+        out, _err, status = Open3.capture3('svn','help','cat', '-v')
         if status.success? && out
           @svnHasPasswordFromStdin = out.include? '--password-from-stdin'
         else
@@ -1028,7 +1027,7 @@ module ASF
     end
 
     private
-    
+
     # Calculate svn parent directory allowing for overrides
     def self.svn_parent
       svn = ASF::Config.get(:svn)
diff --git a/lib/whimsy/asf/themes.rb b/lib/whimsy/asf/themes.rb
index 04cf36c..7c312a2 100644
--- a/lib/whimsy/asf/themes.rb
+++ b/lib/whimsy/asf/themes.rb
@@ -2,7 +2,7 @@ require 'wunderbar'
 
 # Define common page features for whimsy tools using bootstrap styles
 class Wunderbar::HtmlMarkup
-  
+
   # DEPRECATED Wrap content with nicer fluid margins
   def _whimsy_content colstyle="col-lg-11"
     _div.content.container_fluid do
@@ -13,7 +13,7 @@ class Wunderbar::HtmlMarkup
       end
     end
   end
-  
+
   # Emit simplistic copyright footer
   def _whimsy_foot
     _div.footer.container_fluid style: 'background-color: #f5f5f5; padding: 
10px;' do
@@ -30,7 +30,7 @@ class Wunderbar::HtmlMarkup
       end
     end
   end
-  
+
   # Emit a panel with title and body content
   def _whimsy_panel(title, style: 'panel-primary', header: 'h3')
     _div.panel class: style do
@@ -44,7 +44,7 @@ class Wunderbar::HtmlMarkup
       end
     end
   end
-  
+
   # Emit a panel with helpblock and table 
https://getbootstrap.com/components/#panels-tables
   def _whimsy_panel_table(title: 'Table Title', style: 'panel-primary', 
header: 'h2', helpblock: nil)
     _div.panel class: style do
@@ -61,7 +61,7 @@ class Wunderbar::HtmlMarkup
       yield
     end
   end
-  
+
   # Emit a bootstrap navbar with required ASF links
   def _whimsy_nav
     _nav.navbar.navbar_default do
@@ -198,7 +198,7 @@ class Wunderbar::HtmlMarkup
       _whimsy_foot
     end
   end
-  
+
   # Emit wrapper panels for a single tablist accordion item
   # @param listid of the parent _div.panel_group role: "tablist"
   # @param itemid of this specific item
@@ -225,5 +225,5 @@ class Wunderbar::HtmlMarkup
       end
     end
   end
-  
+
 end
diff --git a/lib/whimsy/asf/watch.rb b/lib/whimsy/asf/watch.rb
index c1d9e84..0ef2296 100644
--- a/lib/whimsy/asf/watch.rb
+++ b/lib/whimsy/asf/watch.rb
@@ -1,7 +1,7 @@
 module ASF
 
   class Person < Base
-  
+
     # Return a hash of individuals in the member watch list.  Keys are
     # ASF::Person objects, values are the text from
     # <tt>potential-member-watch-list.txt</tt>..
diff --git a/lib/whimsy/cache.rb b/lib/whimsy/cache.rb
index ef82f74..3746add 100644
--- a/lib/whimsy/cache.rb
+++ b/lib/whimsy/cache.rb
@@ -35,7 +35,7 @@ class Cache
     @enabled = enabled
     init_cache(@dir) if enabled
   end
-  
+
   # gets the URL content
   #
   # Caches the response and returns that if unchanged or recent
@@ -155,7 +155,7 @@ class Cache
         last = nil unless last.length > 25
       end
     end
-    
+
     return Time.now - (mtime ? mtime : Time.new(0)), last, uri, etag, data
   end
 
diff --git a/lib/whimsy/logparser.rb b/lib/whimsy/logparser.rb
index b9b57b3..3d9ba48 100755
--- a/lib/whimsy/logparser.rb
+++ b/lib/whimsy/logparser.rb
@@ -11,7 +11,7 @@ module LogParser
   extend self
   # Hardcoded from 
https://github.com/apache/infrastructure-puppet/blob/deployment/modules/whimsy_server/manifests/init.pp#L200
   ERROR_LOG_DIR = '/srv/whimsy/www/members/log'
-  
+
   # Constants and ignored regex for whimsy_access logs
   WHIMSY_APPS = {
     'roster' => 'Roster tool',
@@ -52,13 +52,13 @@ module LogParser
     /\.php\z/,
     /\.woff2/
   ]
-  
+
   # Related to timestamps in error log output
   TRUNCATE = 6 # Ensure consistency in keys
   TIME_OFFSET = 10000000.0 # Offset milliseconds slightly for array entries
   # Ignore error lines from other tools with long tracebacks
   IGNORE_TRACEBACKS = ["rack.rb", "asf/themes", "phusion_passenger"]
-  
+
   # Read a text or .gz file
   # @param f filename: .log or .log.gz
   # @return File.read(f)
@@ -72,7 +72,7 @@ module LogParser
     end
     return logfile
   end
-  
+
   # Parse whimsy_access and return interesting entries
   # @param f filename of whimsy_access.log or .gz
   # @return array of reduced, scrubbed entries as hashes
@@ -88,7 +88,7 @@ module LogParser
     end
     return logs
   end
-  
+
   # Collate/partition whimsy_access entries by app areas
   # @param logs full set of items to scan
   # @return apps categorized by apphash, with REMAINDER entry all others not 
captured
@@ -122,7 +122,7 @@ module LogParser
     end
     return apps
   end
-  
+
   # Get a simplistic hash report of access entries
   # @param f filepath to whimsy_access.log
   # @return app_report, misses_data
@@ -132,7 +132,7 @@ module LogParser
     apps = collate_whimsy_access(hits)
     return apps, miss
   end
-  
+
   # Parse error.log and return interesting entries
   # @param f filename of error.log or .gz
   # @param logs hash to append to (created if nil) 
@@ -163,7 +163,7 @@ module LogParser
     end
     return logs
   end
-  
+
   # Parse error.log* files in dir and return interesting entries
   # @param d directory to scan for error.log*
   # @return hash of arrays of interesting entries
@@ -173,7 +173,7 @@ module LogParser
     end
     return logs
   end
-  
+
   # Parse whimsy_error.log and return interesting entries
   # @param f filename of error.log or .gz
   # @return hash of string of interesting entries
@@ -195,7 +195,7 @@ module LogParser
     end
     return logs
   end
-  
+
   # Parse whimsy_error.log* files in dir and return interesting entries
   # @param d directory to scan for whimsy_error.log*
   # @return hash of arrays of interesting entries
@@ -205,7 +205,7 @@ module LogParser
     end
     return logs
   end
-  
+
   # Get a list of all current|available error logs interesting entries
   # @param current - only scan current day? or scan all week's logs
   # @param d directory to scan for *error.log*
diff --git a/lib/whimsy/sitestandards.rb b/lib/whimsy/sitestandards.rb
index 0f22ece..835867d 100644
--- a/lib/whimsy/sitestandards.rb
+++ b/lib/whimsy/sitestandards.rb
@@ -11,7 +11,7 @@ module SiteStandards
   CHECK_TYPE      = 'type'      # true = validation checks href/url; false = 
checks text node
   CHECK_POLICY    = 'policy'    # URL to policy statement for this check
   CHECK_DOC       = 'doc'       # Explanation of what the check is looking for
-  
+
   # Checks done only for TLPs (i.e. not podlings)
   TLP_CHECKS = {
     'uri' => { # Custom: merely saves uri of site
@@ -119,7 +119,7 @@ module SiteStandards
       CHECK_DOC => 'Projects SHOULD add a copy of their logo to 
https://www.apache.org/logos/ to be included in ASF homepage.',
     },
   }
-  
+
   SITE_PASS       = 'label-success'
   SITE_WARN       = 'label-warning'
   SITE_FAIL       = 'label-danger'
@@ -138,24 +138,24 @@ module SiteStandards
       SITE_PASS
     end
   end
-  
+
   # Get hash of checks to be done for tlp | podling
   # @param tlp true if project; podling otherwise
   def get_checks(tlp = true)
     tlp ? (return TLP_CHECKS.merge(COMMON_CHECKS)) : (return 
PODLING_CHECKS.merge(COMMON_CHECKS))
   end
-  
+
   # Get filename of check data for tlp | podling
   # @param tlp true if project; podling otherwise
   def get_filename(tlp = true)
     tlp ? (return 'site-scan.json') : (return 'pods-scan.json')
   end
-  
+
   # Get URL to default filename location on server
   def get_url(is_local = true)
     is_local ? (return '../../../www/public/') : (return 
'https://whimsy.apache.org/public/')
   end
-  
+
   # Get check data for tlp | podling
   #   Uses a local_copy if available; w.a.o/public otherwise
   # @param tlp true if project; podling otherwise
@@ -172,7 +172,7 @@ module SiteStandards
       end
     return sites, crawl_time
   end
-  
+
   # Analyze data returned from site-scan.rb by using checks[CHECK_VALIDATE] 
regex
   #   If value =~ CHECK_VALIDATE, SITE_PASS
   #   If value is present (presumably from CHECK_TEXT|CAPTURE), then SITE_WARN
@@ -190,7 +190,7 @@ module SiteStandards
         counts[nam][SITE_FAIL] = sites.select{ |k, site| site[nam].nil? }.count
         counts[nam][SITE_WARN] = sites.size - counts[nam][SITE_PASS] - 
counts[nam][SITE_FAIL]
       end
-      
+
       return [
         counts, {
         SITE_PASS => '# Sites with links to primary ASF page',
diff --git a/tools/collate_minutes.rb b/tools/collate_minutes.rb
index c665bf7..67a80b6 100755
--- a/tools/collate_minutes.rb
+++ b/tools/collate_minutes.rb
@@ -745,7 +745,7 @@ def layout(title = nil)
   end
 
   # Adjust the page header
-  
+
   # find the intro para; assume it is the first para with a strong tag
   # then back up to the main container class for the page content
   section = $calendar.at('.container p strong').parent.parent
diff --git a/tools/comdevtalks.rb b/tools/comdevtalks.rb
index f3c8feb..1f7c4a5 100644
--- a/tools/comdevtalks.rb
+++ b/tools/comdevtalks.rb
@@ -36,9 +36,9 @@ def get_talks_submitters()
   # return parse_talks
   # HACK static data until we have generated public/ or other format
   talks = {"Apache_Way_2017"=>{"title"=>"Apache Way: Effective Open Source 
Project Management", "teaser"=>"Learn how to manage long-lived diverse open 
source project communities by following the behaviors of the Apache Way.", 
"submitter"=>"curcuru", "speakers"=>["curcuru"], "abstract"=>"The \"Apache 
Way\" is the process by which Apache Software Foundation projects are managed. 
It has evolved 18 years and has produced over 170 highly successful open source 
Apache projects. But what is it  [...]
-  
+
   submitters = {"curcuru"=>{"name"=>"Shane Curcuru", 
"website"=>"http://communityovercode.com/";, "twitter"=>"shanecurcuru", 
"facebook"=>nil, "bio"=>"Shane has been involved at the Apache Software 
Foundation (ASF) since 1999, and serves as Director and VP of Brand Management, 
setting trademark policies and helping all 200+ Apache projects implement and 
defend their brands.\n\nOtherwise, Shane is: a father and husband, a friend, a 
geek, a Member of the ASF, a baker, and a punny guy.  Oh, a [...]
-  
+
   return talks, submitters
 end
 
diff --git a/tools/download_check.rb b/tools/download_check.rb
index f9b4c6c..4070a9f 100755
--- a/tools/download_check.rb
+++ b/tools/download_check.rb
@@ -320,7 +320,7 @@ def _checkDownloadPage(path, tlp, version)
 
   # check the main body
   body = check_page(path)
-  
+
   return unless body
 
   hasDisclaimer = body.gsub(%r{\s+},' ').include? 'Incubation is required of 
all newly accepted'
@@ -348,9 +348,9 @@ def _checkDownloadPage(path, tlp, version)
   end
 
   deprecated = Time.parse('2018-01-01')
-  
+
   links = get_links(body)
-  
+
   # check KEYS link
   # TODO: is location used by hc allowed, e.g.
   #   https://www.apache.org/dist/httpcomponents/httpclient/KEYS
@@ -387,7 +387,7 @@ def _checkDownloadPage(path, tlp, version)
       E 'Could not find KEYS link'
     end
   end
-  
+
   # check for verify instructions
   bodytext = body.gsub(/\s+/,' ') # single line
   if VERIFY_TEXT.any? {|text| bodytext.include? text}
@@ -395,19 +395,19 @@ def _checkDownloadPage(path, tlp, version)
   else
     E 'Could not find statement of the need to verify downloads'
   end
-  
+
   # Check if GPG verify has two parameters
   body.scan(%r{^.+gpg --verify.+$}){|m|
     unless m =~ %r{gpg --verify\s+\S+\.asc\s+\S+}
       W "gpg verify should specify second param: #{m.strip} 
see:\nhttps://www.apache.org/info/verification.html#specify_both";
     end
   }
-  
+
   # check if page refers to md5sum
   body.scan(%r{^.+md5sum.+$}){|m|
     W "Found md5sum: #{m.strip}"
   }
-  
+
   # Check archives have hash and sig
   vercheck = Hash.new() # key = archive name, value = array of hash/sig
 
@@ -461,7 +461,7 @@ def _checkDownloadPage(path, tlp, version)
     end
   end
 
-  
+
   # did we find all required elements?
   vercheck.each do |k,v|
     typ = v.shift
diff --git a/tools/mboxhdr2csv.rb b/tools/mboxhdr2csv.rb
index 05c9990..b824b6e 100644
--- a/tools/mboxhdr2csv.rb
+++ b/tools/mboxhdr2csv.rb
@@ -163,7 +163,7 @@ module MailUtils
       end
     end
   end
-  
+
   # Get {MAILS: [{date, who, subject, flag},...\, TOOLS: [{...},...] } from 
the specified list for a month
   # May cache data in mailroot/yearmonth.json
   # Returns empty hash if error or if can't find month
@@ -213,7 +213,7 @@ module MailUtils
       emails[TOOLCOUNT][mail[TOOLS]] += 1
     end
     emails[TOOLCOUNT] = emails[TOOLCOUNT].sort_by { |k,v| -v}.to_h
-    
+
     emails[MAILS].sort_by! { |email| email[DATE] }
     emails[MAILCOUNT] = Hash.new {|h, k| h[k] = 0 }
     emails[MAILS].each do |mail|
@@ -421,7 +421,7 @@ def optparse
   options = {}
   OptionParser.new do |opts|
     opts.on('-h') { puts opts; exit }
-    
+
     opts.on('-dDIRECTORY', '--directory DIRECTORY', 'Local directory to read 
existing mboxes and dump output in (default: .)') do |d|
       if File.directory?(d)
         options[:dir] = d
@@ -444,7 +444,7 @@ def optparse
       exit 1
     end
   end
-  
+
   return options
 end
 
diff --git a/tools/namemap.rb b/tools/namemap.rb
index 484e5ac..a03cbfc 100644
--- a/tools/namemap.rb
+++ b/tools/namemap.rb
@@ -29,7 +29,7 @@ module NameMap
   ID = 'id'
   MAIL = 'mail'
   NAME = 'name'
-  
+
   TEST_COMMITTERS = [ # Drawn from Whimsy's committer data
     {
       'id' => 'curcuru',
@@ -72,7 +72,7 @@ module NameMap
       ],
     },
   ]
-  
+
   TEST_OTHER = [ # Any other system must provide id,name,email for each user
     {
       'id' => 'curcuru',
@@ -105,7 +105,7 @@ module NameMap
       'mail' => '[email protected]',
     },
   ]
-  
+
   # Read committer accounts
   # @param io stream to read JSON from
   # @return json data
@@ -116,7 +116,7 @@ module NameMap
       return TEST_COMMITTERS
     end
   end
-  
+
   # Read other system accounts
   # TODO Depends on file format of exported other system accounts
   # @param f filename to read from
@@ -124,7 +124,7 @@ module NameMap
   def get_other(f)
     return TEST_OTHER
   end
-  
+
   # Transform committer accounts into lookup hashes
   # @param committers array from COMMITTER_JSON
   # @return byid, bymail - hashes for lookups to committer accounts
@@ -141,7 +141,7 @@ module NameMap
     end
     return byid, bymail
   end
-  
+
   # Transform other system accounts into lookup hashes
   # @param other array of hashes including 'id', 'name', 'mail' keys
   # @return byid, bymail - hashes for lookups to other system accounts
@@ -156,7 +156,7 @@ module NameMap
     end
     return byid, bymail
   end
-  
+
   # Compare committer ids to other system account ids
   # @param cids - hash by id of committer data
   # @param cmails - hash by email of [committer1, ...]
@@ -166,7 +166,7 @@ module NameMap
   def compare(cids, cmails, oids, omails)
     matches = {}
     crossmatches = {}
-    
+
     # For every committer, check for a matching account in other system
     cids.each do |cid, committer|
       # If the other system has identical id as committer
@@ -191,7 +191,7 @@ module NameMap
         matches[cid] = "NONE:no id match found"
       end
     end
-    
+
     # Also cross-check email addresses of other system to all committer emails
     omails.each do |omail, other_accounts|
       if cmails.has_key?(omail)
@@ -220,7 +220,7 @@ module NameMap
     end
     return matches, crossmatches
   end
-  
+
   # Compare a committer list to another system's list
   # @param cio io stream to read committer accounts from
   # @param ofile filename to read other system accounts from
@@ -231,7 +231,7 @@ module NameMap
     matches, crossmatches = compare(cids, cmails, oids, omails)
     return matches, crossmatches
   end
-  
+
   # Check for email duplicates in committer roster
   # @return hash of any committers with duplicate emails
   # @return histogram of how many aliases committers list
diff --git a/tools/ponyapi.rb b/tools/ponyapi.rb
index be0c68a..d527ff2 100755
--- a/tools/ponyapi.rb
+++ b/tools/ponyapi.rb
@@ -16,7 +16,7 @@ module PonyAPI
   PONYMBOX  = PONYHOST + 
'api/mbox.lua?list=%{list}@%{domain}&date=%{year}-%{month}' # 
[email protected]&date=2016-06 becomes board-apache-org-201707.mbox
   FILEMBOX  = "%{list}-%{domNoDot}-%<year>.04d%<month>.02d.mbox" # used to 
generate output file name
   PONYPREFS = PONYHOST + 'api/preferences.lua' # => preferences.json
-  
+
   extend self
 
   # Get summary of all mailing lists by domain
@@ -116,7 +116,7 @@ module PonyAPI
       puts "ERROR:get_pony_stats(#{uri.request_uri}) returned code 
#{response.code.inspect}"
     end
   end
-  
+
   # Get multiple years/months of public stats as json
   def get_pony_stats_many(dir, list, subdomain, years, months, cookie=nil)
     cookie=get_cookie() if cookie == 'prompt'
@@ -126,7 +126,7 @@ module PonyAPI
       end
     end
   end
-  
+
   # Download one month as mbox
   # Caveats: uses response's encoding; overwrites existing .json file
   # Must supply cookie = 'ponymail-logged-in-cookie' if a private list
@@ -142,7 +142,7 @@ module PonyAPI
       puts "ERROR:get_public_mbox(#{uri}) returned code 
#{response.code.inspect}"
     end
   end
-  
+
   # Get multiple years/months of mboxes
   def get_pony_mbox_many(dir, list, subdomain, years, months, cookie=nil)
     cookie=get_cookie() if cookie == 'prompt'
diff --git a/tools/ponypoop.rb b/tools/ponypoop.rb
index 8be7e18..8308267 100755
--- a/tools/ponypoop.rb
+++ b/tools/ponypoop.rb
@@ -43,7 +43,7 @@ def analyze_threads(threads)
     end
     p "Hsh: #{threads.class} - #{threads.size} at #{threads['epoch']} 
#{max}/#{total}"
   end
-  
+
   return max, total
 end
 
@@ -135,7 +135,7 @@ def run_analyze_stats(dir, list, subject_regex)
   File.open("#{output}.json", "w") do |f|
     f.puts JSON.pretty_generate(results)
   end
-  
+
   results
 end
 
@@ -149,7 +149,7 @@ def optparse
   options = {}
   OptionParser.new do |opts|
     opts.on('-h') { puts opts; exit }
-    
+
     opts.on('-dDIRECTORY', '--directory DIRECTORY', 'Local directory to 
dump/find .json files (default: .)') do |d|
       if File.directory?(d)
         options[:dir] = d
@@ -160,21 +160,21 @@ def optparse
     opts.on(:REQUIRED, '-lLISTNAME', '--list LISTNAME', 'Root listname to 
download stats archive from (required; board or trademarks or...)') do |l|
       options[:list] = l.chomp('@')
     end
-    
+
     opts.on('-cCOOKIE', '--cookie COOKIE', 'For private lists REQUIRED, your 
ponymail logged-in cookie value') do |c|
       options[:cookie] = c
     end
     opts.on('-sSUBDOMAIN', '--subdomain SUBDOMAIN', 'Root @ subdomain 
.apache.org (only if project list; hadoop or community or...) to download stats 
archive from') do |s|
       options[:subdomain] = s.chomp('@.')
     end
-    
+
     opts.on('-p', '--pull', 'Pull down stats JSON files into -d dir 
(otherwise, default analyzes existing stats JSON in dir)') do |p|
       options[:pull] = true
     end
     opts.on('-m', '--mbox', 'Pull down mbox files into -d dir') do |p|
       options[:mbox] = true
     end
-    
+
     opts.on('-yYEAR', '--year YEAR', 'Only pull down single year, instead of 
2010 thru now') do |y|
       options[:year] = [ y ]
     end
@@ -189,7 +189,7 @@ def optparse
       exit 1
     end
   end
-  
+
   return options
 end
 
diff --git a/tools/pubsub2rake.rb b/tools/pubsub2rake.rb
index a3b2ce4..24ff23c 100755
--- a/tools/pubsub2rake.rb
+++ b/tools/pubsub2rake.rb
@@ -82,7 +82,7 @@ class PubSub
     puts stamp "Pubsub thread finished %s..." % (@updated ? '(updated) ' : '')
     if @restartable
       STDERR.puts stamp 'restarting'
-    
+
       # relaunch script after a one second delay
       sleep 1
       exec RbConfig.ruby, __FILE__, *ARGV
@@ -106,7 +106,7 @@ if $0 == __FILE__
   # depth: 'skip' == ignore completely
   # files: only need to update if path matches one of the files
   # depth: 'files' only need to update for top level files
-  
+
   # The first segment of the url is the repo name, e.g. asf or infra
   # The second segment is the subdir within the repo.
   # The combination of the two are used for the pubsub path, for example:
diff --git a/tools/site-scan.rb b/tools/site-scan.rb
index 1346ddc..3cd0a69 100755
--- a/tools/site-scan.rb
+++ b/tools/site-scan.rb
@@ -107,7 +107,7 @@ def parse(id, site, name)
         data[:license] = a_href
       end
     end
-    
+
     %w(thanks security sponsorship).each do |check|
       if a_text =~ 
SiteStandards::COMMON_CHECKS[check][SiteStandards::CHECK_CAPTURE]
         begin
@@ -189,7 +189,7 @@ else
     end
     results[committee.name] = parse(committee.name, committee.site, 
committee.display_name)
   end
-  
+
   # Scan podlings that have a website
   ASF::Podling.list.each do |podling| 
     if podling.status == 'current' and podling.podlingStatus[:website]
diff --git a/www/apmail/mods.cgi b/www/apmail/mods.cgi
index c7371c5..26583c5 100755
--- a/www/apmail/mods.cgi
+++ b/www/apmail/mods.cgi
@@ -73,7 +73,7 @@ _html do
           emails += moderators.map(&:downcase) 
         end 
       end 
- 
+
       _ul do 
         emails.uniq.sort.each do |email| 
           _li! { _a email, href: email } 
@@ -145,7 +145,7 @@ _html do
             end
           end
         end
-  
+
       if href
         _h2_ {_a "#{list}@#{domain}", href: href}
       else
diff --git a/www/board/agenda/models/agenda.rb 
b/www/board/agenda/models/agenda.rb
index f51a0ca..8e7f4bf 100755
--- a/www/board/agenda/models/agenda.rb
+++ b/www/board/agenda/models/agenda.rb
@@ -99,7 +99,7 @@ class Agenda
 
     file.untaint if file =~ /\Aboard_\w+_[\d_]+\.txt\z/
     path = File.expand_path(file, FOUNDATION_BOARD).untaint
-    
+
     return Agenda[file][:parsed] unless File.exist? path
 
     # Does the working copy have more recent data?
diff --git a/www/board/agenda/models/minutes.rb 
b/www/board/agenda/models/minutes.rb
index fa916c8..940e868 100755
--- a/www/board/agenda/models/minutes.rb
+++ b/www/board/agenda/models/minutes.rb
@@ -202,7 +202,7 @@ class Minutes
     index.sub! /\sProject$/, ''
     index.sub! /\sPMC$/, ''
     index.sub! /\sProject\s/, ' '
-  
+
     @@notes[index]
   end
 end
diff --git a/www/board/agenda/routes.rb b/www/board/agenda/routes.rb
index afc8955..580581a 100755
--- a/www/board/agenda/routes.rb
+++ b/www/board/agenda/routes.rb
@@ -141,14 +141,14 @@ get %r{/(\d\d\d\d-\d\d-\d\d)/followup\.json} do |date|
 
   agenda = "board_agenda_#{date.gsub('-','_')}.txt"
   pass unless Agenda.parse agenda, :quick
-  
+
   # select agenda items that have comments
   parsed = Agenda[agenda][:parsed]
   followup = parsed.select {|item| not item['comments'].to_s.empty?}.
     map {|item| [item['title'], {comments: item['comments'], 
       shepherd: item['shepherd'], mail_list: item['mail_list'], count: 0}]}.
     to_h
-  
+
   # count number of feedback emails found in the board archive
   start = Time.parse(date)
   months = Dir['/srv/mail/board/*'].sort[-2..-1]
diff --git a/www/board/agenda/views/actions/commit.json.rb 
b/www/board/agenda/views/actions/commit.json.rb
index c82431e..3a606c7 100644
--- a/www/board/agenda/views/actions/commit.json.rb
+++ b/www/board/agenda/views/actions/commit.json.rb
@@ -135,7 +135,7 @@ Agenda.update(agenda_file, @message) do |agenda|
           end
           action = update if match
         end
-        
+
         # format action item
         replacement.puts "* #{action[:owner]}: #{action[:text]}"
 
diff --git a/www/board/agenda/views/actions/feedback.json.rb 
b/www/board/agenda/views/actions/feedback.json.rb
index 6e84c96..6432f36 100644
--- a/www/board/agenda/views/actions/feedback.json.rb
+++ b/www/board/agenda/views/actions/feedback.json.rb
@@ -65,7 +65,7 @@ Agenda.parse(@agenda, :full).each do |item|
   cc = []
   # we don't want replies to come to secretary@
   bcc = ['[email protected]']
-  
+
   if item['mail_list']
     if item[:attach] =~ /^[A-Z]+/
       cc << "private@#{item['mail_list']}.apache.org".untaint
diff --git a/www/board/agenda/views/actions/post-data.json.rb 
b/www/board/agenda/views/actions/post-data.json.rb
index c2f2c00..d45deca 100644
--- a/www/board/agenda/views/actions/post-data.json.rb
+++ b/www/board/agenda/views/actions/post-data.json.rb
@@ -33,7 +33,7 @@ when 'committee-list'
   id = env.user
 
   committees = {chair: [], member: [], rest: []}
-           
+
   ASF::Committee.pmcs.sort_by {|pmc| pmc.id}.each do |pmc|
     if pmc.chairs.any? {|chair| chair[:id] == id}
       committees[:chair] << pmc.id
@@ -43,7 +43,7 @@ when 'committee-list'
       committees[:rest] << pmc.id
     end
   end 
-      
+
   committees[:chair] + committees[:member] + committees[:rest]
 
 when 'committer-list'
diff --git a/www/board/agenda/views/actions/publish.json.rb 
b/www/board/agenda/views/actions/publish.json.rb
index a0bc31c..60af001 100755
--- a/www/board/agenda/views/actions/publish.json.rb
+++ b/www/board/agenda/views/actions/publish.json.rb
@@ -115,7 +115,7 @@ ASF::SVN.update BOARD_PRIVATE, @message, env, _ do |tmpdir|
   if File.exist? minutes_path
     ASF::SVN.svn_('rm', minutes_path, _)
   end
-  
+
   agenda_path = File.join(tmpdir, "board_agenda_#{@date}.txt")
   ASF::SVN.svn_('update', agenda_path, _)
   if File.exist? agenda_path
diff --git a/www/board/agenda/views/buttons/post.js.rb 
b/www/board/agenda/views/buttons/post.js.rb
index fd365d6..1fa8b81 100644
--- a/www/board/agenda/views/buttons/post.js.rb
+++ b/www/board/agenda/views/buttons/post.js.rb
@@ -30,39 +30,39 @@ class Post < Vue
     _ModalDialog.wide_form.post_report_form! color: 'commented' do
       if @button == 'add item'
         _h4 'Select Item Type'
-  
+
         _ul.new_item_type do
           _li do
             _button.btn.btn_primary 'Change Chair', onClick: selectItem
             _ '- change chair for an existing PMC'
           end
-  
+
           _li do
             _button.btn.btn_primary 'Establish Project', onClick: selectItem
             _ '- direct to TLP project and subproject to TLP'
           end
-  
+
           _li do
             _button.btn.btn_primary 'Terminate Project', onClick: selectItem
             _ '- move a project to the attic'
           end
-  
+
           _li do
             _button.btn.btn_primary 'New Resolution', onClick: selectItem
             _ '- free form entry of a new resolution'
           end
-  
+
           _li do
             _button.btn.btn_info 'Out of Cycle Report', onClick: selectItem
             _ '- report from a PMC not currently on the agenda for this month'
           end
-  
+
           _li do
             _button.btn.btn_success 'Discussion Item', onClick: selectItem
             _ '- add a discussion item to the agenda'
           end
         end
-  
+
         _button.btn_default 'Cancel', data_dismiss: 'modal'
 
       elsif @button == 'Change Chair'
diff --git a/www/board/agenda/views/buttons/publish-minutes.js.rb 
b/www/board/agenda/views/buttons/publish-minutes.js.rb
index f2cc153..519aa57 100644
--- a/www/board/agenda/views/buttons/publish-minutes.js.rb
+++ b/www/board/agenda/views/buttons/publish-minutes.js.rb
@@ -40,7 +40,7 @@ class PublishMinutes < Vue
         # Minutes from previous meetings section of the agenda
         date = @@item.text[/board_minutes_(\d+_\d+_\d+)\.txt/, 1]
         url = document.baseURI.sub(/[-\d]+\/$/, date.gsub('_', '-')) + '.json'
-  
+
         retrieve url, :json do |agenda|
           self.summarize agenda, date
         end
diff --git a/www/board/agenda/views/layout/footer.js.rb 
b/www/board/agenda/views/layout/footer.js.rb
index 622e871..a2c8b6f 100644
--- a/www/board/agenda/views/layout/footer.js.rb
+++ b/www/board/agenda/views/layout/footer.js.rb
@@ -10,7 +10,7 @@
 
 class Footer < Vue
   def render
-    
+
     meeting_day = Minutes.started || Agenda.meeting_day
 
     _footer.navbar.navbar_fixed_bottom class: @@item.color do
diff --git a/www/board/agenda/views/layout/main.js.rb 
b/www/board/agenda/views/layout/main.js.rb
index 189b147..79490c3 100644
--- a/www/board/agenda/views/layout/main.js.rb
+++ b/www/board/agenda/views/layout/main.js.rb
@@ -179,7 +179,7 @@ class Main < Vue
 
     # start Service Worker
     PageCache.register() if PageCache.enabled
-  
+
     # start backchannel
     Events.monitor()
   end
diff --git a/www/board/agenda/views/models/agenda.js.rb 
b/www/board/agenda/views/models/agenda.js.rb
index 8051d1f..0702035 100644
--- a/www/board/agenda/views/models/agenda.js.rb
+++ b/www/board/agenda/views/models/agenda.js.rb
@@ -281,7 +281,7 @@ class Agenda
           end
         end
       end
-      
+
       @@approved = 'tabled'
     end
 
diff --git a/www/board/agenda/views/models/chat.js.rb 
b/www/board/agenda/views/models/chat.js.rb
index de604de..416ea97 100644
--- a/www/board/agenda/views/models/chat.js.rb
+++ b/www/board/agenda/views/models/chat.js.rb
@@ -22,7 +22,7 @@ class Chat
     # synchonize chat logs
     if defined? BroadcastChannel
       channel = BroadcastChannel.new('chatsync')
-      
+
       # ask if there are any earlier data
       channel.postMessage type: 'query', start: @@start
 
diff --git a/www/board/agenda/views/pages/adjournment.js.rb 
b/www/board/agenda/views/pages/adjournment.js.rb
index a4c84cc..831832b 100644
--- a/www/board/agenda/views/pages/adjournment.js.rb
+++ b/www/board/agenda/views/pages/adjournment.js.rb
@@ -194,7 +194,7 @@ class PMCActions < Vue
         Todos[todo_type].each do |todo| 
           if todo.resolution == item.title
             minutes = Minutes.get(item.title)
- 
+
             resolution = {
               action: todo_type,
               name: todo.name,
diff --git a/www/board/agenda/views/pages/fy23.js.rb 
b/www/board/agenda/views/pages/fy23.js.rb
index 2c3f97a..46b4bc7 100644
--- a/www/board/agenda/views/pages/fy23.js.rb
+++ b/www/board/agenda/views/pages/fy23.js.rb
@@ -303,7 +303,7 @@ class FY23 < Vue
                           #        = 5*Fy18 + 3*(FY23-FY18)
                           #        = 5*Fy18 + 3*FY23 - 3 * FY18
                           #        = 2*Fy18 + 3*FY23
-          
+
                    2*100 + 
                           # EA adjustment: instead of ramping down, the
                           # reduction in expense is immediate and constant.
diff --git a/www/board/agenda/views/pages/report.js.rb 
b/www/board/agenda/views/pages/report.js.rb
index aea8c17..64450a9 100644
--- a/www/board/agenda/views/pages/report.js.rb
+++ b/www/board/agenda/views/pages/report.js.rb
@@ -321,7 +321,7 @@ class Report < Vue
 
     return text
   end
-  
+
   # expand president's attachments
   def president_attachments(text)
     match = text.match(/Additionally, please see Attachments (\d) through 
(\d)/)
diff --git a/www/board/agenda/views/pages/secrets.js.rb 
b/www/board/agenda/views/pages/secrets.js.rb
index 50f8ed6..1a23671 100644
--- a/www/board/agenda/views/pages/secrets.js.rb
+++ b/www/board/agenda/views/pages/secrets.js.rb
@@ -39,7 +39,7 @@ class InsiderSecrets < Vue
         enough to jog your memory?  Click on the date link for this action item
         to see the report for that month.
       ) }
-      
+
       _li { _p { 
         _ %q(
           Need to see Whimsy server status, or get debugging info to help 
diff --git a/www/board/calendar.cgi b/www/board/calendar.cgi
index 2e83e7e..36552c9 100755
--- a/www/board/calendar.cgi
+++ b/www/board/calendar.cgi
@@ -50,14 +50,14 @@ _html do
     Future meeting times, presuming that the time of the meeting is
     set to #{@time} #{@zone}, rotating each meeting time by #{rotate} hours.
   }
-  
+
   if rotate == 0
     _p.bg_danger %{
       This background color indicate a local time change from the previous
       month.
     }
   end
-  
+
   _table.table do
     _thead do
      _tr do
diff --git a/www/brand/list.cgi b/www/brand/list.cgi
index 5bc18fd..53ce523 100755
--- a/www/brand/list.cgi
+++ b/www/brand/list.cgi
@@ -51,7 +51,7 @@ def csv2json
       end
     end
   end
-  
+
   docket
 end
 
diff --git a/www/brand/replyedit.cgi b/www/brand/replyedit.cgi
index c0140b4..eb941d7 100755
--- a/www/brand/replyedit.cgi
+++ b/www/brand/replyedit.cgi
@@ -50,7 +50,7 @@ _html do
           end
         end
       end
-      
+
       _h3 'Edit Your Reply'
       _hr
       _p 'Dear user, thank you for respecting Apache Brands.  Blah blah, foo 
bar, blah (this is boilerplate content) '
diff --git a/www/brand/replylist.cgi b/www/brand/replylist.cgi
index 5f305cc..fb8b7cd 100755
--- a/www/brand/replylist.cgi
+++ b/www/brand/replylist.cgi
@@ -110,7 +110,7 @@ _html do
         end
       end
     end
-    
+
     _script %{
       var table = $(".table").stupidtable();
       table.on("aftertablesort", function (event, data) {
diff --git a/www/brand/replyui.cgi b/www/brand/replyui.cgi
index 55a0b5e..2d9a466 100755
--- a/www/brand/replyui.cgi
+++ b/www/brand/replyui.cgi
@@ -50,10 +50,10 @@ _html do
           end
         end
       end
-      
+
       _h3 'Choose A Reply to edit and send for this question'
       _p 'This could be a choicelist or similar to select from avaialble 
Replies'
-      
+
       _ul do
         _li do 
           _ 'BOOK | Point to FAQ about published books, magazines, etc.'
diff --git a/www/committers/index.cgi b/www/committers/index.cgi
index d49c2ea..ab9ef5a 100755
--- a/www/committers/index.cgi
+++ b/www/committers/index.cgi
@@ -43,7 +43,7 @@ _html do
         meeting: '/committers/tools#meeting'
       }
     ) do
-    
+
       _h2 "Useful Committer-only Tools (require login)"
       _ul do
         MISC.each do |url, desc|
diff --git a/www/committers/subscribe.cgi b/www/committers/subscribe.cgi
index 3f69eb6..99a9785 100755
--- a/www/committers/subscribe.cgi
+++ b/www/committers/subscribe.cgi
@@ -104,7 +104,7 @@ _html do
         end
       }
     ) do
-      
+
       _form method: 'post' do
         _input type: 'hidden', name: 'request', value: 'sub'
         _fieldset do
@@ -212,10 +212,10 @@ _html do
           _p 'Both email and list to subscribe to are required!'
           break
         end
-        
+
         # Each user can only subscribe once to each list in each timeslot
         fn = "#{$USER}-#{@list}.json".untaint
-        
+
         vars = {
           version: FORMAT_NUMBER,
           availid: $USER,
@@ -236,10 +236,10 @@ _html do
 
           _pre request
         end
-        
+
         SUBREQ = ASF::SVN.svnpath!('subreq')
         SUBREQ.sub! '/subreq', '/unsubreq' if @request == 'unsub'
-        
+
         rc = 999
 
         Dir.mktmpdir do |tmpdir|
@@ -265,18 +265,18 @@ _html do
               File.write(fn, request + "\n")
               ASF::SVN.svn('add', fn)
             end
- 
+
             if @request != 'unsub'
               message = "#{@list} += #{$USER}"
             else
               message = "#{@list} -= #{$USER}"
             end
-          
+
             options = credentials.merge({msg: message})
             rc = ASF::SVN.svn_('commit', fn, _, options)
           end
         end
-        
+
         if rc == 0
           _div.alert.alert_success role: 'alert' do
             _p do
diff --git a/www/committers/tm-report.cgi b/www/committers/tm-report.cgi
index c66e19f..9e905a0 100755
--- a/www/committers/tm-report.cgi
+++ b/www/committers/tm-report.cgi
@@ -155,7 +155,7 @@ def emit_form()
           end
         end
       end
-      
+
       emit_input(label: 'Description of misuse - why you believe this is 
improper', name: 'description', required: true,
         rows: 3, icon: 'glyphicon-question-sign', iconlink: 
'https://www.apache.org/foundation/marks/resources', 
         helptext: "Briefly describe in your own words why this use doesn't 
give proper credit to the Apache project")
@@ -198,12 +198,12 @@ def send_form(formdata: {})
   pmc_list = ASF::Committee.find(formdata['project']).mail_list
   cc_list = ["private@#{pmc_list}.apache.org".untaint, frm]
   to_list = BRANDLIST.untaint
-  
+
   if true # TESTING mode
     to_list = "[email protected]"
     cc_list = ''
   end # TESTING mode
-  
+
   ASF::Mail.configure
   mail = Mail.new do
     from  frm
@@ -219,7 +219,7 @@ def send_form(formdata: {})
   rescue Exception => e
     formdata['errors'] = "Bogosity! mail.deliver raised: #{e.message[0..255]}"
   end
-  
+
   # Tell user what we did
   _div.well.well_lg do
     _div.bg_danger "BETA - THIS FORM IS NOT COMPLETE YET - DEBUGGING - 
formdata we would have mailed out"
diff --git a/www/events/other.cgi b/www/events/other.cgi
index 063542a..f06a816 100755
--- a/www/events/other.cgi
+++ b/www/events/other.cgi
@@ -39,7 +39,7 @@ counts = cols.keys.map do |field|
   matches = conflist.select do |conf|
     conf[SPEAKERKIT] && conf[SPEAKERKIT][field]
   end
-  
+
   [field, matches.count]
 end
 counts = counts.to_h
@@ -108,7 +108,7 @@ _html do
         end
       end
     end
-    
+
     _script %{
       var table = $(".table").stupidtable();
       table.on("aftertablesort", function (event, data) {
diff --git a/www/fundraising/invoice.cgi b/www/fundraising/invoice.cgi
index 3430188..d11188c 100755
--- a/www/fundraising/invoice.cgi
+++ b/www/fundraising/invoice.cgi
@@ -248,7 +248,7 @@ _html do
                 }
              }
           }
- 
+
           // Turn it into a $ figure with commas
           // TODO Support other currencies
           total = total.toFixed(2);
@@ -414,7 +414,7 @@ _html do
       end
 
       _p
-      
+
       _table_ style: "margin-left: auto" do
         _tbody do
           _tr do
diff --git a/www/incubator/graduated.cgi b/www/incubator/graduated.cgi
index 0b8937d..6e0641d 100755
--- a/www/incubator/graduated.cgi
+++ b/www/incubator/graduated.cgi
@@ -190,7 +190,7 @@ _html do
           end
         end
       end
-        
+
     end
   end
 end
diff --git a/www/incubator/signoff.cgi b/www/incubator/signoff.cgi
index 8f8571d..0fad816 100755
--- a/www/incubator/signoff.cgi
+++ b/www/incubator/signoff.cgi
@@ -24,7 +24,7 @@ def get_mentor_signoffs()
   ASF::Person.preload('cn')
   ASF::ICLA.preload()
   people = Hash[ASF::Person.list.map {|person| [person.public_name, 
person.id]}]
-  
+
   agendas = Dir[File.join(BOARD, 'board_agenda_*.txt'),
     File.join(BOARD, 'archived_agendas', 'board_agenda_*.txt')]
   agendas = agendas.sort_by {|file| File.basename(file)}[-13..-1]
@@ -33,7 +33,7 @@ def get_mentor_signoffs()
   else
     agendas.pop
   end
-  
+
   # projects = URI.parse('http://incubator.apache.org/projects/')
   # table = Nokogiri::HTML(Net::HTTP.get(projects)).at('table')
   # # extract a list of [podling names, table row]
@@ -42,7 +42,7 @@ def get_mentor_signoffs()
   #   next if tds.empty?
   #   [tds.last.text, tr]
   # end
-  
+
   mentors = {}
   podlings = {}
   agendas.each do |file|
@@ -55,14 +55,14 @@ def get_mentor_signoffs()
       # allow for reports where comments have been joined to the previous line
       name.sub! %r{ Comments:.*}, ''
       name.sub! /\s+\(.*?\)/, ''
-      
+
       mentors[name] = [] unless mentors[name]
       mentors[name] << {
         date: date,
         checked: !check.strip.empty?,
         podling: podling
       }
-      
+
       podlings[podling] = Hash.new{|h,k| h[k] = [] } unless podlings[podling]
       podlings[podling][date] << [name, !check.strip.empty?]
     end
@@ -102,7 +102,7 @@ _html do
       end
     }
   ) do
-    
+
     _whimsy_panel_table(
       title: "Podling Signoffs By Mentor",
       helpblock: -> {
@@ -145,7 +145,7 @@ _html do
         end
       end
     end
-    
+
     _whimsy_panel_table(
       title: "Podling Signoffs By Podling",
       helpblock: -> {
@@ -182,6 +182,6 @@ _html do
         end
       end
     end
-    
+
   end
 end
diff --git a/www/members/archivers.cgi b/www/members/archivers.cgi
index a03d657..1ff757b 100755
--- a/www/members/archivers.cgi
+++ b/www/members/archivers.cgi
@@ -76,7 +76,7 @@ _html do
         end
       }
     ) do
-      
+
     _table.table do
       _tr do
         _th 'id', data_sort: 'string'
@@ -114,7 +114,7 @@ _html do
           mino = 'Missing'
           options[:mino]={class: 'warning'}
         end 
-        
+
         mbox = arcs.select{|e| e[1] == :MBOX}.map{|e| e[2]}.uniq.join('')
 
         next if mbox == 'restricted' # Don't show these
@@ -143,7 +143,7 @@ _html do
           mail_archive = 'Missing'
           options[:mail_archive] = {class: 'warning'}
         end
-          
+
         markmail = arcs.select{|e| e[1] == :MARKMAIL}.map{|e| 
e[2]}.uniq.join('')
         if ! markmail.empty?
           options[:markmail] = {class: 'danger'} if pubprv && markmail != 
pubprv  
@@ -153,7 +153,7 @@ _html do
           markmail = 'Missing'
           options[:markmail] = {class: 'warning'}
         end
-              
+
         # must be done last as it changes pubprv
         unless pubprv
           pubprv = 'Not listed in bin/.archives'
@@ -174,7 +174,7 @@ _html do
             _ '@'
             _ dom
           end
-          
+
           _td pubprv, options[:pubprv]
           _td mino, options[:mino]
           _td mbox, options[:mbox]
diff --git a/www/members/attendance-xcheck.cgi 
b/www/members/attendance-xcheck.cgi
index 7d8c647..ea1ffb4 100755
--- a/www/members/attendance-xcheck.cgi
+++ b/www/members/attendance-xcheck.cgi
@@ -51,7 +51,7 @@ _html do
         _li name
       end
     end
-    
+
     _h2_ 'Listed in members.txt but not listed as attending a members meeting.'
     _table do
       _thead do
diff --git a/www/members/inactive.cgi b/www/members/inactive.cgi
index 7d5a0ab..e4f936f 100755
--- a/www/members/inactive.cgi
+++ b/www/members/inactive.cgi
@@ -126,7 +126,7 @@ _html do
             end
           end
         end
-        
+
         _div.status do
           _form method: 'post' do
             _p %{
diff --git a/www/members/index.cgi b/www/members/index.cgi
index 1e08a2e..a19a1b5 100755
--- a/www/members/index.cgi
+++ b/www/members/index.cgi
@@ -62,7 +62,7 @@ _html do
         meeting: '/committers/tools#meeting'
       }
     ) do
-    
+
       _h2 "Tools related to Member's Meetings (Nominations, Voting, Proxy, 
etc.)"
       _ul do
         MEETING.each do |url, desc|
diff --git a/www/members/meeting-util.rb b/www/members/meeting-util.rb
index e0996d1..b4f2f11 100644
--- a/www/members/meeting-util.rb
+++ b/www/members/meeting-util.rb
@@ -38,13 +38,13 @@ class MeetingUtil
     end
     return num_members, quorum_need, num_proxies, attend_irc
   end
-  
+
   # get list of proxy volunteers
   def self.getVolunteers(mtg_dir)
     lines = IO.read(File.join(mtg_dir, 'proxies'))
     # split by ---- underlines, then by blank lines; pick second para and drop 
leading spaces
     volunteers = lines.split(/^-----------/)[1].split(/\n\n/)[1].scan(/^\ 
+(\S.*$)/).flatten
-    
+
   end
   # Get info about current users's proxying
   # @return "help text", ["id | name (proxy)", ...] if they are a proxy for 
other(s)
@@ -75,7 +75,7 @@ class MeetingUtil
       return help, copypasta
     end
   end
-  
+
   # Get the latest available Meetings dir
   def self.get_latest(mtg_root)
     return Dir[File.join(mtg_root, '2*')].sort.last
diff --git a/www/members/meeting.cgi b/www/members/meeting.cgi
index ad08a51..458b4b3 100755
--- a/www/members/meeting.cgi
+++ b/www/members/meeting.cgi
@@ -178,7 +178,7 @@ _html do
           end
         end
       end
-      
+
       _div id: 'seconds'
       _whimsy_panel("Timeline: Seconds Period (last ten days before meeting)", 
style: 'panel-default') do
         _p do
@@ -197,7 +197,7 @@ _html do
           end
         end
       end
-      
+
       _div id: 'firsthalf'
       _whimsy_panel("Timeline: First Half Of Meeting on IRC (at 
#{m1_date.strftime(DTFORMAT)})", style: 'panel-primary') do
         _p do
@@ -231,7 +231,7 @@ _html do
           end
         end
       end
-      
+
       _div id: 'recess'
       _whimsy_panel("Timeline: Meeting Recess - Time To Vote Via Email (approx 
40+ hours)", style: 'panel-info') do
         _p do
@@ -251,7 +251,7 @@ _html do
           end
         end
       end
-      
+
       _div id: 'secondhalf'
       _whimsy_panel("Timeline: Second Half Of Meeting (at 
#{m2_date.strftime(DTFORMAT)})", style: 'panel-primary') do
         _p do
@@ -274,7 +274,7 @@ _html do
           end
         end
       end
-      
+
       _div id: 'after'
       _whimsy_panel("Timeline: After This Year's Meeting", style: 
'panel-default') do
         _p do 
@@ -293,10 +293,10 @@ _html do
           _ ' to formally invite the new member to fill out the application 
form.  Applications must be signed and submitted to the secretary within 30 
days of the meeting to be valid.'
         end
       end
-      
+
       # Most/all of these links should already be included above
       emit_meeting(cur_mtg_dir, svn_mtg_dir, m1_date, num_members, 
quorum_need, num_proxies, attend_irc)
-      
+
       _div id: 'meeting-history'
       _whimsy_panel("Member Meeting History", style: 'panel-info') do
         all_mtg = Dir[File.join(MEETINGS, '19*'), File.join(MEETINGS, 
'2*')].sort
diff --git a/www/members/memberless-pmcs.cgi b/www/members/memberless-pmcs.cgi
index ca449b9..38b631f 100755
--- a/www/members/memberless-pmcs.cgi
+++ b/www/members/memberless-pmcs.cgi
@@ -65,7 +65,7 @@ _html do
           end
         end
       end
-      
+
       _script %{
         var table = $(".table").stupidtable();
         table.on("aftertablesort", function (event, data) {
diff --git a/www/members/mentor-update.cgi b/www/members/mentor-update.cgi
index df43358..3b50bc7 100755
--- a/www/members/mentor-update.cgi
+++ b/www/members/mentor-update.cgi
@@ -32,7 +32,7 @@ def emit_form(apacheid, mdata, button_help, uimap)
           _p.text_error mdata[MentorFormat::ERRORS]
         end
       end
-      
+
       _div.form_group do
         _label.col_sm_offset_3.col_sm_9.strong.text_left 'How Mentees Should 
Work With You'
       end
@@ -59,14 +59,14 @@ def emit_form(apacheid, mdata, button_help, uimap)
         icon: 'glyphicon-globe', iconlabel: 'globe', 
         helptext: uimap[field][1]
       )
-      
+
       _div.form_group do
         _label.col_sm_offset_3.col_sm_9.strong.text_left 'What You Could Help 
Mentees With'
       end
       emit_mentor_input('experience', mdata, uimap, 'glyphicon-certificate')
       emit_mentor_input('available', mdata, uimap, 'glyphicon-plus-sign')
       emit_mentor_input('mentoring', mdata, uimap, 'glyphicon-minus-sign')
-      
+
       _div.form_group do
         _label.col_sm_offset_3.col_sm_9.strong.text_left 'More About You 
Personally'
       end
@@ -77,7 +77,7 @@ def emit_form(apacheid, mdata, button_help, uimap)
         icon: 'glyphicon-info-sign', value: (mdata[field] ? mdata[field] : ''),
         helptext: uimap[field][1]
       )
-      
+
       _div.form_group do
         _label.col_sm_offset_3.col_sm_9.strong.text_left 'Temporarily Opt Out 
From Any NEW Mentees'
         _label.control_label.col_sm_3 'Not Accepting New Mentees', for: 
"#{MentorFormat::NOTAVAILABLE}"
@@ -94,7 +94,7 @@ def emit_form(apacheid, mdata, button_help, uimap)
           end
         end
       end
-      
+
       _div.col_sm_offset_3.col_sm_9 do
         _span.text_info button_help
         _br
@@ -123,7 +123,7 @@ def send_form(formdata: {})
     _p.lead "Updating your mentor record #{fn} to be:"
     _pre mentor_update
   end
-  
+
   Dir.mktmpdir do |tmpdir|
     credentials = {user: $USER, password: $PASSWORD}
     # TODO: investigate if we should to --depth empty and attempt to get only 
that mentor's file
@@ -141,7 +141,7 @@ def send_form(formdata: {})
       rc = ASF::SVN.svn_('commit', fn, _, {msg: message}.merge(credentials)]
     end
   end
-  
+
   if rc == 0
     _div.alert.alert_success role: 'alert' do
       _p do
diff --git a/www/members/namediff.cgi b/www/members/namediff.cgi
index 2620506..d2c663f 100755
--- a/www/members/namediff.cgi
+++ b/www/members/namediff.cgi
@@ -25,7 +25,7 @@ _html do
       ASF::ICLA.preload
       ldap_members = ASF::Member.list.map {|id, info| ASF::Person.find(id)}
       ASF::Person.preload('cn', ldap_members)
-      
+
       _table.table.table_hover do
         _thead do
           _tr do
@@ -39,10 +39,10 @@ _html do
             end
           end
         end
-        
+
         ASF::Member.list.sort.each do |id, info|
           person = ASF::Person.find(id)
-          
+
           if person.icla
             next if person.icla.name == info[:name]
             next if person.icla.legal_name == info[:name]
@@ -65,7 +65,7 @@ _html do
           end
         end
       end
-      
+
       _script %{
         var table = $(".table").stupidtable();
         table.on("aftertablesort", function (event, data) {
diff --git a/www/members/nominations.cgi b/www/members/nominations.cgi
index 96fd18b..7f27df6 100755
--- a/www/members/nominations.cgi
+++ b/www/members/nominations.cgi
@@ -49,7 +49,7 @@ def setup_data(cur_mtg_dir)
   # preload names
   people = ASF::Person.preload('cn', 
     nominations.map {|nominee| ASF::Person.find(nominee[:id])})
-    
+
   return nominations, people, emails
 end
 
diff --git a/www/members/non-participants.cgi b/www/members/non-participants.cgi
index 2de3aaf..835e92f 100755
--- a/www/members/non-participants.cgi
+++ b/www/members/non-participants.cgi
@@ -35,7 +35,7 @@ def get_attend_matrices(dir)
     data = meetings.sort.reverse.map(&:last)
     first = data.length
     missed = (data.index {|datum| datum != '-'} || data.length)
-    
+
     [id, name, first, missed]
   end
   return attendance, matrix, dates, nameMap
@@ -86,10 +86,10 @@ _html do
           _th 'Last participated', data_sort: 'string'
         end
       end
-      
+
       matrix.each do |id, name, first, missed|
         next unless id
-        
+
         if missed >= @meetingsMissed
           _tr_ do
             _td! {_a nameMap[id], href: "#{ROSTER}/#{id}"}
@@ -104,9 +104,9 @@ _html do
         end
       end
     end
-    
+
     _div.count "Count: #{count} members inactive for #{@meetingsMissed} 
meetings."
-    
+
     _script %{
       var table = $(".table").stupidtable();
       table.on("aftertablesort", function (event, data) {
@@ -120,14 +120,14 @@ _html do
     end
   end
 end
-  
+
 _json do
   meetingsMissed = (@meetingsMissed || 3).to_i
   attendance, matrix, dates, nameMap = get_attend_matrices(MEETINGS)
   inactive = matrix.select do |id, name, first, missed|
     id and missed >= meetingsMissed
   end
-  
+
   Hash[inactive.map {|id, name, first, missed| 
     [id, {name: name, missed: missed, status: 'no response yet'}]
     }]
diff --git a/www/members/proxy.cgi b/www/members/proxy.cgi
index 3bc89df..0e26259 100755
--- a/www/members/proxy.cgi
+++ b/www/members/proxy.cgi
@@ -80,7 +80,7 @@ def emit_form(cur_mtg_dir, meeting, volunteers)
         end
       end
     end
-    
+
     if user_is_proxy
       _p.text_warning %{
           NOTE: you are proxying for other members, so you cannot assign 
@@ -94,14 +94,14 @@ def emit_form(cur_mtg_dir, meeting, volunteers)
         _form method: 'POST' do
           _div.form_group do
             _label 'Select proxy'
-            
+
             # Fetch LDAP
             ldap_members = ASF.members
             ASF::Person.preload('cn', ldap_members)
-            
+
             # Fetch members.txt
             members_txt = ASF::Member.list
-            
+
             # get a list of members who have submitted proxies
             exclude = Dir[File.join(cur_mtg_dir,'proxies-received', '*')].
               map {|name| name[/(\w+)\.\w+$/, 1]}
@@ -132,18 +132,18 @@ def emit_form(cur_mtg_dir, meeting, volunteers)
       end
     end
   end
-  
+
 ##    _script src: "js/jquery-1.11.1.min.js"
 ##    _script src: "js/bootstrap.min.js"
   _script src: "js/bootstrap-combobox.js" # TODO do we need this still?
-  
+
   _script_ %{
     // convert select into combobox
     $('.combobox').combobox();
-    
+
     // initially disable submit
     $('.btn').prop('disabled', true);
-    
+
     // enable submit when proxy is chosen
     $('*[name="proxy"]').change(function() {
       $('.btn').prop('disabled', false);
@@ -193,7 +193,7 @@ def emit_post(cur_mtg_dir, meeting, _)
         # get a list of proxies
         list = Dir['proxies-received/*.txt'].map do |file|
           form = File.read(file.untaint)
-    
+
           id = file[/([-A-Za-z0-9]+)\.\w+$/, 1]
           proxy = form[/hereby authorize ([\S].*) to act/, 1].
             gsub('_', ' ').strip
@@ -234,7 +234,7 @@ def emit_post(cur_mtg_dir, meeting, _)
       end
     end
   end
-  
+
   # Report on contents now that they're checked in
   _h3! do
     _span "Contents of "
diff --git a/www/members/repo-use.cgi b/www/members/repo-use.cgi
index 50ab893..4bf12a7 100755
--- a/www/members/repo-use.cgi
+++ b/www/members/repo-use.cgi
@@ -31,7 +31,7 @@ _html do
       priv = build_regexp(priv)
       pub = build_regexp(pub)
       scan = scan_dir_svn('../../', [priv, pub])
-      
+
       _whimsy_panel_table(title: 'Repo use by script') do
         _table.table.table_hover do
           _thead_ do
@@ -94,7 +94,7 @@ _html do
           end
         end
       end
-      
+
     end
   end
 end
\ No newline at end of file
diff --git a/www/members/security-subs.cgi b/www/members/security-subs.cgi
index 37cf3a2..6c9b33b 100755
--- a/www/members/security-subs.cgi
+++ b/www/members/security-subs.cgi
@@ -112,7 +112,7 @@ _html do
           [email, {person: person , color: color, name: name}]
         end
       ].sort_by {|k,v| [order.index(v[:color]),v[:name]]}
-      
+
       _table do
         _tr do
           _th 'Count '
diff --git a/www/members/watch.cgi b/www/members/watch.cgi
index bea018e..1ca30a0 100755
--- a/www/members/watch.cgi
+++ b/www/members/watch.cgi
@@ -42,7 +42,7 @@ _html do
 
     # determine which list to report on, based on the URI
     request = ENV['REQUEST_URI']  
-    
+
     _div.row do
       _div.col_sm10 do
         _div.panel.panel_primary do
@@ -60,7 +60,7 @@ _html do
                   end
                 end
               end
-              
+
               _li do
                 _a 'Potential Member Watch List', href: 'members/watch'
               end
@@ -97,7 +97,7 @@ _html do
         end
       end
     end
-    
+
     list = {} # Avoid lint errors of shadowing
     if request =~ /multiple/
       _h2_ 'Active In Multiple Committees'
@@ -150,7 +150,7 @@ _html do
           else
             _th 'Nominated?'
           end
-          
+
           _th 'AvailID', data_sort: 'string'
           _th 'Name', data_sort: 'string'
 
@@ -221,7 +221,7 @@ _html do
 
             # public name
             _td person.public_name
-  
+
 
             if request !~ /appstatus/
               # committees
@@ -236,7 +236,7 @@ _html do
                   end
                 end
               end
-    
+
               # chair since
               chair = person.committees.find {|committee| committee.chair == 
person}
               if chair
@@ -244,7 +244,7 @@ _html do
                   
File.basename(name).split('.').first.downcase.gsub(/[_\W]/,'') ==
                     "#{chair.name.gsub(/\W/,'')}"
                 end
-    
+
                 search_string = "RESOLVED, that #{person.public_name}"
                 search_string.force_encoding('utf-8')
 
@@ -262,7 +262,7 @@ _html do
                     end
                   end
                 end
-    
+
                 date = 'unknown'
                 if minutes
                   minutes = 'board/minutes/' + File.basename(minutes)
diff --git a/www/officers/acreq.cgi b/www/officers/acreq.cgi
index 3c252de..f74ba58 100755
--- a/www/officers/acreq.cgi
+++ b/www/officers/acreq.cgi
@@ -144,7 +144,7 @@ _html do
         }
       }
     ) do
-      
+
       _div.row do
         _div.col_md_8 do
           # Display the data input form for an account request
@@ -224,7 +224,7 @@ _html do
                   _textarea.form_control name: "comments", id: "comments" 
                 end
               end
-              
+
               _div.form_group do
                 _div.col_sm_offset_2.col_sm_1 do
                   _input.btn.btn_default type: "submit", value: "Submit"
diff --git a/www/officers/index.cgi b/www/officers/index.cgi
index 7ba36f0..76ef4bd 100755
--- a/www/officers/index.cgi
+++ b/www/officers/index.cgi
@@ -43,7 +43,7 @@ _html do
         end
       }
     ) do
-    
+
       _h2 "Tools Useful For ASF Officers"
       _ul do
         OFFICERS.each do |url, desc|
diff --git a/www/officers/surveys.cgi b/www/officers/surveys.cgi
index 647258d..096ca71 100755
--- a/www/officers/surveys.cgi
+++ b/www/officers/surveys.cgi
@@ -81,7 +81,7 @@ def display_survey(survey_layout)
     display_alert(lead: 'Warning: could not find survey datafile!', body: 
"**#{__method__}(#{survey_file})** the data file to store survey answers was 
not supplied or found; contact the survey owner: 
#{survey_layout[SURVEY][CONTACT]}.")
     warning = true
   end
-  
+
   # Emit the survey, or the default one which provides help on the survey tool
   _whimsy_panel("#{survey_layout[SURVEY][FORM][:title]} (user: #{$USER})", 
style: 'panel-success') do
     _form.form_horizontal method: 'post' do
@@ -119,7 +119,7 @@ def submit_survey(formdata: {})
   Dir.mktmpdir do |tmpdir|
     tmpdir.untaint
     ASF::SVN.svn_('checkout',[get_survey_root(), tmpdir],_,{depth: 'files', 
user: $USER, password: $PASSWORD})
-    
+
     survey_data = JSON.parse(File.read(filename), :symbolize_names => true)
     # Add user data (may overwrite existing entry!)
     survey_data[$USER] = formdata
diff --git a/www/pods.cgi b/www/pods.cgi
index 7abb0c2..ce2a910 100755
--- a/www/pods.cgi
+++ b/www/pods.cgi
@@ -81,7 +81,7 @@ _html do
       # Encapsulate data display (same for projects and podlings)
       display_application(path_info, sites, analysis, checks_performed, 
cgi_for_tlps)
     end
-    
+
     _script %{
       var table = $(".table").stupidtable();
       table.on("aftertablesort", function (event, data) {
diff --git a/www/roster/models/committee.rb b/www/roster/models/committee.rb
index 91afff2..4855a20 100644
--- a/www/roster/models/committee.rb
+++ b/www/roster/models/committee.rb
@@ -195,12 +195,12 @@ class Committee
   def self.load_emails
     # recompute index if the data is 5 minutes old or older
     @people = nil if not @people_time or Time.now-@people_time >= 300
-  
+
     if not @people
       # bulk loading the mail information makes things go faster
       mail = Hash[ASF::Mail.list.group_by(&:last).
         map {|person, list| [person, list.map(&:first)]}]
-  
+
       # build a list of people, their public-names, and email addresses
       @people = ASF::Person.list.map {|person|
         result = {id: person.id, name: person.public_name, mail: mail[person]}
diff --git a/www/roster/models/nonpmc.rb b/www/roster/models/nonpmc.rb
index e0891bb..718a4cc 100644
--- a/www/roster/models/nonpmc.rb
+++ b/www/roster/models/nonpmc.rb
@@ -181,12 +181,12 @@ class NonPMC
   def self.load_emails
     # recompute index if the data is 5 minutes old or older
     @people = nil if not @people_time or Time.now-@people_time >= 300
-  
+
     if not @people
       # bulk loading the mail information makes things go faster
       mail = Hash[ASF::Mail.list.group_by(&:last).
         map {|person, list| [person, list.map(&:first)]}]
-  
+
       # build a list of people, their public-names, and email addresses
       @people = ASF::Person.list.map {|person|
         result = {id: person.id, name: person.public_name, mail: mail[person]}
diff --git a/www/roster/models/orgchart.rb b/www/roster/models/orgchart.rb
index 32416c2..8e9867b 100644
--- a/www/roster/models/orgchart.rb
+++ b/www/roster/models/orgchart.rb
@@ -32,7 +32,7 @@ class OrgChart
     self.load
     @@duties[name]
   end
-  
+
   def self.desc
     self.load
     @@desc
diff --git a/www/roster/models/ppmc.rb b/www/roster/models/ppmc.rb
index fc65304..6c35725 100644
--- a/www/roster/models/ppmc.rb
+++ b/www/roster/models/ppmc.rb
@@ -167,12 +167,12 @@ class PPMC
   def self.load_emails
     # recompute index if the data is 5 minutes old or older
     @people = nil if not @people_time or Time.now-@people_time >= 300
-  
+
     if not @people
       # bulk loading the mail information makes things go faster
       mail = Hash[ASF::Mail.list.group_by(&:last).
         map {|person, list| [person, list.map(&:first)]}]
-  
+
       # build a list of people, their public-names, and email addresses
       @people = ASF::Person.list.map {|person|
         result = {id: person.id, name: person.public_name, mail: mail[person]}
diff --git a/www/roster/public_committee_info.rb 
b/www/roster/public_committee_info.rb
index 337b60f..03813d6 100644
--- a/www/roster/public_committee_info.rb
+++ b/www/roster/public_committee_info.rb
@@ -139,5 +139,5 @@ if changed? and @old_file
       Wunderbar.info "Deleted PMC detected: #{pmc}"
     end
   }
-  
+
 end
diff --git a/www/roster/public_icla_info.rb b/www/roster/public_icla_info.rb
index cfc6af5..7fffde5 100644
--- a/www/roster/public_icla_info.rb
+++ b/www/roster/public_icla_info.rb
@@ -22,7 +22,7 @@ if ARGV.length == 2
     committers: Hash[ids.sort]
   }
   public_json_output_file(info_id, ARGV.shift)
-  
+
   info_noid = {
     last_updated: ASF::ICLA.svn_change,
     non_committers: noid
diff --git a/www/roster/public_json_common.rb b/www/roster/public_json_common.rb
index ff4de5c..f70197c 100644
--- a/www/roster/public_json_common.rb
+++ b/www/roster/public_json_common.rb
@@ -151,12 +151,12 @@ def write_output(file, results)
         Wunderbar.warn "Got exception #{e}"
       end
     end
-  
+
     # replace file as contents have changed
     File.write(file, results + "\n")
 
   else
-  
+
     Wunderbar.info "git_info: #{GITINFO} - no change to #{file}"
     @changed = ChangeStatus::UNCHANGED
 
diff --git a/www/roster/views/actions/fullname.json.rb 
b/www/roster/views/actions/fullname.json.rb
index 7459780..ca03486 100644
--- a/www/roster/views/actions/fullname.json.rb
+++ b/www/roster/views/actions/fullname.json.rb
@@ -72,7 +72,7 @@ if message
     userid = Regexp.escape(@userid)
     text[/^#{userid}:(.*?):/, 1] = @legalname
     text[/^#{userid}:.*?:(.*?):/, 1] = @publicname
-  
+
     text
   end
 end
diff --git a/www/roster/views/committees.html.rb 
b/www/roster/views/committees.html.rb
index 1f743d4..900590a 100644
--- a/www/roster/views/committees.html.rb
+++ b/www/roster/views/committees.html.rb
@@ -67,11 +67,11 @@ _html do
             _td do
               _a pmc.display_name, href: "committee/#{pmc.name}"
             end
-  
+
             _td do
               pmc.chairs.each_with_index do |chair, index|
                 _span ', ' unless index == 0
-  
+
                 if @members.include? chair[:id]
                   _b! {_a chair[:name], href: "committer/#{chair[:id]}"}
                 else
@@ -79,7 +79,7 @@ _html do
                 end
               end
             end
-  
+
             if not pmc.established
               _td ''
               _td.issue 'Not in committee-info.txt'
diff --git a/www/roster/views/committerSearch.js.rb 
b/www/roster/views/committerSearch.js.rb
index b23639a..8640f8f 100644
--- a/www/roster/views/committerSearch.js.rb
+++ b/www/roster/views/committerSearch.js.rb
@@ -80,7 +80,7 @@ class CommitterSearch < Vue
         end
       end
     end
-    
+
     if @search.length
       if not @ready
         _p 'loading...'
diff --git a/www/roster/views/duties.html.rb b/www/roster/views/duties.html.rb
index c624d99..dc615e1 100644
--- a/www/roster/views/duties.html.rb
+++ b/www/roster/views/duties.html.rb
@@ -117,7 +117,7 @@ _html do
             end
           end
         end
-        
+
         # ********************************************************************
         # *                           Source Code                            *
         # ********************************************************************
@@ -130,7 +130,7 @@ _html do
             _a "foundation/officers/personnel-duties/#{txtnam}.txt", href: 
ASF::SVN.svnpath!('personnel-duties', "#{txtnam}.txt")
           end
         end
-        
+
       end
     end
   end
diff --git a/www/roster/views/iclaSearch.js.rb 
b/www/roster/views/iclaSearch.js.rb
index e571a6c..4fa2691 100644
--- a/www/roster/views/iclaSearch.js.rb
+++ b/www/roster/views/iclaSearch.js.rb
@@ -62,7 +62,7 @@ class IclaSearch < Vue
         end
       end
     end
-    
+
     if @search.length
       if not @ready
         _p 'loading...'
diff --git a/www/roster/views/index.html.rb b/www/roster/views/index.html.rb
index ef1e062..049afc1 100644
--- a/www/roster/views/index.html.rb
+++ b/www/roster/views/index.html.rb
@@ -50,11 +50,11 @@ _html do
             _td do
               _a @committers.length, href: 'committer2/'
             end
-  
+
             _td do
               _a 'Committers', href: 'committer2/'
             end
-  
+
             _td do
               _ 'Search for committers by name, user id, or email address.'
               _ ' Also includes pending ICLAs'
diff --git a/www/roster/views/members.html.rb b/www/roster/views/members.html.rb
index 9743047..8c0ec62 100644
--- a/www/roster/views/members.html.rb
+++ b/www/roster/views/members.html.rb
@@ -4,7 +4,7 @@
 
 _html do
   _link rel: 'stylesheet', href: "stylesheets/app.css?#{cssmtime}"
-  
+
   _body? do
     _whimsy_body(
       title: 'ASF Member List',
@@ -86,7 +86,7 @@ _html do
                     _b {_a id, href: "committer/#{id}"}
                   else
                     _a id, href: "committer/#{id}"
-                    
+
                     info[:issue] ||= 'Not in LDAP "member" group' if not 
info['status']
                   end
                 end
diff --git a/www/roster/views/nonpmc/committers.js.rb 
b/www/roster/views/nonpmc/committers.js.rb
index a51d9dc..7bcb31c 100644
--- a/www/roster/views/nonpmc/committers.js.rb
+++ b/www/roster/views/nonpmc/committers.js.rb
@@ -45,7 +45,7 @@ class NonPMCCommitters < Vue
   # compute list of committers
   def committers
     result = []
-    
+
     @@nonpmc.committers.each do |id|
       person = @@nonpmc.roster[id]
       person.id = id
diff --git a/www/roster/views/nonpmcs.html.rb b/www/roster/views/nonpmcs.html.rb
index 8c1c8ee..5086f51 100644
--- a/www/roster/views/nonpmcs.html.rb
+++ b/www/roster/views/nonpmcs.html.rb
@@ -38,11 +38,11 @@ _html do
             _td do
               _a pmc.display_name, href: "nonpmc/#{pmc.name}"
             end
-  
+
             _td do
               pmc.chairs.each_with_index do |chair, index|
                 _span ', ' unless index == 0
-  
+
                 if @members.include? chair[:id]
                   _b! {_a chair[:name], href: "committer/#{chair[:id]}"}
                 else
diff --git a/www/roster/views/orgchart.html.rb 
b/www/roster/views/orgchart.html.rb
index 5b153ad..7403d5a 100644
--- a/www/roster/views/orgchart.html.rb
+++ b/www/roster/views/orgchart.html.rb
@@ -43,7 +43,7 @@ _html do
                   id = value['info']['id'] || value['info']['chair']
                   _a ASF::Person.find(id).public_name, href: "committer/#{id}"
                 end
-                
+
                 # Website - often valuable to people looking for info
                 _td do
                   value['info']['website'].nil? ? _('')  : _a('website', href: 
value['info']['website'])
diff --git a/www/roster/views/person/forms.js.rb 
b/www/roster/views/person/forms.js.rb
index b9f1f64..7736119 100644
--- a/www/roster/views/person/forms.js.rb
+++ b/www/roster/views/person/forms.js.rb
@@ -13,7 +13,7 @@ class PersonForms < Vue
         _ul do
           for form in committer.forms
             link = committer.forms[form]
-            
+
             if form == 'icla'
               _li do
                 if link == '' # has ICLA bu no karma to view it
diff --git a/www/roster/views/person/github.js.rb 
b/www/roster/views/person/github.js.rb
index 6f0991a..609de76 100644
--- a/www/roster/views/person/github.js.rb
+++ b/www/roster/views/person/github.js.rb
@@ -26,7 +26,7 @@ class PersonGitHub < Vue
             # Spare field to allow new entry to be added
             _input style: 'font-family:Monospace', size: 20, name: prefix + 
current, placeholder: '<new GitHub name>'
             _br             
-            
+
             _input type: 'submit', value: 'submit'
           end
 
diff --git a/www/roster/views/person/main.js.rb 
b/www/roster/views/person/main.js.rb
index e579782..4040b3e 100644
--- a/www/roster/views/person/main.js.rb
+++ b/www/roster/views/person/main.js.rb
@@ -114,7 +114,7 @@ class Person < Vue
         _div.value do
           _ul @committer.groups do |group|
             next if group == 'apldap'
-       
+
             if group == 'committers'
               _li {_a group, href: "committer/"}
             elsif group == 'member'
@@ -159,7 +159,7 @@ class Person < Vue
         end
       end
     end
-    
+
     # Email addresses
     # always present
     _PersonEmailForwards person: self, edit: @edit
diff --git a/www/roster/views/pmc/committers.js.rb 
b/www/roster/views/pmc/committers.js.rb
index c98ec72..207e08e 100644
--- a/www/roster/views/pmc/committers.js.rb
+++ b/www/roster/views/pmc/committers.js.rb
@@ -45,7 +45,7 @@ class PMCCommitters < Vue
   # compute list of committers
   def committers
     result = []
-    
+
     @@committee.committers.each do |id|
       person = @@committee.roster[id]
       person.id = id
diff --git a/www/roster/views/podlings.html.rb 
b/www/roster/views/podlings.html.rb
index 2d1ce34..ac6faee 100644
--- a/www/roster/views/podlings.html.rb
+++ b/www/roster/views/podlings.html.rb
@@ -28,7 +28,7 @@ _html do
         podlings: 'podlings'
       }
     ) do
-      
+
       # ********************************************************************
       # *                             Summary                              *
       # ********************************************************************
diff --git a/www/roster/views/polyfill.js.rb b/www/roster/views/polyfill.js.rb
index ae00cc8..75ce53b 100644
--- a/www/roster/views/polyfill.js.rb
+++ b/www/roster/views/polyfill.js.rb
@@ -17,7 +17,7 @@ class Polyfill
       first = document.getElementsByTagName('script')[0]
       first.parentNode.insertBefore(script, first)
     end
-  
+
     if @names.include? 'fetch' and defined? fetch
       self.complete()
     else
diff --git a/www/roster/views/ppmc/committers.js.rb 
b/www/roster/views/ppmc/committers.js.rb
index 9894136..5f19bbd 100644
--- a/www/roster/views/ppmc/committers.js.rb
+++ b/www/roster/views/ppmc/committers.js.rb
@@ -71,7 +71,7 @@ class PPMCCommitters < Vue
   # compute list of committers
   def committers
     result = []
-    
+
     @@ppmc.committers.each do |id|
       person = @@ppmc.roster[id]
       person.id = id
diff --git a/www/roster/views/ppmc/members.js.rb 
b/www/roster/views/ppmc/members.js.rb
index f5870ab..3e77ef4 100644
--- a/www/roster/views/ppmc/members.js.rb
+++ b/www/roster/views/ppmc/members.js.rb
@@ -107,7 +107,7 @@ class PPMCMembers < Vue
   # compute roster
   def roster
     result = []
-    
+
     @@ppmc.owners.each do |id|
       person = @@ppmc.roster[id]
       person.id = id
@@ -146,7 +146,7 @@ class PPMCMember < Vue
         _td @@person.githubUsername
         _td @@person.name
       end
-        
+
       _td data_ids: @@person.id do
         if @@person.selected
           if @@auth.ipmc and not @@person.icommit
diff --git a/www/roster/views/ppmc/mentors.js.rb 
b/www/roster/views/ppmc/mentors.js.rb
index 8a5a037..1a3be7c 100644
--- a/www/roster/views/ppmc/mentors.js.rb
+++ b/www/roster/views/ppmc/mentors.js.rb
@@ -31,7 +31,7 @@ class PPMCMentors < Vue
   # compute roster
   def roster
     result = []
-    
+
     @@ppmc.mentors.each do |id|
       person = @@ppmc.roster[id]
       person.id = id
@@ -74,7 +74,7 @@ class PPMCMentor < Vue
         _td @@person.githubUsername
         _td @@person.name
       end
-        
+
       _td data_ids: @@person.id do
         # TODO: how does this become enabled?
         if @@person.selected
diff --git a/www/roster/views/ppmcs.html.rb b/www/roster/views/ppmcs.html.rb
index 015acc3..9cbcf1f 100644
--- a/www/roster/views/ppmcs.html.rb
+++ b/www/roster/views/ppmcs.html.rb
@@ -50,9 +50,9 @@ _html do
                   _a.label_danger ppmc.display_name, href: 
"ppmc/#{ppmc.name}", title: 'LDAP project not yet set up'
                 end
               end
-  
+
               _td ppmc.startdate
-  
+
               _td do
                 # using _p here messes up the sort
                 if project_names.include? ppmc.name
diff --git a/www/secretary/icla-parse.cgi b/www/secretary/icla-parse.cgi
index be17385..b0166c5 100755
--- a/www/secretary/icla-parse.cgi
+++ b/www/secretary/icla-parse.cgi
@@ -24,11 +24,11 @@ puts ""
 begin
   require_relative 'workbench/models/mailbox'
   require_relative 'iclaparser'
-  
+
   message = Mailbox.find(pathinfo)
-  
+
   path = message.find(iclaname).as_file.path
-  
+
   parsed = ICLAParser.parse(path)
   parsed.sort_by{|k,v| k.to_s }.each do |k,v|
     puts "%-20s %s" % [k,v] unless k == :_meta
@@ -49,7 +49,7 @@ begin
     puts "metadata:"
     puts metadata
   end
-  
+
 rescue Exception => e
   p e
 end
diff --git a/www/secretary/iclaparser.rb b/www/secretary/iclaparser.rb
index 2bc6b47..db70a3d 100644
--- a/www/secretary/iclaparser.rb
+++ b/www/secretary/iclaparser.rb
@@ -61,7 +61,7 @@ module ICLAParser
     def set_text_font_and_size(*args)
        @tfs=args
     end
-  
+
     def show_text(string)
       font = @fontdict[@tfs.first]
       utf8 = ICLAParser.string_to_utf8(string, font)
@@ -91,11 +91,11 @@ module ICLAParser
     def get_text
       @texts
     end
-    
+
     def get_lines
       @lines
     end
-    
+
   end
 
   def self.string_to_utf8(string, font)
@@ -149,7 +149,7 @@ module ICLAParser
       reader.objects.each do |k,v|
         type = v[:Type] rescue nil
         subtype = v[:Subtype] rescue nil
-        
+
         if type == :Annot
           if subtype == :FreeText # These are not directly associated with 
forms
             rect = v[:Rect]
diff --git a/www/secretary/ldap-check-committers.cgi 
b/www/secretary/ldap-check-committers.cgi
index 029c37e..19ed332 100755
--- a/www/secretary/ldap-check-committers.cgi
+++ b/www/secretary/ldap-check-committers.cgi
@@ -27,7 +27,7 @@ _html do
   people = ASF::Person.preload(%w(uid createTimestamp asf-banned asf-altEmail 
mail loginShell))
 
   _h2 'people who are not committers (excluding nologin)'
-  
+
   non_committers = people.reject { |p| p.nologin? or old.include? p.name or 
p.name == 'apldaptest'}
   if non_committers.length > 0
     _table do
diff --git a/www/secretary/ldap-check.cgi b/www/secretary/ldap-check.cgi
index 9930469..755edc2 100755
--- a/www/secretary/ldap-check.cgi
+++ b/www/secretary/ldap-check.cgi
@@ -60,7 +60,7 @@ _html do
 
     projects = ASF::Project.list
     pmcs = ASF::Committee.pmcs
-    
+
     projects.sort_by(&:name).each do |p|
       po=p.ownerids
       pm=p.memberids
@@ -119,7 +119,7 @@ _html do
   end
 
   _h2 'people who are not committers (excluding nologin)'
-  
+
   non_committers = people.reject { |p| p.nologin? or old.include? p.name or 
p.name == 'apldaptest'}
   if non_committers.length > 0
     _table do
@@ -156,10 +156,10 @@ _html do
   end
 
   _h2 'committers who are not in LDAP people'
-  
+
   # which committers are not people?
   non_people = old.reject {|id| people.map(&:name).include? id}
-  
+
   if non_people.length > 0
     _table do
       _tr do
diff --git a/www/secretary/ldap-names.cgi b/www/secretary/ldap-names.cgi
index e74e119..a3a742e 100755
--- a/www/secretary/ldap-names.cgi
+++ b/www/secretary/ldap-names.cgi
@@ -24,14 +24,14 @@ _html do
   }
 
  if @updates
-  
+
   ################################################################## 
   #                         Apply Updates                          #
   ################################################################## 
-  
+
   _h2_ 'Applying updates'
   updates = JSON.parse(@updates)
-  
+
   # update LDAP
   unless updates.empty?
     unless ASF::Service.find('asf-secretary').members.include? 
ASF::Person.new($USER)
@@ -211,7 +211,7 @@ _html do
   #################################################################### 
   #                   Form used to submit changes                    #
   #################################################################### 
-  
+
   _form_ method: 'post' do
     _input type: 'hidden', name: 'updates'
     _input type: 'submit', value: 'Commit Changes', disabled: true
@@ -221,17 +221,17 @@ _html do
   #################################################################### 
   #                        Client side logic                         #
   #################################################################### 
-  
+
   _script do
-  
+
     # enable submit button only when there are modifications
     def enable_submit()
       button = document.querySelector('input[type=submit]')
       modified = document.querySelectorAll('td.modified')
-  
+
       button.disabled = (modified.length == 0)
     end
-  
+
     Array(document.getElementsByTagName('td')).each do |td|
       next unless td.getAttribute('copyAble') == 'true'
       # double-click: copy to previous cell
@@ -248,22 +248,22 @@ _html do
         enable_submit()
       end
     end
-  
+
     # capture modifications when button is pressed
     document.querySelector('input[type=submit]').addEventListener(:click) do
       updates = {}
       # Must agree with number of columns in the main table above
       columnNames = %w(uid icla_file legal_name public_name cn givenName 
newGiven sn newSN unused)
-  
+
       Array(document.querySelectorAll('td.modified')).each do |td|
         id = td.parentNode.firstElementChild.textContent.strip()
         updates[id] ||= {}
         updates[id][columnNames[td.cellIndex]] = td.textContent
       end
-  
+
       document.querySelector('form input').value = JSON.stringify(updates)
     end
-  
+
     # force submit state on initial load (i.e., disable submit button)
     enable_submit()
   end
diff --git a/www/secretary/memapp_check.cgi b/www/secretary/memapp_check.cgi
index 605615b..b5a6cf2 100755
--- a/www/secretary/memapp_check.cgi
+++ b/www/secretary/memapp_check.cgi
@@ -22,7 +22,7 @@ end
 status = ASF::Member.status
 
 members = ASF::Member.new.map {|id, text| ASF::Person.find(id)}
-  
+
 # These members don't have ids, so cannot use the Person class
 members << PersonNoId.new("Shane Caraveo")
 members << PersonNoId.new("Robert Hartill")
diff --git a/www/secretary/public-names.cgi b/www/secretary/public-names.cgi
index 359dfb2..9e3156b 100755
--- a/www/secretary/public-names.cgi
+++ b/www/secretary/public-names.cgi
@@ -90,14 +90,14 @@ _html do
           if names['legal_name']
             iclas[pattern,1] = names['legal_name'].gsub("\u00A0", ' ')  
           end
-  
+
           if names['public_name']
             iclas[pattern,2] = names['public_name'].gsub("\u00A0", ' ') 
           end
         end
 
         iclas # return the updated file
-  
+
       end
 
     end
diff --git a/www/secretary/workbench/parsemail.rb 
b/www/secretary/workbench/parsemail.rb
index 391a416..16697ff 100644
--- a/www/secretary/workbench/parsemail.rb
+++ b/www/secretary/workbench/parsemail.rb
@@ -37,7 +37,7 @@ Dir[File.join(ARCHIVE, '2*')].sort.each do |name|
     not ARGV.any? {|arg| name.include? "/#{arg}"}
   print "#{name.ljust(width)}\r"
   width = name.length
-  
+
   # parse mailbox
   Mailbox.new(name).parse
 end
diff --git a/www/secretary/workbench/views/actions/ccla.json.rb 
b/www/secretary/workbench/views/actions/ccla.json.rb
index d4d4d09..d7f9d72 100644
--- a/www/secretary/workbench/views/actions/ccla.json.rb
+++ b/www/secretary/workbench/views/actions/ccla.json.rb
@@ -37,7 +37,7 @@ _personalize_email(env.user)
 ########################################################################
 
 task "svn commit documents/cclas/#@filename#{fileext} and update cclas.txt" do
-  
+
   # construct line to be inserted in cclas.txt
   @cclalines = "notinavail:" + @company.strip
   unless @contact.empty?
diff --git a/www/secretary/workbench/views/actions/parse-icla.json.rb 
b/www/secretary/workbench/views/actions/parse-icla.json.rb
index a8f6177..4d00a34 100644
--- a/www/secretary/workbench/views/actions/parse-icla.json.rb
+++ b/www/secretary/workbench/views/actions/parse-icla.json.rb
@@ -12,15 +12,15 @@ ALIASES = {
 
 if attachment.end_with? '.pdf'
   message = Mailbox.find(@message)
-  
+
   path = message.find(attachment).as_file.path
-  
+
   parsed = ICLAParser.parse(path)
 
   # Extract the project and adjust if necessary
   project = parsed[:Project]
   parsed [:PDFProject] = project # retain the original value
-  
+
   if project
     project.downcase!
     projects = (ASF::Podling.current+ASF::Committee.pmcs).map(&:name)
diff --git a/www/secretary/workbench/views/forms/ccla.js.rb 
b/www/secretary/workbench/views/forms/ccla.js.rb
index f626bdc..8e917c5 100644
--- a/www/secretary/workbench/views/forms/ccla.js.rb
+++ b/www/secretary/workbench/views/forms/ccla.js.rb
@@ -87,7 +87,7 @@ class CCLA < Vue
   # state 
   def mounted()
     name = @@headers.name || ''
- 
+
     # reorder name if there is a single comma present
     parts = name.split(',')
     if parts.length == 2 and parts[1] !~ /^\s*(jr|ph\.d)\.?$/i
diff --git a/www/secretary/workbench/views/forms/grant.js.rb 
b/www/secretary/workbench/views/forms/grant.js.rb
index 8e8d385..a36554b 100644
--- a/www/secretary/workbench/views/forms/grant.js.rb
+++ b/www/secretary/workbench/views/forms/grant.js.rb
@@ -77,7 +77,7 @@ class Grant < Vue
   # state 
   def mounted()
     name = @@headers.name || ''
- 
+
     # reorder name if there is a single comma present
     parts = name.split(',')
     if parts.length == 2 and parts[1] !~ /^\s*(jr|ph\.d)\.?$/i
diff --git a/www/secretary/workbench/views/parts.js.rb 
b/www/secretary/workbench/views/parts.js.rb
index 3eb40cb..567e8ee 100644
--- a/www/secretary/workbench/views/parts.js.rb
+++ b/www/secretary/workbench/views/parts.js.rb
@@ -463,7 +463,7 @@ class Parts < Vue
     url = message.sub('/workbench/','/icla-parse/') + attachment
     window.parent.frames.content.location.href = url
   end
-  
+
   ########################################################################
   #                             Update email                             #
   ########################################################################
diff --git a/www/secretary/workbench/views/tasklist.html.rb 
b/www/secretary/workbench/views/tasklist.html.rb
index 51afe0e..925c316 100644
--- a/www/secretary/workbench/views/tasklist.html.rb
+++ b/www/secretary/workbench/views/tasklist.html.rb
@@ -15,7 +15,7 @@ _html do
     _header do
       _h1.bg_warning 'Operations to be performed'
     end
-  
+
     _ul.tasklist! do
       @dryrun['tasklist'].each do |task|
         _li do 
diff --git a/www/site.cgi b/www/site.cgi
index b316dbe..5f1455c 100755
--- a/www/site.cgi
+++ b/www/site.cgi
@@ -78,7 +78,7 @@ _html do
       # Encapsulate data display (same for projects and podlings)
       display_application(path_info, sites, analysis, checks_performed, 
cgi_for_tlps)
     end
-    
+
     _script %{
       var table = $(".table").stupidtable();
       table.on("aftertablesort", function (event, data) {
diff --git a/www/status/index.cgi b/www/status/index.cgi
index 43e57c3..5323d7c 100755
--- a/www/status/index.cgi
+++ b/www/status/index.cgi
@@ -44,7 +44,7 @@ print <<-EOF
 
     <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/>
     <link rel="stylesheet" type="text/css" href="css/status.css"/>
-    
+
     <script type="text/javascript" src="js/jquery.min.js"></script>
     <script type="text/javascript" src="js/bootstrap.min.js"></script>
     <script type="text/javascript" src="js/status.js"></script>
diff --git a/www/status/monitors/git.rb b/www/status/monitors/git.rb
index c0b8992..5010237 100644
--- a/www/status/monitors/git.rb
+++ b/www/status/monitors/git.rb
@@ -72,7 +72,7 @@ def Monitor.git(previous_status)
       'Auto packing the repository',
       'See "git help gc" for manual housekeeping',
     ]
-      
+
     lines.reject! do |line| 
       line.start_with?(*start_ignores) or
       line =~ SUMMARY_RE or
@@ -132,7 +132,7 @@ def Monitor.git(previous_status)
       break
     end
   end
-  
+
   {data: status}
 end
 
diff --git a/www/status/monitors/svn.rb b/www/status/monitors/svn.rb
index d5a2743..ebb96b4 100644
--- a/www/status/monitors/svn.rb
+++ b/www/status/monitors/svn.rb
@@ -94,7 +94,7 @@ def Monitor.svn(previous_status)
       break
     end
   end
-  
+
   {data: status}
 end
 
diff --git a/www/test/example.cgi b/www/test/example.cgi
index c99e529..e261993 100755
--- a/www/test/example.cgi
+++ b/www/test/example.cgi
@@ -177,7 +177,7 @@ _html do
           end
         end
       end
-      
+
       # IF YOU WANT TO DO WORK BASED ON ?QUERY=value
       query = CGI::parse(ENV['QUERY_STRING'])
       if query.has_key?('value')
@@ -187,7 +187,7 @@ _html do
         _p "Value Query Passed: #{query['query']}"
         _p query.inspect
       end
-      
+
       # IF YOU WANT TO DISPLAY A FORM and handle the POST
       _div id: 'example-form'
       if _.post?

Reply via email to