From ec33ada11b123707b77b0c06820aedff2fc5f0fc Mon Sep 17 00:00:00 2001 From: Sebb Date: Fri, 19 Jul 2024 21:24:35 +0100 Subject: [PATCH 01/56] Check for duplicates --- lib/whimsy/asf/committee.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb index f5c0a8d849..f39ac968e0 100644 --- a/lib/whimsy/asf/committee.rb +++ b/lib/whimsy/asf/committee.rb @@ -526,7 +526,7 @@ def self.parse_committee_info_nocache(contents) # Now weed out the malformed lines m = line.match(/^[ \t]+(\w.*?)[ \t][ \t]+(.*)[ \t]+<(.*?)@apache\.org>/) if m - committee, name, id = m.captures + committee, name, id = m.captures # committee may not be canonical here unless list[committee].chairs.any? {|chair| chair[:id] == id} list[committee].chairs << {name: name, id: id} end @@ -535,6 +535,11 @@ def self.parse_committee_info_nocache(contents) Wunderbar.warn "Missing separator before chair name in: '#{line}'" end end + # Any duplicates? + dupes = list.group_by{|x| x.first.downcase}.select{|k,v|v.size!=1} + if dupes.size > 0 + Wunderbar.warn "Dulicate chairs: #{dupes}}" + end # Extract the non-PMC committees (e-mail address may be absent) # first drop leading text (and Officers) so we only match non-PMCs nonpmcs = head.sub(/.*?also has /m, '').sub(/ Officers:.*/m, ''). From 8dfb11a48c5959610e98d58033a97c442833701f Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 19:31:14 +0100 Subject: [PATCH 02/56] Obsolete --- lib/test/svn/apmail_bin/.archives | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 lib/test/svn/apmail_bin/.archives diff --git a/lib/test/svn/apmail_bin/.archives b/lib/test/svn/apmail_bin/.archives deleted file mode 100644 index c71a685c03..0000000000 --- a/lib/test/svn/apmail_bin/.archives +++ /dev/null @@ -1,17 +0,0 @@ -# Sample archive data for testing - "jobs", "/home/apmail/private-arch/", - "infra-users", "/home/apmail/private-arch/", - "site-dev", "/home/apmail/public-arch/", - "site-cvs", "/home/apmail/private-arch/", - "committers-cvs", "/home/apmail/private-arch/", - "concom", "/home/apmail/private-arch/", - "party", "/home/apmail/private-arch/", - "board", "/home/apmail/private-arch/", - "board-commits", "/home/apmail/private-arch/", - "board-chat", "/home/apmail/private-arch/", - "ant-private", "/home/apmail/private-arch/", - "whimsical-private", "/home/apmail/private-arch/", - "pod1-commits", "/home/apmail/public-arch/", - "pod2-dev", "/home/apmail/public-arch/", - "pod3-private", "/home/apmail/private-arch/", - From fc5f1495cd6e14282ccaae24dfc7371e2cf3cdf2 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 19:33:32 +0100 Subject: [PATCH 03/56] Add missing :name fields --- lib/test/svn/board/committee-info.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/test/svn/board/committee-info.yaml b/lib/test/svn/board/committee-info.yaml index c228af5b7d..602d75d604 100644 --- a/lib/test/svn/board/committee-info.yaml +++ b/lib/test/svn/board/committee-info.yaml @@ -6,6 +6,7 @@ :cttees: comdev: + :name: Community Development :site: http://community.apache.org/ :description: Resources to help people become involved with Apache projects @@ -16,6 +17,7 @@ :name: Avalon :description: Java software for component and container programming httpd: + :name: HTTP Server :site: http://httpd.apache.org/ :description: Apache Web Server (httpd) jakarta: @@ -26,4 +28,4 @@ :comment: Diary is needed for unit testing :diary: [] ... -# ends \ No newline at end of file +# ends From e21f249fb8d0fd02e600bdc8fff29333384b5bbe Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 19:36:27 +0100 Subject: [PATCH 04/56] committee needs svn and ldap --- lib/whimsy/asf.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/whimsy/asf.rb b/lib/whimsy/asf.rb index aca3f8be46..743dc102e9 100644 --- a/lib/whimsy/asf.rb +++ b/lib/whimsy/asf.rb @@ -1,8 +1,8 @@ require_relative 'asf/config' -require_relative 'asf/committee' +require_relative 'asf/svn' require_relative 'asf/ldap' +require_relative 'asf/committee' require_relative 'asf/mail' -require_relative 'asf/svn' require_relative 'asf/git' require_relative 'asf/watch' require_relative 'asf/nominees' From b4cbeb131989bac7a3a12fad9f5189d60a3eabca Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 19:52:49 +0100 Subject: [PATCH 05/56] Add a dummy CI file --- lib/test/svn/board/committee-info.txt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 lib/test/svn/board/committee-info.txt diff --git a/lib/test/svn/board/committee-info.txt b/lib/test/svn/board/committee-info.txt new file mode 100644 index 0000000000..c6a4635f4c --- /dev/null +++ b/lib/test/svn/board/committee-info.txt @@ -0,0 +1,23 @@ +INFORMATION ABOUT THE ASF COMMITTEES -*-indented-text-*- + +... + +1. APACHE SOFTWARE FOUNDATION COMMITTEES + + +The Apache Software Foundation has the following Project Management +Committees (PMCs): + + NAME CHAIR + ---------- --------------- + HTTP Server Person1 + +2. REPORTING PROCESS AND SCHEDULE + + +3. COMMITTEE MEMBERSHIP AND CHANGE PROCESS + +* HTTP Server (est. 02/1995) + Person1 [1995-02-11] + Person2 [1995-02-11] + From f097455af0a959de5c9dac40d82f35205b34ad28 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 19:54:30 +0100 Subject: [PATCH 06/56] No need to use SVN to get the date --- lib/spec/spec_helper.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/spec/spec_helper.rb b/lib/spec/spec_helper.rb index d5342cc3f6..33fbe72329 100644 --- a/lib/spec/spec_helper.rb +++ b/lib/spec/spec_helper.rb @@ -32,6 +32,17 @@ ASF::SVN[SAMPLE_SVN_NAME] = File.expand_path('../test/svn/minutes', __dir__) ASF::Config[:subscriptions] = File.expand_path('../test/subscriptions', __dir__) ASF::SVN['incubator-podlings'] = File.expand_path('../test/svn/incubator-podlings', __dir__) + # Ensure we can get a date for CI.txt in TEST mode + # (avoids need to add the file to a local SVN repo) + ASF::SVN.instance_eval do + alias getInfoItem_old getInfoItem + def getInfoItem(path, item, user=nil, password=nil) + if item == 'last-changed-date' and path.end_with?('committee-info.txt') + return File.mtime(path).to_s + end + getInfoItem_old(path, item,user,password) + end + end else TEST_DATA = false end From d8196f02b29c03a567269a7f62208ff797439d6e Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 19:57:43 +0100 Subject: [PATCH 07/56] Ensure first CI instance has access to parsed CI data --- lib/spec/lib/committee_spec.rb | 8 ++++++++ lib/whimsy/asf/committee.rb | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/lib/spec/lib/committee_spec.rb b/lib/spec/lib/committee_spec.rb index 169baf387d..9712531e15 100644 --- a/lib/spec/lib/committee_spec.rb +++ b/lib/spec/lib/committee_spec.rb @@ -24,6 +24,14 @@ Wunderbar.logger = nil # ensure we see warnings } describe "ASF::Committee::site" do + it "should return correct display_name initially" do + httpd = ASF::Committee['httpd'] + expect(httpd.display_name).to eq('HTTP Server') + end + it "should return correct display_name subsequently" do + httpd = ASF::Committee['httpd'] + expect(httpd.display_name).to eq('HTTP Server') + end it "should return string for 'httpd'" do res = ASF::Committee.find('HTTP Server').site expect(res).to match(%r{https?://httpd\.apache\.org/?}) diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb index f39ac968e0..dfa80486fc 100644 --- a/lib/whimsy/asf/committee.rb +++ b/lib/whimsy/asf/committee.rb @@ -175,6 +175,7 @@ def self.load_committee_info(contents = nil, info = nil) @committee_mtime = File.mtime(file) @@svn_change = Time.parse(ASF::SVN.getInfoItem(file, 'last-changed-date')).gmtime + Wunderbar.debug "Parsing CI file" @nonpmcs, @officers, @committee_info = parse_committee_info_nocache(File.read(file)) end @committee_info @@ -795,4 +796,10 @@ def self.appendtlpmetadata(input, committee, description, date_established) end end + + # ensure the CI data is pre-loaded + # If this is not done, the first committee instance may be incomplete + Wunderbar.debug "Initialising CI file" + ASF::Committee.load_committee_info + end From 1329c571bbeff517d22319ab8ea3619889276a54 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 20:29:36 +0100 Subject: [PATCH 08/56] revert, breaks a text --- lib/test/svn/board/committee-info.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/test/svn/board/committee-info.yaml b/lib/test/svn/board/committee-info.yaml index 602d75d604..cdcedbf28b 100644 --- a/lib/test/svn/board/committee-info.yaml +++ b/lib/test/svn/board/committee-info.yaml @@ -6,7 +6,6 @@ :cttees: comdev: - :name: Community Development :site: http://community.apache.org/ :description: Resources to help people become involved with Apache projects @@ -17,7 +16,6 @@ :name: Avalon :description: Java software for component and container programming httpd: - :name: HTTP Server :site: http://httpd.apache.org/ :description: Apache Web Server (httpd) jakarta: From d1a7ce31163117643bb5cba12178caabfd75f41c Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 20:55:03 +0100 Subject: [PATCH 09/56] Looks like Wunderbar is needed earlier --- lib/whimsy/asf.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/whimsy/asf.rb b/lib/whimsy/asf.rb index 743dc102e9..c638e47f9c 100644 --- a/lib/whimsy/asf.rb +++ b/lib/whimsy/asf.rb @@ -1,4 +1,5 @@ require_relative 'asf/config' +require 'wunderbar' require_relative 'asf/svn' require_relative 'asf/ldap' require_relative 'asf/committee' From 87e95165a94744bd7b15e706b6080e4fb80c4f60 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 20:56:00 +0100 Subject: [PATCH 10/56] Disable 24.04 [skip ci] --- .github/workflows/unittestlib.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/unittestlib.yml b/.github/workflows/unittestlib.yml index 29b395ee19..7b73327f97 100644 --- a/.github/workflows/unittestlib.yml +++ b/.github/workflows/unittestlib.yml @@ -21,9 +21,10 @@ jobs: exclude: - os: ubuntu-22.04 ruby: 2.7 - include: - - os: ubuntu-24.04 - ruby: 3.2 + # LDAP does not work on 24.04 (needs patch) + # include: + # - os: ubuntu-24.04 + # ruby: 3.2 runs-on: ${{ matrix.os }} steps: - name: setup non-macOS # needed for installing ruby-ldap From c93fcce37e3d461b532e5dfc2e20595c914448a8 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 21 Jul 2024 21:10:09 +0100 Subject: [PATCH 11/56] Flag GHA failure --- lib/spec/lib/committee_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/spec/lib/committee_spec.rb b/lib/spec/lib/committee_spec.rb index 9712531e15..bfe1416490 100644 --- a/lib/spec/lib/committee_spec.rb +++ b/lib/spec/lib/committee_spec.rb @@ -25,6 +25,7 @@ } describe "ASF::Committee::site" do it "should return correct display_name initially" do + pending('works locally, but not under GH actions...') httpd = ASF::Committee['httpd'] expect(httpd.display_name).to eq('HTTP Server') end From e11328ee644fb7cc598b1972dfb7632fb89125e2 Mon Sep 17 00:00:00 2001 From: Sebb Date: Mon, 22 Jul 2024 15:49:31 +0100 Subject: [PATCH 12/56] Ensure overrides are in place before main code is loaded --- lib/spec/lib/committee_spec.rb | 1 - lib/spec/spec_helper.rb | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/spec/lib/committee_spec.rb b/lib/spec/lib/committee_spec.rb index bfe1416490..9712531e15 100644 --- a/lib/spec/lib/committee_spec.rb +++ b/lib/spec/lib/committee_spec.rb @@ -25,7 +25,6 @@ } describe "ASF::Committee::site" do it "should return correct display_name initially" do - pending('works locally, but not under GH actions...') httpd = ASF::Committee['httpd'] expect(httpd.display_name).to eq('HTTP Server') end diff --git a/lib/spec/spec_helper.rb b/lib/spec/spec_helper.rb index 33fbe72329..74c28dc1f1 100644 --- a/lib/spec/spec_helper.rb +++ b/lib/spec/spec_helper.rb @@ -17,8 +17,9 @@ lib = File.expand_path('..', __dir__) $LOAD_PATH.unshift lib unless $LOAD_PATH.include? lib -require 'whimsy/asf' require 'whimsy/asf/config' # must be loaded before updating config +require 'whimsy/asf/svn' # must be loaded before updating config +# Don't load 'whimsy/asf' here as some classes may depend on overrides below SAMPLE_SVN_NAME = 'minutes' # name of checkout of public SVN dir SAMPLE_SVN_URL_RE = %r{https://.+/minutes} From acbf79d749848b12904256811d5bd27ad134f548 Mon Sep 17 00:00:00 2001 From: Sebb Date: Mon, 22 Jul 2024 23:26:05 +0100 Subject: [PATCH 13/56] Reported baremaps error --- tools/site-scan.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/site-scan.rb b/tools/site-scan.rb index 1fd906b42d..f3b7888f7b 100755 --- a/tools/site-scan.rb +++ b/tools/site-scan.rb @@ -221,7 +221,7 @@ def parse(id, site, name, podling=false) nodisclaimer << subpage end else - if show_anyway or !%w(nlpcraft teaclave).include? id # reported, but not yet fixed, so suppress noise + if show_anyway or !%w(baremaps nlpcraft teaclave).include? id # reported, but not yet fixed, so suppress noise $stderr.puts "#{id} #{subpage} => #{uri} #{status} '#{anchor.text.strip}'" end end From 4e8c1586ea00942b044912997462a3b2b6734de0 Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 23 Jul 2024 11:55:19 +0100 Subject: [PATCH 14/56] Fixed --- tools/site-scan.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/site-scan.rb b/tools/site-scan.rb index f3b7888f7b..1fd906b42d 100755 --- a/tools/site-scan.rb +++ b/tools/site-scan.rb @@ -221,7 +221,7 @@ def parse(id, site, name, podling=false) nodisclaimer << subpage end else - if show_anyway or !%w(baremaps nlpcraft teaclave).include? id # reported, but not yet fixed, so suppress noise + if show_anyway or !%w(nlpcraft teaclave).include? id # reported, but not yet fixed, so suppress noise $stderr.puts "#{id} #{subpage} => #{uri} #{status} '#{anchor.text.strip}'" end end From 20fed59ac5d6dc6b761d78bd34a8376e477e3782 Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 23 Jul 2024 12:09:48 +0100 Subject: [PATCH 15/56] Don't ignore missing CI file (looks like this behaviour was once necessary for testing) --- lib/whimsy/asf/committee.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb index dfa80486fc..6d193fc96f 100644 --- a/lib/whimsy/asf/committee.rb +++ b/lib/whimsy/asf/committee.rb @@ -164,9 +164,9 @@ def self.load_committee_info(contents = nil, info = nil) @nonpmcs, @officers, @committee_info = parse_committee_info_nocache(contents) else board = ASF::SVN.find('board') - return unless board + raise ArgumentError.new("Could not find 'board' checkout") unless board file = File.join(board, 'committee-info.txt') - return unless File.exist? file + raise ArgumentError.new("Could not find #{file}") unless File.exist? file if @committee_mtime and File.mtime(file) <= @committee_mtime return @committee_info if @committee_info From db8442a056723887727a77aff0f33e6ae5fb7669 Mon Sep 17 00:00:00 2001 From: Sebb Date: Wed, 24 Jul 2024 00:27:52 +0100 Subject: [PATCH 16/56] Another baremaps issue [skip ci] --- tools/site-scan.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/site-scan.rb b/tools/site-scan.rb index 1fd906b42d..f3b7888f7b 100755 --- a/tools/site-scan.rb +++ b/tools/site-scan.rb @@ -221,7 +221,7 @@ def parse(id, site, name, podling=false) nodisclaimer << subpage end else - if show_anyway or !%w(nlpcraft teaclave).include? id # reported, but not yet fixed, so suppress noise + if show_anyway or !%w(baremaps nlpcraft teaclave).include? id # reported, but not yet fixed, so suppress noise $stderr.puts "#{id} #{subpage} => #{uri} #{status} '#{anchor.text.strip}'" end end From b1b3c85a7f9daaaf74f7d140ce0214eef7822dee Mon Sep 17 00:00:00 2001 From: Sebb Date: Thu, 1 Aug 2024 13:31:52 +0100 Subject: [PATCH 17/56] Add menu item to delete current message --- www/secretary/workbench/views/parts.js.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/www/secretary/workbench/views/parts.js.rb b/www/secretary/workbench/views/parts.js.rb index 84717462fa..8f1c86c21a 100644 --- a/www/secretary/workbench/views/parts.js.rb +++ b/www/secretary/workbench/views/parts.js.rb @@ -50,6 +50,10 @@ def render } } + _ul do + _li "\u2716 delete this email", onMousedown: self.delete_message + end + # locate corresponding signature file (if any) signature = CheckSignature.find(decodeURIComponent(@selected), @attachments) @@ -603,6 +607,7 @@ def revert(_event) } end + # rotate an attachment def rotate_attachment(event) message = window.parent.location.pathname From adb7fddc264018acb75aff78439a2836f9b3a28c Mon Sep 17 00:00:00 2001 From: Sebb Date: Thu, 1 Aug 2024 15:10:13 +0100 Subject: [PATCH 18/56] Add an undelete button --- www/secretary/workbench/views/parts.js.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/www/secretary/workbench/views/parts.js.rb b/www/secretary/workbench/views/parts.js.rb index 8f1c86c21a..f9bfe50e06 100644 --- a/www/secretary/workbench/views/parts.js.rb +++ b/www/secretary/workbench/views/parts.js.rb @@ -50,6 +50,10 @@ def render } } + _ul do + _li "undelete this email", onMousedown: self.undelete_message + end + _ul do _li "\u2716 delete this email", onMousedown: self.delete_message end @@ -559,6 +563,18 @@ def delete_message(event) } end + # undelete a message + def undelete_message(event) + @busy = true + pathname = window.parent.location.pathname + HTTP.patch(pathname, status: nil).then { + window.parent.location.href = '../..' + }.catch {|error| + alert error + @busy = false + } + end + # delete an attachment def delete_attachment(event) data = { From 0e8b021c653eb0cc43f33ef314ed804305810ed8 Mon Sep 17 00:00:00 2001 From: Sebb Date: Fri, 2 Aug 2024 15:10:14 +0100 Subject: [PATCH 19/56] Reparse needs active node --- www/secretary/workbench/server.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/www/secretary/workbench/server.rb b/www/secretary/workbench/server.rb index f563cfe6c4..d295917c38 100644 --- a/www/secretary/workbench/server.rb +++ b/www/secretary/workbench/server.rb @@ -230,6 +230,8 @@ def self.safe_for_line_ending_conversion?(string) # reparse an existing message get %r{/(\d{6})/(\w+)/_reparse_} do |month, hash| + return [503, UNAVAILABLE] if UNAVAILABLE + mailbox = Mailbox.new(month) message = mailbox.find(hash) pass unless message From 1e334150c22be0d9a59d4a5b60b7e666383d10f3 Mon Sep 17 00:00:00 2001 From: Sebb Date: Fri, 2 Aug 2024 22:39:44 +0100 Subject: [PATCH 20/56] Docco [skip ci] --- www/secretary/workbench/server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/secretary/workbench/server.rb b/www/secretary/workbench/server.rb index d295917c38..b2635ac393 100644 --- a/www/secretary/workbench/server.rb +++ b/www/secretary/workbench/server.rb @@ -64,7 +64,7 @@ def self.safe_for_line_ending_conversion?(string) archives = Dir[File.join(ARCHIVE, '*.yml')].select {|name| name =~ %r{/\d{6}\.yml$}} @mbox = archives.empty? ? nil : File.basename(archives.max, '.yml') if @mbox - @mbox = [Date.today.strftime('%Y%m'), @mbox].min + @mbox = [Date.today.strftime('%Y%m'), @mbox].min # Exclude future-dated entries @messages = Mailbox.new(@mbox).client_headers.select do |message| message[:status] != :deleted end From a3a86ea30c6c0418c01659f045e57d0e617eca21 Mon Sep 17 00:00:00 2001 From: Sebb Date: Fri, 2 Aug 2024 22:40:46 +0100 Subject: [PATCH 21/56] Display all messages with links --- www/secretary/workbench/server.rb | 7 ++++++ www/secretary/workbench/views/all.html.rb | 27 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 www/secretary/workbench/views/all.html.rb diff --git a/www/secretary/workbench/server.rb b/www/secretary/workbench/server.rb index b2635ac393..fac856baf8 100644 --- a/www/secretary/workbench/server.rb +++ b/www/secretary/workbench/server.rb @@ -112,6 +112,13 @@ def self.safe_for_line_ending_conversion?(string) _html :deleted end +# display all messages +get %r{/(\d{6})/all} do |mbox| + @mbox = mbox + @messages = Mailbox.new(@mbox).client_headers + _html :all +end + # retrieve a single message get %r{/(\d{6})/(\w+)/} do |month, hash| @message = Mailbox.new(month).headers[hash] diff --git a/www/secretary/workbench/views/all.html.rb b/www/secretary/workbench/views/all.html.rb new file mode 100644 index 0000000000..056da4649d --- /dev/null +++ b/www/secretary/workbench/views/all.html.rb @@ -0,0 +1,27 @@ +_html do + _h1 'All messages' + _table.table do + _thead do + _tr do + _th 'Status' + _th 'Timestamp' + _th 'From' + _th 'Subject' + end + end + _tbody do + @messages.each do |msg| + time = Time.parse(msg[:time]).to_s + _tr do + _td msg[:status].to_s + _td do + _a time, href: "../%s" % msg[:href], title: time + end + _td msg[:from] + _td msg[:subject] + end + end + end + end + _hr +end From b923b96e15e5435e52eb0a3358adc4b1004a661e Mon Sep 17 00:00:00 2001 From: Sebb Date: Sat, 3 Aug 2024 00:07:42 +0100 Subject: [PATCH 22/56] Ensure something useful is returned [skip ci] --- www/secretary/workbench/views/index.json.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/www/secretary/workbench/views/index.json.rb b/www/secretary/workbench/views/index.json.rb index ae458fc29a..d53f2dc731 100644 --- a/www/secretary/workbench/views/index.json.rb +++ b/www/secretary/workbench/views/index.json.rb @@ -19,4 +19,10 @@ mbox: (File.basename(prevmbox, '.yml') if prevmbox), messages: Mailbox.new(@mbox).client_headers } +else + # ensure we return something usable + { + mbox: nil, + messages: [] + } end From d2a1e6ffffaaf8c3c93918947c274e112fd9df08 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sat, 3 Aug 2024 00:09:51 +0100 Subject: [PATCH 23/56] Current month may not have any messages yet [skip ci] --- www/secretary/workbench/server.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/secretary/workbench/server.rb b/www/secretary/workbench/server.rb index fac856baf8..5154070ffc 100644 --- a/www/secretary/workbench/server.rb +++ b/www/secretary/workbench/server.rb @@ -61,10 +61,10 @@ def self.safe_for_line_ending_conversion?(string) redirect to('/') if env['REQUEST_URI'] == env['SCRIPT_NAME'] # determine latest month for which there are messages - archives = Dir[File.join(ARCHIVE, '*.yml')].select {|name| name =~ %r{/\d{6}\.yml$}} + current = Date.today.strftime('%Y%m') # exclude future-dated entries + archives = Dir[File.join(ARCHIVE, '*.yml')].select {|name| name =~ %r{/\d{6}\.yml$} && File.basename(name,'.yml') <= current} @mbox = archives.empty? ? nil : File.basename(archives.max, '.yml') if @mbox - @mbox = [Date.today.strftime('%Y%m'), @mbox].min # Exclude future-dated entries @messages = Mailbox.new(@mbox).client_headers.select do |message| message[:status] != :deleted end From bbbe8578757a168235fab29efbf9717d02d9a56e Mon Sep 17 00:00:00 2001 From: John Bampton Date: Sat, 3 Aug 2024 22:56:03 +1000 Subject: [PATCH 24/56] Fix typo in `DOCKER.md` (#232) --- DOCKER.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DOCKER.md b/DOCKER.md index 316a0763d8..fa694c42d6 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -142,7 +142,7 @@ If a developer needs such access, they should use a local SVN repository. Using a local SVN repository ---------------------------- Create a directory called REPO (must agree with docker-config/whimsy.conf) under the whimsy parent directory -(i.e. alonside the gems/ directory) +(i.e. alongside the gems/ directory) Set up 3 local SVN repositories under the REPO directory using `svnadmin create` with the names: asf, private, infra Under each of these, create the directories and files you need. From 2e364b1158025d79f21a3b48ebdafdd59467dcb4 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 4 Aug 2024 11:50:06 +0100 Subject: [PATCH 25/56] Better to use existing keypress --- www/secretary/workbench/views/parts.js.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/www/secretary/workbench/views/parts.js.rb b/www/secretary/workbench/views/parts.js.rb index f9bfe50e06..76c99d017b 100644 --- a/www/secretary/workbench/views/parts.js.rb +++ b/www/secretary/workbench/views/parts.js.rb @@ -54,9 +54,7 @@ def render _li "undelete this email", onMousedown: self.undelete_message end - _ul do - _li "\u2716 delete this email", onMousedown: self.delete_message - end + _p "(Use [ctrl|meta] + [delete|backspace] to delete this email)" # locate corresponding signature file (if any) signature = CheckSignature.find(decodeURIComponent(@selected), @attachments) From 378e3debeedbc7e350de980261929183b00c297a Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 6 Aug 2024 00:22:08 +0100 Subject: [PATCH 26/56] Don't fail when parsing empty file --- www/secretary/workbench/models/mailbox.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/secretary/workbench/models/mailbox.rb b/www/secretary/workbench/models/mailbox.rb index 9a12748661..fe0d325c8d 100644 --- a/www/secretary/workbench/models/mailbox.rb +++ b/www/secretary/workbench/models/mailbox.rb @@ -157,8 +157,8 @@ def dir # return headers (server view) # def headers - messages = YAML.load_file(yaml_file) rescue {} - messages.delete :mtime + messages = YAML.load_file(yaml_file) || {} rescue {} + messages.delete :mtime # TODO: is this needed? messages.each do |_key, value| value[:source] = @name end From 4a01056fb12b69c998c2fb609a1a5cfa85ef171e Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 6 Aug 2024 11:00:37 +0100 Subject: [PATCH 27/56] Allow for empty YAML file --- www/secretary/workbench/views/index.json.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/secretary/workbench/views/index.json.rb b/www/secretary/workbench/views/index.json.rb index d53f2dc731..d6f1ddaeb5 100644 --- a/www/secretary/workbench/views/index.json.rb +++ b/www/secretary/workbench/views/index.json.rb @@ -9,7 +9,7 @@ if index > 0 prevmbox = available[index-1] - prevmbox = nil unless YAML.load_file(prevmbox).any? do |key, mail| + prevmbox = nil unless YAML.load_file(prevmbox)&.any? do |key, mail| mail[:status] != :deleted and not Message.attachments(mail).empty? end end From abf9b38dcba615831780639a274c910f1d5c3ba2 Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 6 Aug 2024 11:10:13 +0100 Subject: [PATCH 28/56] Tools to list available mailboxes --- www/secretary/workbench/models/mailbox.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/www/secretary/workbench/models/mailbox.rb b/www/secretary/workbench/models/mailbox.rb index fe0d325c8d..4e3bebbf31 100644 --- a/www/secretary/workbench/models/mailbox.rb +++ b/www/secretary/workbench/models/mailbox.rb @@ -34,6 +34,24 @@ def self.fetch(mailboxes=nil) system 'rsync', *options, source, "#{ARCHIVE}/" end + # Get list of mailboxes + def self.allmailboxes + current = Date.today.strftime('%Y%m.yml') # exclude future-dated entries + Dir.entries(ARCHIVE).select{|name| name =~ %r{^\d{6}\.yml$} && name <= current}.map{|n| File.basename n,'.yml'}.sort + end + + # get prev and next entries (or nil) + def self.prev_next(current) + active = self.allmailboxes + index = active.find_index current + prv = nxt = nil + if index + prv = active[index - 1] if index > 0 + nxt = active[index + 1] if index < active.length + end + return prv, nxt + end + # # Initialize a mailbox # From f88653ddce5a019a76e0b1ee83bb19e129fe238b Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 6 Aug 2024 11:18:32 +0100 Subject: [PATCH 29/56] Add Links to Deleted and All messages --- www/secretary/workbench/server.rb | 12 ++++++++++++ www/secretary/workbench/views/all.html.rb | 9 ++++++++- www/secretary/workbench/views/deleted.html.rb | 9 ++++++++- www/secretary/workbench/views/index.html.rb | 3 +++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/www/secretary/workbench/server.rb b/www/secretary/workbench/server.rb index 5154070ffc..2fa04c30a3 100644 --- a/www/secretary/workbench/server.rb +++ b/www/secretary/workbench/server.rb @@ -103,18 +103,30 @@ def self.safe_for_line_ending_conversion?(string) _json :index # This invokes workbench/views/index.json.rb end +get '/deleted' do + current = Mailbox.allmailboxes.last + redirect to("/#{current}/deleted") +end + # display deleted messages get %r{/(\d{6})/deleted} do |mbox| @mbox = mbox + @prv, @nxt = Mailbox.prev_next(mbox) @messages = Mailbox.new(@mbox).client_headers.select do |message| message[:status] == :deleted end _html :deleted end +get '/all' do + current = Mailbox.allmailboxes.last + redirect to("/#{current}/all") +end + # display all messages get %r{/(\d{6})/all} do |mbox| @mbox = mbox + @prv, @nxt = Mailbox.prev_next(mbox) @messages = Mailbox.new(@mbox).client_headers _html :all end diff --git a/www/secretary/workbench/views/all.html.rb b/www/secretary/workbench/views/all.html.rb index 056da4649d..a22e425e0f 100644 --- a/www/secretary/workbench/views/all.html.rb +++ b/www/secretary/workbench/views/all.html.rb @@ -1,5 +1,12 @@ _html do - _h1 'All messages' + _h1 "All messages for #{@mbox}" + _a 'Workbench', href: '..' + if @prv + _a 'Previous', href: "../#{@prv}/all" + end + if @nxt + _a 'Next', href: "../#{@nxt}/all" + end _table.table do _thead do _tr do diff --git a/www/secretary/workbench/views/deleted.html.rb b/www/secretary/workbench/views/deleted.html.rb index 3d71f5e5b5..5a48698730 100644 --- a/www/secretary/workbench/views/deleted.html.rb +++ b/www/secretary/workbench/views/deleted.html.rb @@ -1,5 +1,12 @@ _html do - _h1.bg_danger 'Deleted messages' + _h1.bg_danger "Deleted messages for #{@mbox}" + _a 'Workbench', href: '..' + if @prv + _a 'Previous', href: "../#{@prv}/deleted" + end + if @nxt + _a 'Next', href: "../#{@nxt}/deleted" + end _table.table do _thead do _tr do diff --git a/www/secretary/workbench/views/index.html.rb b/www/secretary/workbench/views/index.html.rb index b1bcf06b37..a7ef8fa7ab 100644 --- a/www/secretary/workbench/views/index.html.rb +++ b/www/secretary/workbench/views/index.html.rb @@ -12,6 +12,9 @@ _h1.bg_success do _a 'ASF Secretary Mail', href: '.' end + _a 'Deleted messages', href: 'deleted' + _ '-' + _a 'All messages', href: 'all' end _div_.index! From d05073271e8e9fc0c0af425cf84791a24d3378ff Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 6 Aug 2024 11:30:07 +0100 Subject: [PATCH 30/56] Also add Pending messages --- www/secretary/workbench/server.rb | 15 +++++++++ www/secretary/workbench/views/index.html.rb | 2 ++ www/secretary/workbench/views/pending.html.rb | 32 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 www/secretary/workbench/views/pending.html.rb diff --git a/www/secretary/workbench/server.rb b/www/secretary/workbench/server.rb index 2fa04c30a3..807a021243 100644 --- a/www/secretary/workbench/server.rb +++ b/www/secretary/workbench/server.rb @@ -118,6 +118,21 @@ def self.safe_for_line_ending_conversion?(string) _html :deleted end +get '/pending' do + current = Mailbox.allmailboxes.last + redirect to("/#{current}/pending") +end + +# display pending messages +get %r{/(\d{6})/pending} do |mbox| + @mbox = mbox + @prv, @nxt = Mailbox.prev_next(mbox) + @messages = Mailbox.new(@mbox).client_headers.reject do |message| + message[:status] == :deleted + end + _html :pending +end + get '/all' do current = Mailbox.allmailboxes.last redirect to("/#{current}/all") diff --git a/www/secretary/workbench/views/index.html.rb b/www/secretary/workbench/views/index.html.rb index a7ef8fa7ab..c4bec1ea31 100644 --- a/www/secretary/workbench/views/index.html.rb +++ b/www/secretary/workbench/views/index.html.rb @@ -15,6 +15,8 @@ _a 'Deleted messages', href: 'deleted' _ '-' _a 'All messages', href: 'all' + _ '-' + _a 'Pending messages', href: 'pending' end _div_.index! diff --git a/www/secretary/workbench/views/pending.html.rb b/www/secretary/workbench/views/pending.html.rb new file mode 100644 index 0000000000..26e570b264 --- /dev/null +++ b/www/secretary/workbench/views/pending.html.rb @@ -0,0 +1,32 @@ +_html do + _h1 "Pending messages for #{@mbox}" + _a 'Workbench', href: '..' + if @prv + _a 'Previous', href: "../#{@prv}/pending" + end + if @nxt + _a 'Next', href: "../#{@nxt}/pending" + end + _table.table do + _thead do + _tr do + _th 'Timestamp' + _th 'From' + _th 'Subject' + end + end + _tbody do + @messages.each do |msg| + time = Time.parse(msg[:time]).to_s + _tr do + _td do + _a time, href: "../%s" % msg[:href], title: time + end + _td msg[:from] + _td msg[:subject] + end + end + end + end + _hr +end From a65858824e1a07c42939e0ec20a7c9c1dcf82431 Mon Sep 17 00:00:00 2001 From: Shane Curcuru Date: Fri, 16 Aug 2024 13:57:32 -0400 Subject: [PATCH 31/56] Add some notes about Annual vs. Special meeting --- www/members/meeting.cgi | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/www/members/meeting.cgi b/www/members/meeting.cgi index 14b4168feb..0c7f346571 100755 --- a/www/members/meeting.cgi +++ b/www/members/meeting.cgi @@ -119,11 +119,13 @@ _html do if today > ics_date # Based on the reconvene date _p do _ %{ - The last Annual Member's Meeting was held #{last_mtg_date.strftime('%A, %d %B %Y')}. Expect the - next Member's meeting to be scheduled between 12 - 13 months after the previous meeting, as per + The last Member's Meeting was held #{last_mtg_date.strftime('%A, %d %B %Y')}. Expect the + next Annual Member's meeting to be scheduled between 12 - 13 months after the previous Annual meeting, as per } _a 'https://www.apache.org/foundation/bylaws.html#3.2', 'the bylaws 3.2.' - _ 'Stay tuned for a [NOTICE] email on members-notify@ announcing the next meeting. The below information is about the ' + _ 'Stay tuned for a [NOTICE] ' + _a 'https://lists.apache.org/list?members-notify@apache.org', 'email on members-notify@' + _ ' announcing the next meeting. The below information is about the ' _strong 'LAST' _ " Member's meeting." end @@ -134,12 +136,14 @@ _html do _span.glyphicon.glyphicon_time '' _ " #{ics_date.strftime(DTFORMAT)} " end - _ "as an online IRC meeting for about an hour. REMEMBER: all voting is done by email the week BEFORE the IRC meeting" + _ "as an online " + _a 'https://asfmm.apache.org', "ASFMM chat tool meeting" + _ " for less than an hour. REMEMBER: all voting is done by email the week BEFORE the ASFMM meeting." end _p do _ 'Please read below for a Timeline of Meeting activities and links to how you can take action, or see additional links to the right. ' _strong 'REMINDER: ' - _ 'Nominations for the board or new members close 10 days before the meeting starts; no new names may be added after that date.' + _ 'Nominations for the board or new members (when being held) close 10 days before the meeting starts; no new names may be added after that date.' end _p do _ 'Currently, we need ' @@ -155,7 +159,7 @@ _html do end _p 'Individual Members are considered to have Attended a meeting if they either: respond to Roll Call in the meeting; submit a proxy (this gets submitted during Roll Call); or who cast a ballot on any matters.' _ul do - _li '2024 dates:' + _li '2024 March Annual Meeting dates:' _li 'Nominations open: February 06' _li 'Nominations close: February 24, 2024 at 20:00' _li 'Ballots emailed: February 29, 2024' @@ -198,7 +202,7 @@ _html do _div id: 'nominations' _whimsy_panel("Timeline: Nomination Period (until 10 days BEFORE meeting)", style: 'panel-default') do _p do - _ 'Before the meeting, any Member may nominate people either for the Board, or as a New Member Candidate. Much of this discussion happens on members@ mailing list. Remember, all new nominated names must be checked into SVN 10 days before the meeting.' + _ 'Before any Annual meeting, any Member may nominate people either for the Board, or as a New Member Candidate. Much of this discussion happens on members@ mailing list. Remember, all new nominated names must be checked into SVN 10 days before the meeting.' _ 'Also, you should submit a proxy if you might not attend the the meeting.' _ul do ['board_nominations.txt', 'board_ballot.txt', '/members/board-nominate.cgi', '/members/board_nominations.cgi', @@ -240,10 +244,10 @@ _html do _ "Ballots close ONE FULL DAY (24 hours) BEFORE the meeting starts - don't wait to vote!" _ul do _li do - _a 'New Members Elected By Majority Yes/No/Abstain vote', href: 'https://www.apache.org/foundation/governance/meetings#how-member-votes-are-tallied' + _a 'New Members Elected By Majority Yes/No/Abstain vote, when elections held', href: 'https://www.apache.org/foundation/governance/meetings#how-member-votes-are-tallied' end _li do - _a 'Board Seats Are Elected By STV - ORDER OF YOUR VOTE MATTERS!', href: 'https://www.apache.org/foundation/governance/meetings#how-votes-for-the-board-are-tallied' + _a 'Board Seats Are Elected By STV at Annual Meetings - ORDER OF YOUR VOTE MATTERS!', href: 'https://www.apache.org/foundation/governance/meetings#how-votes-for-the-board-are-tallied' end end end @@ -257,8 +261,8 @@ _html do _em '(time)' end _ 'The meeting is typically short - it\'s primarily briefly reporting from officers, announcing vote results and any last-minute announcements. Members do not need to attend the meeting if you proxied or voted; all results will be emailed or checked into SVN.' - _ 'Various data files about the meeting (raw-irc-log, board voting tally) will be checked in within a day after the meeting for historical records.' - _ 'Votes for the Omnibus resolution are included in raw-irc-log. We do not currently publish vote results for new member nominees.' + _ 'Various data files about the meeting (raw-irc-log, board voting tally if present) will be checked in within soon after the meeting for historical records.' + _ 'Votes for the Omnibus resolution, if any, are included in raw-irc-log. We do not publish vote results for new member nominees.' _ul do ['record', 'attend', 'voter-tally', 'raw_board_votes.txt', 'raw-irc-log'].each do |f| _li do @@ -273,11 +277,11 @@ _html do end _div id: 'after' - _whimsy_panel("Timeline: After This Year's Meeting", style: 'panel-default') do + _whimsy_panel("Timeline: After This Meeting", style: 'panel-default') do _p do - _ 'Shortly after the second half Meeting ends, ' + _ 'Shortly after the live ASFMM Meeting ends, ' _a '@TheASF twitter', href: 'https://twitter.com/theasf' - _ ' will formally announce the new board - please wait to retweet the official announcement.' + _ ' will formally announce the new board, if an Annual meeting has elected one - please wait to retweet the official announcement.' _span.text_warning 'IMPORTANT:' _ ' Do not publicise the names of newly elected members! In rare cases, the new candidate might not accept the honor.' end From 38856aaf45b2d8ee3fe759dff0d0248efd18e38b Mon Sep 17 00:00:00 2001 From: Sebb Date: Fri, 23 Aug 2024 22:53:05 +0100 Subject: [PATCH 32/56] Allow for missing config file --- lib/whimsy/asf/mail.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/whimsy/asf/mail.rb b/lib/whimsy/asf/mail.rb index 944917f424..b5d201df11 100644 --- a/lib/whimsy/asf/mail.rb +++ b/lib/whimsy/asf/mail.rb @@ -259,11 +259,11 @@ def self._load_flags if not @flags or File.mtime(@list_flags) != @flags_mtime lists = [] File.open(@list_flags).each do |line| - if line.match(/^F:-([a-zA-Z]{26}) (\S+) (\S+)/) + if line.match(/(?:^F:-([a-zA-Z]{26}) )?(\S+) (\S+)/) flags, dom, list = $1, $2, $3 next if list =~ /^infra-[a-z]$/ or (dom == 'incubator' and list == 'infra-dev') - lists << [dom, list, flags] + lists << [dom, list, flags || ''] else raise "Unexpected flags: #{line}" end From 9a756e3ff9393ddce9d86791d9cf1543c5df69e5 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 12:14:29 +0100 Subject: [PATCH 33/56] Allow for missing LDAP project group --- www/roster/models/committee.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/www/roster/models/committee.rb b/www/roster/models/committee.rb index 50fc4b2015..4f12c6abdc 100644 --- a/www/roster/models/committee.rb +++ b/www/roster/models/committee.rb @@ -7,8 +7,7 @@ def self.serialize(id, env) return unless pmc.pmc? # Only show PMCs owners = pmc.owners committers = pmc.committers - return if owners.empty? and committers.empty? - + # These may be empty if there is no matching LDAP group, e.g. during initial setup ASF::Committee.load_committee_info # We'll be needing the mail data later ASF::Person.preload(['cn', 'mail', 'asf-altEmail', 'githubUsername'], (owners + committers).uniq) From 3a1292eaa8e41bdfd862e47887c53884bde355e5 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 14:39:19 +0100 Subject: [PATCH 34/56] See if can trace status hang --- www/status/monitors/git.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/www/status/monitors/git.rb b/www/status/monitors/git.rb index 4712089387..dda4425137 100644 --- a/www/status/monitors/git.rb +++ b/www/status/monitors/git.rb @@ -144,13 +144,14 @@ def show(name,value) end # for debugging purposes -if __FILE__ == $0 - response = Monitor.git(nil) # must agree with method name above - data = response[:data] - data.each do |k,v| - puts "#{k} #{data[k][:level]} #{data[k][:title] or data[k][:data] }" - end -end +# Temporarily disable; seems to cause hang TODO FIX +# if __FILE__ == $0 +# response = Monitor.git(nil) # must agree with method name above +# data = response[:data] +# data.each do |k,v| +# puts "#{k} #{data[k][:level]} #{data[k][:title] or data[k][:data] }" +# end +# end # test data __END__ From e5de4c3630a77e96afbc924525fc01f5d2d5aca6 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 14:51:34 +0100 Subject: [PATCH 35/56] Revert "See if can trace status hang" This reverts commit 3a1292eaa8e41bdfd862e47887c53884bde355e5. --- www/status/monitors/git.rb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/www/status/monitors/git.rb b/www/status/monitors/git.rb index dda4425137..4712089387 100644 --- a/www/status/monitors/git.rb +++ b/www/status/monitors/git.rb @@ -144,14 +144,13 @@ def show(name,value) end # for debugging purposes -# Temporarily disable; seems to cause hang TODO FIX -# if __FILE__ == $0 -# response = Monitor.git(nil) # must agree with method name above -# data = response[:data] -# data.each do |k,v| -# puts "#{k} #{data[k][:level]} #{data[k][:title] or data[k][:data] }" -# end -# end +if __FILE__ == $0 + response = Monitor.git(nil) # must agree with method name above + data = response[:data] + data.each do |k,v| + puts "#{k} #{data[k][:level]} #{data[k][:title] or data[k][:data] }" + end +end # test data __END__ From 126b26309a79682ff4622112e8eee342b6c281ae Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 17:56:14 +0100 Subject: [PATCH 36/56] Ignore cached gpg keys; always fetch --- .../views/actions/check-signature.json.rb | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/www/secretary/workbench/views/actions/check-signature.json.rb b/www/secretary/workbench/views/actions/check-signature.json.rb index 935b751b9c..1fc7e1f541 100644 --- a/www/secretary/workbench/views/actions/check-signature.json.rb +++ b/www/secretary/workbench/views/actions/check-signature.json.rb @@ -83,14 +83,17 @@ def validate_sig(attachment, signature, msgid) # run gpg verify command # TODO: may need to drop the keyid-format parameter when gpg is updated as it might # reduce the keyid length from the full fingerprint - out, err, rc = Open3.capture3 gpg, - '--keyid-format', 'long', # Show a longer id - '--verify', signature.path, attachment.path + + # Temp test - could be made permanent: + # Ignore existing cached keys, so we always fetch the current key + # out, err, rc = Open3.capture3 gpg, + # '--keyid-format', 'long', # Show a longer id + # '--verify', signature.path, attachment.path # if key is not found, fetch and try again - if - err.include? "gpg: Can't check signature: No public key" or - err.include? "gpg: Can't check signature: public key not found" + if true # IGNORE existing entries + # err.include? "gpg: Can't check signature: No public key" or + # err.include? "gpg: Can't check signature: public key not found" then # extract and fetch key keyid = err[/[RD]SA key (ID )?(\w+)/,2] From 696ef87390e830567b715671b88d79b18e392d5f Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 17:59:57 +0100 Subject: [PATCH 37/56] Revert "Ignore cached gpg keys; always fetch" This reverts commit 126b26309a79682ff4622112e8eee342b6c281ae. --- .../views/actions/check-signature.json.rb | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/www/secretary/workbench/views/actions/check-signature.json.rb b/www/secretary/workbench/views/actions/check-signature.json.rb index 1fc7e1f541..935b751b9c 100644 --- a/www/secretary/workbench/views/actions/check-signature.json.rb +++ b/www/secretary/workbench/views/actions/check-signature.json.rb @@ -83,17 +83,14 @@ def validate_sig(attachment, signature, msgid) # run gpg verify command # TODO: may need to drop the keyid-format parameter when gpg is updated as it might # reduce the keyid length from the full fingerprint - - # Temp test - could be made permanent: - # Ignore existing cached keys, so we always fetch the current key - # out, err, rc = Open3.capture3 gpg, - # '--keyid-format', 'long', # Show a longer id - # '--verify', signature.path, attachment.path + out, err, rc = Open3.capture3 gpg, + '--keyid-format', 'long', # Show a longer id + '--verify', signature.path, attachment.path # if key is not found, fetch and try again - if true # IGNORE existing entries - # err.include? "gpg: Can't check signature: No public key" or - # err.include? "gpg: Can't check signature: public key not found" + if + err.include? "gpg: Can't check signature: No public key" or + err.include? "gpg: Can't check signature: public key not found" then # extract and fetch key keyid = err[/[RD]SA key (ID )?(\w+)/,2] From 5b679a64a3703fd09d59ab1b4e2b585484a26df0 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 20:05:36 +0100 Subject: [PATCH 38/56] Always fetch current key --- .../workbench/views/actions/check-signature.json.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/www/secretary/workbench/views/actions/check-signature.json.rb b/www/secretary/workbench/views/actions/check-signature.json.rb index 935b751b9c..a0c14bff97 100644 --- a/www/secretary/workbench/views/actions/check-signature.json.rb +++ b/www/secretary/workbench/views/actions/check-signature.json.rb @@ -80,21 +80,17 @@ def validate_sig(attachment, signature, msgid) gpg = `which gpg2`.chomp gpg = `which gpg`.chomp if gpg.empty? - # run gpg verify command + # run gpg verify command - this is needed to determine the key-id # TODO: may need to drop the keyid-format parameter when gpg is updated as it might # reduce the keyid length from the full fingerprint out, err, rc = Open3.capture3 gpg, '--keyid-format', 'long', # Show a longer id '--verify', signature.path, attachment.path - # if key is not found, fetch and try again - if - err.include? "gpg: Can't check signature: No public key" or - err.include? "gpg: Can't check signature: public key not found" + # Look for the keyid so we can fetch the current key + keyid = err[/[RD]SA key (ID )?(\w+)/,2] + if keyid then - # extract and fetch key - keyid = err[/[RD]SA key (ID )?(\w+)/,2] - # Try to fetch the key Dir.mktmpdir do |dir| found = false From fcd0a9e26868439b30921122860f783a069a3320 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 20:22:23 +0100 Subject: [PATCH 39/56] Don't rely on import message --- www/secretary/workbench/views/actions/check-signature.json.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/secretary/workbench/views/actions/check-signature.json.rb b/www/secretary/workbench/views/actions/check-signature.json.rb index a0c14bff97..59b6755a23 100644 --- a/www/secretary/workbench/views/actions/check-signature.json.rb +++ b/www/secretary/workbench/views/actions/check-signature.json.rb @@ -105,7 +105,7 @@ def validate_sig(attachment, signature, msgid) '--batch', '--import', tmpfile # For later analysis Wunderbar.warn "#{gpg} --import #{tmpfile} rc=#{rc} out=#{out} err=#{err}" - if err.include? 'imported: 1' # downloaded key is valid; store it for posterity + if err.include? 'gpg: Signature made' # downloaded key is valid; store it for posterity TODO: better check Dir.mktmpdir do |tmpdir| container = ASF::SVN.svnpath!('iclas', '__keys__') ASF::SVN.svn!('checkout',[container, tmpdir], {depth: 'empty', env: env}) From 9b79853854fa113dd7e2408898a2e322fd15f634 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 20:28:28 +0100 Subject: [PATCH 40/56] Better key check --- www/secretary/workbench/views/actions/check-signature.json.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/secretary/workbench/views/actions/check-signature.json.rb b/www/secretary/workbench/views/actions/check-signature.json.rb index 59b6755a23..8ddcbc3d6e 100644 --- a/www/secretary/workbench/views/actions/check-signature.json.rb +++ b/www/secretary/workbench/views/actions/check-signature.json.rb @@ -105,7 +105,7 @@ def validate_sig(attachment, signature, msgid) '--batch', '--import', tmpfile # For later analysis Wunderbar.warn "#{gpg} --import #{tmpfile} rc=#{rc} out=#{out} err=#{err}" - if err.include? 'gpg: Signature made' # downloaded key is valid; store it for posterity TODO: better check + if err.include?('imported: 1') or err.include?('processed: 1') # downloaded key is valid; store it for posterity Dir.mktmpdir do |tmpdir| container = ASF::SVN.svnpath!('iclas', '__keys__') ASF::SVN.svn!('checkout',[container, tmpdir], {depth: 'empty', env: env}) From 43d9cdcc611e865feef8b9e50c6f133d83afc0be Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 20:30:27 +0100 Subject: [PATCH 41/56] Oops, wrong check --- www/secretary/workbench/views/actions/check-signature.json.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/secretary/workbench/views/actions/check-signature.json.rb b/www/secretary/workbench/views/actions/check-signature.json.rb index 8ddcbc3d6e..5d669be496 100644 --- a/www/secretary/workbench/views/actions/check-signature.json.rb +++ b/www/secretary/workbench/views/actions/check-signature.json.rb @@ -105,7 +105,7 @@ def validate_sig(attachment, signature, msgid) '--batch', '--import', tmpfile # For later analysis Wunderbar.warn "#{gpg} --import #{tmpfile} rc=#{rc} out=#{out} err=#{err}" - if err.include?('imported: 1') or err.include?('processed: 1') # downloaded key is valid; store it for posterity + if err.include?('imported: 1') or err.include?('unchanged: 1') # downloaded key is valid; store it for posterity Dir.mktmpdir do |tmpdir| container = ASF::SVN.svnpath!('iclas', '__keys__') ASF::SVN.svn!('checkout',[container, tmpdir], {depth: 'empty', env: env}) From 73694233eb7a68d3fc723e21c0134f7cbf602932 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 20:56:57 +0100 Subject: [PATCH 42/56] Better check --- .../workbench/views/actions/check-signature.json.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/www/secretary/workbench/views/actions/check-signature.json.rb b/www/secretary/workbench/views/actions/check-signature.json.rb index 5d669be496..0ada63cb21 100644 --- a/www/secretary/workbench/views/actions/check-signature.json.rb +++ b/www/secretary/workbench/views/actions/check-signature.json.rb @@ -87,6 +87,10 @@ def validate_sig(attachment, signature, msgid) '--keyid-format', 'long', # Show a longer id '--verify', signature.path, attachment.path + # N.B. the code now always fetches the key, so it is guaranteed current. + # Might need to consider allowing for using a cached key if fetches fail frequently, + # but this should probably be on demand only + # Look for the keyid so we can fetch the current key keyid = err[/[RD]SA key (ID )?(\w+)/,2] if keyid @@ -105,7 +109,7 @@ def validate_sig(attachment, signature, msgid) '--batch', '--import', tmpfile # For later analysis Wunderbar.warn "#{gpg} --import #{tmpfile} rc=#{rc} out=#{out} err=#{err}" - if err.include?('imported: 1') or err.include?('unchanged: 1') # downloaded key is valid; store it for posterity + if err.include?('processed: 1') # downloaded key is valid; store it for posterity Dir.mktmpdir do |tmpdir| container = ASF::SVN.svnpath!('iclas', '__keys__') ASF::SVN.svn!('checkout',[container, tmpdir], {depth: 'empty', env: env}) From 7dfd23c1084c6b798cc81fe11758561dd4e98dfc Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 23:16:29 +0100 Subject: [PATCH 43/56] Try previous macos --- .github/workflows/unittestlib.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unittestlib.yml b/.github/workflows/unittestlib.yml index 7b73327f97..a53c67a75b 100644 --- a/.github/workflows/unittestlib.yml +++ b/.github/workflows/unittestlib.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, ubuntu-20.04, ubuntu-22.04] + os: [macos-13, ubuntu-20.04, ubuntu-22.04] ruby: [2.7, 3.1] # 2.7 not supported on 22.04 exclude: From 028f7229b80b2dbc1dfc8c18d76b1a12470fd125 Mon Sep 17 00:00:00 2001 From: Sebb Date: Sun, 25 Aug 2024 23:46:41 +0100 Subject: [PATCH 44/56] logo dev mail list override --- lib/whimsy/asf/committee.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb index 6d193fc96f..1d3151f773 100644 --- a/lib/whimsy/asf/committee.rb +++ b/lib/whimsy/asf/committee.rb @@ -143,6 +143,8 @@ def mail_list 'planners@apachecon.com' when 'publicaffairs' 'public-affairs-private@apache.org' + when 'logodevelopment' + 'logo-dev@apache.org' # their only list as at 2024-08-25 else name.downcase end From 46338fc11004a5b2eb9be7b9fd01f6ad75e0799b Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 27 Aug 2024 11:26:47 +0100 Subject: [PATCH 45/56] Needed for CLI testing [skip ci] --- www/status/monitor.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/www/status/monitor.rb b/www/status/monitor.rb index e48488f1e2..13dcf2faa3 100644 --- a/www/status/monitor.rb +++ b/www/status/monitor.rb @@ -20,6 +20,12 @@ require 'time' require 'thread' +# for debugging purposes must include status +if __FILE__ == $0 + $LOAD_PATH.unshift '/srv/whimsy/lib' + require 'whimsy/asf/status' +end + class Monitor # match http://getbootstrap.com/components/#alerts LEVELS = %w(success info warning danger fatal) From 09bc8a36f28d5ef12ddfb4be038ef14dd52dc435 Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 27 Aug 2024 12:08:10 +0100 Subject: [PATCH 46/56] Rename to avoid collision with Ruby Monitor class --- www/status/README.md | 2 +- www/status/index.cgi | 2 +- www/status/monitor.rb | 6 +++--- www/status/monitors/board_minutes.rb | 4 ++-- www/status/monitors/git.rb | 4 ++-- www/status/monitors/mail_jobs.rb | 2 +- www/status/monitors/public_json.rb | 2 +- www/status/monitors/secmail.rb | 2 +- www/status/monitors/site_scan.rb | 2 +- www/status/monitors/svn.rb | 4 ++-- www/status/monitors/system.rb | 2 +- www/status/monitors/unit_test.rb | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/www/status/README.md b/www/status/README.md index bd89640a80..f1909baa1f 100644 --- a/www/status/README.md +++ b/www/status/README.md @@ -83,7 +83,7 @@ can be done either by browsers or pings, results in a call to If it has been more than 60 seconds since the last status update, index.cgi will call [monitor.rb](https://github.com/apache/whimsy/blob/master/www/status/monitor.rb). -Monitor.rb will load and then call each of the monitors defined in the +StatusMonitor.rb will load and then call each of the monitors defined in the [monitors](https://github.com/apache/whimsy/tree/master/www/status/monitors) subdirectory. diff --git a/www/status/index.cgi b/www/status/index.cgi index e6dc5a8870..d279543450 100755 --- a/www/status/index.cgi +++ b/www/status/index.cgi @@ -12,7 +12,7 @@ status = JSON.parse(File.read(json)) rescue {} if not status[:mtime] or Time.now - Time.parse(status[:mtime]) > 60 begin require_relative './monitor' - status = Monitor.new.status || {} + status = StatusMonitor.new.status || {} rescue Exception => e print "Status: 500 Internal Server Error\r\n" print "Context-Type: text/plain\r\n\r\n" diff --git a/www/status/monitor.rb b/www/status/monitor.rb index 13dcf2faa3..a1c849c4d6 100644 --- a/www/status/monitor.rb +++ b/www/status/monitor.rb @@ -26,7 +26,7 @@ require 'whimsy/asf/status' end -class Monitor +class StatusMonitor # match http://getbootstrap.com/components/#alerts LEVELS = %w(success info warning danger fatal) @@ -58,7 +58,7 @@ def initialize(args = []) begin # invoke method to determine current status previous = baseline[:data][method.to_sym] || {mtime: Time.at(0)} - status = Monitor.send(method, previous) || previous + status = StatusMonitor.send(method, previous) || previous # convert non-hashes in proper statuses if not status.instance_of? Hash @@ -193,5 +193,5 @@ def normalize(status) # for debugging purposes if __FILE__ == $0 - puts JSON.pretty_generate(Monitor.new(ARGV).status) + puts JSON.pretty_generate(StatusMonitor.new(ARGV).status) end diff --git a/www/status/monitors/board_minutes.rb b/www/status/monitors/board_minutes.rb index 0563e97633..7fdfa65e50 100644 --- a/www/status/monitors/board_minutes.rb +++ b/www/status/monitors/board_minutes.rb @@ -16,7 +16,7 @@ require 'time' -def Monitor.board_minutes(previous_status) +def StatusMonitor.board_minutes(previous_status) index = File.expand_path('../../www/board/minutes/index.html') log = File.read(File.expand_path('../../www/logs/collate_minutes')) @@ -41,4 +41,4 @@ def Monitor.board_minutes(previous_status) if __FILE__ == $0 require_relative 'unit_test' runtest('board_minutes') # must agree with method name above -end \ No newline at end of file +end diff --git a/www/status/monitors/git.rb b/www/status/monitors/git.rb index 4712089387..856047dd68 100644 --- a/www/status/monitors/git.rb +++ b/www/status/monitors/git.rb @@ -16,7 +16,7 @@ SUMMARY_RE = %r{^ \d+ files? changed(, \d+ insertions?\(\+\))?(, \d+ deletions?\(-\))?$} -def Monitor.git(previous_status) +def StatusMonitor.git(previous_status) logdir = File.expand_path('../../../logs', __FILE__) log = File.join(logdir, 'git-pull') @@ -145,7 +145,7 @@ def show(name,value) # for debugging purposes if __FILE__ == $0 - response = Monitor.git(nil) # must agree with method name above + response = StatusMonitor.git(nil) # must agree with method name above data = response[:data] data.each do |k,v| puts "#{k} #{data[k][:level]} #{data[k][:title] or data[k][:data] }" diff --git a/www/status/monitors/mail_jobs.rb b/www/status/monitors/mail_jobs.rb index 43397898e0..6e3f4c9162 100644 --- a/www/status/monitors/mail_jobs.rb +++ b/www/status/monitors/mail_jobs.rb @@ -16,7 +16,7 @@ require 'fileutils' require 'time' -def Monitor.mail_jobs(previous_status) +def StatusMonitor.mail_jobs(previous_status) danger_period = 86_400 # one day diff --git a/www/status/monitors/public_json.rb b/www/status/monitors/public_json.rb index 22bfae1bae..8aef674ba9 100644 --- a/www/status/monitors/public_json.rb +++ b/www/status/monitors/public_json.rb @@ -17,7 +17,7 @@ require 'fileutils' require 'time' -def Monitor.public_json(previous_status) +def StatusMonitor.public_json(previous_status) danger_period = 86_400 # one day warning_period = 5400 # 1.5 hours diff --git a/www/status/monitors/secmail.rb b/www/status/monitors/secmail.rb index 0e3f9e590f..92b9ce3387 100644 --- a/www/status/monitors/secmail.rb +++ b/www/status/monitors/secmail.rb @@ -4,7 +4,7 @@ require 'time' -def Monitor.secmail(previous_status) +def StatusMonitor.secmail(previous_status) log = '/srv/mail/procmail.log' {mtime: File.mtime(log).gmtime.iso8601, level: 'success'} # to agree with normalise diff --git a/www/status/monitors/site_scan.rb b/www/status/monitors/site_scan.rb index d2cca96d27..5a3d4f62c5 100644 --- a/www/status/monitors/site_scan.rb +++ b/www/status/monitors/site_scan.rb @@ -14,7 +14,7 @@ require 'time' -def Monitor.site_scan(previous_status) +def StatusMonitor.site_scan(previous_status) logdir = File.expand_path('../../www/logs') logfile = File.join(logdir, 'site-scan') log = File.read(logfile) diff --git a/www/status/monitors/svn.rb b/www/status/monitors/svn.rb index 363acf616a..3f821a0d5e 100644 --- a/www/status/monitors/svn.rb +++ b/www/status/monitors/svn.rb @@ -18,7 +18,7 @@ # Match revision messages REV_RE = %r{^(Checked out|\s*Updated ('[^']+' )?to|At|List updated from \d+ to|List is at) (revision |r)\d+\s*\.$} -def Monitor.svn(previous_status) +def StatusMonitor.svn(previous_status) logdir = File.expand_path('../../../logs', __FILE__) archive = File.join(logdir,'archive') FileUtils.mkdir(archive) unless File.directory?(archive) @@ -101,7 +101,7 @@ def Monitor.svn(previous_status) # for debugging purposes if __FILE__ == $0 if ARGV.first == '__DATA__' - response = Monitor.svn(nil) # must agree with method name above + response = StatusMonitor.svn(nil) # must agree with method name above data = response[:data] data.each do |k,v| puts "#{k} #{data[k][:level]} #{data[k][:title]} #{data[k][:data]}" diff --git a/www/status/monitors/system.rb b/www/status/monitors/system.rb index f326028e09..04da189ced 100644 --- a/www/status/monitors/system.rb +++ b/www/status/monitors/system.rb @@ -5,7 +5,7 @@ require 'time' -def Monitor.system(previous_status) +def StatusMonitor.system(previous_status) name=:puppet status = {} status[name] = { diff --git a/www/status/monitors/unit_test.rb b/www/status/monitors/unit_test.rb index 2ba91c5b1e..6201c4985f 100644 --- a/www/status/monitors/unit_test.rb +++ b/www/status/monitors/unit_test.rb @@ -9,7 +9,7 @@ def runtest(method_name) baseline = JSON.parse(File.read(status_file),{symbolize_names: true}) rescue {} baseline[:data] = {} unless baseline[:data].instance_of? Hash previous = baseline[:data][method_name.to_sym] || {mtime: Time.at(0)} - response = Monitor.send(method_name, previous) + response = StatusMonitor.send(method_name, previous) if response == previous puts "No change in response" elsif response[:data] and response[:data] == previous[:data] From ecb8fbfbc0189df5219c9adeceb49285ee8c89ce Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 27 Aug 2024 14:12:46 +0100 Subject: [PATCH 47/56] Rubocop - Style/StringLiterals Prefer single-quoted strings when you don't need string interpolation or special symbols. --- Rakefile | 40 +- asf.gemspec | 26 +- config/setupmymac | 60 +- lib/spec/lib/committee_spec.rb | 28 +- lib/spec/lib/documents_spec.rb | 8 +- lib/spec/lib/icla_spec.rb | 22 +- lib/spec/lib/mail/mail_spec.rb | 10 +- lib/spec/lib/mail/mlist_spec.rb | 36 +- lib/spec/lib/member_spec.rb | 18 +- lib/spec/lib/svn_spec.rb | 76 +- lib/spec/lib/svn_wunderbar_spec.rb | 56 +- lib/spec/lib/yaml_spec.rb | 28 +- lib/spec/spec_helper.rb | 8 +- lib/whimsy/asf/agenda.rb | 4 +- lib/whimsy/asf/agenda/summary.rb | 4 +- lib/whimsy/asf/board.rb | 4 +- lib/whimsy/asf/committee.rb | 10 +- lib/whimsy/asf/config.rb | 4 +- lib/whimsy/asf/git.rb | 2 +- lib/whimsy/asf/icla.rb | 2 +- lib/whimsy/asf/icla_text.rb | 44 +- lib/whimsy/asf/json-utils.rb | 4 +- lib/whimsy/asf/ldap.rb | 22 +- lib/whimsy/asf/mail.rb | 2 +- lib/whimsy/asf/meeting-util.rb | 8 +- lib/whimsy/asf/member-files.rb | 18 +- lib/whimsy/asf/member.rb | 12 +- lib/whimsy/asf/mlist.rb | 12 +- lib/whimsy/asf/nominees.rb | 2 +- lib/whimsy/asf/person/override-dates.rb | 3990 ++++++++--------- lib/whimsy/asf/podling.rb | 4 +- lib/whimsy/asf/rack.rb | 4 +- lib/whimsy/asf/status.rb | 2 +- lib/whimsy/asf/svn.rb | 20 +- lib/whimsy/asf/themes.rb | 20 +- lib/whimsy/cache.rb | 2 +- lib/whimsy/lockfile.rb | 4 +- lib/whimsy/logparser.rb | 2 +- lib/whimsy/sitewebsite.rb | 8 +- lib/whimsy/utf8-utils.rb | 4 +- tools/agenda_summary.rb | 6 +- tools/collate_minutes.rb | 44 +- tools/comdevtalks.rb | 250 +- tools/download_check.rb | 58 +- tools/fixroster.rb | 4 +- tools/iclasort.rb | 2 +- tools/mboxhdr2csv.rb | 12 +- tools/mirror_check.rb | 26 +- tools/mkconf.rb | 12 +- tools/moderationhelper.rb | 34 +- tools/modify_pmcchairs.rb | 2 +- tools/namemap.rb | 2 +- tools/parsemail.rb | 4 +- tools/ponyapi.rb | 8 +- tools/ponypoop.rb | 4 +- tools/proxyhelper.rb | 2 +- tools/pubsub-ci-email.rb | 28 +- tools/pubsub.rb | 12 +- tools/pubsub2rake.rb | 24 +- tools/site-scan.rb | 6 +- tools/site_member_check.rb | 10 +- tools/tocsplit.rb | 2 +- tools/toucher.rb | 2 +- tools/travis-relay.rb | 2 +- tools/utf8-fix.rb | 4 +- tools/vhosttest.rb | 2 +- tools/votes2ini.rb | 4 +- tools/wwwdocs.rb | 4 +- www/board/agenda/Gemfile | 2 +- www/board/agenda/Rakefile | 2 +- www/board/agenda/Vagrantfile | 22 +- www/board/agenda/bin/remind-cronjob.rb | 6 +- www/board/agenda/daemon/wsc.rb | 14 +- www/board/agenda/daemon/wss.rb | 12 +- www/board/agenda/models/agenda.rb | 2 +- www/board/agenda/models/minutes.rb | 20 +- www/board/agenda/models/reporter.rb | 2 +- www/board/agenda/routes.rb | 14 +- www/board/agenda/spec/actions_spec.rb | 40 +- www/board/agenda/spec/client_spec.rb | 6 +- www/board/agenda/spec/filters_spec.rb | 16 +- www/board/agenda/spec/forms_spec.rb | 18 +- www/board/agenda/spec/index_spec.rb | 6 +- www/board/agenda/spec/navigate_spec.rb | 4 +- www/board/agenda/spec/other_views_spec.rb | 26 +- www/board/agenda/spec/parse_spec.rb | 8 +- www/board/agenda/spec/reflow_spec.rb | 12 +- www/board/agenda/spec/reports_spec.rb | 14 +- www/board/agenda/spec/secretary_spec.rb | 18 +- www/board/agenda/spec/spec_helper.rb | 12 +- www/board/agenda/spec/vue_server.rb | 4 +- www/board/agenda/test/stresstest.rb | 14 +- www/board/agenda/views/actions/attend.json.rb | 4 +- www/board/agenda/views/actions/commit.json.rb | 4 +- .../agenda/views/actions/financials.json.rb | 4 +- www/board/agenda/views/actions/post.json.rb | 12 +- .../views/actions/posted-reports.json.rb | 2 +- .../views/actions/potential-actions.json.rb | 2 +- .../agenda/views/actions/publish.json.rb | 6 +- .../views/actions/remind-actions.json.rb | 2 +- .../views/actions/reminder-text.json.rb | 6 +- .../agenda/views/actions/responses.json.rb | 2 +- www/board/agenda/views/actions/todos.json.rb | 4 +- .../agenda/views/buttons/add-comment.js.rb | 4 +- .../agenda/views/buttons/add-minutes.js.rb | 2 +- www/board/agenda/views/buttons/commit.js.rb | 2 +- .../agenda/views/buttons/draft-minutes.js.rb | 2 +- www/board/agenda/views/buttons/email.js.rb | 10 +- www/board/agenda/views/buttons/message.js.rb | 2 +- www/board/agenda/views/buttons/post.js.rb | 10 +- .../views/buttons/publish-minutes.js.rb | 2 +- .../agenda/views/buttons/remind-actions.js.rb | 8 +- .../agenda/views/buttons/reminders.js.rb | 6 +- www/board/agenda/views/buttons/summary.js.rb | 2 +- www/board/agenda/views/buttons/vote.js.rb | 6 +- .../agenda/views/committers_report.text.rb | 2 +- .../views/elements/additional-info.js.rb | 2 +- www/board/agenda/views/keyboard.js.rb | 24 +- www/board/agenda/views/layout/footer.js.rb | 4 +- www/board/agenda/views/layout/header.js.rb | 6 +- www/board/agenda/views/models/chat.js.rb | 6 +- www/board/agenda/views/models/events.js.rb | 8 +- .../agenda/views/models/jsonstorage.js.rb | 4 +- www/board/agenda/views/models/pending.js.rb | 10 +- www/board/agenda/views/new.html.rb | 8 +- .../agenda/views/pages/action-items.js.rb | 4 +- www/board/agenda/views/pages/fy23.js.rb | 6 +- www/board/agenda/views/pages/report.js.rb | 2 +- www/board/agenda/views/pages/roll-call.js.rb | 2 +- .../agenda/views/pages/select-actions.rb | 4 +- www/board/agenda/views/sw.js.rb | 6 +- www/board/agenda/views/touch.js.rb | 8 +- www/board/agenda/views/utils.js.rb | 6 +- www/board/agenda/views/vue-config.js.rb | 2 +- www/project/icla/Rakefile | 2 +- www/project/icla/main.rb | 8 +- www/project/icla/views/actions/update.json.rb | 2 +- .../icla/views/actions/validate.json.rb | 10 +- www/project/icla/views/app.html.rb | 6 +- www/project/icla/views/pages.js.rb | 28 +- www/project/icla/views/pages/discuss.js.rb | 20 +- www/project/icla/views/pages/invite.js.rb | 12 +- www/project/icla/views/pages/vote.js.rb | 22 +- www/project/icla/views/vue-config.js.rb | 2 +- www/roster/main.rb | 10 +- www/roster/models/group.rb | 10 +- www/roster/public_committee_info.rb | 4 +- www/roster/public_icla_info.rb | 2 +- www/roster/public_ldap_authgroups.rb | 2 +- www/roster/public_ldap_people.rb | 2 +- www/roster/public_ldap_projects.rb | 2 +- www/roster/public_ldap_roles.rb | 2 +- www/roster/public_ldap_services.rb | 2 +- www/roster/views/actions/authgroup.json.rb | 2 +- www/roster/views/actions/committee.json.rb | 2 +- .../views/actions/email_forward.json.rb | 2 +- www/roster/views/actions/memstat.json.rb | 16 +- www/roster/views/actions/memtext.json.rb | 2 +- www/roster/views/actions/nonpmc.json.rb | 2 +- www/roster/views/actions/pgpkeys.json.rb | 2 +- www/roster/views/actions/service.json.rb | 2 +- www/roster/views/committees.html.rb | 8 +- www/roster/views/committerSearch.js.rb | 2 +- www/roster/views/duties.html.rb | 2 +- www/roster/views/groups.html.rb | 8 +- www/roster/views/iclaSearch.js.rb | 2 +- www/roster/views/index.html.rb | 12 +- www/roster/views/members.html.rb | 2 +- www/roster/views/nonpmc/add.js.rb | 2 +- www/roster/views/nonpmc/main.js.rb | 6 +- www/roster/views/nonpmc/mod.js.rb | 6 +- www/roster/views/person/github.js.rb | 2 +- www/roster/views/person/main.js.rb | 12 +- www/roster/views/pmc/add.js.rb | 2 +- www/roster/views/pmc/main.js.rb | 10 +- www/roster/views/pmc/mod.js.rb | 6 +- www/roster/views/podlings.html.rb | 4 +- www/roster/views/ppmc/add.js.rb | 2 +- www/roster/views/ppmc/committers.js.rb | 4 +- www/roster/views/ppmc/main.js.rb | 26 +- www/roster/views/ppmc/members.js.rb | 2 +- www/roster/views/ppmc/mod.js.rb | 4 +- www/roster/views/ppmc_new.html.rb | 2 +- www/roster/views/ppmcs.html.rb | 6 +- www/roster/views/utils.js.rb | 2 +- www/roster/views/vue-config.js.rb | 2 +- www/secretary/iclaparser.rb | 20 +- www/secretary/workbench/tasks.rb | 6 +- .../workbench/views/actions/ccla.json.rb | 2 +- .../views/actions/check-signature.json.rb | 8 +- .../workbench/views/actions/icla.json.rb | 6 +- .../workbench/views/actions/icla2.json.rb | 8 +- .../workbench/views/actions/memapp.json.rb | 12 +- .../views/actions/parse-icla.json.rb | 2 +- www/secretary/workbench/views/all.html.rb | 2 +- www/secretary/workbench/views/deleted.html.rb | 2 +- .../workbench/views/forms/ccla.js.rb | 2 +- .../workbench/views/forms/forward.js.rb | 2 +- .../workbench/views/forms/grant.js.rb | 4 +- .../workbench/views/forms/icla.js.rb | 12 +- .../workbench/views/forms/icla2.js.rb | 2 +- .../workbench/views/forms/memapp.js.rb | 2 +- www/secretary/workbench/views/http.js.rb | 6 +- www/secretary/workbench/views/index.html.rb | 2 +- www/secretary/workbench/views/index.js.rb | 6 +- www/secretary/workbench/views/index.json.rb | 2 +- www/secretary/workbench/views/parts.js.rb | 14 +- www/secretary/workbench/views/pending.html.rb | 2 +- .../workbench/views/vue-config.js.rb | 2 +- www/site_or_pod.rb | 18 +- www/status/monitor.rb | 2 +- www/status/monitors/git.rb | 6 +- www/status/monitors/svn.rb | 8 +- www/status/monitors/unit_test.rb | 6 +- 214 files changed, 3096 insertions(+), 3096 deletions(-) diff --git a/Rakefile b/Rakefile index 43cd4c8881..fb6a1e2b5d 100644 --- a/Rakefile +++ b/Rakefile @@ -11,7 +11,7 @@ end # Run system and abort if it fails def system!(*args) - system(*args) or raise "system!() failed!" + system(*args) or raise 'system!() failed!' end # update gems and restart applications as needed @@ -56,9 +56,9 @@ task :update, [:command] do |_task, args| gemlines = Dir['**/Gemfile']. map {|file| File.read file}.join.scan(/^\s*gem\s.*/) - if File.exist? "asf.gemspec" + if File.exist? 'asf.gemspec' gemlines += - File.read("asf.gemspec").scan(/add_dependency\((.*)\)/). + File.read('asf.gemspec').scan(/add_dependency\((.*)\)/). map {|(line)| "gem #{line}"} end @@ -71,19 +71,19 @@ task :update, [:command] do |_task, args| Dir.chdir dir do contents = [ "source 'https://rubygems.org'", - "ldapversion = nil", # Needed for initial gem setup + 'ldapversion = nil', # Needed for initial gem setup gems.values ].join("\n") - File.write "Gemfile", contents - $stderr.puts "* Preloading gems..." + File.write 'Gemfile', contents + $stderr.puts '* Preloading gems...' system!('bundle', 'install') - $stderr.puts "* ... done" + $stderr.puts '* ... done' end end end # update gems - $stderr.puts "* Update Gems" # use stderr so output appears in syslog + $stderr.puts '* Update Gems' # use stderr so output appears in syslog Dir['**/Gemfile'].each do |gemfile| Dir.chdir File.dirname(gemfile) do ruby = File.read('Gemfile')[/^ruby ['"](.*?)['"]/, 1] @@ -103,7 +103,7 @@ task :update, [:command] do |_task, args| # if new gems were installed and this directory contains a passenger # application, restart it if (File.mtime('Gemfile.lock') rescue Time.at(0)) != locktime - $stderr.puts "* Gemfile.lock was updated" + $stderr.puts '* Gemfile.lock was updated' if File.exist?('tmp/restart.txt') FileUtils.touch 'tmp/.restart.txt' FileUtils.chmod 0o777, 'tmp/.restart.txt' @@ -184,7 +184,7 @@ namespace :svn do next if arg1 == 'skip' if noCheckout - puts "Skipping" if depth == 'skip' # Must agree with monitors/svn.rb + puts 'Skipping' if depth == 'skip' # Must agree with monitors/svn.rb next end @@ -300,7 +300,7 @@ namespace :svn do if errors > 0 puts "** Found #{errors} error(s) **" else - puts "** No errors found **" + puts '** No errors found **' end end end @@ -387,7 +387,7 @@ LDAP_WHIMSY_PATH = '../.ldap_whimsy.tmp' def getpass(user_dn) pw = $stdin.getpass("password for #{user_dn}: ") return pw unless pw == '*' - if RbConfig::CONFIG["host_os"].start_with? 'darwin' + if RbConfig::CONFIG['host_os'].start_with? 'darwin' pw, status = Open3.capture2('security', 'find-generic-password', '-a', user_dn, '-w') raise "ERROR: problem running security: #{status}" unless status.success? else @@ -401,23 +401,23 @@ def ldap_init require 'io/console' # cannot prompt from container, so need to do this upfront require 'whimsy/asf/config' - whimsy_dn = ASF::Config.get(:whimsy_dn) or raise "ERROR: Must provide whimsy_dn value in .whimsy" + whimsy_dn = ASF::Config.get(:whimsy_dn) or raise 'ERROR: Must provide whimsy_dn value in .whimsy' whimsy_pw = getpass(whimsy_dn) - raise "ERROR: Password is required" unless whimsy_pw.size > 1 + raise 'ERROR: Password is required' unless whimsy_pw.size > 1 httpd_dn = ASF::Config.get(:httpd_dn) if httpd_dn httpd_pw = getpass(httpd_dn) - raise "ERROR: Password is required" unless httpd_pw.size > 1 + raise 'ERROR: Password is required' unless httpd_pw.size > 1 else # default to whimsy credentials httpd_dn = whimsy_dn httpd_pw = whimsy_pw end - File.open(LDAP_HTTPD_PATH, "w", 0o600) do |w| + File.open(LDAP_HTTPD_PATH, 'w', 0o600) do |w| w.puts httpd_dn w.puts httpd_pw end - File.open(LDAP_WHIMSY_PATH, "w", 0o600) do |w| + File.open(LDAP_WHIMSY_PATH, 'w', 0o600) do |w| w.puts whimsy_dn w.puts whimsy_pw end @@ -427,7 +427,7 @@ end def filter(src, dst, ldaphosts, ldapbinddn, ldapbindpw) require 'erb' template = ERB.new(File.read(src)) - File.open(dst, "w") do |w| + File.open(dst, 'w') do |w| w.write(template.result(binding)) end end @@ -450,9 +450,9 @@ def ldap_setup $LOAD_PATH.unshift 'lib' require 'whimsy/asf/config' hosts = ASF::Config.get(:ldap) - raise "ERROR: Must define :ldap in ../.whimsy" unless hosts + raise 'ERROR: Must define :ldap in ../.whimsy' unless hosts - ldaphosts = hosts.join(" ").gsub('ldaps://', '') + ldaphosts = hosts.join(' ').gsub('ldaps://', '') filter('docker-config/whimsy.conf', '/etc/apache2/sites-enabled/000-default.conf', ldaphosts, ldapbinddn, ldapbindpw) diff --git a/asf.gemspec b/asf.gemspec index fa2529e6db..c305e344dc 100644 --- a/asf.gemspec +++ b/asf.gemspec @@ -9,31 +9,31 @@ end Gem::Specification.new do |s| # Change these as appropriate - s.name = "whimsy-asf" + s.name = 'whimsy-asf' s.license = 'Apache-2.0' s.version = version s.summary = "Whimsy 'model' of the ASF" - s.author = "Sam Ruby" - s.email = "rubys@intertwingly.net" - s.homepage = "https://whimsy.apache.org/" + s.author = 'Sam Ruby' + s.email = 'rubys@intertwingly.net' + s.homepage = 'https://whimsy.apache.org/' s.description = <<-EOD This package contains a set of classes which encapsulate access to a number of data sources such as LDAP, ICLAs, auth lists, etc. EOD # Add any extra files to include in the gem - s.files = Dir.glob(["asf.*", "lib/**/*"]) - s.require_paths = ["lib"] + s.files = Dir.glob(['asf.*', 'lib/**/*']) + s.require_paths = ['lib'] # If you want to depend on other gems, add them here, along with any # relevant versions - s.add_dependency("nokogiri") - s.add_dependency("rack") - s.add_dependency("ruby-ldap", ldapversion) - s.add_dependency("tzinfo") - s.add_dependency("tzinfo-data") - s.add_dependency("wunderbar") - s.add_dependency("rdoc") + s.add_dependency('nokogiri') + s.add_dependency('rack') + s.add_dependency('ruby-ldap', ldapversion) + s.add_dependency('tzinfo') + s.add_dependency('tzinfo-data') + s.add_dependency('wunderbar') + s.add_dependency('rdoc') # If your tests use any gems, include them here # s.add_development_dependency("mocha") # for example diff --git a/config/setupmymac b/config/setupmymac index d574f63c4e..cb2a411991 100755 --- a/config/setupmymac +++ b/config/setupmymac @@ -16,12 +16,12 @@ $apache_would_have_been_restarted = (ARGV.delete '--apache-restarted') ######################################################################### unless RUBY_PLATFORM.include? 'darwin' - STDERR.puts "This script is intended to be run on macOS" + STDERR.puts 'This script is intended to be run on macOS' exit 1 end unless (RUBY_VERSION.split('.').map(&:to_i) <=> [2, 4, 1]) >= 0 - STDERR.puts "Ruby 2.4.1 or later is required" + STDERR.puts 'Ruby 2.4.1 or later is required' exit 1 end @@ -51,7 +51,7 @@ end # echo a command and run it def run *args - color "$ " + "#{'sudo ' if $root}" + Array(args).join(' ') + color '$ ' + "#{'sudo ' if $root}" + Array(args).join(' ') return if $dry_run Kernel.system(*args) end @@ -77,7 +77,7 @@ def sudo system RbConfig.ruby, COMMAND, *ARGS, '--sudo' $apache_would_have_been_restarted = true else - system "sudo", RbConfig.ruby, COMMAND, *ARGS + system 'sudo', RbConfig.ruby, COMMAND, *ARGS exit $?.exitstatus unless $?.success? end end @@ -98,81 +98,81 @@ option = :www OptionParser.new do |opts| opts.banner = "Usage: #{$0} [options]" - opts.on('-u', '--user', "Run whimsy under your user") do |_opt| + opts.on('-u', '--user', 'Run whimsy under your user') do |_opt| option = :user end - opts.on('-w', '--web', "Run whimsy under the Apache web user") do |_opt| + opts.on('-w', '--web', 'Run whimsy under the Apache web user') do |_opt| option = :web end - opts.on('-d', '--docker', "Run whimsy on docker") do |_opt| + opts.on('-d', '--docker', 'Run whimsy on docker') do |_opt| option = :docker end - opts.on('--[no-]gem', '--gems', "Upgrade gem dependencies") do |opt| + opts.on('--[no-]gem', '--gems', 'Upgrade gem dependencies') do |opt| force[:gems] = opt end - opts.on('--[no-]bundle', '--bundler', "Upgrade bundler") do |opt| + opts.on('--[no-]bundle', '--bundler', 'Upgrade bundler') do |opt| force[:bundler] = opt end - opts.on('--[no-]node', "Upgrade to the latest node.js") do |opt| + opts.on('--[no-]node', 'Upgrade to the latest node.js') do |opt| force[:node] = opt end - opts.on('--[no-]passenger', "Upgrade to the latest Phusion Passenger") do |opt| + opts.on('--[no-]passenger', 'Upgrade to the latest Phusion Passenger') do |opt| force[:passenger] = opt end - opts.on('--[no-]ldap', "Reconfigure LDAP") do |_opt| + opts.on('--[no-]ldap', 'Reconfigure LDAP') do |_opt| force[:ldap] = opts end - opts.on('--[no-]svn', "Checkout/update svn repositories") do |_opt| + opts.on('--[no-]svn', 'Checkout/update svn repositories') do |_opt| force[:svn] = opts end - opts.on('--[no-]git', "Clone/pull git repositories") do |_opt| + opts.on('--[no-]git', 'Clone/pull git repositories') do |_opt| force[:git] = opts end - opts.on('--[no-]source', "Pull the latest changes to the source code") do |opt| + opts.on('--[no-]source', 'Pull the latest changes to the source code') do |opt| force[:source] = opt end - opts.on('--[no-]minutes', "Collate board minutes") do |opt| + opts.on('--[no-]minutes', 'Collate board minutes') do |opt| force[:minutes] = opt end - opts.on('--update-all', "Update everything") do |_opt| + opts.on('--update-all', 'Update everything') do |_opt| force.default = true end - opts.on('--[no-]toucher', "Restart rack applications on source change") do |opt| + opts.on('--[no-]toucher', 'Restart rack applications on source change') do |opt| force[:toucher] = opt end - opts.on('--[no-]ws', "Start board agenda websocket") do |opt| + opts.on('--[no-]ws', 'Start board agenda websocket') do |opt| force[:ws] = opt end - opts.on('--all', "Update and launch everything") do |_opt| + opts.on('--all', 'Update and launch everything') do |_opt| force[:ws] = true if force[:ws].nil? force[:toucher] = true if force[:toucher].nil? force.default = true end - opts.on('--[no-]clean', "Clean up source directory") do |opt| + opts.on('--[no-]clean', 'Clean up source directory') do |opt| force[:clean] = opt end - opts.on('--[no-]prune', "Prune docker containers and images") do |opt| + opts.on('--[no-]prune', 'Prune docker containers and images') do |opt| force[:prune] = opt end - opts.on('--dry-run', "Only indicate what commands would be run") do |_opt| + opts.on('--dry-run', 'Only indicate what commands would be run') do |_opt| $dry_run = true end end.parse! @@ -250,14 +250,14 @@ unless Dir.exist? '/srv' run 'chown', "#{sudo_user.uid}:#{sudo_user.gid}", '/var/whimsy' run 'touch', '/etc/synthetic.conf' SYNTHETIC = '/etc/synthetic.conf' - unless File.read(SYNTHETIC).include? "/var/whimsy" + unless File.read(SYNTHETIC).include? '/var/whimsy' color "$ sudo edit #{SYNTHETIC}" unless $dry_run File.write SYNTHETIC, File.read(SYNTHETIC) + "srv\t/var/whimsy\n" end STDERR.puts "#{SYNTHETIC} updated; reboot machine and rerun this script" puts %(\nPress "y" to reboot now, anything else to exit) - run "shutdown -r now" if gets.strip.downcase == "y" + run 'shutdown -r now' if gets.strip.downcase == 'y' exit 1 end else @@ -417,7 +417,7 @@ end unless $root if force[:gems] or not File.exist?("#{WHIMSY}/Gemfile.lock") Dir.chdir WHIMSY do - run "rake", "update" + run 'rake', 'update' end end end @@ -515,7 +515,7 @@ if config != File.read(HTTPD_CONF) sudo do color "$ sudo edit #{HTTPD_CONF}" return if $dry_run - File.rename HTTPD_CONF, HTTPD_CONF + ".original" + File.rename HTTPD_CONF, HTTPD_CONF + '.original' File.write(HTTPD_CONF, config) end @@ -597,7 +597,7 @@ end if force[:ws] != nil sudo do - plist = "/Library/LaunchDaemons/board-agenda-websocket.plist" + plist = '/Library/LaunchDaemons/board-agenda-websocket.plist' if force[:ws] contents = File.read("#{__dir__}/board-agenda-websocket.plist") @@ -639,9 +639,9 @@ end if $root and not $apache_would_have_been_restarted if not `launchctl list`.include? 'org.apache.httpd' - run "launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist" + run 'launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist' elsif restart_apache - run "apachectl restart" + run 'apachectl restart' sleep 0.5 end elsif not $dry_run diff --git a/lib/spec/lib/committee_spec.rb b/lib/spec/lib/committee_spec.rb index 9712531e15..c0401a6763 100644 --- a/lib/spec/lib/committee_spec.rb +++ b/lib/spec/lib/committee_spec.rb @@ -23,12 +23,12 @@ before { Wunderbar.logger = nil # ensure we see warnings } - describe "ASF::Committee::site" do - it "should return correct display_name initially" do + describe 'ASF::Committee::site' do + it 'should return correct display_name initially' do httpd = ASF::Committee['httpd'] expect(httpd.display_name).to eq('HTTP Server') end - it "should return correct display_name subsequently" do + it 'should return correct display_name subsequently' do httpd = ASF::Committee['httpd'] expect(httpd.display_name).to eq('HTTP Server') end @@ -43,7 +43,7 @@ end end - describe "ASF::Committee::description" do + describe 'ASF::Committee::description' do it "should return string for 'httpd'" do res = ASF::Committee.find('HTTP Server').description expect(res).to match(%r{Apache Web Server}) @@ -54,7 +54,7 @@ end end - describe "ASF::Committee.metadata" do + describe 'ASF::Committee.metadata' do it "should return hash for 'httpd'" do res = ASF::Committee.metadata('httpd') expect(res.class).to eq(Hash) @@ -83,7 +83,7 @@ date_established = Date.parse('1970-01-01') established_value = '1970-01' # as per yaml - describe "ASF::Committee.appendtlpmetadata" do + describe 'ASF::Committee.appendtlpmetadata' do board = ASF::SVN.find('board') file = File.join(board, 'committee-info.yaml') input = File.read(file) @@ -107,7 +107,7 @@ it "should succeed for '#{pmc}'" do res = nil desc = 'Description of A-B-C' - expect { res = ASF::Committee.appendtlpmetadata(input, pmc, desc, date_established) }.to output("").to_stderr + expect { res = ASF::Committee.appendtlpmetadata(input, pmc, desc, date_established) }.to output('').to_stderr expect(res).not_to eq(input) tlps = YAML.safe_load(res, permitted_classes: [Symbol])[:tlps] abc = tlps[pmc] @@ -125,7 +125,7 @@ date_resumed = Time.now resumed_value = date_resumed.strftime('%Y-%m') res = nil - expect { res = ASF::Committee.appendtlpmetadata(input, pmc, 'unused', date_resumed) }.to output("").to_stderr + expect { res = ASF::Committee.appendtlpmetadata(input, pmc, 'unused', date_resumed) }.to output('').to_stderr expect(res).not_to equal(input) tlps = YAML.safe_load(res, permitted_classes: [Symbol])[:tlps] updated = tlps[pmc] @@ -150,7 +150,7 @@ date_resumed = Time.now resumed_value = date_resumed.strftime('%Y-%m') res = nil - expect { res = ASF::Committee.appendtlpmetadata(input, pmc, 'unused', date_resumed) }.to output("").to_stderr + expect { res = ASF::Committee.appendtlpmetadata(input, pmc, 'unused', date_resumed) }.to output('').to_stderr expect(res).not_to equal(input) tlps = YAML.safe_load(res, permitted_classes: [Symbol])[:tlps] updated = tlps[pmc] @@ -167,17 +167,17 @@ end end - describe "ASF::ASF::Committee.record_termination" do + describe 'ASF::ASF::Committee.record_termination' do cinfoy = File.join(ASF::SVN['board'], 'committee-info.yaml') yyyymm = '2020-10' data = File.read cinfoy yaml = YAML.safe_load(data, permitted_classes: [Symbol]) - it "should contain HTTPD, but not retired" do + it 'should contain HTTPD, but not retired' do para = yaml[:tlps]['httpd'] expect(para).not_to eql(nil) expect(para[:retired]).to eql(nil) end - it "should add retired tag to HTTPD" do + it 'should add retired tag to HTTPD' do data = ASF::Committee.record_termination(data, 'HTTP Server', yyyymm) yaml = YAML.safe_load(data, permitted_classes: [Symbol]) para = yaml[:tlps]['httpd'] @@ -188,11 +188,11 @@ yaml = YAML.safe_load(data, permitted_classes: [Symbol]) name = 'XYZXYZ' pmc = ASF::Committee.to_canonical(name) - it "should not contain XYZXYZ" do + it 'should not contain XYZXYZ' do para = yaml[:tlps][pmc] expect(para).to eql(nil) end - it "should now contain XYZXYZ" do + it 'should now contain XYZXYZ' do data = ASF::Committee.record_termination(data, name, yyyymm) yaml = YAML.safe_load(data, permitted_classes: [Symbol]) para = yaml[:tlps][pmc] diff --git a/lib/spec/lib/documents_spec.rb b/lib/spec/lib/documents_spec.rb index 8eafff4490..2189a764dd 100644 --- a/lib/spec/lib/documents_spec.rb +++ b/lib/spec/lib/documents_spec.rb @@ -26,7 +26,7 @@ def getPerson(name) end describe ASF::EmeritusFiles do - it "listnames should return array of size 1" do + it 'listnames should return array of size 1' do res = ASF::EmeritusFiles.listnames expect(res).to be_kind_of(Array) expect(res.size).to eq(1) @@ -61,7 +61,7 @@ def getPerson(name) end describe ASF::EmeritusReinstatedFiles do - it "listnames should return array of size 1" do + it 'listnames should return array of size 1' do res = ASF::EmeritusReinstatedFiles.listnames expect(res).to be_kind_of(Array) expect(res.size).to eq(1) @@ -78,7 +78,7 @@ def getPerson(name) end describe ASF::EmeritusRequestFiles do - it "listnames should return array of size 1" do + it 'listnames should return array of size 1' do res = ASF::EmeritusRequestFiles.listnames expect(res).to be_kind_of(Array) expect(res.size).to eq(1) @@ -95,7 +95,7 @@ def getPerson(name) end describe ASF::EmeritusRescindedFiles do - it "listnames should return array of size 1" do + it 'listnames should return array of size 1' do res = ASF::EmeritusRescindedFiles.listnames expect(res).to be_kind_of(Array) expect(res.size).to eq(1) diff --git a/lib/spec/lib/icla_spec.rb b/lib/spec/lib/icla_spec.rb index 2d433206de..9917276794 100644 --- a/lib/spec/lib/icla_spec.rb +++ b/lib/spec/lib/icla_spec.rb @@ -32,44 +32,44 @@ after(:all) do set_cache(original) end - describe "ASF::ICLAFiles.listnames" do - it "should return 4 files" do + describe 'ASF::ICLAFiles.listnames' do + it 'should return 4 files' do res = ASF::ICLAFiles.listnames expect(res.length).to equal(4) end end - describe "ASF::ICLAFiles.matchStem" do - it "should return [] for abcd" do + describe 'ASF::ICLAFiles.matchStem' do + it 'should return [] for abcd' do res = ASF::ICLAFiles.matchStem('abcd') expect(res).to eq([]) end - it "should return [abc.pdf] for abc" do + it 'should return [abc.pdf] for abc' do res = ASF::ICLAFiles.matchStem('abc') expect(res).to eq(['abc.pdf']) end end - describe "ASF::ICLAFiles.Dir?" do - it "should return true for ab" do + describe 'ASF::ICLAFiles.Dir?' do + it 'should return true for ab' do res = ASF::ICLAFiles.Dir?('ab') expect(res).to eq(true) end - it "should return false for abc" do + it 'should return false for abc' do res = ASF::ICLAFiles.Dir?('abc') expect(res).to eq(false) end - it "should return true for abcd" do + it 'should return true for abcd' do res = ASF::ICLAFiles.Dir?('abcd') expect(res).to eq(true) end - it "should return true for abcde" do + it 'should return true for abcde' do res = ASF::ICLAFiles.Dir?('abcde') expect(res).to eq(true) end end - describe "ASF::ICLAFiles.match_claRef" do + describe 'ASF::ICLAFiles.match_claRef' do it "should return nil for 'xyz'" do res = ASF::ICLAFiles.match_claRef('xyz') expect(res).to equal(nil) diff --git a/lib/spec/lib/mail/mail_spec.rb b/lib/spec/lib/mail/mail_spec.rb index e12e88d4a5..7990f86229 100644 --- a/lib/spec/lib/mail/mail_spec.rb +++ b/lib/spec/lib/mail/mail_spec.rb @@ -21,8 +21,8 @@ describe ASF::Mail do - describe "ASF::Mail.to_canonical" do - it "should return address unaltered for invalid emails" do + describe 'ASF::Mail.to_canonical' do + it 'should return address unaltered for invalid emails' do email = 'textwithnoATsign' expect(ASF::Mail.to_canonical(email)).to eq(email) email = 'textwithtrailing@' @@ -30,13 +30,13 @@ email = '@textwithleadingAT' expect(ASF::Mail.to_canonical(email)).to eq(email) end - it "should return address with downcased domain for valid emails" do + it 'should return address with downcased domain for valid emails' do expect(ASF::Mail.to_canonical('ABC@DEF')).to eq('ABC@def') end - it "should return address with downcased domain and canonicalised name for GMail emails" do + it 'should return address with downcased domain and canonicalised name for GMail emails' do expect(ASF::Mail.to_canonical('A.B.C+123@GMail.com')).to eq('abc@gmail.com') end - it "should return address with downcased domain and canonicalised name for Googlemail emails" do + it 'should return address with downcased domain and canonicalised name for Googlemail emails' do expect(ASF::Mail.to_canonical('A.B.C+123@Googlemail.com')).to eq('abc@gmail.com') end end diff --git a/lib/spec/lib/mail/mlist_spec.rb b/lib/spec/lib/mail/mlist_spec.rb index 61f372676a..5f96162a56 100644 --- a/lib/spec/lib/mail/mlist_spec.rb +++ b/lib/spec/lib/mail/mlist_spec.rb @@ -22,8 +22,8 @@ describe ASF::MLIST do - describe "ASF::MLIST.members_subscribers" do - it "should return an array of members@ subscribers followed by the file update time" do + describe 'ASF::MLIST.members_subscribers' do + it 'should return an array of members@ subscribers followed by the file update time' do res = ASF::MLIST.members_subscribers() expect(res.class).to eq(Array) expect(res.length).to eq(2) @@ -38,8 +38,8 @@ end end - describe "ASF::MLIST.list_archivers" do - it "should return array of form [dom, list, [[archiver, type, alias|direct],...]" do + describe 'ASF::MLIST.list_archivers' do + it 'should return array of form [dom, list, [[archiver, type, alias|direct],...]' do ASF::MLIST.list_archivers do |res| expect(res.class).to eq(Array) expect(res.length).to eq(3) @@ -54,8 +54,8 @@ end end - describe "ASF::MLIST.moderates(user_emails, response)" do - it "should not find any entries for invalid emails" do + describe 'ASF::MLIST.moderates(user_emails, response)' do + it 'should not find any entries for invalid emails' do user_emails = ['user@localhost', 'user@domain.invalid'] res = ASF::MLIST.moderates(user_emails) expect(res.length).to eq(2) @@ -63,7 +63,7 @@ expect(mods.length).to eq(0) end - it "should find some entries for mod-private@gsuite.cloud.apache.org" do + it 'should find some entries for mod-private@gsuite.cloud.apache.org' do user_emails = ['mod-private@gsuite.cloud.apache.org'] res = ASF::MLIST.moderates(user_emails) expect(res.length).to eq(2) @@ -72,8 +72,8 @@ end end - describe "ASF::MLIST.subscriptions(user_emails, response)" do - it "should not find any entries for invalid emails" do + describe 'ASF::MLIST.subscriptions(user_emails, response)' do + it 'should not find any entries for invalid emails' do user_emails = ['user@localhost', 'user@domain.invalid'] res = ASF::MLIST.subscriptions(user_emails) expect(res.length).to eq(2) @@ -82,7 +82,7 @@ end end - it "should find lots of entries for archiver@mbox-vm.apache.org" do + it 'should find lots of entries for archiver@mbox-vm.apache.org' do user_emails = ['archiver@mbox-vm.apache.org'] res = ASF::MLIST.subscriptions(user_emails) expect(res.length).to eq(2) @@ -94,8 +94,8 @@ end end - describe "ASF::MLIST.each_list" do - it "should return an array of form [[dom, list],...]" do + describe 'ASF::MLIST.each_list' do + it 'should return an array of form [[dom, list],...]' do ASF::MLIST.each_list do |res| expect(res.class).to eq(Array) expect(res.length).to eq(2) @@ -110,8 +110,8 @@ end end - describe "ASF::MLIST.list_subscribers(mail_domain, podling=false, list_subs=false, skip_archivers=false)" do - it "abcd should return an array of the form [Hash, Time]" do + describe 'ASF::MLIST.list_subscribers(mail_domain, podling=false, list_subs=false, skip_archivers=false)' do + it 'abcd should return an array of the form [Hash, Time]' do res = ASF::MLIST.list_subscribers('abcd') # array of Hash and Updated date expect(res.class).to eq(Array) @@ -121,7 +121,7 @@ expect(stamp.class).to eq(Time) expect(list.size).to eq(0) end - it "members should have some entries" do + it 'members should have some entries' do list, _ = ASF::MLIST.list_subscribers('members') if TEST_DATA expect(list.size).to eq(1) # members @@ -134,8 +134,8 @@ end end end - describe "ASF::MLIST.list_moderators(mail_domain, podling=false)" do - it "abcd should return an array of the form [Hash, Time]" do + describe 'ASF::MLIST.list_moderators(mail_domain, podling=false)' do + it 'abcd should return an array of the form [Hash, Time]' do res = ASF::MLIST.list_moderators('abcd') # array of Hash and Updated date expect(res.class).to eq(Array) @@ -145,7 +145,7 @@ expect(stamp.class).to eq(Time) expect(list.size).to eq(0) end - it "members should have some entries" do + it 'members should have some entries' do list, _ = ASF::MLIST.list_moderators('members') if TEST_DATA expect(list.size).to eq(1) # members diff --git a/lib/spec/lib/member_spec.rb b/lib/spec/lib/member_spec.rb index e646b7ba75..992690a05f 100644 --- a/lib/spec/lib/member_spec.rb +++ b/lib/spec/lib/member_spec.rb @@ -44,11 +44,11 @@ expect(res).to eq(nil) end fields = {fullname: 'Full Name', address: "Line 1\nLine2", availid: 'a-b-c', email: 'user@domain.invalid'} - it "make_entry() should raise error" do + it 'make_entry() should raise error' do expect { ASF::Member.make_entry(fields.reject{|k,v| k == :fullname}) }.to raise_error(ArgumentError, ':fullname is required') expect { ASF::Member.make_entry(fields.reject{|k,v| k == :availid}) }.to raise_error(ArgumentError, ':availid is required') end - it "make_entry(fields) should create entry" do + it 'make_entry(fields) should create entry' do res = ASF::Member.make_entry(fields) expect(res).to eq( <<~MEMAPP @@ -63,29 +63,29 @@ MEMAPP ) end - it "make_entry({country:}}) should create entry with country" do + it 'make_entry({country:}}) should create entry with country' do res = ASF::Member.make_entry(fields.merge({country: 'UN'})) expect(res).to match(%r{^ UN$}) end - it "make_entry({tele:}}) should create entry with Tel:" do + it 'make_entry({tele:}}) should create entry with Tel:' do res = ASF::Member.make_entry(fields.merge({tele: '123-456'})) expect(res).to match(%r{^ Tel: 123-456$}) end - it "make_entry({fax:}}) should create entry with Fax:" do + it 'make_entry({fax:}}) should create entry with Fax:' do res = ASF::Member.make_entry(fields.merge({fax: '123-456'})) expect(res).to match(%r{^ Fax: 123-456$}) end - it "status should return hash" do + it 'status should return hash' do res = ASF::Member.status expect(res).to be_kind_of(Hash) expect(res.size).to eq(3) - expect(res.keys.sort).to eq(["cherry", "damson", "elder"]) + expect(res.keys.sort).to eq(['cherry', 'damson', 'elder']) end - it "emeritus should return hash" do + it 'emeritus should return hash' do res = ASF::Member.emeritus expect(res).to be_kind_of(Array) expect(res.size).to eq(2) - expect(res.sort).to eq(["cherry", "damson"]) + expect(res.sort).to eq(['cherry', 'damson']) end it "find('cherry') should return true" do res = ASF::Member.find('cherry') diff --git a/lib/spec/lib/svn_spec.rb b/lib/spec/lib/svn_spec.rb index 82d37667a7..f3d6658c87 100644 --- a/lib/spec/lib/svn_spec.rb +++ b/lib/spec/lib/svn_spec.rb @@ -27,7 +27,7 @@ # repo_entry should only include repos that have local workspaces - describe "ASF::SVN.repo_entry" do + describe 'ASF::SVN.repo_entry' do it "should return Hash for #{SAMPLE_SVN_NAME}" do res = ASF::SVN.repo_entry(SAMPLE_SVN_NAME) expect(res.class).to equal(Hash) @@ -45,7 +45,7 @@ end - describe "ASF::SVN.repo_entry!" do + describe 'ASF::SVN.repo_entry!' do it "should return string for #{SAMPLE_SVN_NAME}" do res = ASF::SVN.repo_entry!(SAMPLE_SVN_NAME) expect(res.class).to equal(Hash) @@ -61,7 +61,7 @@ # svnurl should include aliases - describe "ASF::SVN.svnurl" do + describe 'ASF::SVN.svnurl' do it "should return URL for #{SAMPLE_SVN_NAME}" do res = ASF::SVN.svnurl(SAMPLE_SVN_NAME) expect(res.class).to equal(String) @@ -81,7 +81,7 @@ end - describe "ASF::SVN.svnurl!" do + describe 'ASF::SVN.svnurl!' do it "should return URL for #{SAMPLE_SVN_NAME}" do res = ASF::SVN.svnurl!(SAMPLE_SVN_NAME) expect(res.class).to equal(String) @@ -98,7 +98,7 @@ # repo_entries should exclude aliases - describe "ASF::SVN.repo_entries" do + describe 'ASF::SVN.repo_entries' do it "should return hash with #{SAMPLE_SVN_NAME} but not #{SAMPLE_ALIAS}" do res = ASF::SVN.repo_entries expect(res.class).to equal(Hash) @@ -110,7 +110,7 @@ # find returns local workspace so excludes aliases - describe "ASF::SVN.find" do + describe 'ASF::SVN.find' do it "should return string for #{SAMPLE_SVN_NAME}" do res = ASF::SVN.find(SAMPLE_SVN_NAME) expect(res.class).to equal(String) @@ -128,8 +128,8 @@ end - describe "ASF:SVN.private_public" do - it "should return an array of size 2" do + describe 'ASF:SVN.private_public' do + it 'should return an array of size 2' do res = ASF::SVN.private_public expect(res.size()).to eq(2) expect(res[0].size).to eq(15) # will need to be adjusted from time to time @@ -137,7 +137,7 @@ end end - describe "ASF:SVN.getInfo(repo)" do + describe 'ASF:SVN.getInfo(repo)' do # it "getInfo(public workspace) should return a string at least 30 chars long starting with 'Path: '" do # pub = ASF::SVN.private_public()[1] # repo = ASF::SVN[pub[1]] # select a public repo @@ -159,14 +159,14 @@ it "getInfo(public url) should return a string at least 30 chars long starting with 'Path: '" do pub = ASF::SVN.private_public()[1] repo = ASF::SVN.svnurl(pub[1]) # select a public repo url - expect(repo).to start_with("https://") + expect(repo).to start_with('https://') out, err = ASF::SVN.getInfo(repo) expect(err).to eq(nil) expect(out.size).to be > 30 - expect(out).to start_with("Path: ") + expect(out).to start_with('Path: ') end - it "getInfo(nil) should fail" do + it 'getInfo(nil) should fail' do expect { ASF::SVN.getInfo(nil) }.to raise_error(ArgumentError, 'path must not be nil') end @@ -183,7 +183,7 @@ end - describe "ASF:SVN.getInfoItem" do + describe 'ASF:SVN.getInfoItem' do # it "getInfoItem(public checkout,'url') should return the URL" do # pub = ASF::SVN.private_public()[1] # repo = ASF::SVN[pub[1]] # select a public repo @@ -201,7 +201,7 @@ end end - describe "ASF:SVN.list" do + describe 'ASF:SVN.list' do # it "list(public checkout,'url') should return a list" do # pub = ASF::SVN.private_public()[1] # repo = ASF::SVN[pub[1]] # select a public repo @@ -219,7 +219,7 @@ end end - describe "ASF:SVN.get" do + describe 'ASF:SVN.get' do # it "get(public checkout,'_template.xml') should return the revision and contents" do # repo = File.join(ASF::SVN['attic-xdocs'],'_template.xml') # revision, content = ASF::SVN.get(repo) @@ -241,8 +241,8 @@ end end - describe "ASF::SVN.passwordStdinOK?" do - it "passwordStdinOK? should return true or false" do + describe 'ASF::SVN.passwordStdinOK?' do + it 'passwordStdinOK? should return true or false' do res = ASF::SVN.passwordStdinOK? expect(res).to be(true).or be(false) # show what we are working with @@ -251,8 +251,8 @@ end end - describe "ASF::SVN.svn" do - it "svn(nil,nil) should raise error" do + describe 'ASF::SVN.svn' do + it 'svn(nil,nil) should raise error' do expect { ASF::SVN.svn(nil,nil) }.to raise_error(ArgumentError, 'command must not be nil') end it "svn('st',nil) should raise error" do @@ -279,7 +279,7 @@ expect(out).to match(/^file +https:/) end - it "svn() should honour :chdir option" do + it 'svn() should honour :chdir option' do pods = ASF::SVN['incubator-podlings'] # arbitrary, but must be set up in Rakefile and spec_helper if pods out, err = ASF::SVN.svn('info', '.', {chdir: pods}) @@ -303,84 +303,84 @@ # end end - describe "ASF::SVN._svn_build_cmd" do + describe 'ASF::SVN._svn_build_cmd' do it "_svn_build_cmd('help', 'path', {}) should include path" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {}) expect(stdin).to eq(nil) - expect(cmd).to eq(["svn", "help", "--non-interactive", "--", "path"]) + expect(cmd).to eq(['svn', 'help', '--non-interactive', '--', 'path']) end it "_svn_build_cmd('help', 'path', {user: 'whimsy'}) should not include username" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {user: 'whimsy'}) expect(stdin).to eq(nil) - expect(cmd).to eq(["svn", "help", "--non-interactive", "--", "path"]) + expect(cmd).to eq(['svn', 'help', '--non-interactive', '--', 'path']) end it "_svn_build_cmd('help', 'path', {user: 'whimsy', password: 'pass}) should include username" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {user: 'whimsy', password: 'pass'}) - exp = ["svn", "help", "--non-interactive", ["--username", "whimsy", "--no-auth-cache"], "--", "path"] + exp = ['svn', 'help', '--non-interactive', ['--username', 'whimsy', '--no-auth-cache'], '--', 'path'] if ASF::SVN.passwordStdinOK? expect(stdin).to eq('pass') - expect(cmd-exp).to eq([["--password-from-stdin"]]) + expect(cmd-exp).to eq([['--password-from-stdin']]) else expect(stdin).to eq(nil) - expect(cmd-exp).to eq([["--password", "pass"]]) + expect(cmd-exp).to eq([['--password', 'pass']]) end end it "_svn_build_cmd('help', 'path', {user: 'whimsysvn'}) should not include username" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {user: 'whimsysvn'}) expect(stdin).to eq(nil) - expect(cmd).to eq(["whimsysvn", "help", "--non-interactive", "--", "path"]) + expect(cmd).to eq(['whimsysvn', 'help', '--non-interactive', '--', 'path']) end it "_svn_build_cmd('help', 'path', {user: 'whimsysvn', dryrun: false}) should not include username" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {user: 'whimsysvn', dryrun: false}) expect(stdin).to eq(nil) - expect(cmd).to eq(["whimsysvn", "help", "--non-interactive", "--", "path"]) + expect(cmd).to eq(['whimsysvn', 'help', '--non-interactive', '--', 'path']) end it "_svn_build_cmd('help', 'path', {user: 'whimsysvn', dryrun: true}) should not include username" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {user: 'whimsysvn', dryrun: true}) - expect(cmd).to eq(["whimsysvn", "help", "--non-interactive", "--", "path"]) + expect(cmd).to eq(['whimsysvn', 'help', '--non-interactive', '--', 'path']) end it "_svn_build_cmd('help', 'path', {user: '_dummy_', password: 'password'}) should include username" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {user: '_dummy_', password: 'password'}) expect(stdin).to eq('password') - expect(cmd).to eq(["svn", "help", "--non-interactive", ["--username", "_dummy_", "--no-auth-cache"], ["--password-from-stdin"], "--", "path"]) + expect(cmd).to eq(['svn', 'help', '--non-interactive', ['--username', '_dummy_', '--no-auth-cache'], ['--password-from-stdin'], '--', 'path']) end it "_svn_build_cmd('help', 'path', {user: '_dummy_', password: 'password', dryrun: false}) should include username" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {user: '_dummy_', password: 'password', dryrun: false}) expect(stdin).to eq('password') - expect(cmd).to eq(["svn", "help", "--non-interactive", ["--username", "_dummy_", "--no-auth-cache"], ["--password-from-stdin"], "--", "path"]) + expect(cmd).to eq(['svn', 'help', '--non-interactive', ['--username', '_dummy_', '--no-auth-cache'], ['--password-from-stdin'], '--', 'path']) end it "_svn_build_cmd('help', 'path', {user: '_dummy_', dryrun: true}) should not include username" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {user: '_dummy_', dryrun: true}) expect(stdin).to eq(nil) - expect(cmd).to eq(["svn", "help", "--non-interactive", "--", "path"]) + expect(cmd).to eq(['svn', 'help', '--non-interactive', '--', 'path']) end it "_svn_build_cmd('help', 'path', {_error: true}) should raise error" do - expect { ASF::SVN._svn_build_cmd('help', 'path', {_error: true}) }.to raise_error(ArgumentError, "Following options not recognised: [:_error]") + expect { ASF::SVN._svn_build_cmd('help', 'path', {_error: true}) }.to raise_error(ArgumentError, 'Following options not recognised: [:_error]') end it "_svn_build_cmd('help', 'path', {quiet: true}) should include --quiet" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {quiet: true}) expect(stdin).to eq(nil) - expect(cmd).to eq(["svn", "help", "--non-interactive", "--quiet", "--", "path"]) + expect(cmd).to eq(['svn', 'help', '--non-interactive', '--quiet', '--', 'path']) end it "_svn_build_cmd('help', 'path', {item: 'url'}) should include --show-item url" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {item: 'url'}) expect(stdin).to eq(nil) - expect(cmd).to eq(["svn", "help", "--non-interactive", "--show-item", 'url', "--", "path"]) + expect(cmd).to eq(['svn', 'help', '--non-interactive', '--show-item', 'url', '--', 'path']) end it "_svn_build_cmd('help', 'path', {revision: '123'}) should include --revision 123" do cmd, stdin = ASF::SVN._svn_build_cmd('help', 'path', {revision: '123'}) expect(stdin).to eq(nil) - expect(cmd).to eq(["svn", "help", "--non-interactive", "--revision", '123', "--", "path"]) + expect(cmd).to eq(['svn', 'help', '--non-interactive', '--revision', '123', '--', 'path']) end it "_svn_build_cmd(true, 'path') should fail with ArgumentError" do @@ -406,7 +406,7 @@ end - describe "ASF::SVN.svnpath!" do + describe 'ASF::SVN.svnpath!' do it "svnpath!('board', 'committee-info.txt') should be https://svn.apache.org/repos/private/committers/board/committee-info.txt" do exp = 'https://svn.apache.org/repos/private/committers/board/committee-info.txt' act = ASF::SVN.svnpath!('board', 'committee-info.txt') @@ -418,7 +418,7 @@ end end - describe "ASF::SVN.getlisting" do + describe 'ASF::SVN.getlisting' do set_svnroot # need local test data here it "getlisting('emeritus') returns array of 1" do _tag, list = ASF::SVN.getlisting('emeritus') diff --git a/lib/spec/lib/svn_wunderbar_spec.rb b/lib/spec/lib/svn_wunderbar_spec.rb index 3f67dacff8..a947544189 100644 --- a/lib/spec/lib/svn_wunderbar_spec.rb +++ b/lib/spec/lib/svn_wunderbar_spec.rb @@ -21,9 +21,9 @@ require 'wunderbar' `which svnmucc` -svnmucc_missing = $?.exitstatus == 0 ? false : "svnmucc not found" +svnmucc_missing = $?.exitstatus == 0 ? false : 'svnmucc not found' -describe "ASF::SVN.svn_!" do +describe 'ASF::SVN.svn_!' do it "svn_!('info') should return array with Name:" do repo = File.join(ASF::SVN.svnurl('attic-xdocs'),'_template.xml') @@ -48,8 +48,8 @@ end end -describe "ASF::SVN.svn_" do - it "svn_(nil,nil,nil) should raise error" do +describe 'ASF::SVN.svn_' do + it 'svn_(nil,nil,nil) should raise error' do expect { ASF::SVN.svn_(nil,nil,nil) }.to raise_error(ArgumentError, 'command must not be nil') end it "svn_('st',nil,nil) should raise error" do @@ -82,7 +82,7 @@ expect(rc).to be(0) expect(out['transcript'].class).to equal(Array) - exp = ["svn", "info", "--non-interactive", "--", "https://svn.apache.org/repos/asf/attic/site/xdocs/projects/_template.xml"] + exp = ['svn', 'info', '--non-interactive', '--', 'https://svn.apache.org/repos/asf/attic/site/xdocs/projects/_template.xml'] expect(out['transcript'][1]).to eq(exp.join(' ')) end it "svn_('info', 'no file') should fail with E200009" do @@ -97,64 +97,64 @@ expect(out['transcript'].join("\n")).to match(/svn: E200009:/) end - it "auth: should override env: and user:/password:" do + it 'auth: should override env: and user:/password:' do rc1, out1 = _json do |_| ASF::SVN.svn_('help', 'help', _, {auth: [['--username', 'a', '--password', 'b']], env: ENV_.new('c','d'), user: 'user', password: 'pass', verbose: true, dryrun: true}) end expect(rc1).to eq(0) - exp = [["svn", "help", "--non-interactive", "--", "help"], {}] + exp = [['svn', 'help', '--non-interactive', '--', 'help'], {}] act = out1['transcript'][1] expect(act).to eq(exp.inspect) end - it "env: should include password" do + it 'env: should include password' do rc, out = _json do |_| ASF::SVN.svn_('help', 'help', _, {env: ENV_.new('a','b'), verbose: true}) end expect(rc).to eq(0) act = out['transcript'][1] if ASF::SVN.passwordStdinOK? - exp = [["svn", "help", "--non-interactive", ["--username", "a", "--no-auth-cache"], ["--password-from-stdin"], "--", "help"], {:stdin=>"b"}] + exp = [['svn', 'help', '--non-interactive', ['--username', 'a', '--no-auth-cache'], ['--password-from-stdin'], '--', 'help'], {:stdin=>'b'}] else - exp = [["svn", "help", "--non-interactive", ["--username", "a", "--no-auth-cache"], ["--password", "b"], "--", "help"], {}] + exp = [['svn', 'help', '--non-interactive', ['--username', 'a', '--no-auth-cache'], ['--password', 'b'], '--', 'help'], {}] end expect(act).to eq(exp.inspect) end - it "env: should include password and override user" do + it 'env: should include password and override user' do rc, out = _json do |_| ASF::SVN.svn_('help', 'help', _, {env: ENV_.new('a','b'), verbose: true, user: 'user', password: 'pass'}) end expect(rc).to eq(0) act = out['transcript'][1] if ASF::SVN.passwordStdinOK? - exp = [["svn", "help", "--non-interactive", ["--username", "a", "--no-auth-cache"], ["--password-from-stdin"], "--", "help"], {:stdin=>"b"}] + exp = [['svn', 'help', '--non-interactive', ['--username', 'a', '--no-auth-cache'], ['--password-from-stdin'], '--', 'help'], {:stdin=>'b'}] else - exp = [["svn", "help", "--non-interactive", ["--username", "a", "--no-auth-cache"], ["--password", "b"], "--", "help"], {}] + exp = [['svn', 'help', '--non-interactive', ['--username', 'a', '--no-auth-cache'], ['--password', 'b'], '--', 'help'], {}] end expect(act).to eq(exp.inspect) end - it "user: alone should not appear" do + it 'user: alone should not appear' do rc, out = _json do |_| ASF::SVN.svn_('help', 'help', _, {verbose: true, user: 'user'}) end expect(rc).to eq(0) act = out['transcript'][1] - exp = [["svn", "help", "--non-interactive", "--", "help"], {}] + exp = [['svn', 'help', '--non-interactive', '--', 'help'], {}] expect(act).to eq(exp.inspect) end - it "user: and password: should appear" do + it 'user: and password: should appear' do rc, out = _json do |_| ASF::SVN.svn_('help', 'help', _, {verbose: true, user: 'user', password: 'pass'}) end expect(rc).to eq(0) act = out['transcript'][1] if ASF::SVN.passwordStdinOK? - exp = [["svn", "help", "--non-interactive", ["--username", "user", "--no-auth-cache"], ["--password-from-stdin"], "--", "help"], {:stdin=>"pass"}] + exp = [['svn', 'help', '--non-interactive', ['--username', 'user', '--no-auth-cache'], ['--password-from-stdin'], '--', 'help'], {:stdin=>'pass'}] else - exp = [["svn", "help", "--non-interactive", ["--username", "user", "--no-auth-cache"], ["--password", "pass"], "--", "help"], {}] + exp = [['svn', 'help', '--non-interactive', ['--username', 'user', '--no-auth-cache'], ['--password', 'pass'], '--', 'help'], {}] end expect(act).to eq(exp.inspect) end @@ -181,12 +181,12 @@ # end end -describe "ASF::SVN.update" do +describe 'ASF::SVN.update' do it "update('_template.xml') should return array" do repo = File.join(ASF::SVN.svnurl('attic-xdocs'),'_template.xml') rc, out = _json do |_| - ASF::SVN.update(repo, "Dummy message", ENV_.new, _, {dryrun:true}) do |tmpdir, contents| + ASF::SVN.update(repo, 'Dummy message', ENV_.new, _, {dryrun:true}) do |tmpdir, contents| contents+"test\n" end end @@ -199,21 +199,21 @@ end -describe "ASF::SVN.svnmucc_", skip: svnmucc_missing do - it "svnmucc_(nil,nil,nil,nil,nil) should fail" do - expect { ASF::SVN.svnmucc_(nil,nil,nil,nil,nil) }.to raise_error(ArgumentError, "commands must be an array") +describe 'ASF::SVN.svnmucc_', skip: svnmucc_missing do + it 'svnmucc_(nil,nil,nil,nil,nil) should fail' do + expect { ASF::SVN.svnmucc_(nil,nil,nil,nil,nil) }.to raise_error(ArgumentError, 'commands must be an array') end - it "svnmucc_([],nil,nil,nil,nil) should fail" do - expect { ASF::SVN.svnmucc_([],nil,nil,nil,nil) }.to raise_error(ArgumentError, "msg must not be nil") + it 'svnmucc_([],nil,nil,nil,nil) should fail' do + expect { ASF::SVN.svnmucc_([],nil,nil,nil,nil) }.to raise_error(ArgumentError, 'msg must not be nil') end it "svnmucc_([],'test',nil,nil,nil) should fail" do - expect { ASF::SVN.svnmucc_([],'test',nil,nil,nil) }.to raise_error(ArgumentError, "env must not be nil") + expect { ASF::SVN.svnmucc_([],'test',nil,nil,nil) }.to raise_error(ArgumentError, 'env must not be nil') end it "svnmucc_([],'test',ENV_.new,nil,nil) should fail" do - expect { ASF::SVN.svnmucc_([],ENV_.new,'test',nil,nil) }.to raise_error(ArgumentError, "_ must not be nil") + expect { ASF::SVN.svnmucc_([],ENV_.new,'test',nil,nil) }.to raise_error(ArgumentError, '_ must not be nil') end it "svnmucc_([[],'x',[]],'test',ENV_.new,'_',nil) should fail" do - expect { ASF::SVN.svnmucc_([[],'x',[]],ENV_.new,'test','_',nil) }.to raise_error(ArgumentError, "command entries must be an array") + expect { ASF::SVN.svnmucc_([[],'x',[]],ENV_.new,'test','_',nil) }.to raise_error(ArgumentError, 'command entries must be an array') end it "svnmucc_([['xyz']],'test',ENV_.new,_,nil) should fail" do rc, out = _json do |_| diff --git a/lib/spec/lib/yaml_spec.rb b/lib/spec/lib/yaml_spec.rb index 572433f456..5161da4411 100644 --- a/lib/spec/lib/yaml_spec.rb +++ b/lib/spec/lib/yaml_spec.rb @@ -21,17 +21,17 @@ describe YamlFile do tmpdir = Dir.mktmpdir tmpname = File.join(tmpdir, 'yaml_spec1.yaml') - describe "YamlFile.read" do - it "should fail ENOENT" do + describe 'YamlFile.read' do + it 'should fail ENOENT' do expect do YamlFile.read(tmpname) end.to raise_error(Errno::ENOENT) end end - describe "YamlFile.update_section" do + describe 'YamlFile.update_section' do tmpdir = Dir.mktmpdir tmpname = File.join(tmpdir, 'yaml_spec1.yaml') - it "should fail ENOENT" do + it 'should fail ENOENT' do expect do YamlFile.update_section(tmpname, nil) {|yaml| yaml} end.to raise_error(Errno::ENOENT) @@ -40,18 +40,18 @@ workfile = File.join(tmpdir, 'yaml_spec2.yaml') FileUtils.cp testfile, workfile # Check copied file is OK - it "read should return 3 entries" do + it 'read should return 3 entries' do yaml = YamlFile.read(workfile) expect(yaml.size).to equal(3) end - it "should fail with missing section and not update file" do + it 'should fail with missing section and not update file' do mtime = File.mtime workfile expect do YamlFile.update_section(workfile, 'none') {|yaml| yaml} end.to raise_error(ArgumentError) expect(File.mtime(workfile)).to eql(mtime) end - it "should find 2 entries and touch file" do + it 'should find 2 entries and touch file' do mtime = File.mtime workfile YamlFile.update_section(workfile, :key1) do |yaml| expect(yaml.size).to eql(2) @@ -60,14 +60,14 @@ expect(File.mtime(workfile)).to be > mtime end # check it is still OK after dummy update - it "read should return 3 entries" do + it 'read should return 3 entries' do yaml = YamlFile.read(workfile) expect(yaml.size).to equal(3) end - it "should be unchanged" do + it 'should be unchanged' do expect(File.read(testfile)).to eql(File.read(workfile)) end - it "should not touch file if nil returned" do + it 'should not touch file if nil returned' do mtime = File.mtime workfile YamlFile.update_section(workfile, :key1) do |yaml| expect(yaml.size).to eql(2) @@ -76,9 +76,9 @@ expect(File.mtime(workfile)).to eql(mtime) end end - describe "YamlFile.update" do + describe 'YamlFile.update' do tmpname = File.join(tmpdir, 'yaml_spec3.yaml') - it "should create empty file" do + it 'should create empty file' do YamlFile.update(tmpname) do |yaml| expect(yaml.class).to equal(Hash) expect(yaml.size).to equal(0) @@ -87,11 +87,11 @@ yaml end end - it "read should return single entry" do + it 'read should return single entry' do yaml = YamlFile.read(tmpname) expect(yaml.size).to equal(1) end - it "read not change the file time-stamp" do + it 'read not change the file time-stamp' do mtime1 = File.mtime(tmpname) YamlFile.update(tmpname) do |yaml| expect(yaml.class).to equal(Hash) diff --git a/lib/spec/spec_helper.rb b/lib/spec/spec_helper.rb index 74c28dc1f1..5201c359c3 100644 --- a/lib/spec/spec_helper.rb +++ b/lib/spec/spec_helper.rb @@ -27,7 +27,7 @@ # Override with test data if there is no checkout available (allows local use) if ENV['RAKE_TEST'] == 'TRUE' or not (ASF::SVN.find('apmail_bin') and ASF::SVN.find('board')) TEST_DATA = true # Test data is smaller so some tests need adjusting - puts "Overriding data directories" + puts 'Overriding data directories' ASF::SVN['apmail_bin'] = File.expand_path('../test/svn/apmail_bin', __dir__) ASF::SVN['board'] = File.expand_path('../test/svn/board', __dir__) ASF::SVN[SAMPLE_SVN_NAME] = File.expand_path('../test/svn/minutes', __dir__) @@ -49,7 +49,7 @@ def getInfoItem(path, item, user=nil, password=nil) end def set_svnroot # ensure can access svn directory listing files - ASF::Config.setsvnroot File.expand_path("../test/svn/*", __dir__) + ASF::Config.setsvnroot File.expand_path('../test/svn/*', __dir__) end def set_cache(restore=nil) # ensure can access test version of iclas.txt @@ -58,7 +58,7 @@ def set_cache(restore=nil) # ensure can access test version of iclas.txt if restore config[:cache] = restore else - source = File.expand_path("../test/svn/", __dir__) + source = File.expand_path('../test/svn/', __dir__) FileUtils.touch File.join(source,'iclas.txt') # ensure it is marked as up-to-date config[:cache] = source end @@ -66,7 +66,7 @@ def set_cache(restore=nil) # ensure can access test version of iclas.txt end def set_svn(name) - ASF::SVN[name] = File.expand_path(File.join("..", "test", "svn", name), __dir__) + ASF::SVN[name] = File.expand_path(File.join('..', 'test', 'svn', name), __dir__) end if TEST_DATA diff --git a/lib/whimsy/asf/agenda.rb b/lib/whimsy/asf/agenda.rb index b128d217aa..b4d5942267 100644 --- a/lib/whimsy/asf/agenda.rb +++ b/lib/whimsy/asf/agenda.rb @@ -160,9 +160,9 @@ def parse(file, quick=false) hash[:attach] = section # look for missing titles - hash['title'] ||= "UNKNOWN" + hash['title'] ||= 'UNKNOWN' - if hash['title'] == "UNKNOWN" + if hash['title'] == 'UNKNOWN' hash['warnings'] = ['unable to find attachment'] end end diff --git a/lib/whimsy/asf/agenda/summary.rb b/lib/whimsy/asf/agenda/summary.rb index 6411674aed..debb7cc071 100644 --- a/lib/whimsy/asf/agenda/summary.rb +++ b/lib/whimsy/asf/agenda/summary.rb @@ -78,7 +78,7 @@ def self.summarize(fname) summary[PMCS_KEY][r[TITLE_KEY]][REPORT_LEN] = r['report'].length if r['report'] end end - actions = agenda.select{ |v| v.has_key?(INDEX_KEY) && v[INDEX_KEY] == "Action Items" }[0][ACTIONS_KEY] + actions = agenda.select{ |v| v.has_key?(INDEX_KEY) && v[INDEX_KEY] == 'Action Items' }[0][ACTIONS_KEY] if actions summary[ACTIONS_KEY] = Hash.new{|h,k| h[k] = [] } actions.each do |r| @@ -89,7 +89,7 @@ def self.summarize(fname) summary[STATS_KEY] = {} summary[STATS_KEY]['specialorders'] = agenda.select{ |v| /\A7/ =~ v[ATTACH_KEY] }.length summary[STATS_KEY]['discusstextlen'] = agenda.select{ |v| - v[INDEX_KEY] == "Discussion Items" || /\A8[A-Z]/ =~ v[ATTACH_KEY] + v[INDEX_KEY] == 'Discussion Items' || /\A8[A-Z]/ =~ v[ATTACH_KEY] }.map {|v| v['text'].length}.sum totapprovals = 0 totcommentlen = 0 diff --git a/lib/whimsy/asf/board.rb b/lib/whimsy/asf/board.rb index e7b6f8a2e1..a72c5117ac 100644 --- a/lib/whimsy/asf/board.rb +++ b/lib/whimsy/asf/board.rb @@ -10,9 +10,9 @@ module Board # Note: the path must be adjusted if the TIMEZONE changes. def self.tzlink(time) # build full time zone link - path = "/worldclock/fixedtime.html?iso=" + + path = '/worldclock/fixedtime.html?iso=' + time.strftime('%Y-%m-%dT%H:%M:%S') + - "&msg=ASF+Board+Meeting" + '&msg=ASF+Board+Meeting' # path += '&p1=137' # time zone for PST/PDT locality link = "http://www.timeanddate.com/#{path}" diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb index 1d3151f773..d0f3f07ea5 100644 --- a/lib/whimsy/asf/committee.rb +++ b/lib/whimsy/asf/committee.rb @@ -177,7 +177,7 @@ def self.load_committee_info(contents = nil, info = nil) @committee_mtime = File.mtime(file) @@svn_change = Time.parse(ASF::SVN.getInfoItem(file, 'last-changed-date')).gmtime - Wunderbar.debug "Parsing CI file" + Wunderbar.debug 'Parsing CI file' @nonpmcs, @officers, @committee_info = parse_committee_info_nocache(File.read(file)) end @committee_info @@ -193,7 +193,7 @@ def self.update_next_month(contents, date, missing, rejected, todos) block = next_month[/(.*#.*\n)+/] || '' # remove expired entries - month = date.strftime("%B") + month = date.strftime('%B') block.gsub!(/.* # new, monthly through #{month}\n/, '') # update/remove existing 'missing' entries @@ -418,7 +418,7 @@ def self.establish(contents, pmc, date, people) blocks[index + 2].split("\n"), ] - unless slots.any? {|slot| slot.include? " " + pmc} + unless slots.any? {|slot| slot.include? ' ' + pmc} # ensure that spacing is uniform slots.each {|slot| slot.unshift '' unless slot[0] == ''} @@ -432,7 +432,7 @@ def self.establish(contents, pmc, date, people) headers = slots[slot].shift(3) # insert pmc into the reporting schedule - slots[slot] << " " + pmc + slots[slot] << ' ' + pmc # sort entries, case insensitive slots[slot].sort_by!(&:downcase) @@ -801,7 +801,7 @@ def self.appendtlpmetadata(input, committee, description, date_established) # ensure the CI data is pre-loaded # If this is not done, the first committee instance may be incomplete - Wunderbar.debug "Initialising CI file" + Wunderbar.debug 'Initialising CI file' ASF::Committee.load_committee_info end diff --git a/lib/whimsy/asf/config.rb b/lib/whimsy/asf/config.rb index 5d96739f17..9f24ce15fc 100644 --- a/lib/whimsy/asf/config.rb +++ b/lib/whimsy/asf/config.rb @@ -45,7 +45,7 @@ class Config root_config = "#{@root}/.whimsy" if File.exist? root_config @config.merge! YAML.load_file(root_config) || {} - @root = '/srv' unless Dir.exist? File.join(@root, "whimsy") + @root = '/srv' unless Dir.exist? File.join(@root, 'whimsy') end # capture root @@ -65,7 +65,7 @@ class Config @config[:git] ||= "#{@root}/git/*" # default location of LDAP credentials - @config[:ldap_creds] ||= "/srv/ldap.txt" + @config[:ldap_creds] ||= '/srv/ldap.txt' # The cache is used for local copies of SVN files that may be updated by Whimsy diff --git a/lib/whimsy/asf/git.rb b/lib/whimsy/asf/git.rb index 92fb6a9142..c05633f67f 100644 --- a/lib/whimsy/asf/git.rb +++ b/lib/whimsy/asf/git.rb @@ -49,7 +49,7 @@ def self.repos git_over = repo_override[:git] if git_over require 'wunderbar' - Wunderbar.warn("Found override for repository.yml[:git]") + Wunderbar.warn('Found override for repository.yml[:git]') @@repository_entries[:git].merge!(git_over) end end diff --git a/lib/whimsy/asf/icla.rb b/lib/whimsy/asf/icla.rb index 4dc97ef7c1..2cc52aa9ef 100644 --- a/lib/whimsy/asf/icla.rb +++ b/lib/whimsy/asf/icla.rb @@ -196,7 +196,7 @@ def self.each(&block) # if age > 0, return the entries added in the last n days def self.unlisted_name_by_email(age=0, env=nil) if age > 0 - rev = "{%s}:HEAD" % (Date.today - age) + rev = '{%s}:HEAD' % (Date.today - age) diff, _err = ASF::SVN.svn('diff', SOURCE_URL, {revision: rev, env: env}) raise _err unless diff return Hash[*diff.scan(/^[+]notinavail:.*?:(.*?):(.*?):Signed CLA/).flatten.reverse] diff --git a/lib/whimsy/asf/icla_text.rb b/lib/whimsy/asf/icla_text.rb index 5e00517716..b583e93490 100644 --- a/lib/whimsy/asf/icla_text.rb +++ b/lib/whimsy/asf/icla_text.rb @@ -21,28 +21,28 @@ def self.type(line) # underlines have all been compressed to 16 char, as that was the shortest found # Also dropped the following prefixes: "(optional)", "*" FORMS = { - "Full name: ________________" => :FullName, - "Legal name: ________________" => :FullName, - "Public name: ________________" => :PublicName, - "Display name: ________________" => :PublicName, - "Mailing Address: ________________" => :MailingAddress, - "Postal Address: ________________" => :MailingAddress, - "PostalAddress: ________________" => :MailingAddress, - "Address: ________________" => :MailingAddress, - "________________" => :MailingAddress2, - "Country: ________________" => :Country, - "E-Mail: ________________" => :EMail, - "preferred Apache id(s): ________________" => :ApacheID, - "Preferred ApacheID: ________________" => :ApacheID, - "PreferredApacheID: ________________" => :ApacheID, - "Alternative ApacheID(s): ________________" => :ApacheID, - "AlternativeApacheID(s): ________________" => :ApacheID, - "notify project: ________________" => :Project, - "GitHub id(s): ________________" => :Github, - "Facsimile: ________________" => :Facsimile, - "Telephone: ________________" => :Telephone, - "Please sign: ________________ Date: ________________" => :Date, - "Please sign:________________ Date: ________________" => :Date, + 'Full name: ________________' => :FullName, + 'Legal name: ________________' => :FullName, + 'Public name: ________________' => :PublicName, + 'Display name: ________________' => :PublicName, + 'Mailing Address: ________________' => :MailingAddress, + 'Postal Address: ________________' => :MailingAddress, + 'PostalAddress: ________________' => :MailingAddress, + 'Address: ________________' => :MailingAddress, + '________________' => :MailingAddress2, + 'Country: ________________' => :Country, + 'E-Mail: ________________' => :EMail, + 'preferred Apache id(s): ________________' => :ApacheID, + 'Preferred ApacheID: ________________' => :ApacheID, + 'PreferredApacheID: ________________' => :ApacheID, + 'Alternative ApacheID(s): ________________' => :ApacheID, + 'AlternativeApacheID(s): ________________' => :ApacheID, + 'notify project: ________________' => :Project, + 'GitHub id(s): ________________' => :Github, + 'Facsimile: ________________' => :Facsimile, + 'Telephone: ________________' => :Telephone, + 'Please sign: ________________ Date: ________________' => :Date, + 'Please sign:________________ Date: ________________' => :Date, } # Tried using __END__ text but the DATA pointer relates to the calling file. diff --git a/lib/whimsy/asf/json-utils.rb b/lib/whimsy/asf/json-utils.rb index d433f113ab..90c40b9695 100644 --- a/lib/whimsy/asf/json-utils.rb +++ b/lib/whimsy/asf/json-utils.rb @@ -68,8 +68,8 @@ def self.compare_json(old_json, new_json, out=$stdout) if __FILE__ == $0 require 'stringio' - old_file = ARGV.shift or raise ArgumentError.new "Old file!" - new_file = ARGV.shift or raise ArgumentError.new "New file!" + old_file = ARGV.shift or raise ArgumentError.new 'Old file!' + new_file = ARGV.shift or raise ArgumentError.new 'New file!' old_json = JSON.parse(File.read(old_file)) new_json = JSON.parse(File.read(new_file)) out = StringIO.new diff --git a/lib/whimsy/asf/ldap.rb b/lib/whimsy/asf/ldap.rb index c6cbf90abf..081e2a6fd8 100644 --- a/lib/whimsy/asf/ldap.rb +++ b/lib/whimsy/asf/ldap.rb @@ -79,12 +79,12 @@ def self.connect(hosts = nil) return ldap rescue ::LDAP::ResultError => re Wunderbar.warn "[#{host}] - Error connecting to LDAP server: " + - re.message + " (continuing)" + re.message + ' (continuing)' end end - Wunderbar.error "Failed to connect to any LDAP host" + Wunderbar.error 'Failed to connect to any LDAP host' return nil end @@ -169,10 +169,10 @@ def self.hosts(use_config = true) if File.exist? conf uris = File.read(conf)[/^uri\s+(.*)/i, 1].to_s hosts = uris.scan(%r{ldaps?://\S+}) # May not have a port - Wunderbar.debug "Using hosts from LDAP config" + Wunderbar.debug 'Using hosts from LDAP config' end else - Wunderbar.debug "Using hosts from Whimsy config" + Wunderbar.debug 'Using hosts from Whimsy config' end # There is no default @@ -240,7 +240,7 @@ def self.configure # determine if ldap has been configured at least once def self.configured? - return File.read("#{ETCLDAP}/ldap.conf").include? "asf-ldap-client.pem" + return File.read("#{ETCLDAP}/ldap.conf").include? 'asf-ldap-client.pem' end # modify an entry in LDAP; dump information on LDAP errors @@ -1038,9 +1038,9 @@ def self.add(attrs) # defaults attrs['loginShell'] ||= '/bin/bash' # as per asfpy.ldap - attrs['homeDirectory'] ||= File.join("/home", availid) - attrs['host'] ||= "home.apache.org" - attrs['asf-sascore'] ||= "10" + attrs['homeDirectory'] ||= File.join('/home', availid) + attrs['host'] ||= 'home.apache.org' + attrs['asf-sascore'] ||= '10' # parse name if sn has not been provided (givenName is optional) attrs = ASF::Person.ldap_name(attrs['cn']).merge(attrs) unless attrs['sn'] @@ -1094,7 +1094,7 @@ def include?(person) # fetch dn, member, modifyTimestamp, and # createTimestamp for all groups in LDAP. def self.preload - Hash[ASF.search_one(base, "cn=*", %w(dn memberUid modifyTimestamp createTimestamp)).map do |results| + Hash[ASF.search_one(base, 'cn=*', %w(dn memberUid modifyTimestamp createTimestamp)).map do |results| cn = results['dn'].first[/^cn=(.*?),/, 1] group = ASF::Group.find(cn) group.modifyTimestamp = results['modifyTimestamp'].first # it is returned as an array of 1 entry @@ -1207,7 +1207,7 @@ def self.[](name) # fetch dn, member, modifyTimestamp, and # createTimestamp for all projects in LDAP. def self.preload - Hash[ASF.search_one(base, "cn=*", %w(dn member owner modifyTimestamp createTimestamp)).map do |results| + Hash[ASF.search_one(base, 'cn=*', %w(dn member owner modifyTimestamp createTimestamp)).map do |results| cn = results['dn'].first[/^cn=(.*?),/, 1] project = self.find(cn) project.modifyTimestamp = results['modifyTimestamp'].first # it is returned as an array of 1 entry @@ -1457,7 +1457,7 @@ def base # createTimestamp for all services in LDAP. # N.B. some services have memberUid rather than member entries def self.preload - Hash[ASF.search_one(base, "cn=*", %w(dn member memberUid modifyTimestamp createTimestamp)).map do |results| + Hash[ASF.search_one(base, 'cn=*', %w(dn member memberUid modifyTimestamp createTimestamp)).map do |results| cn = results['dn'].first[/^cn=(.*?),/, 1] service = self.find(cn) service.modifyTimestamp = results['modifyTimestamp'].first # it is returned as an array of 1 entry diff --git a/lib/whimsy/asf/mail.rb b/lib/whimsy/asf/mail.rb index b5d201df11..7bb52f9b39 100644 --- a/lib/whimsy/asf/mail.rb +++ b/lib/whimsy/asf/mail.rb @@ -200,7 +200,7 @@ def self.archivelistid(dom, list) return "apachecon-#{list}" if dom == 'apachecon.com' return list if dom == 'apache.org' - dom.sub(".apache.org", '-') + list + dom.sub('.apache.org', '-') + list end # Convert dom, list to form used in mail_list_autosub.yml diff --git a/lib/whimsy/asf/meeting-util.rb b/lib/whimsy/asf/meeting-util.rb index 307fa08a08..8b719a008a 100644 --- a/lib/whimsy/asf/meeting-util.rb +++ b/lib/whimsy/asf/meeting-util.rb @@ -139,12 +139,12 @@ def self.is_user_proxied(mtg_dir, id) end end rescue StandardError => e - (help ||= "") << "ERROR, could not read LDAP, proxy data may not be correct: #{e.message}" + (help ||= '') << "ERROR, could not read LDAP, proxy data may not be correct: #{e.message}" end if copypasta.empty? return help else - (help ||= "") << "During the meeting, to mark your proxies' attendance, AFTER the 2. Roll Call is called, you may copy/paste the below lines to mark your and your proxies attendance." + (help ||= '') << "During the meeting, to mark your proxies' attendance, AFTER the 2. Roll Call is called, you may copy/paste the below lines to mark your and your proxies attendance." copypasta.unshift("#{user.id.ljust(max_uid_len)} | #{user.cn}") return help, copypasta end @@ -212,7 +212,7 @@ def self.parse_memapp(path=nil,header=false) # Assume 6 columns for now hyphens=hdr[1].scan(/^(--+ +)(---+ +)(---+ +)(---+ +)(---+ +)(----+ *)$/).first hyphens.pop # drop last; don't want to pad that - fmt = [hyphens.map{|h| "%%-%ds" % (h.size - 1)},'%s'].join(" ") + fmt = [hyphens.map{|h| '%%-%ds' % (h.size - 1)},'%s'].join(' ') return [list, hdr, fmt] else return list @@ -467,5 +467,5 @@ def self.application_valid?(message_datetime) dir = ARGV[0] dir ||= '.' ASF::MeetingUtil.annotate_attendance(dir) - puts "DONE, check attendance-cohorts.json" + puts 'DONE, check attendance-cohorts.json' end diff --git a/lib/whimsy/asf/member-files.rb b/lib/whimsy/asf/member-files.rb index 4eca3b89b4..5ce45982bc 100644 --- a/lib/whimsy/asf/member-files.rb +++ b/lib/whimsy/asf/member-files.rb @@ -114,12 +114,12 @@ def self.parse_file(name) # create a member nomination entry in the standard format # def self.make_member_nomination(fields = {}) - availid = fields[:availid] or raise ArgumentError.new(":availid is required") + availid = fields[:availid] or raise ArgumentError.new(':availid is required') publicname = ASF::Person[availid]&.cn or raise ArgumentError.new(":availid #{availid} is invalid") - nomby = fields[:nomby] or raise ArgumentError.new(":nomby is required") - ASF::Person[nomby]&.dn or raise ArgumentError.new(":nomby is invalid") + nomby = fields[:nomby] or raise ArgumentError.new(':nomby is required') + ASF::Person[nomby]&.dn or raise ArgumentError.new(':nomby is invalid') secby = fields[:secby] || '' - statement = fields[:statement] or raise ArgumentError.new(":statement is required") + statement = fields[:statement] or raise ArgumentError.new(':statement is required') [ '', " #{availid} <#{publicname}>", @@ -137,12 +137,12 @@ def self.make_member_nomination(fields = {}) # create a board nomination entry in the standard format # def self.make_board_nomination(fields = {}) - availid = fields[:availid] or raise ArgumentError.new(":availid is required") + availid = fields[:availid] or raise ArgumentError.new(':availid is required') publicname = ASF::Person[availid]&.cn or raise ArgumentError.new(":availid #{availid} is invalid") - nomby = fields[:nomby] or raise ArgumentError.new(":nomby is required") - ASF::Person[nomby]&.dn or raise ArgumentError.new(":nomby is invalid") + nomby = fields[:nomby] or raise ArgumentError.new(':nomby is required') + ASF::Person[nomby]&.dn or raise ArgumentError.new(':nomby is invalid') secby = fields[:secby] || '' - statement = fields[:statement] or raise ArgumentError.new(":statement is required") + statement = fields[:statement] or raise ArgumentError.new(':statement is required') [ '', " #{publicname}", @@ -262,7 +262,7 @@ def self.board_nominees v['Public Name']&.encoding, v['Public Name']&.valid_encoding?] end - puts "--------------" + puts '--------------' ASF::MemberFiles.board_nominees.each do |k, v| p [k, v['Public Name'], diff --git a/lib/whimsy/asf/member.rb b/lib/whimsy/asf/member.rb index de63c0c5db..6640cfaac2 100644 --- a/lib/whimsy/asf/member.rb +++ b/lib/whimsy/asf/member.rb @@ -216,7 +216,7 @@ def self.list_entries(keys_wanted=nil, raw=false, &block) end end else # can this happen? - raise ArgumentError, "Unexpected section with nil status!" + raise ArgumentError, 'Unexpected section with nil status!' end end end.each(&block) @@ -265,7 +265,7 @@ def self.sort(source) # split into entries, and normalize those entries entries = section.split(/^\s\*\)\s/) header = entries.shift - entries.map! {|entry| " *) " + entry.strip + "\n\n"} + entries.map! {|entry| ' *) ' + entry.strip + "\n\n"} # sort the entries entries.sort_by! do |entry| @@ -338,9 +338,9 @@ def self.text=(text) # :tele - optional # :fax - optional def self.make_entry(fields={}) - fullname = fields[:fullname] or raise ArgumentError.new(":fullname is required") + fullname = fields[:fullname] or raise ArgumentError.new(':fullname is required') address = fields[:address] || '' - availid = fields[:availid] or raise ArgumentError.new(":availid is required") + availid = fields[:availid] or raise ArgumentError.new(':availid is required') email = fields[:email] || "#{availid}@apache.org" country = fields[:country] || '' tele = fields[:tele] || '' @@ -353,7 +353,7 @@ def self.make_entry(fields={}) (" Email: #{email}" unless email.empty?), (" Tel: #{tele}" unless tele.empty?), (" Fax: #{fax}" unless fax.empty?), - " Forms on File: ASF Membership Application", + ' Forms on File: ASF Membership Application', " Avail ID: #{availid}" ].compact.join("\n") + "\n" end @@ -363,7 +363,7 @@ class Person # text entry from members.txt. If full is true, # this will also include the text delimiters. def members_txt(full = false) - prefix, suffix = " *) ", "\n\n" if full + prefix, suffix = ' *) ', "\n\n" if full # Is the cached text still valid? unless @members_time == ASF::Member.mtime @members_txt = nil diff --git a/lib/whimsy/asf/mlist.rb b/lib/whimsy/asf/mlist.rb index 91ef0cb17f..1799fccb79 100644 --- a/lib/whimsy/asf/mlist.rb +++ b/lib/whimsy/asf/mlist.rb @@ -430,15 +430,15 @@ def self.list_parse(type, &block) end # Standard ASF archivers - ARCH_MBOX_PUB = "archiver@mbox-vm.apache.org" - ARCH_MBOX_PRV = "private@mbox-vm.apache.org" - ARCH_MBOX_RST = "restricted@mbox-vm.apache.org" + ARCH_MBOX_PUB = 'archiver@mbox-vm.apache.org' + ARCH_MBOX_PRV = 'private@mbox-vm.apache.org' + ARCH_MBOX_RST = 'restricted@mbox-vm.apache.org' - ARCH_PONY_PUB = "archive-asf-public@cust-asf.ponee.io" - ARCH_PONY_PRV = "archive-asf-private@cust-asf.ponee.io" + ARCH_PONY_PUB = 'archive-asf-public@cust-asf.ponee.io' + ARCH_PONY_PRV = 'archive-asf-private@cust-asf.ponee.io' # Standard external archivers (necessarily public) - ARCH_EXT_MAIL_ARCHIVE = "archive@mail-archive.com" + ARCH_EXT_MAIL_ARCHIVE = 'archive@mail-archive.com' ARCH_EXT_MARKMAIL_RE = %r{^\w+\.\w+\.\w+@.\.markmail\.org$} # one.two.three@a.markmail.org ARCHIVERS = [ARCH_PONY_PRV, ARCH_PONY_PUB, diff --git a/lib/whimsy/asf/nominees.rb b/lib/whimsy/asf/nominees.rb index a6be45b4df..99b4bda0c0 100644 --- a/lib/whimsy/asf/nominees.rb +++ b/lib/whimsy/asf/nominees.rb @@ -16,7 +16,7 @@ def self.member_nominees nominations = Dir[File.join(meetings, '*', 'nominated-members.txt')].max # ensure non-UTF-8 chars don't cause a crash - nominations = File.read(nominations).encode("utf-8", "utf-8", :invalid => :replace).split(/^\s*---+--\s*/) + nominations = File.read(nominations).encode('utf-8', 'utf-8', :invalid => :replace).split(/^\s*---+--\s*/) nominations.shift(2) nominees = {} diff --git a/lib/whimsy/asf/person/override-dates.rb b/lib/whimsy/asf/person/override-dates.rb index 139d5847ac..6c47058e8d 100644 --- a/lib/whimsy/asf/person/override-dates.rb +++ b/lib/whimsy/asf/person/override-dates.rb @@ -27,2000 +27,2000 @@ class ASF::Person # See https://issues.apache.org/jira/browse/WHIMSY-63 @@create_date = { - "aadamchik"=>"20060414170210Z", - "aaf"=>"20080522205123Z", - "aaron"=>"20010718000000Z", # r89589 - "ab"=>"20050201133057Z", - "abey"=>"20031006000000Z", # r218753 - "ablack"=>"20061019200520Z", - "abrookes"=>"20050714205335Z", - "abrown"=>"20061101190806Z", - "achou"=>"20040701000000Z", - "aclute"=>"20050423134740Z", - "acmurthy"=>"20070830223529Z", - "aco"=>"20051209152936Z", - "acoliver"=>"20020126000000Z", # r149646 - "aconway"=>"20060914005910Z", - "acumiskey"=>"20071025234756Z", - "acutright"=>"20031208000000Z", # r262623 - "acymbalak"=>"20080908203334Z", - "adasilva"=>"20040701000000Z", - "adc"=>"20030927000000Z", # r44305 - "adelmelle"=>"20040404000000Z", # r197491 - "adisakala"=>"20060222205824Z", - "aditya"=>"20080516193920Z", - "aditzel"=>"20080618181225Z", - "adrian"=>"20030612000000Z", # r134233 - "adrianc"=>"20070614181327Z", - "adrianocrestani"=>"20070412203543Z", - "aeberbac"=>"20060802010849Z", - "aevers"=>"20021021000000Z", # r233816 - "afester"=>"20051111103039Z", - "aford"=>"20080606225801Z", - "agariboldi"=>"20090427005113Z", - "agazzarini"=>"20090103030619Z", - "agilliland"=>"20050601140952Z", - "agrove"=>"20070626023007Z", - "aheritier"=>"20040424000000Z", # r115038 - "ahj"=>"20060222205855Z", - "ahochsteger"=>"20060914005820Z", - "ahuegen"=>"20050714205249Z", - "aidan"=>"20080104031302Z", - "aivanov"=>"20070626023446Z", - "ajack"=>"20030829000000Z", # r33679 - "ajaquith"=>"20071016014231Z", - "ajaypaibir"=>"20060820232336Z", - "ajborley"=>"20060816181438Z", - "ajindal"=>"20050714205359Z", - "ajith"=>"20041205181755Z", - "akara"=>"20081021155001Z", - "akarasulu"=>"20021113000000Z", # r141 - "ake"=>"20000217000000Z", # r84640 - "akornev"=>"20080522205115Z", - "akosut"=>"19960229000000Z", # r76327 - "akpetteroe"=>"20090211221711Z", - "aku"=>"20041219125317Z", - "akulshreshtha"=>"20060928031838Z", - "alakshman"=>"20090117072257Z", - "alally"=>"20061109025815Z", - "alex"=>"20000623000000Z", # r282044 - "alexanderbell"=>"20090427220055Z", - "alexeys"=>"20050428212601Z", - "alexkli"=>"20080516193737Z", - "alexmc"=>"20040701000000Z", - "alf"=>"20070626023539Z", - "allee8285"=>"20070927194833Z", - "almaw"=>"20061101190540Z", - "altheim"=>"20040701000000Z", - "alvaro"=>"20070711043000Z", - "amamment"=>"20031211000000Z", # r131426 - "amaniatis"=>"20070228034445Z", - "amassari"=>"20031020000000Z", # r175297 - "amattheu"=>"20030211000000Z", # r350609 - "amichalec"=>"20090225194726Z", - "amila"=>"20040701000000Z", - "amilas"=>"20061109030122Z", - "amiro"=>"20010514000000Z", # r334738 - "amita"=>"20071016014233Z", - "ammulder"=>"20030927000000Z", # r44304 - "amol"=>"20050617132342Z", - "amyroh"=>"20010321000000Z", # r285745 - "anathaniel"=>"20050423134751Z", - "anders"=>"20010126000000Z", # r308979 - "andi"=>"20040701000000Z", - "andreas"=>"20030418104123Z", - "andreask"=>"20060606005110Z", - "andreasmyth"=>"20060820232356Z", - "andrey"=>"20080926181646Z", - "andya"=>"20010613000000Z", # r295442 - "andyc"=>"19991111000000Z", # r315091 - "andydale"=>"20060809040855Z", - "andydoerr"=>"20040412000000Z", # r265383 - "andyh"=>"19991117000000Z", # r313298 - "andyhot"=>"20040701000000Z", - "andyj"=>"20070927194835Z", - "andypiper"=>"20060222205818Z", - "andys"=>"20070718014553Z", - "angela"=>"20051102142634Z", - "anil"=>"20040528000000Z", # r262801 - "ankitp"=>"20041109110725Z", - "anou_mana"=>"20040115000000Z", # r262637 - "antelder"=>"20020607000000Z", # r240915 - "antoine"=>"20030415122337Z", - "antollinim"=>"20080516193934Z", - "antonio"=>"20030921000000Z", # r25787 - "antonp"=>"20091114191449Z", - "apaliwal"=>"20090103030617Z", - "apatel"=>"20070516012936Z", - "apavlenko"=>"20071016014225Z", - "apetrelli"=>"20060719164553Z", - "apetrenko"=>"20061019200247Z", - "apien"=>"20060615000123Z", - "apopescu"=>"20060112140508Z", - "aprime"=>"20081219185919Z", - "apurtell"=>"20080912205046Z", - "aramirez"=>"20051118021756Z", - "archie"=>"20051102142726Z", - "ard"=>"20060907020414Z", - "areggiori"=>"20070215031415Z", - "arje"=>"20051023072400Z", - "arkurth"=>"20081112232615Z", - "arminw"=>"20020718000000Z", # r360800 - "arnaudsimon"=>"20070614181541Z", - "arnesond"=>"20061004221242Z", - "arnout"=>"20000206000000Z", # r267584 - "arobinson74"=>"20070614181609Z", - "aroush"=>"20050319182208Z", - "arron"=>"20020118000000Z", # r48821 - "artw"=>"20010424000000Z", # r194223 - "aruny"=>"20030508000000Z", # r337455 - "asanka"=>"20080908203328Z", - "asankha"=>"20060519190836Z", - "asavory"=>"20030327000000Z", # r23924 - "ashah"=>"20060914010118Z", - "ashapochka"=>"20071120160902Z", - "ashish"=>"20071212024022Z", - "ashutosh"=>"20050602161841Z", - "ask"=>"19980616000000Z", # r176588 - "aslom"=>"20021014000000Z", # r241166 - "asmuts"=>"20020115000000Z", # r223361 - "asrabkin"=>"20090225194741Z", - "assaf"=>"20060415113003Z", - "asteinmetz"=>"20050823011043Z", - "astitcher"=>"20070127223244Z", - "atagunov"=>"20030608000000Z", # r17278 - "ate"=>"20040517195746Z", - "athusoo"=>"20090115183641Z", - "auriemma"=>"20000824000000Z", # r338905 - "autarch"=>"20060630183256Z", - "avar"=>"20030122000000Z", # r248846 - "avik"=>"20020502000000Z", # r352583 - "avk"=>"20081015213521Z", - "awhite"=>"20060723194523Z", - "awiner"=>"20060414014034Z", - "awm"=>"20040701000000Z", - "ayza"=>"20061101190740Z", - "azeez"=>"20060130181048Z", - "azoppello"=>"20090211221705Z", - "baerrach"=>"20070117181927Z", - "bago"=>"20050729132057Z", - "bakert"=>"20080116220741Z", - "bakksjo"=>"20050729132052Z", - "baku"=>"20070215031710Z", - "bandaram"=>"20040922003345Z", - "baranda"=>"20050714205238Z", - "barrettj"=>"20060920221842Z", - "barries"=>"20020415000000Z", # r344565 - "baserose"=>"20020620000000Z", # r360638 - "baudyjy"=>"20040319000000Z", # r250449 - "bayard"=>"20010824000000Z", # r147608 - "bayer"=>"20031112000000Z", # r249856 - "bbuffone"=>"20060615000204Z", - "bcholmes"=>"20001121000000Z", # r202737 - "bckfnn"=>"20040120000000Z", # r197227 - "bcm"=>"20051118021749Z", - "bdaniel"=>"20060907020453Z", - "bdelacretaz"=>"20021031000000Z", # r195395 - "bdotte"=>"20040701000000Z", - "bdruth"=>"20040701000000Z", - "bdube"=>"20070528024532Z", - "bdudney"=>"20040809205337Z", - "beaton"=>"20080606225814Z", - "beckerdo"=>"20080908203322Z", - "behl"=>"20040701000000Z", - "bella"=>"20010613000000Z", # r199977 - "bellingard"=>"20060411132333Z", - "ben"=>"19960222000000Z", # r76321 - "bentmann"=>"20080311172718Z", - "berkes"=>"20050821124653Z", - "berndf"=>"20060509013805Z", - "bernt"=>"20050714205327Z", - "bert"=>"20020607000000Z", # r7243 - "bflood"=>"20060415113155Z", - "bhakti"=>"20040220000000Z", # r337895 - "bharath"=>"20080311172720Z", - "bhuemer"=>"20080128212946Z", - "bhupendrab"=>"20061004221216Z", - "bhusted"=>"20051025235948Z", - "bhyde"=>"19980625000000Z", # r81607 - "bibryam"=>"20071208185502Z", - "bigdog"=>"20040817000000Z", # r43243 - "billa"=>"20060123162359Z", - "billbarker"=>"20011002000000Z", # r284236 - "billsch"=>"20001130000000Z", # r172469 - "bimargulies"=>"20071016014210Z", - "binujohn"=>"20081209195854Z", - "bip"=>"20010426000000Z", # r285929 - "bjh"=>"19990322000000Z", # r82973 - "bjohnson"=>"20070830223732Z", - "bjorn"=>"20071208185447Z", - "bjreed"=>"20080908203337Z", - "blanco"=>"20050604130912Z", - "blautenb"=>"20030202000000Z", # r350605 - "blin"=>"20060820232152Z", - "blitchfield"=>"20080221195115Z", - "bloritsch"=>"20010307000000Z", # r10839 - "bluesvm"=>"20080623210603Z", - "blumm"=>"20031002122646Z", - "bmbouter"=>"20081112232617Z", - "bmclaugh"=>"19991215000000Z", # r168817 - "bmesser"=>"20041106095749Z", - "bmitchell"=>"20080128212931Z", - "bnicholes"=>"20010330000000Z", # r88615 - "bnoll"=>"20061221220300Z", - "bobh"=>"20020814000000Z", # r297739 - "bobharner"=>"20070528024843Z", - "bodewig"=>"20000623000000Z", # r267686 - "boisvert"=>"20060415112917Z", - "bojan"=>"20010925000000Z", # r284207 - "bommel"=>"20050930170207Z", - "bond"=>"20080731032735Z", - "borisk"=>"20070920152354Z", - "bpendleton"=>"20060222203934Z", - "bpontarelli"=>"20071016022944Z", - "brad"=>"20031209155429Z", - "brane"=>"20001128000000Z", # r60805 - "bravi"=>"20060415112623Z", - "brazil"=>"20050926174215Z", - "breed"=>"20071025234805Z", - "brekke"=>"20010819000000Z", # r227631 - "brentworden"=>"20031114065614Z", - "brett"=>"20030818000000Z", # r112157 - "brianb"=>"20040704000000Z", # r53612 - "brianellin"=>"20060809040828Z", - "brianf"=>"20060328062002Z", - "briangoetz"=>"20011101000000Z", # r149616 - "brianm"=>"20030914000000Z", # r362912 - "brianp"=>"20011120000000Z", # r92046 - "brindy"=>"20090225194735Z", - "brj"=>"20020617000000Z", # r360614 - "brondsem"=>"20031118100545Z", - "bruce"=>"20020702000000Z", # r273052 - "brudav"=>"20030422150815Z", - "bruno"=>"20030310000000Z", # r23575 - "brushed"=>"20071016014219Z", - "bryanche"=>"20050306155049Z", - "bryanduxbury"=>"20080212193739Z", - "bs"=>"20090514033350Z", - "bsnyder"=>"20030811011316Z", - "bspeakmon"=>"20070528024942Z", - "bstansberry"=>"20051007055848Z", - "bstoler"=>"20080104031220Z", - "bsullivan"=>"20070718014527Z", - "btmurphy"=>"20070412203048Z", - "btopping"=>"20050318184301Z", - "burton"=>"19991002000000Z", # r180475 - "buschmi"=>"20070201030009Z", - "buscob"=>"20090115183652Z", - "butek"=>"20010905000000Z", # r245270 - "butlermh"=>"20030317000000Z", # r23734 - "bvenners"=>"20070412203116Z", - "bwalding"=>"20030128000000Z", # r119592 - "bwallace"=>"20040701000000Z", - "byersa"=>"20060302011357Z", - "byrne"=>"20060317185518Z", - "byron"=>"20081219185935Z", - "cagatay"=>"20060802010935Z", - "calavera"=>"20080618181232Z", - "cam"=>"20040801000000Z", # r201371 - "cargilld"=>"20031215000000Z", # r175561 - "carlos"=>"20040617000000Z", # r115487 - "carlson"=>"20011220000000Z", # r149631 - "carnold"=>"20040731162525Z", - "carrier"=>"20090103030623Z", - "cbegin"=>"20041007000154Z", - "cblecken"=>"20041218134544Z", - "cbowditch"=>"20040301000000Z", # r197400 - "cbrisson"=>"20061221220204Z", - "ccardona"=>"20061101190602Z", - "cchew"=>"20030430000000Z", # r223866 - "ccristal"=>"20081209195849Z", - "cctrieloff"=>"20060914010218Z", - "ccustine"=>"20070528024607Z", - "cdamon"=>"20060317185356Z", - "cdaniluk"=>"20060414170221Z", - "cdevienne"=>"20040809205414Z", - "cdinapala"=>"20050523235419Z", - "cdoremus"=>"20050310111606Z", - "cdouglas"=>"20071212024020Z", - "cdupoirieux"=>"20050821124645Z", - "cedric"=>"20010801000000Z", # r48516 - "ceki"=>"20001116000000Z", # r308872 - "cezar"=>"20030910101847Z", - "cfieber"=>"20040719000000Z", # r23065 - "cgreenlee"=>"20040701000000Z", - "chaase3"=>"20080321174854Z", - "chabotc"=>"20080411160508Z", - "chadh"=>"20060222205732Z", - "chamikara"=>"20041218134559Z", - "chamil"=>"20051028125031Z", - "chaminda"=>"20030626000000Z", # r249182 - "chamindra"=>"20040701000000Z", - "chanwit"=>"20080623210605Z", - "charitha"=>"20070718014455Z", - "charlesb"=>"20010213000000Z", # r107364 - "charper"=>"20060415113031Z", - "chathura"=>"20041205181815Z", - "chathura_ce"=>"20070110182426Z", - "chatra"=>"20060222205736Z", - "cheche"=>"20030715000000Z", # r8522 - "chestnut"=>"20050617152644Z", - "chico"=>"20090225194733Z", - "chinthaka"=>"20041113020921Z", - "chirino"=>"20030822000000Z", # r43937 - "cholet"=>"19990615000000Z", # r177129 - "chowells"=>"20061009210708Z", - "chrisd"=>"20060518032526Z", - "chrise"=>"20040701000000Z", - "chrisg"=>"20020210000000Z", # r194634 - "chrisjdavis"=>"20040701000000Z", - "chrisjs"=>"20060326214123Z", - "christian"=>"20080212193738Z", - "chrisw"=>"20021124000000Z", # r273576 - "chuck"=>"19960528000000Z", # r76523 - "chuckw"=>"20060530190223Z", - "chunrong"=>"20080522205122Z", - "cjblythe"=>"20070127223134Z", - "cjodea"=>"20060415112730Z", - "cjolif"=>"20001023000000Z", # r198840 - "cjudson"=>"20040715191822Z", - "ckiehl"=>"20070718014757Z", - "ckoell"=>"20081015213525Z", - "ckoppelt"=>"20061221220345Z", - "ckormos"=>"20060615000143Z", - "cks"=>"20020620000000Z", # r297556 - "clar"=>"20031229193723Z", - "clay"=>"20040611000000Z", # r197697 - "clement"=>"20070528024744Z", - "clhubert"=>"20040701000000Z", - "cliff"=>"19990315000000Z", # r82913 - "cliffs"=>"20030910101847Z", - "clim"=>"20050713000904Z", - "clint"=>"20070626023347Z", - "clombart"=>"20050103161248Z", - "clr"=>"20050306155044Z", - "clucas"=>"20010324000000Z", # r283400 - "cmanohar"=>"20050209150220Z", - "cmchen"=>"20070920152400Z", - "cmlenz"=>"20010801000000Z", # r203588 - "cmoulliard"=>"20040701000000Z", - "cmpilato"=>"20040701000000Z", - "coar"=>"19970408000000Z", # r77815 - "coheigea"=>"20080908203330Z", - "coliver"=>"20030314000000Z", # r23672 - "colm"=>"20050823011035Z", - "conny"=>"20081112232634Z", - "conor"=>"20000617000000Z", # r267680 - "costin"=>"19991010000000Z", # r229805 - "covener"=>"20070516013036Z", - "cpiro"=>"20080516193927Z", - "crafterm"=>"20020416000000Z", # r13382 - "craigc"=>"20040715191748Z", - "craigmcc"=>"19991012000000Z", # r280991 - "crazybob"=>"20060530190203Z", - "crogers"=>"20051018200758Z", - "crossley"=>"20020210000000Z", # r225960 - "csauer"=>"20071025234809Z", - "cschneider"=>"20080926181652Z", - "cschoett"=>"20051121034953Z", - "ctan"=>"20080821235430Z", - "ctoth"=>"20080311172725Z", - "ctwiner"=>"20080606225816Z", - "curcuru"=>"20000720000000Z", # r333163 - "cutting"=>"20010924000000Z", # r149585 - "cvillegas"=>"20050120090838Z", - "cwei"=>"20060614235909Z", - "cwiklik"=>"20081118230926Z", - "cygnus"=>"20061009205633Z", - "cziegeler"=>"20010926000000Z", # r313952 - "dadams"=>"20070626023035Z", - "dag"=>"20070323185123Z", - "daijy"=>"20080926181644Z", - "dain"=>"20030811000000Z", # r43712 - "damien"=>"20080311172703Z", - "damitha"=>"20030627000000Z", # r249204 - "damonc"=>"20011108000000Z", # r265075 - "damrhei"=>"20070830223630Z", - "dancres"=>"20070412202915Z", - "dandiep"=>"20050428213250Z", - "dane0101"=>"20080423163440Z", - "danese"=>"20040701000000Z", - "danielf"=>"20031229193640Z", - "danielwilson"=>"20080221195120Z", - "danj"=>"20060606005551Z", - "danlyke"=>"20061004221344Z", - "danny"=>"20010928000000Z", # r107672 - "dantran"=>"20051204210655Z", - "danushka"=>"20081209195852Z", - "darobin"=>"20020130000000Z", # r344501 - "darrell"=>"20010815000000Z", # r107624 - "dasarath"=>"20041208231238Z", - "dashorst"=>"20060921010439Z", - "davenewton"=>"20070927194827Z", - "daveread"=>"20040715191838Z", - "daveremy"=>"20030910101847Z", - "davi"=>"20070626023128Z", - "davidb"=>"20081125224432Z", - "davidbau"=>"20030910101847Z", - "davidillsley"=>"20060606004641Z", - "davidvc"=>"20050729132055Z", - "davidw"=>"20000908000000Z", # r321531 - "davisp"=>"20090227180034Z", - "davsclaus"=>"20080321174900Z", - "dawood"=>"20090415173940Z", - "dbalmain"=>"20060606005841Z", - "dbentley"=>"20080104031250Z", - "dbertoni"=>"20000124000000Z", # r338285 - "dbhole"=>"20051220201929Z", - "dblevins"=>"20030830000000Z", # r44081 - "dbrosius"=>"20050209150254Z", - "dchappell"=>"20020926000000Z", # r248258 - "dchauhan"=>"20081219185933Z", - "dcoker"=>"20080104031255Z", - "ddam"=>"20080116220743Z", - "ddas"=>"20070830223557Z", - "ddevienne"=>"20041113020119Z", - "ddewolf"=>"20040224000000Z", # r35896 - "ddhill"=>"20040701000000Z", - "ddp"=>"20020508000000Z", # r144602 - "deepal"=>"20041113021049Z", - "dejanb"=>"20080908203327Z", - "delafran"=>"20050326223129Z", - "demuru"=>"20060317185455Z", - "dennisbyrne"=>"20060126150112Z", - "dennisl"=>"20060112140356Z", - "dettborn"=>"20070808193104Z", - "deweese"=>"20001027000000Z", # r198867 - "dezzio"=>"20070711043149Z", - "dfabulich"=>"20070110182606Z", - "dflores"=>"20051209152935Z", - "dflorey"=>"20040224000000Z", # r206874 - "dfs"=>"20000915000000Z", # r54278 - "dgeary"=>"20000929000000Z", # r47804 - "dglazer"=>"20080104031224Z", - "dgraham"=>"20021019000000Z", # r49657 - "dhague"=>"20081219185924Z", - "dhaney"=>"20050714205343Z", - "dharkness"=>"20080104031226Z", - "dharris"=>"20040701000000Z", - "dhirup"=>"20050310111629Z", - "dhruba"=>"20070323185153Z", - "dicka"=>"20040913000000Z", # r259220 - "digy"=>"20081112232642Z", - "diluka"=>"20080731032802Z", - "dims"=>"20010601000000Z", # r225913 - "dimuthu"=>"20060921010339Z", - "dinesh"=>"20051209144032Z", - "dino"=>"20001002000000Z", # r198774 - "dion"=>"20020119000000Z", # r138215 - "dirkv"=>"20010711000000Z", # r203474 - "dirkx"=>"19980703000000Z", # r81646 - "dirving"=>"20060830183925Z", - "diwaker"=>"20050714205252Z", - "dixson"=>"20081026004621Z", - "djcook"=>"20051209153115Z", - "djd"=>"20040922003402Z", - "djencks"=>"20030811011316Z", - "djpolito"=>"20010806000000Z", # r227541 - "djspiewak"=>"20090515035900Z", - "djue"=>"20080221195123Z", - "dkulp"=>"20060507190739Z", - "dlat"=>"20081112232609Z", - "dlegg"=>"20080908203318Z", - "dleslie"=>"19991217000000Z", # r313350 - "dlestrat"=>"20040208225139Z", - "dlouzan"=>"20050423134737Z", - "dlr"=>"20001011000000Z", # r72187 - "dls"=>"20081112232607Z", - "dlydick"=>"20051014070338Z", - "dmandell"=>"20010417000000Z", # r218486 - "dmarston"=>"20001127000000Z", # r342509 - "dmeikle"=>"20081015213527Z", - "dmiddlem"=>"20060222205749Z", - "dmitri"=>"20010603000000Z", # r145962 - "dmitryh"=>"20040310000000Z", # r341985 - "dmitrys"=>"20030925000000Z", # r150062 - "dmkarr"=>"20020926000000Z", # r49538 - "dmui"=>"20030306000000Z", # r353021 - "dnaber"=>"20040731162602Z", - "dobbs"=>"20011024000000Z", # r220486 - "dobri"=>"20090306145826Z", - "doebele"=>"20080731032740Z", - "dogacan"=>"20070614182023Z", - "dolander"=>"20040716163912Z", - "doll"=>"20080104031222Z", - "dominik"=>"20041218134516Z", - "donaldp"=>"20001123000000Z", # r10721 - "dongukchoi"=>"20080623210612Z", - "donsez"=>"20060914005312Z", - "doogie"=>"20071016014235Z", - "doronc"=>"20070215031351Z", - "dos"=>"20050310111615Z", - "dougm"=>"19970719000000Z", # r78680 - "dougsale"=>"20081112232639Z", - "dougsleite"=>"20080821235446Z", - "dpejesh"=>"20020825000000Z", # r96527 - "dpeterson"=>"20080516193916Z", - "dpfister"=>"20050326223121Z", - "dpicco"=>"20060222205808Z", - "dpp"=>"20081209195856Z", - "drag0n2"=>"20020520000000Z", # r149759 - "draier"=>"20041218134530Z", - "dreid"=>"19991007000000Z", # r59275 - "dreiss"=>"20080516193923Z", - "drewbai"=>"20081125224440Z", - "drieseng"=>"20040215115753Z", - "drobiazko"=>"20080606225819Z", - "drobinson"=>"20070614181358Z", - "drtr"=>"20040701000000Z", - "drummondreed"=>"20060816181222Z", - "dsale"=>"20011010000000Z", # r138181 - "dsavazzi"=>"20040809205351Z", - "dsh"=>"20060719164440Z", - "dsolis"=>"20030321001509Z", - "dsosnoski"=>"20050914151733Z", - "dspencer"=>"20040925124550Z", - "dtanzer"=>"20051008054815Z", - "duftler"=>"20000714000000Z", # r261943 - "dug"=>"20001107000000Z", # r262026 - "dumindu"=>"20070330211736Z", - "duncan"=>"19991009000000Z", # r229801 - "duncf"=>"20041105060718Z", - "dushshantha"=>"20050423134735Z", - "dutta"=>"20040516000000Z", # r110743 - "dvholten"=>"20060519190112Z", - "dviner"=>"20021120000000Z", # r192290 - "dwaite"=>"20041207000000Z", # r111136 - "dweir"=>"20060222205835Z", - "dweiss"=>"20080116220754Z", - "dwinterfeldt"=>"20010701000000Z", # r48455 - "dwoods"=>"20070330211825Z", - "dyre"=>"20070920152411Z", - "eacmen"=>"20060615000101Z", - "eae"=>"20061109172655Z", - "eaf"=>"20080411160515Z", - "ebengston"=>"20050609113055Z", - "ebourg"=>"20040602071623Z", - "ecarmich"=>"20030824000000Z", # r305801 - "eckardjf"=>"20070516012910Z", - "eckehard"=>"20040521000000Z", # r207199 - "ecraig"=>"20071120160905Z", - "ed"=>"20000615000000Z", # r282012 - "edalquist"=>"20080311172657Z", - "edeoliveira"=>"20080718165053Z", - "edgarpoce"=>"20050601141009Z", - "edith"=>"20030418104123Z", - "edslattery"=>"20051221165551Z", - "edwardsmj"=>"20051221165545Z", - "edwardyoon"=>"20080623210601Z", - "edwingo"=>"20001116000000Z", # r316582 - "efastl"=>"20070528025011Z", - "efy"=>"20080731032758Z", - "egli"=>"20030418104123Z", - "eglynn"=>"20060820232014Z", - "egor"=>"20070626023155Z", - "ehatcher"=>"20011221000000Z", # r270293 - "ehillenius"=>"20060921010500Z", - "ekbush"=>"20021015000000Z", # r49627 - "ekoneil"=>"20040716163935Z", - "elecharny"=>"20050317000000Z", # r157983 - "elemings"=>"20071016014227Z", - "elena"=>"20010105000000Z", # r316771 - "eliast"=>"20051014070340Z", - "elrod"=>"20040518000000Z", # r250980 - "ema"=>"20060820232212Z", - "enis"=>"20070907215137Z", - "enolan"=>"20060222205754Z", - "enver"=>"20011128000000Z", # r152712 - "epugh"=>"20030226000000Z", # r221078 - "epunzalan"=>"20051118021751Z", - "eranga"=>"20080505204056Z", - "ericf"=>"20030627000000Z", # r249194 - "ericjohnson"=>"20060820232051Z", - "ericvas"=>"20030910101847Z", - "ericye"=>"20000421000000Z", # r315452 - "erikabele"=>"20020810000000Z", # r96346 - "erodriguez"=>"20040922003517Z", - "eross"=>"20061130180750Z", - "ersiner"=>"20050930214625Z", - "esm"=>"20060712200503Z", - "etnu"=>"20080104031238Z", - "evan"=>"20080104031247Z", - "evanthika"=>"20080606225803Z", - "evenisse"=>"20020914000000Z", # r118909 - "eworley"=>"20070711042903Z", - "ewrick"=>"20070302211105Z", - "eyang"=>"20090225212646Z", - "fadushin"=>"20070626023254Z", - "fancy"=>"20070820141344Z", - "fanf"=>"19991028000000Z", # r84060 - "fapeeler"=>"20081112232613Z", - "faridz"=>"20060830184010Z", - "farra"=>"20030928000000Z", # r17839 - "faywang"=>"20080926181648Z", - "fbarnaby"=>"20070425132819Z", - "fcarrion"=>"20070323185022Z", - "fdc"=>"19980528000000Z", # r176523 - "fede"=>"20010223000000Z", # r10735 - "fedor"=>"20010901000000Z", # r220398 - "felicity"=>"20020927000000Z", # r3529 - "felipeal"=>"20031218000000Z", # r218248 - "felix"=>"20030418104123Z", - "felixk"=>"20070323184935Z", - "ferdinand"=>"20050423134759Z", - "fern"=>"20020802000000Z", # r192130 - "fernanda"=>"20061101190827Z", - "ffang"=>"20060820231953Z", - "fgiust"=>"20050930152814Z", - "fguillaume"=>"20090508011736Z", - "fhanik"=>"20030219000000Z", # r301548 - "fielding"=>"19960804000000Z", # r76699 - "fitz"=>"20010410000000Z", # r58203 - "florianbruckner"=>"20020617000000Z", # r360616 - "florianh"=>"20081125224438Z", - "flynch"=>"20060914005953Z", - "fmeschbe"=>"20051102142558Z", - "foconer"=>"20051209152658Z", - "foliver"=>"20070412203520Z", - "fpj"=>"20080522205132Z", - "francisdb"=>"20090103030621Z", - "frankb"=>"20051221165539Z", - "frankbille"=>"20060921010539Z", - "fredrik"=>"20030920180212Z", - "freemant"=>"20060507190705Z", - "froehlich"=>"20011116000000Z", # r12408 - "froethenbacher"=>"20060123163059Z", - "fuankg"=>"20040404133119Z", - "fuhwei"=>"20070718014823Z", - "funkman"=>"20030601000000Z", # r301916 - "furfari"=>"20060317185439Z", - "fuzzylogic"=>"20040922003447Z", - "fwang"=>"20080516193740Z", - "fwiles"=>"20060222202830Z", - "gabriele"=>"20090514033353Z", - "ganesh"=>"20090427220048Z", - "ganeshmb"=>"20090227180042Z", - "gangolli"=>"20050710000000Z", # r210025 - "gareth"=>"20021118000000Z", # r174367 - "garyp"=>"20001008000000Z", # r333460 - "gastaldi"=>"20060127031524Z", - "gates"=>"20071025234759Z", - "gatfora"=>"20061115174836Z", - "gawor"=>"20040409000000Z", # r240498 - "gbayon"=>"20041007000134Z", - "gboccalon"=>"20090211221703Z", - "gbrown"=>"20090225194729Z", - "gcasper"=>"20030803022443Z", - "gcrawford"=>"20061101190447Z", - "gdamour"=>"20031210000000Z", # r44669 - "gdaniels"=>"20000705000000Z", # r261937 - "gdf"=>"20080505204042Z", - "gears"=>"20000413000000Z", # r193326 - "ged"=>"20040701000000Z", - "geechorama"=>"20090415173942Z", - "geirm"=>"20001028000000Z", # r72492 - "geoff"=>"20020302000000Z", # r177665 - "gerdogdu"=>"20081112232636Z", - "germuska"=>"20031226000000Z", # r51278 - "gertv"=>"20070516013006Z", - "geuerp"=>"20010928000000Z", # r350313 - "gfs"=>"20080104031228Z", - "ggolden"=>"20020430000000Z", # r183104 - "ggregory"=>"20030320000000Z", # r137261 - "gharley"=>"20060331124239Z", - "ghicker"=>"20070711043123Z", - "gholam"=>"20010227000000Z", # r126094 - "ghoward"=>"20030328000000Z", # r23926 - "ghudson"=>"20040701000000Z", - "giacomo"=>"20010825000000Z", # r11705 - "gianugo"=>"20020404000000Z", # r192051 - "giorgio"=>"20080411160504Z", - "gkesavan"=>"20090326020048Z", - "gkossakowski"=>"20070309235235Z", - "glenn"=>"20000725000000Z", # r282196 - "glens"=>"20020208000000Z", # r352077 - "gmarcy"=>"20040701000000Z", - "gmazza"=>"20030623141729Z", - "gmcdonald"=>"20060719164637Z", - "gmonroe"=>"20061130180731Z", - "gmuellan"=>"20060411161410Z", - "gnodet"=>"20051209151953Z", - "goller"=>"20031003132908Z", - "gonzalo"=>"20010813000000Z", # r227563 - "gozer"=>"20030226000000Z", # r69767 - "gpetracek"=>"20080116220752Z", - "grahamd"=>"20060130181045Z", - "grantm"=>"20060921010855Z", - "grantmonroe"=>"20061009211333Z", - "grantsmith"=>"20041007000058Z", - "grchiu"=>"20021206000000Z", # r343774 - "greddin"=>"20051023072541Z", - "gredler"=>"20040701000000Z", - "gregames"=>"20000829000000Z", # r86158 - "gregor"=>"20030418104123Z", - "gregw"=>"20030811011316Z", - "greybird"=>"20050818193307Z", - "grimsell"=>"20050423134743Z", - "grischik"=>"20060317185416Z", - "grisha"=>"20000505000000Z", # r85141 - "grobmeier"=>"20090406194957Z", - "gryzor"=>"20080908203312Z", - "gsandhir"=>"20081026004625Z", - "gscenini"=>"20051209141757Z", - "gschneid"=>"20020710000000Z", # r360752 - "gscokart"=>"20070528024917Z", - "gseitz"=>"20070920152407Z", - "gshimansky"=>"20061101190710Z", - "gsim"=>"20060914010158Z", - "gsingers"=>"20060530190145Z", - "gstein"=>"19990417000000Z", # r83054 - "gtully"=>"20080731032803Z", - "gturrell"=>"20061130180707Z", - "guillaume"=>"20050106132214Z", - "gvanmatre"=>"20050821124658Z", - "gwinn"=>"20061122184649Z", - "gwynevans"=>"20060921010636Z", - "haddadc"=>"20020809000000Z", # r247708 - "hadrian"=>"20071120160915Z", - "hairong"=>"20071212024011Z", - "halleypo"=>"20060519190137Z", - "hammant"=>"20010311000000Z", # r10840 - "hammett"=>"20030923000000Z", # r17813 - "handyande"=>"20061130180808Z", - "hannes"=>"20011029000000Z", # r233593 - "hannonpi"=>"20080116220750Z", - "hans"=>"20050803150115Z", - "hansbak"=>"20060302011400Z", - "hansgk"=>"20070626023321Z", - "happen"=>"20080423163428Z", - "hari"=>"20051017072305Z", - "harishkswamy"=>"20030919000000Z", # r243566 - "hattori"=>"20050116142020Z", - "haul"=>"20030312000000Z", # r23626 - "hauser"=>"20060106123524Z", - "hawkeye"=>"20040723000000Z", # r258779 - "hazems"=>"20080516193742Z", - "hbedi"=>"20010330000000Z", # r107444 - "hboutemy"=>"20071016014212Z", - "hbuelow"=>"20050714205339Z", - "hchan"=>"20041106110048Z", - "hchar"=>"20040417000000Z", # r224072 - "hcunico"=>"20060320170616Z", - "heathers"=>"20040715191857Z", - "hefti"=>"20011206000000Z", # r322131 - "heh"=>"20050821124656Z", - "heitmann"=>"20070323185047Z", - "hemapani"=>"20031117000000Z", # r263321 - "henkp"=>"20050125000000Z", # r126393 - "hennejg"=>"20060830183902Z", - "hennes"=>"20050930170209Z", - "henning"=>"20010821000000Z", # r220380 - "henryjen"=>"20080516193738Z", - "hepabolu"=>"20050714205316Z", - "hermanns"=>"20060302011345Z", - "hermod"=>"20070309235206Z", - "herven"=>"20070711043058Z", - "hfahmy"=>"20040701000000Z", - "hgilde"=>"20041107101932Z", - "hgomez"=>"20001115000000Z", # r282650 - "hhernandez"=>"20030123000000Z", # r220951 - "hibou"=>"20080321174914Z", - "hideharu"=>"20050713001211Z", - "hillion"=>"20001010000000Z", # r198776 - "hilmer"=>"20031111032218Z", - "hindessm"=>"20060609044203Z", - "hiranya"=>"20080505204046Z", - "hlship"=>"20030110000000Z", # r243177 - "hmahbod"=>"20090306145824Z", - "hnordberg"=>"20060630183223Z", - "hoffmann"=>"20061115175026Z", - "hogstrom"=>"20050930152414Z", - "hoju"=>"20030214000000Z", # r311513 - "holtdl"=>"20010117000000Z", # r268475 - "hongtebari"=>"20080623210610Z", - "horwat"=>"20000803000000Z", # r216602 - "hossman"=>"20060123163057Z", - "hrabago"=>"20050310111622Z", - "hstern"=>"20091229185201Z", - "huber"=>"20030311000000Z", # r23589 - "huck"=>"20021107000000Z", # r321648 - "hughesj"=>"20020606000000Z", # r240912 - "humberto"=>"20060317185508Z", - "husted"=>"20010108000000Z", # r47997 - "huw"=>"20020804000000Z", # r14431 - "ianh"=>"20010511000000Z", # r89085 - "ias"=>"20031113000000Z", # r231643 - "ib"=>"20030227000000Z", # r205883 - "iberezhn"=>"20080522205117Z", - "idarwin"=>"20020913000000Z", # r288521 - "idus"=>"20050930170217Z", - "ieb"=>"20080718165050Z", - "igorh"=>"20030808000000Z", # r337602 - "igors"=>"20011228000000Z", # r246128 - "ilene"=>"20020719000000Z", # r336579 - "ilkka"=>"20040701000000Z", - "imario"=>"20040423220612Z", - "indika"=>"20070110182452Z", - "ips"=>"20041116020515Z", - "isabel"=>"20080128212936Z", - "isilval"=>"20061101190516Z", - "issac"=>"20030704195228Z", - "isurues"=>"20070302211128Z", - "ivavladimir"=>"20070614181922Z", - "ivaynberg"=>"20060921010558Z", - "ivelin"=>"20020526000000Z", # r314126 - "ivn"=>"20050906143408Z", - "ivstolya"=>"20080522205127Z", - "j3h"=>"20060928031820Z", - "jacekp"=>"20020906000000Z", # r96672 - "jacob"=>"20030911000000Z", # r327272 - "jacobd"=>"20070907215343Z", - "jacopoc"=>"20060302011351Z", - "jake"=>"20081219185931Z", - "jaliya"=>"20040106000000Z", # r263362 - "jalkanen"=>"20071016014229Z", - "jamejose"=>"20050118175426Z", - "jan"=>"20080311172651Z", - "janb"=>"20030811011316Z", - "jancona"=>"20080618181230Z", - "jankeesvanandel"=>"20090225194719Z", - "jann"=>"20050603220044Z", - "janne"=>"20060921010518Z", - "janstey"=>"20080908203332Z", - "jasha"=>"20080821235440Z", - "jasons"=>"20010327000000Z", # r313778 - "jasonw"=>"20040107000000Z", # r109027 - "jawarner"=>"20080411160513Z", - "jayachandra"=>"20050602161836Z", - "jaydm"=>"20070626023512Z", - "jaz"=>"20060302011354Z", - "jbass"=>"20081112232619Z", - "jbates"=>"20020226000000Z", # r192027 - "jbellis"=>"20090326020005Z", - "jberry"=>"20000729000000Z", # r172286 - "jblok"=>"20060921010734Z", - "jbohn"=>"20060621210600Z", - "jbonofre"=>"20090211221701Z", - "jboynes"=>"20030811011316Z", - "jbq"=>"20060112140529Z", - "jbryant"=>"20070228034418Z", - "jcarman"=>"20040913175739Z", - "jcarreira"=>"20060123163715Z", - "jcduenas"=>"20060802011117Z", - "jcej"=>"20020906000000Z", # r118863 - "jchris"=>"20080912205044Z", - "jcompagner"=>"20060921010655Z", - "jconlon"=>"20060830183839Z", - "jcosters"=>"20090415173946Z", - "jdcasey"=>"20040624230548Z", - "jdcryans"=>"20080731032745Z", - "jdecocq"=>"20081026004628Z", - "jdillon"=>"20030812000000Z", # r43729 - "jdliau"=>"20081026004630Z", - "jdonnerstag"=>"20060921010618Z", - "jdumay"=>"20080505204048Z", - "jeastman"=>"20080411160518Z", - "jechawke"=>"20010616000000Z", # r313882 - "jeffreyr"=>"20000125000000Z", # r315201 - "jefft"=>"20010802000000Z", # r11572 - "jeffyu"=>"20080311172709Z", - "jeremias"=>"20020505000000Z", # r194764 - "jeremy"=>"20030313000000Z", # r23649 - "jeremy_a"=>"20030407041056Z", - "jerenkrantz"=>"20010531000000Z", # r58270 - "jericho"=>"20010223000000Z", # r203060 - "jernst"=>"20061019200218Z", - "jerome"=>"20050729132109Z", - "jeromy"=>"20080204143438Z", - "jesse"=>"20030408014417Z", - "jfaath"=>"20070718014644Z", - "jfallows"=>"20060414014035Z", - "jfarcand"=>"20020822000000Z", # r301177 - "jfclere"=>"20010404000000Z", # r57618 - "jford"=>"20030619000000Z", # r184137 - "jfthomps"=>"20081112232621Z", - "jgallacher"=>"20050607175400Z", - "jgallimore"=>"20080718165049Z", - "jgapuz"=>"20051209152700Z", - "jgbutler"=>"20051007054554Z", - "jgenender"=>"20050201123204Z", - "jglick"=>"20040922003500Z", - "jgmyers"=>"20051007060141Z", - "jgomes"=>"20080311172712Z", - "jgoodwill"=>"20051209141759Z", - "jgoodyear"=>"20090211221709Z", - "jhaile"=>"20080618181222Z", - "jhawkins"=>"20060830184030Z", - "jheight"=>"20030917000000Z", # r353355 - "jheymans"=>"20050906143413Z", - "jhm"=>"20030901000000Z", # r275165 - "jhollis"=>"20050714205356Z", - "jholmes"=>"20020623000000Z", # r49146 - "jhook"=>"20060302011405Z", - "jhuang"=>"20090115183648Z", - "jhunter"=>"19991018000000Z", # r264219 - "jhurley"=>"20070412203404Z", - "jim"=>"19960316000000Z", # r76385 - "jimk"=>"20070516013203Z", - "jimw"=>"20001216000000Z", # r87379 - "jjensen"=>"20060830183744Z", - "jjohnston"=>"20060802010704Z", - "jkaputin"=>"20050423134757Z", - "jkelly"=>"20050823011127Z", - "jkesselm"=>"20000920000000Z", # r333357 - "jkeyes"=>"20020613000000Z", # r129769 - "jkf"=>"20041208231217Z", - "jkuhnert"=>"20051204210653Z", - "jkumaran"=>"20031117000000Z", # r249868 - "jlaskowski"=>"20040217000000Z", # r45123 - "jleroux"=>"20060712200529Z", - "jlim"=>"20051209152657Z", - "jliu"=>"20060820232233Z", - "jlruiz"=>"20060802011142Z", - "jlund"=>"20040519141919Z", - "jlust"=>"20060317185539Z", - "jm"=>"20040105000000Z", # r6089 - "jmachols"=>"20031114060139Z", - "jmacna"=>"20030911000000Z", # r327271 - "jmargaris"=>"20060614235932Z", - "jmarino"=>"20051221165547Z", - "jmcconnell"=>"20060411132329Z", - "jmcnally"=>"20010815000000Z", # r227579 - "jmitchell"=>"20021025000000Z", # r49691 - "jmoore"=>"20010712000000Z", # r309226 - "jmorales"=>"20090415173944Z", - "jmsnell"=>"20010127000000Z", # r244556 - "jneeraj"=>"20071208185453Z", - "joachim"=>"20061004221304Z", - "joakime"=>"20060830183656Z", - "joannet"=>"20041213000000Z", # r338078 - "jochen"=>"20030923000000Z", # r231557 - "joecheng"=>"20050503151330Z", - "joehni"=>"20051211223150Z", - "joerg"=>"20030513111116Z", - "joern"=>"20071016014218Z", - "joes"=>"20010315000000Z", # r88519 - "johan"=>"20080731032749Z", - "johara"=>"20060914010348Z", - "johnemb"=>"20080411160528Z", - "johng"=>"20010419000000Z", # r334623 - "johnh"=>"20071212024024Z", - "johns"=>"20080821235442Z", - "johnturner"=>"20040701000000Z", - "johnx"=>"20050201133113Z", - "jon"=>"20000324000000Z", # r281661 - "jonathan"=>"20081112232611Z", - "jonesde"=>"20060302011348Z", - "jongjinchoi"=>"20040715191806Z", - "jonl"=>"20040701000000Z", - "jordan"=>"20000620000000Z", # r193407 - "jorgenlo"=>"20080423163413Z", - "jorton"=>"20021111000000Z", # r64012 - "josch"=>"20050326223115Z", - "jose"=>"20040701000000Z", - "josh"=>"20080321174904Z", - "josias"=>"20051125184605Z", - "jpanzer"=>"20080104031233Z", - "jrbauer"=>"20080926181650Z", - "jrduncans"=>"20060921010420Z", - "jregan"=>"20080104031231Z", - "jreijn"=>"20070323184957Z", - "jrodenburg"=>"20060830183720Z", - "jrthomerson"=>"20090306145830Z", - "jruiz"=>"20051118021753Z", - "jruzzi"=>"20050617132358Z", - "jsachs"=>"20010731000000Z", # r89840 - "jsalvata"=>"20021224000000Z", # r322920 - "jsdelfino"=>"20051221165543Z", - "jsdever"=>"20020715000000Z", # r133712 - "jsisson"=>"20050523235433Z", - "jskeet"=>"20020224000000Z", # r271531 - "jsl"=>"20010711000000Z", # r89537 - "jsommer"=>"20060415112703Z", - "jsong"=>"20040715191915Z", - "jssarma"=>"20090326020038Z", - "jstrachan"=>"20010428000000Z", # r216641 - "jta"=>"20040810200659Z", - "jtaylor"=>"20020212000000Z", # r223500 - "jtb"=>"20060606005411Z", - "jtirsen"=>"20060414170208Z", - "jtolentino"=>"20060411132324Z", - "juan"=>"20050821124612Z", - "juanpablo"=>"20071016014215Z", - "juergen"=>"20010104000000Z", # r202878 - "jukka"=>"20050211123355Z", - "jules"=>"20031220000000Z", # r44700 - "jumal"=>"20021008000000Z", # r205694 - "june"=>"20040715191519Z", - "jussi"=>"20080104031244Z", - "jvanzyl"=>"20000930000000Z", # r72121 - "jvazquez"=>"20070927194821Z", - "jvermillard"=>"20060719164509Z", - "jwaldman"=>"20060712200356Z", - "jwang"=>"20080516193925Z", - "jwhitlock"=>"20060719164617Z", - "jwkaltz"=>"20041113002959Z", - "jwoolley"=>"20010218000000Z", # r58109 - "jyang"=>"20031215000000Z", # r185436 - "jycli"=>"20031215005354Z", - "jzurbano"=>"20090326020100Z", - "kahatlen"=>"20060222203955Z", - "kai"=>"20090326020026Z", - "kailass"=>"20060317185535Z", - "kalle"=>"20080128212939Z", - "kamaljit"=>"20081125224444Z", - "kannan"=>"20090115183646Z", - "kaplansky"=>"20060614192539Z", - "karl"=>"20040102000000Z", # r265355 - "karlvr"=>"20021109000000Z", # r216721 - "karthick"=>"20081026004638Z", - "kaushalye"=>"20060816181344Z", - "kawai"=>"20040410000000Z", # r103324 - "kayyagari"=>"20080311172716Z", - "kaz"=>"20020216000000Z", # r222358 - "kb"=>"20080411160458Z", - "kbennett"=>"20071016014221Z", - "kclark"=>"20080516193928Z", - "kconner"=>"20061109030022Z", - "kcormier"=>"20070228034509Z", - "keiron"=>"20000711000000Z", # r193463 - "keith"=>"20000711000000Z", # r85818 - "keithc"=>"20061109030142Z", - "kellyc"=>"20001218000000Z", # r193888 - "kelvingoodson"=>"20060816181255Z", - "kelvint"=>"20020508000000Z", # r150756 - "kenc"=>"20081021155005Z", - "kenney"=>"20050729132050Z", - "kentam"=>"20040715191936Z", - "kess"=>"20020801000000Z", # r96275 - "keturn"=>"20061009210938Z", - "kevan"=>"20051204210651Z", - "kevj"=>"20051221051357Z", - "kevlar"=>"20040710010002Z", - "kfogel"=>"20001125000000Z", # r60788 - "khera"=>"19980612000000Z", # r176569 - "kidz"=>"20050523235449Z", - "kief"=>"20010213000000Z", # r283152 - "kimptoc"=>"20011126000000Z", # r182710 - "kinman"=>"20011003000000Z", # r286735 - "kip"=>"20020207000000Z", # r344511 - "kkoehler"=>"20040701000000Z", - "kkolinko"=>"20090514033357Z", - "kkress"=>"20030910101847Z", - "kkrouse"=>"20040912115126Z", - "klaas"=>"20060816181603Z", - "klease"=>"20001110000000Z", # r193761 - "klichong"=>"20081021155003Z", - "klute"=>"20020302000000Z", # r352128 - "kmalhi"=>"20070907215052Z", - "kmarsden"=>"20040922003417Z", - "kmcgrail"=>"20060222205726Z", - "kmenard"=>"20060507190724Z", - "knoaman"=>"20010212000000Z", # r172529 - "knopp"=>"20060921010716Z", - "knut"=>"20040711000000Z", # r189132 - "knvijay"=>"20040701000000Z", - "kocolosk"=>"20090306145819Z", - "kohsuke"=>"20040205000000Z", # r319755 - "koinov"=>"20040912115050Z", - "koji"=>"20080505204051Z", - "kpiroumian"=>"20020527000000Z", # r7194 - "kpvdr"=>"20060914010241Z", - "krab"=>"20060222205828Z", - "kris"=>"20040306003202Z", - "kristwaa"=>"20061109025733Z", - "kschrader"=>"20010810000000Z", # r227558 - "ksmith"=>"20070425132656Z", - "kstaken"=>"20011217000000Z", # r191981 - "kstam"=>"20061130180707Z", - "kubes"=>"20070302211150Z", - "kurdalen"=>"20070711042931Z", - "kurinchikumaran"=>"20050209150336Z", - "kward"=>"20020324000000Z", # r192047 - "kwilliams"=>"20051221165552Z", - "kwouters"=>"20040701000000Z", - "kwsutter"=>"20091218022507Z", - "kylem"=>"20040810020703Z", - "lacton"=>"20080821235448Z", - "lahiru"=>"20080212193735Z", - "lajos"=>"20060816181410Z", - "lance"=>"20050606233650Z", - "larryi"=>"20000826000000Z", # r282345 - "lars"=>"19980715000000Z", # r81745 - "laurieh"=>"20051018195925Z", - "lchasen"=>"20061004221407Z", - "ldiduck"=>"20051007054906Z", - "legassick"=>"20010926000000Z", # r220423 - "lehmi"=>"20081219185928Z", - "lehors"=>"20000106000000Z", # r315147 - "leif"=>"20020124000000Z", # r12733 - "lektran"=>"20070127223307Z", - "lenzi"=>"20060317185503Z", - "leoli"=>"20070614181820Z", - "leonardr"=>"20010815000000Z", # r147588 - "leosimons"=>"20050607175400Z", - "leosutic"=>"20020305000000Z", # r12917 - "lfrohman"=>"20060802010913Z", - "lfurini"=>"20041106092817Z", - "lgawron"=>"20041106105809Z", - "lgentis"=>"20080912205041Z", - "lhazlewood"=>"20080618181228Z", - "lhein"=>"20080221195107Z", - "liangyx"=>"20061101190647Z", - "lilantha"=>"20030708000000Z", # r249283 - "lindner"=>"20080204143436Z", - "linsun"=>"20070516012726Z", - "lischke"=>"20050104142718Z", - "liyanage"=>"20030418104123Z", - "ljones"=>"20060222202845Z", - "lkuehne"=>"20060222205841Z", - "lmandel"=>"20050428212515Z", - "lmartin"=>"20010115000000Z", # r316778 - "lmeadors"=>"20041007000211Z", - "lmorandini"=>"20080821235436Z", - "lmoroney"=>"20030910101847Z", - "lnicoara"=>"20050714205402Z", - "lofwyr"=>"20050930170220Z", - "lohit"=>"20080821235434Z", - "lresende"=>"20061115174956Z", - "lryan"=>"20080104031252Z", - "ltheussl"=>"20050906143419Z", - "ltrieloff"=>"20061019200412Z", - "lu4242"=>"20071120160909Z", - "luc"=>"20070110182347Z", - "luehe"=>"20011121000000Z", # r217559 - "luetzkendorf"=>"20040511042002Z", - "lukaszlenart"=>"20090427005115Z", - "lvjing"=>"20071016014223Z", - "lwaterman"=>"20060415113103Z", - "maarten"=>"20070808193135Z", - "maartenc"=>"20061122184732Z", - "mac"=>"20050106132226Z", - "mach"=>"20030805000000Z", # r344747 - "macsun"=>"20080908203325Z", - "maczniak"=>"20040428150649Z", - "madams"=>"20050523235424Z", - "madhum"=>"20030221000000Z", # r98747 - "mads"=>"20030103000000Z", # r98158 - "magnus"=>"20040701000000Z", - "mahadev"=>"20080516193733Z", - "makas"=>"20080731032800Z", - "malderson"=>"20070626023101Z", - "mamta"=>"20061122184629Z", - "manjula"=>"20070228034531Z", - "manoj"=>"19980721000000Z", # r81793 - "manojganesan"=>"20090427220041Z", - "manolito"=>"20041006235956Z", - "manuel"=>"20051007060009Z", - "manugeorge"=>"20070215031628Z", - "marbro"=>"20070412202948Z", - "marc"=>"19970128000000Z", # r77522 - "marcjohnson"=>"20071016014204Z", - "marck"=>"20080516193922Z", - "marco"=>"20040308000000Z", # r312325 - "marcsaeg"=>"20001221000000Z", # r282801 - "marino"=>"20031014000000Z", # r71790 - "markh"=>"20070614181645Z", - "markrmiller"=>"20080522205134Z", - "markt"=>"20031210000000Z", # r288887 - "marl"=>"20050423134732Z", - "marnie"=>"20060914010015Z", - "marrink"=>"20080321174858Z", - "marrs"=>"20060222205739Z", - "martijnh"=>"20071120160911Z", - "martin"=>"19971020000000Z", # r79412 - "martinc"=>"20010614000000Z", # r48429 - "martint"=>"20071208185458Z", - "marvin"=>"20060606005923Z", - "mas"=>"20020221000000Z", # r130545 - "masonjm"=>"20040710010250Z", - "matei"=>"20090103030624Z", - "mattbaird"=>"20020703000000Z", # r360712 - "matth"=>"20030921000000Z", # r140390 - "mattinger"=>"20040624230556Z", - "mattmann"=>"20061122185702Z", - "mattpelletier"=>"20060809040757Z", - "matts"=>"20010224000000Z", # r88302 - "mattschmidt"=>"20060222205716Z", - "matwell"=>"20060914005844Z", - "matzew"=>"20040731162509Z", - "mauro"=>"20040617000000Z", # r21365 - "max"=>"20050523235443Z", - "maxb"=>"20060222193420Z", - "maxberger"=>"20071120160913Z", - "maxime"=>"20050729132047Z", - "mazz"=>"20041205181844Z", - "mbaessler"=>"20061109025637Z", - "mbecke"=>"20030221000000Z", # r134112 - "mbenson"=>"20040216000000Z", # r276095 - "mbgl"=>"20040701000000Z", - "mblankestijn"=>"20050310111547Z", - "mbo"=>"20050314150816Z", - "mbr"=>"20050714205301Z", - "mbraden"=>"20040701000000Z", - "mbrown"=>"20080321174902Z", - "mc"=>"20050209150235Z", - "mcaisse"=>"20050318184258Z", - "mcatan"=>"20030609000000Z", # r308070 - "mcconne"=>"20070614181507Z", - "mcconnell"=>"20020202000000Z", # r12795 - "mccreedy"=>"20020309000000Z", # r93809 - "mcculls"=>"20070820141412Z", - "mcfirst"=>"20080128212935Z", - "mchampion"=>"20081125224442Z", - "mckierna"=>"20061115174810Z", - "mclark"=>"20040715191950Z", - "mcnamara"=>"20040427000000Z", # r343924 - "mcombellack"=>"20080104031205Z", - "mconcini"=>"20090427220057Z", - "mcooper"=>"20070516013104Z", - "mcslee"=>"20080516193918Z", - "mdahm"=>"20011031000000Z", # r152697 - "mdierken"=>"20000313000000Z", # r312998 - "mdiggory"=>"20030528120329Z", - "mduerig"=>"20090129135100Z", - "mdulisch"=>"20040701000000Z", - "meder"=>"20041007000113Z", - "medgar"=>"20030203000000Z", # r243246 - "meerajk"=>"20060907020344Z", - "memo"=>"20030418104123Z", - "mestrade"=>"20040701000000Z", - "metskem"=>"20080731032732Z", - "meyering"=>"20070127223222Z", - "mfreedman"=>"20080104031257Z", - "mfursov"=>"20070614181754Z", - "mgaffney"=>"20060127031527Z", - "mgamerdinger"=>"20080731032736Z", - "mgentry"=>"20060414170217Z", - "mgoulet"=>"20050607175350Z", - "mharwood"=>"20040508210930Z", - "mheath"=>"20050714205405Z", - "mholz"=>"20031229000000Z", # r206654 - "mhoyt"=>"20031229193638Z", - "michaelknunez"=>"20080908203320Z", - "michaelm"=>"20030311000000Z", # r23600 - "michal"=>"20030508000000Z", # r113414 - "michau"=>"20050821124648Z", - "michele"=>"20080411160520Z", - "michi"=>"20030418104123Z", - "midon"=>"20080606225810Z", - "mikagoeckel"=>"20060830183629Z", - "mikedd"=>"20070330211850Z", - "mikeh"=>"20020614000000Z", # r228411 - "mikem"=>"20040922003433Z", - "mikemccand"=>"20061115174932Z", - "mikus"=>"20060530190124Z", - "milan"=>"20050131104928Z", - "milinda"=>"20070228034258Z", - "minchau"=>"20030424000000Z", # r337442 - "mindbridge"=>"20020917000000Z", # r242883 - "minfrin"=>"20010310000000Z", # r88485 - "mischmitz"=>"20070907215410Z", - "mjc"=>"19960301000000Z", # r76350 - "mkalen"=>"20040710010707Z", - "mkettler"=>"20080116220738Z", - "mkg"=>"20081112232623Z", - "mkienenb"=>"20051123000000Z", # r348550 - "mkleint"=>"20060411132339Z", - "mkostrze"=>"20040323000000Z", # r324505 - "mkwan"=>"20020812000000Z", # r343688 - "mlangham"=>"20030521000000Z", # r24503 - "mlink"=>"20010308000000Z", # r321797 - "mlittle"=>"20061109030000Z", - "mloenko"=>"20060331124235Z", - "mlovett"=>"20061109025915Z", - "mmanders"=>"20010613000000Z", # r283668 - "mmao"=>"20060820232257Z", - "mmarinschek"=>"20041007000027Z", - "mmarkov"=>"20071016014237Z", - "mmartinec"=>"20070626023226Z", - "mmay"=>"20031215073708Z", - "mmerz"=>"20040826194511Z", - "mmidy"=>"20000717000000Z", # r333150 - "mnash"=>"20040701000000Z", - "mnour"=>"20070309235257Z", - "mode"=>"19991015000000Z", # r281020 - "monteith"=>"20081209195847Z", - "mor"=>"20080104031216Z", - "morciuch"=>"20020816000000Z", # r183474 - "morgand"=>"20010108000000Z", # r216474 - "morrijr"=>"20010402000000Z", # r31242 - "morten"=>"20010501000000Z", # r334666 - "moseley"=>"20020405000000Z", # r66044 - "mperham"=>"20051220201930Z", - "mpfingsthorn"=>"20050729132100Z", - "mpo"=>"20020731100947Z", - "mprudhom"=>"20060723194446Z", - "mraible"=>"20050601140947Z", - "mrakesh"=>"20070330211803Z", - "mrdon"=>"20030804000000Z", # r50897 - "mreutegg"=>"20040914192000Z", - "mrglavas"=>"20030616000000Z", # r319258 - "mrinal"=>"20090103030614Z", - "mriou"=>"20050423134745Z", - "mrisaliti"=>"20071208185504Z", - "mryan3"=>"20081015213532Z", - "mschulte"=>"20070626023035Z", - "msmith"=>"20010328000000Z", # r203188 - "mss"=>"20041105060726Z", - "mstover1"=>"20010307000000Z", # r322619 - "mszefler"=>"20060621210538Z", - "mteira"=>"20080908203316Z", - "mturk"=>"20020623000000Z", # r297569 - "mturyn"=>"20060614235952Z", - "mtylenda"=>"20090227180045Z", - "mukund"=>"20080311172701Z", - "mullan"=>"20050607175345Z", - "musachy"=>"20070215031520Z", - "muthulee"=>"20031121000000Z", # r249894 - "mvdb"=>"20020613000000Z", # r128875 - "mvescovi"=>"20061004221428Z", - "mwebb"=>"20070516012827Z", - "mwiederkehr"=>"20081209195858Z", - "mwomack"=>"20020510000000Z", # r309518 - "mxmanghi"=>"20040701000000Z", - "myoder"=>"20050714205354Z", - "myrnavl"=>"20061115174903Z", - "mzaun"=>"20050318184305Z", - "nabeel"=>"20060523135044Z", - "nachbaur"=>"20040710010400Z", - "nacho"=>"20000404000000Z", # r281731 - "nadika"=>"20030701000000Z", # r249250 - "nadinem"=>"20061122185724Z", - "nadiramra"=>"20050423134722Z", - "nagy"=>"20010628000000Z", # r262332 - "namit"=>"20090225194737Z", - "nandana"=>"20071208185500Z", - "nandika"=>"20050527162946Z", - "nash"=>"20070927194830Z", - "natalia"=>"20070711042839Z", - "nava"=>"20040701000000Z", - "nbubna"=>"20030124000000Z", # r71612 - "nchalumeau"=>"20050926174255Z", - "nd"=>"20020910000000Z", # r96729 - "ndbeyer"=>"20060606005733Z", - "nddelima"=>"20040603055538Z", - "ndlesiecki"=>"20010925000000Z", # r234852 - "ndw"=>"20020130000000Z", # r225950 - "neeme"=>"20000630000000Z", # r181493 - "neeraj"=>"20020122000000Z", # r318115 - "neilg"=>"20010119000000Z", # r316796 - "neilotoole"=>"20041211000000Z", # r131824 - "neoflux"=>"20040701000000Z", - "nettings"=>"20060921010754Z", - "ngallardo"=>"20060802010826Z", - "ngn"=>"20060107174839Z", - "nhope"=>"20061109030102Z", - "niall"=>"20050311000000Z", # r312245 - "niallp"=>"20040608000000Z", # r51577 - "nick"=>"20050609113100Z", - "nickchalko"=>"20030123000000Z", # r32880 - "nicko"=>"20040123000000Z", # r311935 - "niclas"=>"20031117000000Z", # r18181 - "nico"=>"20010125000000Z", # r268521 - "nicolaken"=>"20020312000000Z", # r352210 - "nicolas"=>"20071208185455Z", - "nigel"=>"20070228034326Z", - "nikke"=>"20071208185444Z", - "niklas"=>"20050423134754Z", - "nilgun"=>"20080718165046Z", - "nilsga"=>"20060928031650Z", - "ningjiang"=>"20060907020256Z", - "niq"=>"20040625000000Z", # r104034 - "niranjan"=>"20080212193732Z", - "nithya"=>"20041116020515Z", - "nlehuen"=>"20041218134500Z", - "nlevitt"=>"20040603055538Z", - "nlothian"=>"20040225000000Z", # r35899 - "nmaves"=>"20051007054349Z", - "nmittler"=>"20060331124245Z", - "nmukhi"=>"20020917000000Z", # r241122 - "noble"=>"20090514033355Z", - "noel"=>"20021102000000Z", # r108193 - "noelgrandin"=>"20090508011740Z", - "noirin"=>"20060112140427Z", - "noodl"=>"20070711042812Z", - "norman"=>"20060509013753Z", - "nsandhu"=>"20071127212901Z", - "nsantos"=>"20071127212905Z", - "nslater"=>"20080321174856Z", - "nsochele"=>"20020925000000Z", # r201042 - "nstein"=>"20060317185530Z", - "nthaker"=>"20061109025937Z", - "nuttycom"=>"20060816181500Z", - "nuwan"=>"20030805000000Z", # r249446 - "oalexeev"=>"20010714000000Z", # r48483 - "oberhack"=>"20040125000000Z", # r18804 - "ocastaneda"=>"20081112232559Z", - "oching"=>"20060411132322Z", - "odeakin"=>"20061101190626Z", - "oersoy"=>"20060928031738Z", - "oglueck"=>"20020919000000Z", # r133835 - "ogusakov"=>"20080618181220Z", - "oheger"=>"20041112231136Z", - "okid"=>"20080423163438Z", - "okiessler"=>"20050601141019Z", - "olamy"=>"20070907215114Z", - "olegk"=>"20030125000000Z", # r134026 - "olegnitz"=>"20021013000000Z", # r361440 - "olegt"=>"20021118000000Z", # r195557 - "olga"=>"20071025234801Z", - "oliverm"=>"20030922000000Z", # r362932 - "ollie"=>"20060123164106Z", - "olston"=>"20071025234803Z", - "omalley"=>"20060414201215Z", - "orlikowski"=>"20010116000000Z", # r87695 - "oros"=>"20030113000000Z", # r322992 - "oshani"=>"20060802010755Z", - "otis"=>"20011104000000Z", # r149625 - "ovidiu"=>"20040701000000Z", - "owenb"=>"20020606000000Z", # r240913 - "oyilmazel"=>"20080212193744Z", - "oysteing"=>"20070830223759Z", - "ozeigermann"=>"20031114000000Z", # r206491 - "painter"=>"20040423220612Z", - "pamarcelot"=>"20060928031719Z", - "paolo"=>"20080321174907Z", - "parin"=>"20050906143402Z", - "parker"=>"20040224000000Z", # r6844 - "parsonsd"=>"20081125224436Z", - "pathos"=>"20010227000000Z", # r309030 - "patrickl"=>"20011106000000Z", # r286989 - "patthoyts"=>"20040624230547Z", - "pauldick"=>"20000331000000Z", # r338415 - "paulrbrown"=>"20060415113124Z", - "pauls"=>"20060317185548Z", - "paulsp"=>"20010810000000Z", # r182537 - "pavani"=>"20040701000000Z", - "pbenedict"=>"20060719164532Z", - "pbwest"=>"20020427000000Z", # r194750 - "pcal"=>"20031017042509Z", - "pcl"=>"20050523235428Z", - "pcourcoux"=>"20040913175725Z", - "pctony"=>"20070614181728Z", - "pdodds"=>"20051209153339Z", - "pdp8"=>"20070412203150Z", - "peiyongz"=>"20010612000000Z", # r172773 - "pepper"=>"20001203000000Z", # r87159 - "pero"=>"20040908003256Z", - "perrin"=>"20040704000000Z", # r67699 - "perryan"=>"20041001000000Z", # r259308 - "peter_jones"=>"20070412203436Z", - "peterbr"=>"20020620000000Z", # r314181 - "peterjm"=>"20060317185543Z", - "peterjones"=>"20060820232110Z", - "peterreilly"=>"20030527095536Z", - "pferraro"=>"20040903190320Z", - "pfisher"=>"20040701000000Z", - "pgier"=>"20080311172718Z", - "pgoldstein"=>"20020806000000Z", # r107954 - "pgollucci"=>"20050714205313Z", - "pherweg"=>"20040101000000Z", # r197087 - "phil"=>"20070215031436Z", - "phred"=>"20060802010958Z", - "phunsberger"=>"20060802010625Z", - "phunt"=>"20080522205114Z", - "pier"=>"19991017000000Z", # r52569 - "pierred"=>"20000811000000Z", # r284949 - "pietsch"=>"20020529000000Z", # r194844 - "pini"=>"20060331142656Z", - "piotrp"=>"20021110000000Z", # r241238 - "pisong"=>"20080522205130Z", - "pjaol"=>"20090115183650Z", - "pjones"=>"20081021154959Z", - "pkoch"=>"20070920152357Z", - "pkosiorowski"=>"20050714205408Z", - "pkosuru"=>"20060415112459Z", - "pkriens"=>"20080411160510Z", - "pledbrook"=>"20080618181223Z", - "pleff"=>"20050930170203Z", - "plightbo"=>"20060123163701Z", - "plynch"=>"20020624000000Z", # r118039 - "pmahoney"=>"20070614181435Z", - "pmalik"=>"20090115183643Z", - "pmcmahan"=>"20060820231908Z", - "pmd"=>"20070201025932Z", - "pnever"=>"20020216000000Z", # r204150 - "polx"=>"20031225000000Z", # r135913 - "ppakulski"=>"20070110182541Z", - "ppiegaze"=>"20040914191951Z", - "ppoddar"=>"20060723194359Z", - "pquerna"=>"20040710010445Z", - "prabalig"=>"20071208185449Z", - "pradeepkth"=>"20090115183632Z", - "pradine"=>"20060914005758Z", - "prasad"=>"20061019200611Z", - "prasadc"=>"20090225194739Z", - "prebriy"=>"20080522205128Z", - "prestonf"=>"20040902163734Z", - "prickett"=>"20020212000000Z", # r146787 - "prophecy"=>"20020619000000Z", # r360634 - "proyal"=>"20020424000000Z", # r13448 - "prussell"=>"20040923000000Z", # r47124 - "pschneider"=>"20070412203612Z", - "pshah"=>"20060317185410Z", - "psmith"=>"20030428000000Z", # r311528 - "psteitz"=>"20030820000000Z", # r137636 - "ptahchiev"=>"20070412202842Z", - "pvillacorta"=>"20051209152934Z", - "pyang"=>"20060717003219Z", - "pzf"=>"20051013000000Z", # r320784 - "qiuxx"=>"20040701000000Z", - "quellhorst"=>"20060830183946Z", - "quinlan"=>"20020515000000Z", # r2382 - "quintonm"=>"20030103000000Z", # r220837 - "radup"=>"20040912115110Z", - "rafal"=>"20040701000000Z", - "rafale"=>"20070711043029Z", - "ragaller"=>"20070920152403Z", - "raghu"=>"20030201000000Z", # r361961 - "rahul"=>"20050714205319Z", - "rahulj"=>"19991110000000Z", # r171396 - "rahuls"=>"20011127000000Z", # r317944 - "rajdavies"=>"20051209152026Z", - "rajith"=>"20060802010729Z", - "ramani"=>"20080104031240Z", - "rami"=>"20041106092403Z", - "ramirjf"=>"20070412203214Z", - "ramkumar"=>"20081021154957Z", - "rana_b"=>"20030427000000Z", # r306665 - "randy"=>"19960721000000Z", # r76654 - "rangadi"=>"20071212024006Z", - "rangika"=>"20041116020515Z", - "raphael"=>"20010326000000Z", # r182200 - "raul"=>"20040731162546Z", - "rayb"=>"20070228034354Z", - "rbb"=>"19990817000000Z", # r59151 - "rbowen"=>"20000912000000Z", # r86205 - "rdecampo"=>"20030830000000Z", # r311902 - "rdonkin"=>"20010328000000Z", # r168913 - "rebarraz"=>"20081026004632Z", - "recordond"=>"20060820231834Z", - "rederpj"=>"20010320000000Z", # r88541 - "regisxu"=>"20090326020000Z", - "reiher"=>"20080731032738Z", - "reinhard"=>"20030630000000Z", # r24840 - "remm"=>"20000509000000Z", # r202568 - "renaud"=>"20061109030044Z", - "reschke"=>"20060914005728Z", - "resendes"=>"20070412203335Z", - "rfeng"=>"20040701000000Z", - "rfrovarp"=>"20070528024813Z", - "rgardler"=>"20040102141249Z", - "rgielen"=>"20060222220600Z", - "rgodfrey"=>"20070127223159Z", - "rgoers"=>"20041107014751Z", - "rgrabowski"=>"20050611164835Z", - "rgraham"=>"20050729132103Z", - "rgreig"=>"20060914005931Z", - "rhillegas"=>"20060127031530Z", - "rhoegg"=>"20030124000000Z", # r233834 - "rhs"=>"20060914010056Z", - "rian"=>"20040701000000Z", - "ricardo"=>"20031123000000Z", # r26501 - "riccole"=>"20081209195851Z", - "rich"=>"20040715192005Z", - "richdougherty"=>"20080821235444Z", - "richter"=>"19980714000000Z", # r293613 - "rici"=>"20050601140958Z", - "rick"=>"20041106093413Z", - "rickhall"=>"20050807205111Z", - "rickmcguire"=>"20060415112822Z", - "ridabenjelloun"=>"20070412202816Z", - "ridruejo"=>"20000229000000Z", # r84684 - "rineholt"=>"20011106000000Z", # r245677 - "rinku"=>"20061210023302Z", - "ritchiem"=>"20060914010037Z", - "rittmey"=>"20030423000000Z", # r323184 - "rjan"=>"20080221195111Z", - "rjmann"=>"20070425132847Z", - "rjung"=>"20060507190751Z", - "rkellogg"=>"20030628000000Z", # r263182 - "rleland"=>"20010307000000Z", # r48210 - "rlewisshell"=>"20011203000000Z", # r242332 - "rlubke"=>"20011212000000Z", # r230106 - "rmenschel"=>"20050729132106Z", - "rmonson"=>"20040701000000Z", - "rmurthy"=>"20090326020057Z", - "robbie"=>"20090225194745Z", - "robbinspg"=>"20051221165549Z", - "robertdzeigler"=>"20081209195842Z", - "robertlazarski"=>"20060317185428Z", - "roberto"=>"20050226162706Z", - "robinsona"=>"20070215031606Z", - "robweir"=>"19991218000000Z", # r338273 - "robyates"=>"20060712200429Z", - "rogerrut"=>"20040208225139Z", - "roku"=>"20040209000000Z", # r42326 - "rolandw"=>"20060326214124Z", - "romkal"=>"20080116220746Z", - "ronald"=>"19990411000000Z", # r83048 - "ronnie"=>"20011228000000Z", # r322134 - "rony"=>"20050504191751Z", - "rooneg"=>"20041205000000Z", # r109910 - "roshan"=>"20030625000000Z", # r249173 - "rossb"=>"20040701000000Z", - "rossd"=>"20060317185402Z", - "rotan"=>"20040715192021Z", - "rott"=>"20070215031542Z", - "roughley"=>"20060317185548Z", - "roxspring"=>"20020828000000Z", # r127404 - "rpalepu"=>"20060123192602Z", - "rpenoyer"=>"20031114060215Z", - "rpluem"=>"20051001181433Z", - "rr"=>"20061019200309Z", - "rrhodes"=>"20040809205403Z", - "rsaba"=>"20051209153116Z", - "rscheifler"=>"20070412203308Z", - "rscott"=>"20060928031800Z", - "rse"=>"19970713000000Z", # r78602 - "rsfeir"=>"20040713224614Z", - "rsitze"=>"20020222000000Z", # r246479 - "rsivaram"=>"20080116220748Z", - "rubys"=>"19991208000000Z", # r281267 - "ruchith"=>"20050209150317Z", - "ruchithf"=>"20050602161830Z", - "rudolf"=>"20090225194721Z", - "runping"=>"20071212024017Z", - "rupertlssmith"=>"20070425132555Z", - "ruppert"=>"20070302211209Z", - "ruwan"=>"20061115175047Z", - "rwaldhoff"=>"20010406000000Z", # r148227 - "rwatler"=>"20041218134623Z", - "rwinston"=>"20040602072758Z", - "rwyles"=>"20090311132334Z", - "ryan"=>"20070425132945Z", - "ryman"=>"20050428213343Z", - "sabob"=>"20080731032753Z", - "sackley"=>"20020407000000Z", # r352350 - "sahan"=>"20060123192608Z", - "sai"=>"20090326020019Z", - "sameer"=>"19961126000000Z", # r77046 - "saminda"=>"20050906143424Z", - "samisa"=>"20040426193017Z", - "samjoyce"=>"20060914010325Z", - "sandakith"=>"20061109030201Z", - "sanders"=>"20010413000000Z", # r143386 - "sandygao"=>"20010605000000Z", # r317206 - "sandymac"=>"20060226160453Z", - "sanjaya"=>"20030623000000Z", # r249159 - "sanjayak"=>"20071127214732Z", - "sanjiva"=>"20000615000000Z", # r261930 - "sanka"=>"20050527162933Z", - "santiagopg"=>"20020402000000Z", # r336212 - "santillan"=>"20060802011053Z", - "saram"=>"20090115183636Z", - "sascha"=>"19991229000000Z", # r59556 - "satheesh"=>"20040914234121Z", - "saua"=>"20020627000000Z", # r360675 - "sbailliez"=>"20010731000000Z", # r269411 - "sberlin"=>"20080606225812Z", - "sboag"=>"19991109000000Z", # r333118 - "sboden"=>"20051007052516Z", - "sboehme"=>"20050601141014Z", - "sboyd"=>"20060614235844Z", - "sbrewin"=>"20031205054419Z", - "scamp"=>"20041116020503Z", - "scantor"=>"20070425132916Z", - "sccomer"=>"20081026004623Z", - "schallm"=>"20081015213516Z", - "schemers"=>"20060317185406Z", - "schepers"=>"20060615000013Z", - "scheu"=>"20011106000000Z", # r245669 - "schof"=>"20090803183856Z", - "schor"=>"20061109025755Z", - "schultz"=>"20080221195125Z", - "scohen"=>"20030228000000Z", # r139352 - "scolebourne"=>"20020620000000Z", # r146100 - "scotsmatrix"=>"20061122184706Z", - "scottganyo"=>"20010925000000Z", # r149592 - "scottkurz"=>"20080618181216Z", - "scottryan"=>"20040715192035Z", - "sctemme"=>"20020819000000Z", # r96447 - "sdeboy"=>"20030428000000Z", # r311527 - "seade"=>"20030107000000Z", # r322961 - "seanahn"=>"20090115183654Z", - "seanoc"=>"20060820232317Z", - "sebor"=>"20050714205332Z", - "sebb"=>"20030923000000Z", # LDAP record was recreated in 2011; date is the earliest commit I could find - "seelmann"=>"20061221220407Z", - "seguin"=>"20010512000000Z", # r295282 - "senaka"=>"20080128212940Z", - "serge"=>"19990709000000Z", # r107023 - "sergey"=>"20060112145526Z", - "sergeyb"=>"20040701000000Z", - "sethcall"=>"20081026004634Z", - "sfermigier"=>"20090508011749Z", - "sfrenot"=>"20060705155006Z", - "sgala"=>"20000829000000Z", # r181686 - "sgoeschl"=>"20041205181824Z", - "sgoldstein"=>"20040710010526Z", - "sgoyal"=>"20081112232644Z", - "shade"=>"20090129135057Z", - "shalin"=>"20080718165056Z", - "shankar"=>"20071208185451Z", - "shannon"=>"20020530000000Z", # r314129 - "shanti"=>"20081015213530Z", - "sharad"=>"20090326020051Z", - "sharathreddy"=>"20060606005503Z", - "shash"=>"20040624230551Z", - "shawn"=>"20000825000000Z", # r216697 - "sheetal"=>"20081015213523Z", - "shemnon"=>"20000112000000Z", # r229886 - "shesmer"=>"20010308000000Z", # r182158 - "shinobu"=>"20060830183813Z", - "shinsuke"=>"20040903190336Z", - "shivahr"=>"20070907215313Z", - "shuber"=>"20051102142419Z", - "shuston"=>"20080908203314Z", - "shv"=>"20071212024015Z", - "sichen"=>"20060326214126Z", - "sidler"=>"20020109000000Z", # r71548 - "sidney"=>"20040317000000Z", # r9570 - "simon"=>"20040701000000Z", - "simoneg"=>"20060411135656Z", - "simonw"=>"20060921010817Z", - "simuvid"=>"20090211221707Z", - "siren"=>"20050201133129Z", - "sisbell"=>"20061210023334Z", - "sjanuary"=>"20080128212933Z", - "sjlee"=>"20080311172723Z", - "sjur"=>"20061109025853Z", - "sk"=>"20040701000000Z", - "skestle"=>"20070516012756Z", - "skim"=>"20060723194505Z", - "skitching"=>"20040216000000Z", # r132561 - "slacoin"=>"20090508011747Z", - "slaubach"=>"20021004000000Z", # r352877 - "slava"=>"20050425190856Z", - "slaws"=>"20070127223106Z", - "slessard"=>"20060830184053Z", - "slive"=>"20000909000000Z", # r86182 - "smartini"=>"20090306145828Z", - "smilek"=>"20060802011029Z", - "smishura"=>"20060331124237Z", - "smor"=>"20020708000000Z", # r118333 - "smorgrav"=>"20060331142658Z", - "sms"=>"20090115183639Z", - "snichol"=>"20020617000000Z", # r262431 - "snicoll"=>"20050821124651Z", - "snimalan"=>"20040429000000Z", # r224729 - "snoopdave"=>"20050601141003Z", - "sobryan"=>"20070718014621Z", - "soc-xzw"=>"20050714205323Z", - "soldis"=>"20030706000000Z", # r100466 - "solprovider"=>"20051125184609Z", - "spepping"=>"20040527000000Z", # r197644 - "spinder"=>"20051023073133Z", - "spoole"=>"20081219185917Z", - "sppatel"=>"20050913005324Z", - "sradia"=>"20090326020055Z", - "sraeburn"=>"20030708000000Z", # r50735 - "srowen"=>"20080411160526Z", - "ssegu"=>"20061221220236Z", - "ssilvert"=>"20090803183856Z", - "stack"=>"20070626023418Z", - "stan"=>"20090514033346Z", - "stas"=>"20010326000000Z", # r68191 - "stefan"=>"20030315000000Z", # r205898 - "stefano"=>"19980903000000Z", # r322534 - "stellagjj"=>"20080423163436Z", - "stephan"=>"19990622000000Z", # r168698 - "stephenh"=>"20020725000000Z", # r228486 - "sterling"=>"20030422125008Z", - "steshaw"=>"20060914010138Z", - "steveh"=>"20040716184227Z", - "stevehay"=>"20070425132751Z", - "stevel"=>"20010927000000Z", # r269728 - "stevencaswell"=>"20020726000000Z", # r136949 - "stevendolg"=>"20080821235438Z", - "stevenn"=>"20020226000000Z", # r7073 - "sthepper"=>"20031002122646Z", - "stocco"=>"20040715192050Z", - "stoddard"=>"19980803000000Z", # r81851 - "striker"=>"20010630000000Z", # r61831 - "stroucki"=>"20081015213534Z", - "struberg"=>"20090826034703Z", - "suguri"=>"20050103161355Z", - "sullis"=>"20020621000000Z", # r133690 - "sumedha"=>"20070425132626Z", - "supun"=>"20070228034220Z", - "suresht"=>"20060606005156Z", - "susantha"=>"20030625000000Z", # r249164 - "susie"=>"20040701000000Z", - "sussman"=>"20001116000000Z", # r65374 - "sviens"=>"20031109000000Z", # r262614 - "svieujot"=>"20041007000042Z", - "svkrish"=>"20060921010836Z", - "syedrikov"=>"20060914010410Z", - "sylvain"=>"20030309000000Z", # r23570 - "szetszwo"=>"20080821235432Z", - "szoerner"=>"20050930161308Z", - "tabish"=>"20060914005243Z", - "takashi"=>"20080505204033Z", - "takezoe"=>"20080731032755Z", - "taton"=>"20070907215029Z", - "taylor"=>"20001203000000Z", # r181826 - "tbennett"=>"20040224000000Z", # r19081 - "tcopeland"=>"20020226000000Z", # r116482 - "tcunning"=>"20080516193931Z", - "tcurdt"=>"20030311000000Z", # r23609 - "tdawson"=>"20010613000000Z", # r216646 - "tdonovan"=>"20080522205109Z", - "tdunning"=>"20080505204053Z", - "tedst"=>"20080221195129Z", - "tejeswar"=>"20060914010432Z", - "tekgrrl"=>"20090508011742Z", - "tellison"=>"20051211223144Z", - "termie"=>"20080104031218Z", - "tfischer"=>"20041205181744Z", - "thads"=>"20030228000000Z", # r323095 - "theory"=>"20040707195730Z", - "thepish"=>"20040701000000Z", - "thiagohp"=>"20090225194723Z", - "thies"=>"20040701000000Z", - "thilina"=>"20050523235438Z", - "thma"=>"20020620000000Z", # r360645 - "thobbs"=>"20090427220038Z", - "thomanie"=>"20080411160522Z", - "thomasm"=>"20070820141245Z", - "thommay"=>"20020623000000Z", # r63517 - "thorhauer"=>"20011017000000Z", # r220468 - "thorpe"=>"20081112232629Z", - "thorsten"=>"20030418104123Z", - "thrantal"=>"20080505204044Z", - "tijs"=>"20070110182516Z", - "tim"=>"20031208222818Z", - "tjones"=>"20040308214236Z", - "tkirby"=>"20080618181218Z", - "tkormann"=>"20001013000000Z", # r198797 - "tli"=>"20060820232130Z", - "tmjee"=>"20060331133434Z", - "tmnk"=>"20050617132328Z", - "tng"=>"20001206000000Z", # r172471 - "toback"=>"20060317185524Z", - "tobrien"=>"20030203000000Z", # r143548 - "tomasr"=>"20070425132724Z", - "tomdz"=>"20031215000000Z", # r363172 - "tomeks"=>"20070528025038Z", - "tomj"=>"20010905000000Z", # r245267 - "tomsp"=>"20041007000011Z", - "tomwhite"=>"20070215031651Z", - "tongfin"=>"20081118230924Z", - "tony"=>"20030922000000Z", # r25791 - "tonywu"=>"20070614181951Z", - "tore"=>"20010416000000Z", # r194212 - "torehalset"=>"20060414170212Z", - "torsten"=>"20080606225805Z", - "toshi"=>"20030807000000Z", # r263186 - "tpeng"=>"20080423163426Z", - "trawick"=>"20000322000000Z", # r59731 - "treilly"=>"20040404133124Z", - "tripod"=>"20040914192007Z", - "tross"=>"20080516193936Z", - "trotter"=>"20060907020434Z", - "truk"=>"20040130000000Z", # r299128 - "trustin"=>"20041007000302Z", - "trygvis"=>"20040505000000Z", # r122258 - "tschlabach"=>"20041207000000Z", # r110104 - "tschneider"=>"20070215031459Z", - "tsvetelin"=>"20031024000000Z", # r243620 - "tterm"=>"20070323184859Z", - "ttriemstra"=>"20050714205348Z", - "turner"=>"20020919000000Z", # r139843 - "tv"=>"20051121000000Z", # r345880 - "tveil"=>"20080618181227Z", - "tvolkert"=>"20090225194731Z", - "tw"=>"20061019200329Z", - "twgoetz"=>"20061019200454Z", - "twilliams"=>"20050716171454Z", - "twl"=>"19991109000000Z", # r171387 - "ugo"=>"20030803022443Z", - "ukuester"=>"20051023072708Z", - "ulbricht"=>"20060712200311Z", - "ulhasbhole"=>"20060820231931Z", - "umagesh"=>"20011120000000Z", # r269965 - "uncled"=>"20040914191942Z", - "unico"=>"20031021194938Z", - "unrealjiang"=>"20060820232032Z", - "upayavira"=>"20030604000000Z", # r24625 - "upul"=>"20071120160908Z", - "uschindler"=>"20081219185921Z", - "utkarsh"=>"20071025234806Z", - "vajda"=>"20050423134802Z", - "vamsic007"=>"20061019200542Z", - "vanto"=>"20070718014732Z", - "varlax"=>"20061109025834Z", - "vborja"=>"20080212193741Z", - "vdichev"=>"20081219185926Z", - "vdkoogh"=>"20020828000000Z", # r350530 - "veithen"=>"20080221195113Z", - "venkat"=>"20041220233434Z", - "venu"=>"20030908000000Z", # r319383 - "vgoenka"=>"20060606004513Z", - "vgritsenko"=>"20020531000000Z", # r314137 - "vhardy"=>"20001011000000Z", # r198788 - "vhennebert"=>"20061019200350Z", - "vidyanand"=>"20021122000000Z", # r248628 - "viet"=>"20080128212947Z", - "vikas"=>"20051017072315Z", - "villard"=>"20030303000000Z", # r337306 - "vinayc"=>"20020628000000Z", # r13996 - "vincenzo"=>"20030618000000Z", # r108810 - "vinh"=>"20080618181212Z", - "vinod"=>"20070412203240Z", - "vinoski"=>"20060914010302Z", - "vishal"=>"20040405115500Z", - "vitek"=>"20080104031259Z", - "vk"=>"20041007000245Z", - "vkumar"=>"20080128212928Z", - "vladimir"=>"20021023000000Z", # r192182 - "vmassol"=>"20010318000000Z", # r48235 - "vmasutin"=>"20071120160916Z", - "vmote"=>"20021127000000Z", # r195640 - "vmz"=>"20080128212942Z", - "vnarayanan"=>"20080423163424Z", - "vouk"=>"20081112232625Z", - "vramdal"=>"20090406194959Z", - "vsalvato"=>"20040715192103Z", - "vsiveton"=>"20050607175355Z", - "vtence"=>"20040212113207Z", - "vtpavan"=>"20031125000000Z", # r249928 - "waldo"=>"20070412203019Z", - "walkerr"=>"20060123192604Z", - "wam"=>"20020214000000Z", # r204139 - "wassa"=>"20050428212542Z", - "wave"=>"20080321174910Z", - "wburrows"=>"20041204021650Z", - "wcloeten"=>"20001128000000Z", # r262039 - "weaver"=>"20030320000000Z", # r183929 - "weber"=>"20050930170213Z", - "werken"=>"20001101000000Z", # r72535 - "werner"=>"20040224000000Z", # r240571 - "werpu"=>"20050926174233Z", - "wesmckean"=>"20031114060145Z", - "wesw"=>"20080204143433Z", - "wglass"=>"20050103161337Z", - "whitlock"=>"20020610000000Z", # r240926 - "whoschek"=>"20050821191650Z", - "wire"=>"20041205181835Z", - "wisneskid"=>"20061221220323Z", - "wjaniszewski"=>"20080731032805Z", - "wjwashburn"=>"20060705155033Z", - "wombachera"=>"20041205181805Z", - "woodroy"=>"20070830223703Z", - "woolfel"=>"20030819013017Z", - "woonsan"=>"20070808193040Z", - "wrowe"=>"20000428000000Z", # r59974 - "wsanchez"=>"19990427000000Z", # r83120 - "wsmoak"=>"20050714205309Z", - "wsobel"=>"20081015213519Z", - "wtam"=>"20081125224434Z", - "wtan"=>"20060830183555Z", - "wypoon"=>"20081118230920Z", - "xavier"=>"20061109025705Z", - "xiping"=>"20090415173938Z", - "xli"=>"20070307012624Z", - "xuhaihong"=>"20090306145822Z", - "yackley"=>"20040512000000Z", # r10597 - "yana"=>"20051007055710Z", - "yegor"=>"20070127223330Z", - "yhemanth"=>"20080321174850Z", - "ymikulski"=>"20040701000000Z", - "yoavs"=>"20030607000000Z", # r301931 - "yonghoha"=>"20080623210608Z", - "yonik"=>"20051025235930Z", - "yoonjoosun"=>"20080623210613Z", - "yoshiki"=>"20010111000000Z", # r87651 - "ypark"=>"20081026004636Z", - "ytalwar"=>"20050125130402Z", - "yunfengma"=>"20080718165055Z", - "zhangfan"=>"20080423163431Z", - "zhanghuangzhu"=>"20070614181850Z", - "zhen"=>"20080104031242Z", - "zheng"=>"20051007060353Z", - "zieg"=>"20030910101847Z", - "zongaro"=>"20020729000000Z", # r336600 - "zshao"=>"20080731032747Z" + 'aadamchik'=>'20060414170210Z', + 'aaf'=>'20080522205123Z', + 'aaron'=>'20010718000000Z', # r89589 + 'ab'=>'20050201133057Z', + 'abey'=>'20031006000000Z', # r218753 + 'ablack'=>'20061019200520Z', + 'abrookes'=>'20050714205335Z', + 'abrown'=>'20061101190806Z', + 'achou'=>'20040701000000Z', + 'aclute'=>'20050423134740Z', + 'acmurthy'=>'20070830223529Z', + 'aco'=>'20051209152936Z', + 'acoliver'=>'20020126000000Z', # r149646 + 'aconway'=>'20060914005910Z', + 'acumiskey'=>'20071025234756Z', + 'acutright'=>'20031208000000Z', # r262623 + 'acymbalak'=>'20080908203334Z', + 'adasilva'=>'20040701000000Z', + 'adc'=>'20030927000000Z', # r44305 + 'adelmelle'=>'20040404000000Z', # r197491 + 'adisakala'=>'20060222205824Z', + 'aditya'=>'20080516193920Z', + 'aditzel'=>'20080618181225Z', + 'adrian'=>'20030612000000Z', # r134233 + 'adrianc'=>'20070614181327Z', + 'adrianocrestani'=>'20070412203543Z', + 'aeberbac'=>'20060802010849Z', + 'aevers'=>'20021021000000Z', # r233816 + 'afester'=>'20051111103039Z', + 'aford'=>'20080606225801Z', + 'agariboldi'=>'20090427005113Z', + 'agazzarini'=>'20090103030619Z', + 'agilliland'=>'20050601140952Z', + 'agrove'=>'20070626023007Z', + 'aheritier'=>'20040424000000Z', # r115038 + 'ahj'=>'20060222205855Z', + 'ahochsteger'=>'20060914005820Z', + 'ahuegen'=>'20050714205249Z', + 'aidan'=>'20080104031302Z', + 'aivanov'=>'20070626023446Z', + 'ajack'=>'20030829000000Z', # r33679 + 'ajaquith'=>'20071016014231Z', + 'ajaypaibir'=>'20060820232336Z', + 'ajborley'=>'20060816181438Z', + 'ajindal'=>'20050714205359Z', + 'ajith'=>'20041205181755Z', + 'akara'=>'20081021155001Z', + 'akarasulu'=>'20021113000000Z', # r141 + 'ake'=>'20000217000000Z', # r84640 + 'akornev'=>'20080522205115Z', + 'akosut'=>'19960229000000Z', # r76327 + 'akpetteroe'=>'20090211221711Z', + 'aku'=>'20041219125317Z', + 'akulshreshtha'=>'20060928031838Z', + 'alakshman'=>'20090117072257Z', + 'alally'=>'20061109025815Z', + 'alex'=>'20000623000000Z', # r282044 + 'alexanderbell'=>'20090427220055Z', + 'alexeys'=>'20050428212601Z', + 'alexkli'=>'20080516193737Z', + 'alexmc'=>'20040701000000Z', + 'alf'=>'20070626023539Z', + 'allee8285'=>'20070927194833Z', + 'almaw'=>'20061101190540Z', + 'altheim'=>'20040701000000Z', + 'alvaro'=>'20070711043000Z', + 'amamment'=>'20031211000000Z', # r131426 + 'amaniatis'=>'20070228034445Z', + 'amassari'=>'20031020000000Z', # r175297 + 'amattheu'=>'20030211000000Z', # r350609 + 'amichalec'=>'20090225194726Z', + 'amila'=>'20040701000000Z', + 'amilas'=>'20061109030122Z', + 'amiro'=>'20010514000000Z', # r334738 + 'amita'=>'20071016014233Z', + 'ammulder'=>'20030927000000Z', # r44304 + 'amol'=>'20050617132342Z', + 'amyroh'=>'20010321000000Z', # r285745 + 'anathaniel'=>'20050423134751Z', + 'anders'=>'20010126000000Z', # r308979 + 'andi'=>'20040701000000Z', + 'andreas'=>'20030418104123Z', + 'andreask'=>'20060606005110Z', + 'andreasmyth'=>'20060820232356Z', + 'andrey'=>'20080926181646Z', + 'andya'=>'20010613000000Z', # r295442 + 'andyc'=>'19991111000000Z', # r315091 + 'andydale'=>'20060809040855Z', + 'andydoerr'=>'20040412000000Z', # r265383 + 'andyh'=>'19991117000000Z', # r313298 + 'andyhot'=>'20040701000000Z', + 'andyj'=>'20070927194835Z', + 'andypiper'=>'20060222205818Z', + 'andys'=>'20070718014553Z', + 'angela'=>'20051102142634Z', + 'anil'=>'20040528000000Z', # r262801 + 'ankitp'=>'20041109110725Z', + 'anou_mana'=>'20040115000000Z', # r262637 + 'antelder'=>'20020607000000Z', # r240915 + 'antoine'=>'20030415122337Z', + 'antollinim'=>'20080516193934Z', + 'antonio'=>'20030921000000Z', # r25787 + 'antonp'=>'20091114191449Z', + 'apaliwal'=>'20090103030617Z', + 'apatel'=>'20070516012936Z', + 'apavlenko'=>'20071016014225Z', + 'apetrelli'=>'20060719164553Z', + 'apetrenko'=>'20061019200247Z', + 'apien'=>'20060615000123Z', + 'apopescu'=>'20060112140508Z', + 'aprime'=>'20081219185919Z', + 'apurtell'=>'20080912205046Z', + 'aramirez'=>'20051118021756Z', + 'archie'=>'20051102142726Z', + 'ard'=>'20060907020414Z', + 'areggiori'=>'20070215031415Z', + 'arje'=>'20051023072400Z', + 'arkurth'=>'20081112232615Z', + 'arminw'=>'20020718000000Z', # r360800 + 'arnaudsimon'=>'20070614181541Z', + 'arnesond'=>'20061004221242Z', + 'arnout'=>'20000206000000Z', # r267584 + 'arobinson74'=>'20070614181609Z', + 'aroush'=>'20050319182208Z', + 'arron'=>'20020118000000Z', # r48821 + 'artw'=>'20010424000000Z', # r194223 + 'aruny'=>'20030508000000Z', # r337455 + 'asanka'=>'20080908203328Z', + 'asankha'=>'20060519190836Z', + 'asavory'=>'20030327000000Z', # r23924 + 'ashah'=>'20060914010118Z', + 'ashapochka'=>'20071120160902Z', + 'ashish'=>'20071212024022Z', + 'ashutosh'=>'20050602161841Z', + 'ask'=>'19980616000000Z', # r176588 + 'aslom'=>'20021014000000Z', # r241166 + 'asmuts'=>'20020115000000Z', # r223361 + 'asrabkin'=>'20090225194741Z', + 'assaf'=>'20060415113003Z', + 'asteinmetz'=>'20050823011043Z', + 'astitcher'=>'20070127223244Z', + 'atagunov'=>'20030608000000Z', # r17278 + 'ate'=>'20040517195746Z', + 'athusoo'=>'20090115183641Z', + 'auriemma'=>'20000824000000Z', # r338905 + 'autarch'=>'20060630183256Z', + 'avar'=>'20030122000000Z', # r248846 + 'avik'=>'20020502000000Z', # r352583 + 'avk'=>'20081015213521Z', + 'awhite'=>'20060723194523Z', + 'awiner'=>'20060414014034Z', + 'awm'=>'20040701000000Z', + 'ayza'=>'20061101190740Z', + 'azeez'=>'20060130181048Z', + 'azoppello'=>'20090211221705Z', + 'baerrach'=>'20070117181927Z', + 'bago'=>'20050729132057Z', + 'bakert'=>'20080116220741Z', + 'bakksjo'=>'20050729132052Z', + 'baku'=>'20070215031710Z', + 'bandaram'=>'20040922003345Z', + 'baranda'=>'20050714205238Z', + 'barrettj'=>'20060920221842Z', + 'barries'=>'20020415000000Z', # r344565 + 'baserose'=>'20020620000000Z', # r360638 + 'baudyjy'=>'20040319000000Z', # r250449 + 'bayard'=>'20010824000000Z', # r147608 + 'bayer'=>'20031112000000Z', # r249856 + 'bbuffone'=>'20060615000204Z', + 'bcholmes'=>'20001121000000Z', # r202737 + 'bckfnn'=>'20040120000000Z', # r197227 + 'bcm'=>'20051118021749Z', + 'bdaniel'=>'20060907020453Z', + 'bdelacretaz'=>'20021031000000Z', # r195395 + 'bdotte'=>'20040701000000Z', + 'bdruth'=>'20040701000000Z', + 'bdube'=>'20070528024532Z', + 'bdudney'=>'20040809205337Z', + 'beaton'=>'20080606225814Z', + 'beckerdo'=>'20080908203322Z', + 'behl'=>'20040701000000Z', + 'bella'=>'20010613000000Z', # r199977 + 'bellingard'=>'20060411132333Z', + 'ben'=>'19960222000000Z', # r76321 + 'bentmann'=>'20080311172718Z', + 'berkes'=>'20050821124653Z', + 'berndf'=>'20060509013805Z', + 'bernt'=>'20050714205327Z', + 'bert'=>'20020607000000Z', # r7243 + 'bflood'=>'20060415113155Z', + 'bhakti'=>'20040220000000Z', # r337895 + 'bharath'=>'20080311172720Z', + 'bhuemer'=>'20080128212946Z', + 'bhupendrab'=>'20061004221216Z', + 'bhusted'=>'20051025235948Z', + 'bhyde'=>'19980625000000Z', # r81607 + 'bibryam'=>'20071208185502Z', + 'bigdog'=>'20040817000000Z', # r43243 + 'billa'=>'20060123162359Z', + 'billbarker'=>'20011002000000Z', # r284236 + 'billsch'=>'20001130000000Z', # r172469 + 'bimargulies'=>'20071016014210Z', + 'binujohn'=>'20081209195854Z', + 'bip'=>'20010426000000Z', # r285929 + 'bjh'=>'19990322000000Z', # r82973 + 'bjohnson'=>'20070830223732Z', + 'bjorn'=>'20071208185447Z', + 'bjreed'=>'20080908203337Z', + 'blanco'=>'20050604130912Z', + 'blautenb'=>'20030202000000Z', # r350605 + 'blin'=>'20060820232152Z', + 'blitchfield'=>'20080221195115Z', + 'bloritsch'=>'20010307000000Z', # r10839 + 'bluesvm'=>'20080623210603Z', + 'blumm'=>'20031002122646Z', + 'bmbouter'=>'20081112232617Z', + 'bmclaugh'=>'19991215000000Z', # r168817 + 'bmesser'=>'20041106095749Z', + 'bmitchell'=>'20080128212931Z', + 'bnicholes'=>'20010330000000Z', # r88615 + 'bnoll'=>'20061221220300Z', + 'bobh'=>'20020814000000Z', # r297739 + 'bobharner'=>'20070528024843Z', + 'bodewig'=>'20000623000000Z', # r267686 + 'boisvert'=>'20060415112917Z', + 'bojan'=>'20010925000000Z', # r284207 + 'bommel'=>'20050930170207Z', + 'bond'=>'20080731032735Z', + 'borisk'=>'20070920152354Z', + 'bpendleton'=>'20060222203934Z', + 'bpontarelli'=>'20071016022944Z', + 'brad'=>'20031209155429Z', + 'brane'=>'20001128000000Z', # r60805 + 'bravi'=>'20060415112623Z', + 'brazil'=>'20050926174215Z', + 'breed'=>'20071025234805Z', + 'brekke'=>'20010819000000Z', # r227631 + 'brentworden'=>'20031114065614Z', + 'brett'=>'20030818000000Z', # r112157 + 'brianb'=>'20040704000000Z', # r53612 + 'brianellin'=>'20060809040828Z', + 'brianf'=>'20060328062002Z', + 'briangoetz'=>'20011101000000Z', # r149616 + 'brianm'=>'20030914000000Z', # r362912 + 'brianp'=>'20011120000000Z', # r92046 + 'brindy'=>'20090225194735Z', + 'brj'=>'20020617000000Z', # r360614 + 'brondsem'=>'20031118100545Z', + 'bruce'=>'20020702000000Z', # r273052 + 'brudav'=>'20030422150815Z', + 'bruno'=>'20030310000000Z', # r23575 + 'brushed'=>'20071016014219Z', + 'bryanche'=>'20050306155049Z', + 'bryanduxbury'=>'20080212193739Z', + 'bs'=>'20090514033350Z', + 'bsnyder'=>'20030811011316Z', + 'bspeakmon'=>'20070528024942Z', + 'bstansberry'=>'20051007055848Z', + 'bstoler'=>'20080104031220Z', + 'bsullivan'=>'20070718014527Z', + 'btmurphy'=>'20070412203048Z', + 'btopping'=>'20050318184301Z', + 'burton'=>'19991002000000Z', # r180475 + 'buschmi'=>'20070201030009Z', + 'buscob'=>'20090115183652Z', + 'butek'=>'20010905000000Z', # r245270 + 'butlermh'=>'20030317000000Z', # r23734 + 'bvenners'=>'20070412203116Z', + 'bwalding'=>'20030128000000Z', # r119592 + 'bwallace'=>'20040701000000Z', + 'byersa'=>'20060302011357Z', + 'byrne'=>'20060317185518Z', + 'byron'=>'20081219185935Z', + 'cagatay'=>'20060802010935Z', + 'calavera'=>'20080618181232Z', + 'cam'=>'20040801000000Z', # r201371 + 'cargilld'=>'20031215000000Z', # r175561 + 'carlos'=>'20040617000000Z', # r115487 + 'carlson'=>'20011220000000Z', # r149631 + 'carnold'=>'20040731162525Z', + 'carrier'=>'20090103030623Z', + 'cbegin'=>'20041007000154Z', + 'cblecken'=>'20041218134544Z', + 'cbowditch'=>'20040301000000Z', # r197400 + 'cbrisson'=>'20061221220204Z', + 'ccardona'=>'20061101190602Z', + 'cchew'=>'20030430000000Z', # r223866 + 'ccristal'=>'20081209195849Z', + 'cctrieloff'=>'20060914010218Z', + 'ccustine'=>'20070528024607Z', + 'cdamon'=>'20060317185356Z', + 'cdaniluk'=>'20060414170221Z', + 'cdevienne'=>'20040809205414Z', + 'cdinapala'=>'20050523235419Z', + 'cdoremus'=>'20050310111606Z', + 'cdouglas'=>'20071212024020Z', + 'cdupoirieux'=>'20050821124645Z', + 'cedric'=>'20010801000000Z', # r48516 + 'ceki'=>'20001116000000Z', # r308872 + 'cezar'=>'20030910101847Z', + 'cfieber'=>'20040719000000Z', # r23065 + 'cgreenlee'=>'20040701000000Z', + 'chaase3'=>'20080321174854Z', + 'chabotc'=>'20080411160508Z', + 'chadh'=>'20060222205732Z', + 'chamikara'=>'20041218134559Z', + 'chamil'=>'20051028125031Z', + 'chaminda'=>'20030626000000Z', # r249182 + 'chamindra'=>'20040701000000Z', + 'chanwit'=>'20080623210605Z', + 'charitha'=>'20070718014455Z', + 'charlesb'=>'20010213000000Z', # r107364 + 'charper'=>'20060415113031Z', + 'chathura'=>'20041205181815Z', + 'chathura_ce'=>'20070110182426Z', + 'chatra'=>'20060222205736Z', + 'cheche'=>'20030715000000Z', # r8522 + 'chestnut'=>'20050617152644Z', + 'chico'=>'20090225194733Z', + 'chinthaka'=>'20041113020921Z', + 'chirino'=>'20030822000000Z', # r43937 + 'cholet'=>'19990615000000Z', # r177129 + 'chowells'=>'20061009210708Z', + 'chrisd'=>'20060518032526Z', + 'chrise'=>'20040701000000Z', + 'chrisg'=>'20020210000000Z', # r194634 + 'chrisjdavis'=>'20040701000000Z', + 'chrisjs'=>'20060326214123Z', + 'christian'=>'20080212193738Z', + 'chrisw'=>'20021124000000Z', # r273576 + 'chuck'=>'19960528000000Z', # r76523 + 'chuckw'=>'20060530190223Z', + 'chunrong'=>'20080522205122Z', + 'cjblythe'=>'20070127223134Z', + 'cjodea'=>'20060415112730Z', + 'cjolif'=>'20001023000000Z', # r198840 + 'cjudson'=>'20040715191822Z', + 'ckiehl'=>'20070718014757Z', + 'ckoell'=>'20081015213525Z', + 'ckoppelt'=>'20061221220345Z', + 'ckormos'=>'20060615000143Z', + 'cks'=>'20020620000000Z', # r297556 + 'clar'=>'20031229193723Z', + 'clay'=>'20040611000000Z', # r197697 + 'clement'=>'20070528024744Z', + 'clhubert'=>'20040701000000Z', + 'cliff'=>'19990315000000Z', # r82913 + 'cliffs'=>'20030910101847Z', + 'clim'=>'20050713000904Z', + 'clint'=>'20070626023347Z', + 'clombart'=>'20050103161248Z', + 'clr'=>'20050306155044Z', + 'clucas'=>'20010324000000Z', # r283400 + 'cmanohar'=>'20050209150220Z', + 'cmchen'=>'20070920152400Z', + 'cmlenz'=>'20010801000000Z', # r203588 + 'cmoulliard'=>'20040701000000Z', + 'cmpilato'=>'20040701000000Z', + 'coar'=>'19970408000000Z', # r77815 + 'coheigea'=>'20080908203330Z', + 'coliver'=>'20030314000000Z', # r23672 + 'colm'=>'20050823011035Z', + 'conny'=>'20081112232634Z', + 'conor'=>'20000617000000Z', # r267680 + 'costin'=>'19991010000000Z', # r229805 + 'covener'=>'20070516013036Z', + 'cpiro'=>'20080516193927Z', + 'crafterm'=>'20020416000000Z', # r13382 + 'craigc'=>'20040715191748Z', + 'craigmcc'=>'19991012000000Z', # r280991 + 'crazybob'=>'20060530190203Z', + 'crogers'=>'20051018200758Z', + 'crossley'=>'20020210000000Z', # r225960 + 'csauer'=>'20071025234809Z', + 'cschneider'=>'20080926181652Z', + 'cschoett'=>'20051121034953Z', + 'ctan'=>'20080821235430Z', + 'ctoth'=>'20080311172725Z', + 'ctwiner'=>'20080606225816Z', + 'curcuru'=>'20000720000000Z', # r333163 + 'cutting'=>'20010924000000Z', # r149585 + 'cvillegas'=>'20050120090838Z', + 'cwei'=>'20060614235909Z', + 'cwiklik'=>'20081118230926Z', + 'cygnus'=>'20061009205633Z', + 'cziegeler'=>'20010926000000Z', # r313952 + 'dadams'=>'20070626023035Z', + 'dag'=>'20070323185123Z', + 'daijy'=>'20080926181644Z', + 'dain'=>'20030811000000Z', # r43712 + 'damien'=>'20080311172703Z', + 'damitha'=>'20030627000000Z', # r249204 + 'damonc'=>'20011108000000Z', # r265075 + 'damrhei'=>'20070830223630Z', + 'dancres'=>'20070412202915Z', + 'dandiep'=>'20050428213250Z', + 'dane0101'=>'20080423163440Z', + 'danese'=>'20040701000000Z', + 'danielf'=>'20031229193640Z', + 'danielwilson'=>'20080221195120Z', + 'danj'=>'20060606005551Z', + 'danlyke'=>'20061004221344Z', + 'danny'=>'20010928000000Z', # r107672 + 'dantran'=>'20051204210655Z', + 'danushka'=>'20081209195852Z', + 'darobin'=>'20020130000000Z', # r344501 + 'darrell'=>'20010815000000Z', # r107624 + 'dasarath'=>'20041208231238Z', + 'dashorst'=>'20060921010439Z', + 'davenewton'=>'20070927194827Z', + 'daveread'=>'20040715191838Z', + 'daveremy'=>'20030910101847Z', + 'davi'=>'20070626023128Z', + 'davidb'=>'20081125224432Z', + 'davidbau'=>'20030910101847Z', + 'davidillsley'=>'20060606004641Z', + 'davidvc'=>'20050729132055Z', + 'davidw'=>'20000908000000Z', # r321531 + 'davisp'=>'20090227180034Z', + 'davsclaus'=>'20080321174900Z', + 'dawood'=>'20090415173940Z', + 'dbalmain'=>'20060606005841Z', + 'dbentley'=>'20080104031250Z', + 'dbertoni'=>'20000124000000Z', # r338285 + 'dbhole'=>'20051220201929Z', + 'dblevins'=>'20030830000000Z', # r44081 + 'dbrosius'=>'20050209150254Z', + 'dchappell'=>'20020926000000Z', # r248258 + 'dchauhan'=>'20081219185933Z', + 'dcoker'=>'20080104031255Z', + 'ddam'=>'20080116220743Z', + 'ddas'=>'20070830223557Z', + 'ddevienne'=>'20041113020119Z', + 'ddewolf'=>'20040224000000Z', # r35896 + 'ddhill'=>'20040701000000Z', + 'ddp'=>'20020508000000Z', # r144602 + 'deepal'=>'20041113021049Z', + 'dejanb'=>'20080908203327Z', + 'delafran'=>'20050326223129Z', + 'demuru'=>'20060317185455Z', + 'dennisbyrne'=>'20060126150112Z', + 'dennisl'=>'20060112140356Z', + 'dettborn'=>'20070808193104Z', + 'deweese'=>'20001027000000Z', # r198867 + 'dezzio'=>'20070711043149Z', + 'dfabulich'=>'20070110182606Z', + 'dflores'=>'20051209152935Z', + 'dflorey'=>'20040224000000Z', # r206874 + 'dfs'=>'20000915000000Z', # r54278 + 'dgeary'=>'20000929000000Z', # r47804 + 'dglazer'=>'20080104031224Z', + 'dgraham'=>'20021019000000Z', # r49657 + 'dhague'=>'20081219185924Z', + 'dhaney'=>'20050714205343Z', + 'dharkness'=>'20080104031226Z', + 'dharris'=>'20040701000000Z', + 'dhirup'=>'20050310111629Z', + 'dhruba'=>'20070323185153Z', + 'dicka'=>'20040913000000Z', # r259220 + 'digy'=>'20081112232642Z', + 'diluka'=>'20080731032802Z', + 'dims'=>'20010601000000Z', # r225913 + 'dimuthu'=>'20060921010339Z', + 'dinesh'=>'20051209144032Z', + 'dino'=>'20001002000000Z', # r198774 + 'dion'=>'20020119000000Z', # r138215 + 'dirkv'=>'20010711000000Z', # r203474 + 'dirkx'=>'19980703000000Z', # r81646 + 'dirving'=>'20060830183925Z', + 'diwaker'=>'20050714205252Z', + 'dixson'=>'20081026004621Z', + 'djcook'=>'20051209153115Z', + 'djd'=>'20040922003402Z', + 'djencks'=>'20030811011316Z', + 'djpolito'=>'20010806000000Z', # r227541 + 'djspiewak'=>'20090515035900Z', + 'djue'=>'20080221195123Z', + 'dkulp'=>'20060507190739Z', + 'dlat'=>'20081112232609Z', + 'dlegg'=>'20080908203318Z', + 'dleslie'=>'19991217000000Z', # r313350 + 'dlestrat'=>'20040208225139Z', + 'dlouzan'=>'20050423134737Z', + 'dlr'=>'20001011000000Z', # r72187 + 'dls'=>'20081112232607Z', + 'dlydick'=>'20051014070338Z', + 'dmandell'=>'20010417000000Z', # r218486 + 'dmarston'=>'20001127000000Z', # r342509 + 'dmeikle'=>'20081015213527Z', + 'dmiddlem'=>'20060222205749Z', + 'dmitri'=>'20010603000000Z', # r145962 + 'dmitryh'=>'20040310000000Z', # r341985 + 'dmitrys'=>'20030925000000Z', # r150062 + 'dmkarr'=>'20020926000000Z', # r49538 + 'dmui'=>'20030306000000Z', # r353021 + 'dnaber'=>'20040731162602Z', + 'dobbs'=>'20011024000000Z', # r220486 + 'dobri'=>'20090306145826Z', + 'doebele'=>'20080731032740Z', + 'dogacan'=>'20070614182023Z', + 'dolander'=>'20040716163912Z', + 'doll'=>'20080104031222Z', + 'dominik'=>'20041218134516Z', + 'donaldp'=>'20001123000000Z', # r10721 + 'dongukchoi'=>'20080623210612Z', + 'donsez'=>'20060914005312Z', + 'doogie'=>'20071016014235Z', + 'doronc'=>'20070215031351Z', + 'dos'=>'20050310111615Z', + 'dougm'=>'19970719000000Z', # r78680 + 'dougsale'=>'20081112232639Z', + 'dougsleite'=>'20080821235446Z', + 'dpejesh'=>'20020825000000Z', # r96527 + 'dpeterson'=>'20080516193916Z', + 'dpfister'=>'20050326223121Z', + 'dpicco'=>'20060222205808Z', + 'dpp'=>'20081209195856Z', + 'drag0n2'=>'20020520000000Z', # r149759 + 'draier'=>'20041218134530Z', + 'dreid'=>'19991007000000Z', # r59275 + 'dreiss'=>'20080516193923Z', + 'drewbai'=>'20081125224440Z', + 'drieseng'=>'20040215115753Z', + 'drobiazko'=>'20080606225819Z', + 'drobinson'=>'20070614181358Z', + 'drtr'=>'20040701000000Z', + 'drummondreed'=>'20060816181222Z', + 'dsale'=>'20011010000000Z', # r138181 + 'dsavazzi'=>'20040809205351Z', + 'dsh'=>'20060719164440Z', + 'dsolis'=>'20030321001509Z', + 'dsosnoski'=>'20050914151733Z', + 'dspencer'=>'20040925124550Z', + 'dtanzer'=>'20051008054815Z', + 'duftler'=>'20000714000000Z', # r261943 + 'dug'=>'20001107000000Z', # r262026 + 'dumindu'=>'20070330211736Z', + 'duncan'=>'19991009000000Z', # r229801 + 'duncf'=>'20041105060718Z', + 'dushshantha'=>'20050423134735Z', + 'dutta'=>'20040516000000Z', # r110743 + 'dvholten'=>'20060519190112Z', + 'dviner'=>'20021120000000Z', # r192290 + 'dwaite'=>'20041207000000Z', # r111136 + 'dweir'=>'20060222205835Z', + 'dweiss'=>'20080116220754Z', + 'dwinterfeldt'=>'20010701000000Z', # r48455 + 'dwoods'=>'20070330211825Z', + 'dyre'=>'20070920152411Z', + 'eacmen'=>'20060615000101Z', + 'eae'=>'20061109172655Z', + 'eaf'=>'20080411160515Z', + 'ebengston'=>'20050609113055Z', + 'ebourg'=>'20040602071623Z', + 'ecarmich'=>'20030824000000Z', # r305801 + 'eckardjf'=>'20070516012910Z', + 'eckehard'=>'20040521000000Z', # r207199 + 'ecraig'=>'20071120160905Z', + 'ed'=>'20000615000000Z', # r282012 + 'edalquist'=>'20080311172657Z', + 'edeoliveira'=>'20080718165053Z', + 'edgarpoce'=>'20050601141009Z', + 'edith'=>'20030418104123Z', + 'edslattery'=>'20051221165551Z', + 'edwardsmj'=>'20051221165545Z', + 'edwardyoon'=>'20080623210601Z', + 'edwingo'=>'20001116000000Z', # r316582 + 'efastl'=>'20070528025011Z', + 'efy'=>'20080731032758Z', + 'egli'=>'20030418104123Z', + 'eglynn'=>'20060820232014Z', + 'egor'=>'20070626023155Z', + 'ehatcher'=>'20011221000000Z', # r270293 + 'ehillenius'=>'20060921010500Z', + 'ekbush'=>'20021015000000Z', # r49627 + 'ekoneil'=>'20040716163935Z', + 'elecharny'=>'20050317000000Z', # r157983 + 'elemings'=>'20071016014227Z', + 'elena'=>'20010105000000Z', # r316771 + 'eliast'=>'20051014070340Z', + 'elrod'=>'20040518000000Z', # r250980 + 'ema'=>'20060820232212Z', + 'enis'=>'20070907215137Z', + 'enolan'=>'20060222205754Z', + 'enver'=>'20011128000000Z', # r152712 + 'epugh'=>'20030226000000Z', # r221078 + 'epunzalan'=>'20051118021751Z', + 'eranga'=>'20080505204056Z', + 'ericf'=>'20030627000000Z', # r249194 + 'ericjohnson'=>'20060820232051Z', + 'ericvas'=>'20030910101847Z', + 'ericye'=>'20000421000000Z', # r315452 + 'erikabele'=>'20020810000000Z', # r96346 + 'erodriguez'=>'20040922003517Z', + 'eross'=>'20061130180750Z', + 'ersiner'=>'20050930214625Z', + 'esm'=>'20060712200503Z', + 'etnu'=>'20080104031238Z', + 'evan'=>'20080104031247Z', + 'evanthika'=>'20080606225803Z', + 'evenisse'=>'20020914000000Z', # r118909 + 'eworley'=>'20070711042903Z', + 'ewrick'=>'20070302211105Z', + 'eyang'=>'20090225212646Z', + 'fadushin'=>'20070626023254Z', + 'fancy'=>'20070820141344Z', + 'fanf'=>'19991028000000Z', # r84060 + 'fapeeler'=>'20081112232613Z', + 'faridz'=>'20060830184010Z', + 'farra'=>'20030928000000Z', # r17839 + 'faywang'=>'20080926181648Z', + 'fbarnaby'=>'20070425132819Z', + 'fcarrion'=>'20070323185022Z', + 'fdc'=>'19980528000000Z', # r176523 + 'fede'=>'20010223000000Z', # r10735 + 'fedor'=>'20010901000000Z', # r220398 + 'felicity'=>'20020927000000Z', # r3529 + 'felipeal'=>'20031218000000Z', # r218248 + 'felix'=>'20030418104123Z', + 'felixk'=>'20070323184935Z', + 'ferdinand'=>'20050423134759Z', + 'fern'=>'20020802000000Z', # r192130 + 'fernanda'=>'20061101190827Z', + 'ffang'=>'20060820231953Z', + 'fgiust'=>'20050930152814Z', + 'fguillaume'=>'20090508011736Z', + 'fhanik'=>'20030219000000Z', # r301548 + 'fielding'=>'19960804000000Z', # r76699 + 'fitz'=>'20010410000000Z', # r58203 + 'florianbruckner'=>'20020617000000Z', # r360616 + 'florianh'=>'20081125224438Z', + 'flynch'=>'20060914005953Z', + 'fmeschbe'=>'20051102142558Z', + 'foconer'=>'20051209152658Z', + 'foliver'=>'20070412203520Z', + 'fpj'=>'20080522205132Z', + 'francisdb'=>'20090103030621Z', + 'frankb'=>'20051221165539Z', + 'frankbille'=>'20060921010539Z', + 'fredrik'=>'20030920180212Z', + 'freemant'=>'20060507190705Z', + 'froehlich'=>'20011116000000Z', # r12408 + 'froethenbacher'=>'20060123163059Z', + 'fuankg'=>'20040404133119Z', + 'fuhwei'=>'20070718014823Z', + 'funkman'=>'20030601000000Z', # r301916 + 'furfari'=>'20060317185439Z', + 'fuzzylogic'=>'20040922003447Z', + 'fwang'=>'20080516193740Z', + 'fwiles'=>'20060222202830Z', + 'gabriele'=>'20090514033353Z', + 'ganesh'=>'20090427220048Z', + 'ganeshmb'=>'20090227180042Z', + 'gangolli'=>'20050710000000Z', # r210025 + 'gareth'=>'20021118000000Z', # r174367 + 'garyp'=>'20001008000000Z', # r333460 + 'gastaldi'=>'20060127031524Z', + 'gates'=>'20071025234759Z', + 'gatfora'=>'20061115174836Z', + 'gawor'=>'20040409000000Z', # r240498 + 'gbayon'=>'20041007000134Z', + 'gboccalon'=>'20090211221703Z', + 'gbrown'=>'20090225194729Z', + 'gcasper'=>'20030803022443Z', + 'gcrawford'=>'20061101190447Z', + 'gdamour'=>'20031210000000Z', # r44669 + 'gdaniels'=>'20000705000000Z', # r261937 + 'gdf'=>'20080505204042Z', + 'gears'=>'20000413000000Z', # r193326 + 'ged'=>'20040701000000Z', + 'geechorama'=>'20090415173942Z', + 'geirm'=>'20001028000000Z', # r72492 + 'geoff'=>'20020302000000Z', # r177665 + 'gerdogdu'=>'20081112232636Z', + 'germuska'=>'20031226000000Z', # r51278 + 'gertv'=>'20070516013006Z', + 'geuerp'=>'20010928000000Z', # r350313 + 'gfs'=>'20080104031228Z', + 'ggolden'=>'20020430000000Z', # r183104 + 'ggregory'=>'20030320000000Z', # r137261 + 'gharley'=>'20060331124239Z', + 'ghicker'=>'20070711043123Z', + 'gholam'=>'20010227000000Z', # r126094 + 'ghoward'=>'20030328000000Z', # r23926 + 'ghudson'=>'20040701000000Z', + 'giacomo'=>'20010825000000Z', # r11705 + 'gianugo'=>'20020404000000Z', # r192051 + 'giorgio'=>'20080411160504Z', + 'gkesavan'=>'20090326020048Z', + 'gkossakowski'=>'20070309235235Z', + 'glenn'=>'20000725000000Z', # r282196 + 'glens'=>'20020208000000Z', # r352077 + 'gmarcy'=>'20040701000000Z', + 'gmazza'=>'20030623141729Z', + 'gmcdonald'=>'20060719164637Z', + 'gmonroe'=>'20061130180731Z', + 'gmuellan'=>'20060411161410Z', + 'gnodet'=>'20051209151953Z', + 'goller'=>'20031003132908Z', + 'gonzalo'=>'20010813000000Z', # r227563 + 'gozer'=>'20030226000000Z', # r69767 + 'gpetracek'=>'20080116220752Z', + 'grahamd'=>'20060130181045Z', + 'grantm'=>'20060921010855Z', + 'grantmonroe'=>'20061009211333Z', + 'grantsmith'=>'20041007000058Z', + 'grchiu'=>'20021206000000Z', # r343774 + 'greddin'=>'20051023072541Z', + 'gredler'=>'20040701000000Z', + 'gregames'=>'20000829000000Z', # r86158 + 'gregor'=>'20030418104123Z', + 'gregw'=>'20030811011316Z', + 'greybird'=>'20050818193307Z', + 'grimsell'=>'20050423134743Z', + 'grischik'=>'20060317185416Z', + 'grisha'=>'20000505000000Z', # r85141 + 'grobmeier'=>'20090406194957Z', + 'gryzor'=>'20080908203312Z', + 'gsandhir'=>'20081026004625Z', + 'gscenini'=>'20051209141757Z', + 'gschneid'=>'20020710000000Z', # r360752 + 'gscokart'=>'20070528024917Z', + 'gseitz'=>'20070920152407Z', + 'gshimansky'=>'20061101190710Z', + 'gsim'=>'20060914010158Z', + 'gsingers'=>'20060530190145Z', + 'gstein'=>'19990417000000Z', # r83054 + 'gtully'=>'20080731032803Z', + 'gturrell'=>'20061130180707Z', + 'guillaume'=>'20050106132214Z', + 'gvanmatre'=>'20050821124658Z', + 'gwinn'=>'20061122184649Z', + 'gwynevans'=>'20060921010636Z', + 'haddadc'=>'20020809000000Z', # r247708 + 'hadrian'=>'20071120160915Z', + 'hairong'=>'20071212024011Z', + 'halleypo'=>'20060519190137Z', + 'hammant'=>'20010311000000Z', # r10840 + 'hammett'=>'20030923000000Z', # r17813 + 'handyande'=>'20061130180808Z', + 'hannes'=>'20011029000000Z', # r233593 + 'hannonpi'=>'20080116220750Z', + 'hans'=>'20050803150115Z', + 'hansbak'=>'20060302011400Z', + 'hansgk'=>'20070626023321Z', + 'happen'=>'20080423163428Z', + 'hari'=>'20051017072305Z', + 'harishkswamy'=>'20030919000000Z', # r243566 + 'hattori'=>'20050116142020Z', + 'haul'=>'20030312000000Z', # r23626 + 'hauser'=>'20060106123524Z', + 'hawkeye'=>'20040723000000Z', # r258779 + 'hazems'=>'20080516193742Z', + 'hbedi'=>'20010330000000Z', # r107444 + 'hboutemy'=>'20071016014212Z', + 'hbuelow'=>'20050714205339Z', + 'hchan'=>'20041106110048Z', + 'hchar'=>'20040417000000Z', # r224072 + 'hcunico'=>'20060320170616Z', + 'heathers'=>'20040715191857Z', + 'hefti'=>'20011206000000Z', # r322131 + 'heh'=>'20050821124656Z', + 'heitmann'=>'20070323185047Z', + 'hemapani'=>'20031117000000Z', # r263321 + 'henkp'=>'20050125000000Z', # r126393 + 'hennejg'=>'20060830183902Z', + 'hennes'=>'20050930170209Z', + 'henning'=>'20010821000000Z', # r220380 + 'henryjen'=>'20080516193738Z', + 'hepabolu'=>'20050714205316Z', + 'hermanns'=>'20060302011345Z', + 'hermod'=>'20070309235206Z', + 'herven'=>'20070711043058Z', + 'hfahmy'=>'20040701000000Z', + 'hgilde'=>'20041107101932Z', + 'hgomez'=>'20001115000000Z', # r282650 + 'hhernandez'=>'20030123000000Z', # r220951 + 'hibou'=>'20080321174914Z', + 'hideharu'=>'20050713001211Z', + 'hillion'=>'20001010000000Z', # r198776 + 'hilmer'=>'20031111032218Z', + 'hindessm'=>'20060609044203Z', + 'hiranya'=>'20080505204046Z', + 'hlship'=>'20030110000000Z', # r243177 + 'hmahbod'=>'20090306145824Z', + 'hnordberg'=>'20060630183223Z', + 'hoffmann'=>'20061115175026Z', + 'hogstrom'=>'20050930152414Z', + 'hoju'=>'20030214000000Z', # r311513 + 'holtdl'=>'20010117000000Z', # r268475 + 'hongtebari'=>'20080623210610Z', + 'horwat'=>'20000803000000Z', # r216602 + 'hossman'=>'20060123163057Z', + 'hrabago'=>'20050310111622Z', + 'hstern'=>'20091229185201Z', + 'huber'=>'20030311000000Z', # r23589 + 'huck'=>'20021107000000Z', # r321648 + 'hughesj'=>'20020606000000Z', # r240912 + 'humberto'=>'20060317185508Z', + 'husted'=>'20010108000000Z', # r47997 + 'huw'=>'20020804000000Z', # r14431 + 'ianh'=>'20010511000000Z', # r89085 + 'ias'=>'20031113000000Z', # r231643 + 'ib'=>'20030227000000Z', # r205883 + 'iberezhn'=>'20080522205117Z', + 'idarwin'=>'20020913000000Z', # r288521 + 'idus'=>'20050930170217Z', + 'ieb'=>'20080718165050Z', + 'igorh'=>'20030808000000Z', # r337602 + 'igors'=>'20011228000000Z', # r246128 + 'ilene'=>'20020719000000Z', # r336579 + 'ilkka'=>'20040701000000Z', + 'imario'=>'20040423220612Z', + 'indika'=>'20070110182452Z', + 'ips'=>'20041116020515Z', + 'isabel'=>'20080128212936Z', + 'isilval'=>'20061101190516Z', + 'issac'=>'20030704195228Z', + 'isurues'=>'20070302211128Z', + 'ivavladimir'=>'20070614181922Z', + 'ivaynberg'=>'20060921010558Z', + 'ivelin'=>'20020526000000Z', # r314126 + 'ivn'=>'20050906143408Z', + 'ivstolya'=>'20080522205127Z', + 'j3h'=>'20060928031820Z', + 'jacekp'=>'20020906000000Z', # r96672 + 'jacob'=>'20030911000000Z', # r327272 + 'jacobd'=>'20070907215343Z', + 'jacopoc'=>'20060302011351Z', + 'jake'=>'20081219185931Z', + 'jaliya'=>'20040106000000Z', # r263362 + 'jalkanen'=>'20071016014229Z', + 'jamejose'=>'20050118175426Z', + 'jan'=>'20080311172651Z', + 'janb'=>'20030811011316Z', + 'jancona'=>'20080618181230Z', + 'jankeesvanandel'=>'20090225194719Z', + 'jann'=>'20050603220044Z', + 'janne'=>'20060921010518Z', + 'janstey'=>'20080908203332Z', + 'jasha'=>'20080821235440Z', + 'jasons'=>'20010327000000Z', # r313778 + 'jasonw'=>'20040107000000Z', # r109027 + 'jawarner'=>'20080411160513Z', + 'jayachandra'=>'20050602161836Z', + 'jaydm'=>'20070626023512Z', + 'jaz'=>'20060302011354Z', + 'jbass'=>'20081112232619Z', + 'jbates'=>'20020226000000Z', # r192027 + 'jbellis'=>'20090326020005Z', + 'jberry'=>'20000729000000Z', # r172286 + 'jblok'=>'20060921010734Z', + 'jbohn'=>'20060621210600Z', + 'jbonofre'=>'20090211221701Z', + 'jboynes'=>'20030811011316Z', + 'jbq'=>'20060112140529Z', + 'jbryant'=>'20070228034418Z', + 'jcarman'=>'20040913175739Z', + 'jcarreira'=>'20060123163715Z', + 'jcduenas'=>'20060802011117Z', + 'jcej'=>'20020906000000Z', # r118863 + 'jchris'=>'20080912205044Z', + 'jcompagner'=>'20060921010655Z', + 'jconlon'=>'20060830183839Z', + 'jcosters'=>'20090415173946Z', + 'jdcasey'=>'20040624230548Z', + 'jdcryans'=>'20080731032745Z', + 'jdecocq'=>'20081026004628Z', + 'jdillon'=>'20030812000000Z', # r43729 + 'jdliau'=>'20081026004630Z', + 'jdonnerstag'=>'20060921010618Z', + 'jdumay'=>'20080505204048Z', + 'jeastman'=>'20080411160518Z', + 'jechawke'=>'20010616000000Z', # r313882 + 'jeffreyr'=>'20000125000000Z', # r315201 + 'jefft'=>'20010802000000Z', # r11572 + 'jeffyu'=>'20080311172709Z', + 'jeremias'=>'20020505000000Z', # r194764 + 'jeremy'=>'20030313000000Z', # r23649 + 'jeremy_a'=>'20030407041056Z', + 'jerenkrantz'=>'20010531000000Z', # r58270 + 'jericho'=>'20010223000000Z', # r203060 + 'jernst'=>'20061019200218Z', + 'jerome'=>'20050729132109Z', + 'jeromy'=>'20080204143438Z', + 'jesse'=>'20030408014417Z', + 'jfaath'=>'20070718014644Z', + 'jfallows'=>'20060414014035Z', + 'jfarcand'=>'20020822000000Z', # r301177 + 'jfclere'=>'20010404000000Z', # r57618 + 'jford'=>'20030619000000Z', # r184137 + 'jfthomps'=>'20081112232621Z', + 'jgallacher'=>'20050607175400Z', + 'jgallimore'=>'20080718165049Z', + 'jgapuz'=>'20051209152700Z', + 'jgbutler'=>'20051007054554Z', + 'jgenender'=>'20050201123204Z', + 'jglick'=>'20040922003500Z', + 'jgmyers'=>'20051007060141Z', + 'jgomes'=>'20080311172712Z', + 'jgoodwill'=>'20051209141759Z', + 'jgoodyear'=>'20090211221709Z', + 'jhaile'=>'20080618181222Z', + 'jhawkins'=>'20060830184030Z', + 'jheight'=>'20030917000000Z', # r353355 + 'jheymans'=>'20050906143413Z', + 'jhm'=>'20030901000000Z', # r275165 + 'jhollis'=>'20050714205356Z', + 'jholmes'=>'20020623000000Z', # r49146 + 'jhook'=>'20060302011405Z', + 'jhuang'=>'20090115183648Z', + 'jhunter'=>'19991018000000Z', # r264219 + 'jhurley'=>'20070412203404Z', + 'jim'=>'19960316000000Z', # r76385 + 'jimk'=>'20070516013203Z', + 'jimw'=>'20001216000000Z', # r87379 + 'jjensen'=>'20060830183744Z', + 'jjohnston'=>'20060802010704Z', + 'jkaputin'=>'20050423134757Z', + 'jkelly'=>'20050823011127Z', + 'jkesselm'=>'20000920000000Z', # r333357 + 'jkeyes'=>'20020613000000Z', # r129769 + 'jkf'=>'20041208231217Z', + 'jkuhnert'=>'20051204210653Z', + 'jkumaran'=>'20031117000000Z', # r249868 + 'jlaskowski'=>'20040217000000Z', # r45123 + 'jleroux'=>'20060712200529Z', + 'jlim'=>'20051209152657Z', + 'jliu'=>'20060820232233Z', + 'jlruiz'=>'20060802011142Z', + 'jlund'=>'20040519141919Z', + 'jlust'=>'20060317185539Z', + 'jm'=>'20040105000000Z', # r6089 + 'jmachols'=>'20031114060139Z', + 'jmacna'=>'20030911000000Z', # r327271 + 'jmargaris'=>'20060614235932Z', + 'jmarino'=>'20051221165547Z', + 'jmcconnell'=>'20060411132329Z', + 'jmcnally'=>'20010815000000Z', # r227579 + 'jmitchell'=>'20021025000000Z', # r49691 + 'jmoore'=>'20010712000000Z', # r309226 + 'jmorales'=>'20090415173944Z', + 'jmsnell'=>'20010127000000Z', # r244556 + 'jneeraj'=>'20071208185453Z', + 'joachim'=>'20061004221304Z', + 'joakime'=>'20060830183656Z', + 'joannet'=>'20041213000000Z', # r338078 + 'jochen'=>'20030923000000Z', # r231557 + 'joecheng'=>'20050503151330Z', + 'joehni'=>'20051211223150Z', + 'joerg'=>'20030513111116Z', + 'joern'=>'20071016014218Z', + 'joes'=>'20010315000000Z', # r88519 + 'johan'=>'20080731032749Z', + 'johara'=>'20060914010348Z', + 'johnemb'=>'20080411160528Z', + 'johng'=>'20010419000000Z', # r334623 + 'johnh'=>'20071212024024Z', + 'johns'=>'20080821235442Z', + 'johnturner'=>'20040701000000Z', + 'johnx'=>'20050201133113Z', + 'jon'=>'20000324000000Z', # r281661 + 'jonathan'=>'20081112232611Z', + 'jonesde'=>'20060302011348Z', + 'jongjinchoi'=>'20040715191806Z', + 'jonl'=>'20040701000000Z', + 'jordan'=>'20000620000000Z', # r193407 + 'jorgenlo'=>'20080423163413Z', + 'jorton'=>'20021111000000Z', # r64012 + 'josch'=>'20050326223115Z', + 'jose'=>'20040701000000Z', + 'josh'=>'20080321174904Z', + 'josias'=>'20051125184605Z', + 'jpanzer'=>'20080104031233Z', + 'jrbauer'=>'20080926181650Z', + 'jrduncans'=>'20060921010420Z', + 'jregan'=>'20080104031231Z', + 'jreijn'=>'20070323184957Z', + 'jrodenburg'=>'20060830183720Z', + 'jrthomerson'=>'20090306145830Z', + 'jruiz'=>'20051118021753Z', + 'jruzzi'=>'20050617132358Z', + 'jsachs'=>'20010731000000Z', # r89840 + 'jsalvata'=>'20021224000000Z', # r322920 + 'jsdelfino'=>'20051221165543Z', + 'jsdever'=>'20020715000000Z', # r133712 + 'jsisson'=>'20050523235433Z', + 'jskeet'=>'20020224000000Z', # r271531 + 'jsl'=>'20010711000000Z', # r89537 + 'jsommer'=>'20060415112703Z', + 'jsong'=>'20040715191915Z', + 'jssarma'=>'20090326020038Z', + 'jstrachan'=>'20010428000000Z', # r216641 + 'jta'=>'20040810200659Z', + 'jtaylor'=>'20020212000000Z', # r223500 + 'jtb'=>'20060606005411Z', + 'jtirsen'=>'20060414170208Z', + 'jtolentino'=>'20060411132324Z', + 'juan'=>'20050821124612Z', + 'juanpablo'=>'20071016014215Z', + 'juergen'=>'20010104000000Z', # r202878 + 'jukka'=>'20050211123355Z', + 'jules'=>'20031220000000Z', # r44700 + 'jumal'=>'20021008000000Z', # r205694 + 'june'=>'20040715191519Z', + 'jussi'=>'20080104031244Z', + 'jvanzyl'=>'20000930000000Z', # r72121 + 'jvazquez'=>'20070927194821Z', + 'jvermillard'=>'20060719164509Z', + 'jwaldman'=>'20060712200356Z', + 'jwang'=>'20080516193925Z', + 'jwhitlock'=>'20060719164617Z', + 'jwkaltz'=>'20041113002959Z', + 'jwoolley'=>'20010218000000Z', # r58109 + 'jyang'=>'20031215000000Z', # r185436 + 'jycli'=>'20031215005354Z', + 'jzurbano'=>'20090326020100Z', + 'kahatlen'=>'20060222203955Z', + 'kai'=>'20090326020026Z', + 'kailass'=>'20060317185535Z', + 'kalle'=>'20080128212939Z', + 'kamaljit'=>'20081125224444Z', + 'kannan'=>'20090115183646Z', + 'kaplansky'=>'20060614192539Z', + 'karl'=>'20040102000000Z', # r265355 + 'karlvr'=>'20021109000000Z', # r216721 + 'karthick'=>'20081026004638Z', + 'kaushalye'=>'20060816181344Z', + 'kawai'=>'20040410000000Z', # r103324 + 'kayyagari'=>'20080311172716Z', + 'kaz'=>'20020216000000Z', # r222358 + 'kb'=>'20080411160458Z', + 'kbennett'=>'20071016014221Z', + 'kclark'=>'20080516193928Z', + 'kconner'=>'20061109030022Z', + 'kcormier'=>'20070228034509Z', + 'keiron'=>'20000711000000Z', # r193463 + 'keith'=>'20000711000000Z', # r85818 + 'keithc'=>'20061109030142Z', + 'kellyc'=>'20001218000000Z', # r193888 + 'kelvingoodson'=>'20060816181255Z', + 'kelvint'=>'20020508000000Z', # r150756 + 'kenc'=>'20081021155005Z', + 'kenney'=>'20050729132050Z', + 'kentam'=>'20040715191936Z', + 'kess'=>'20020801000000Z', # r96275 + 'keturn'=>'20061009210938Z', + 'kevan'=>'20051204210651Z', + 'kevj'=>'20051221051357Z', + 'kevlar'=>'20040710010002Z', + 'kfogel'=>'20001125000000Z', # r60788 + 'khera'=>'19980612000000Z', # r176569 + 'kidz'=>'20050523235449Z', + 'kief'=>'20010213000000Z', # r283152 + 'kimptoc'=>'20011126000000Z', # r182710 + 'kinman'=>'20011003000000Z', # r286735 + 'kip'=>'20020207000000Z', # r344511 + 'kkoehler'=>'20040701000000Z', + 'kkolinko'=>'20090514033357Z', + 'kkress'=>'20030910101847Z', + 'kkrouse'=>'20040912115126Z', + 'klaas'=>'20060816181603Z', + 'klease'=>'20001110000000Z', # r193761 + 'klichong'=>'20081021155003Z', + 'klute'=>'20020302000000Z', # r352128 + 'kmalhi'=>'20070907215052Z', + 'kmarsden'=>'20040922003417Z', + 'kmcgrail'=>'20060222205726Z', + 'kmenard'=>'20060507190724Z', + 'knoaman'=>'20010212000000Z', # r172529 + 'knopp'=>'20060921010716Z', + 'knut'=>'20040711000000Z', # r189132 + 'knvijay'=>'20040701000000Z', + 'kocolosk'=>'20090306145819Z', + 'kohsuke'=>'20040205000000Z', # r319755 + 'koinov'=>'20040912115050Z', + 'koji'=>'20080505204051Z', + 'kpiroumian'=>'20020527000000Z', # r7194 + 'kpvdr'=>'20060914010241Z', + 'krab'=>'20060222205828Z', + 'kris'=>'20040306003202Z', + 'kristwaa'=>'20061109025733Z', + 'kschrader'=>'20010810000000Z', # r227558 + 'ksmith'=>'20070425132656Z', + 'kstaken'=>'20011217000000Z', # r191981 + 'kstam'=>'20061130180707Z', + 'kubes'=>'20070302211150Z', + 'kurdalen'=>'20070711042931Z', + 'kurinchikumaran'=>'20050209150336Z', + 'kward'=>'20020324000000Z', # r192047 + 'kwilliams'=>'20051221165552Z', + 'kwouters'=>'20040701000000Z', + 'kwsutter'=>'20091218022507Z', + 'kylem'=>'20040810020703Z', + 'lacton'=>'20080821235448Z', + 'lahiru'=>'20080212193735Z', + 'lajos'=>'20060816181410Z', + 'lance'=>'20050606233650Z', + 'larryi'=>'20000826000000Z', # r282345 + 'lars'=>'19980715000000Z', # r81745 + 'laurieh'=>'20051018195925Z', + 'lchasen'=>'20061004221407Z', + 'ldiduck'=>'20051007054906Z', + 'legassick'=>'20010926000000Z', # r220423 + 'lehmi'=>'20081219185928Z', + 'lehors'=>'20000106000000Z', # r315147 + 'leif'=>'20020124000000Z', # r12733 + 'lektran'=>'20070127223307Z', + 'lenzi'=>'20060317185503Z', + 'leoli'=>'20070614181820Z', + 'leonardr'=>'20010815000000Z', # r147588 + 'leosimons'=>'20050607175400Z', + 'leosutic'=>'20020305000000Z', # r12917 + 'lfrohman'=>'20060802010913Z', + 'lfurini'=>'20041106092817Z', + 'lgawron'=>'20041106105809Z', + 'lgentis'=>'20080912205041Z', + 'lhazlewood'=>'20080618181228Z', + 'lhein'=>'20080221195107Z', + 'liangyx'=>'20061101190647Z', + 'lilantha'=>'20030708000000Z', # r249283 + 'lindner'=>'20080204143436Z', + 'linsun'=>'20070516012726Z', + 'lischke'=>'20050104142718Z', + 'liyanage'=>'20030418104123Z', + 'ljones'=>'20060222202845Z', + 'lkuehne'=>'20060222205841Z', + 'lmandel'=>'20050428212515Z', + 'lmartin'=>'20010115000000Z', # r316778 + 'lmeadors'=>'20041007000211Z', + 'lmorandini'=>'20080821235436Z', + 'lmoroney'=>'20030910101847Z', + 'lnicoara'=>'20050714205402Z', + 'lofwyr'=>'20050930170220Z', + 'lohit'=>'20080821235434Z', + 'lresende'=>'20061115174956Z', + 'lryan'=>'20080104031252Z', + 'ltheussl'=>'20050906143419Z', + 'ltrieloff'=>'20061019200412Z', + 'lu4242'=>'20071120160909Z', + 'luc'=>'20070110182347Z', + 'luehe'=>'20011121000000Z', # r217559 + 'luetzkendorf'=>'20040511042002Z', + 'lukaszlenart'=>'20090427005115Z', + 'lvjing'=>'20071016014223Z', + 'lwaterman'=>'20060415113103Z', + 'maarten'=>'20070808193135Z', + 'maartenc'=>'20061122184732Z', + 'mac'=>'20050106132226Z', + 'mach'=>'20030805000000Z', # r344747 + 'macsun'=>'20080908203325Z', + 'maczniak'=>'20040428150649Z', + 'madams'=>'20050523235424Z', + 'madhum'=>'20030221000000Z', # r98747 + 'mads'=>'20030103000000Z', # r98158 + 'magnus'=>'20040701000000Z', + 'mahadev'=>'20080516193733Z', + 'makas'=>'20080731032800Z', + 'malderson'=>'20070626023101Z', + 'mamta'=>'20061122184629Z', + 'manjula'=>'20070228034531Z', + 'manoj'=>'19980721000000Z', # r81793 + 'manojganesan'=>'20090427220041Z', + 'manolito'=>'20041006235956Z', + 'manuel'=>'20051007060009Z', + 'manugeorge'=>'20070215031628Z', + 'marbro'=>'20070412202948Z', + 'marc'=>'19970128000000Z', # r77522 + 'marcjohnson'=>'20071016014204Z', + 'marck'=>'20080516193922Z', + 'marco'=>'20040308000000Z', # r312325 + 'marcsaeg'=>'20001221000000Z', # r282801 + 'marino'=>'20031014000000Z', # r71790 + 'markh'=>'20070614181645Z', + 'markrmiller'=>'20080522205134Z', + 'markt'=>'20031210000000Z', # r288887 + 'marl'=>'20050423134732Z', + 'marnie'=>'20060914010015Z', + 'marrink'=>'20080321174858Z', + 'marrs'=>'20060222205739Z', + 'martijnh'=>'20071120160911Z', + 'martin'=>'19971020000000Z', # r79412 + 'martinc'=>'20010614000000Z', # r48429 + 'martint'=>'20071208185458Z', + 'marvin'=>'20060606005923Z', + 'mas'=>'20020221000000Z', # r130545 + 'masonjm'=>'20040710010250Z', + 'matei'=>'20090103030624Z', + 'mattbaird'=>'20020703000000Z', # r360712 + 'matth'=>'20030921000000Z', # r140390 + 'mattinger'=>'20040624230556Z', + 'mattmann'=>'20061122185702Z', + 'mattpelletier'=>'20060809040757Z', + 'matts'=>'20010224000000Z', # r88302 + 'mattschmidt'=>'20060222205716Z', + 'matwell'=>'20060914005844Z', + 'matzew'=>'20040731162509Z', + 'mauro'=>'20040617000000Z', # r21365 + 'max'=>'20050523235443Z', + 'maxb'=>'20060222193420Z', + 'maxberger'=>'20071120160913Z', + 'maxime'=>'20050729132047Z', + 'mazz'=>'20041205181844Z', + 'mbaessler'=>'20061109025637Z', + 'mbecke'=>'20030221000000Z', # r134112 + 'mbenson'=>'20040216000000Z', # r276095 + 'mbgl'=>'20040701000000Z', + 'mblankestijn'=>'20050310111547Z', + 'mbo'=>'20050314150816Z', + 'mbr'=>'20050714205301Z', + 'mbraden'=>'20040701000000Z', + 'mbrown'=>'20080321174902Z', + 'mc'=>'20050209150235Z', + 'mcaisse'=>'20050318184258Z', + 'mcatan'=>'20030609000000Z', # r308070 + 'mcconne'=>'20070614181507Z', + 'mcconnell'=>'20020202000000Z', # r12795 + 'mccreedy'=>'20020309000000Z', # r93809 + 'mcculls'=>'20070820141412Z', + 'mcfirst'=>'20080128212935Z', + 'mchampion'=>'20081125224442Z', + 'mckierna'=>'20061115174810Z', + 'mclark'=>'20040715191950Z', + 'mcnamara'=>'20040427000000Z', # r343924 + 'mcombellack'=>'20080104031205Z', + 'mconcini'=>'20090427220057Z', + 'mcooper'=>'20070516013104Z', + 'mcslee'=>'20080516193918Z', + 'mdahm'=>'20011031000000Z', # r152697 + 'mdierken'=>'20000313000000Z', # r312998 + 'mdiggory'=>'20030528120329Z', + 'mduerig'=>'20090129135100Z', + 'mdulisch'=>'20040701000000Z', + 'meder'=>'20041007000113Z', + 'medgar'=>'20030203000000Z', # r243246 + 'meerajk'=>'20060907020344Z', + 'memo'=>'20030418104123Z', + 'mestrade'=>'20040701000000Z', + 'metskem'=>'20080731032732Z', + 'meyering'=>'20070127223222Z', + 'mfreedman'=>'20080104031257Z', + 'mfursov'=>'20070614181754Z', + 'mgaffney'=>'20060127031527Z', + 'mgamerdinger'=>'20080731032736Z', + 'mgentry'=>'20060414170217Z', + 'mgoulet'=>'20050607175350Z', + 'mharwood'=>'20040508210930Z', + 'mheath'=>'20050714205405Z', + 'mholz'=>'20031229000000Z', # r206654 + 'mhoyt'=>'20031229193638Z', + 'michaelknunez'=>'20080908203320Z', + 'michaelm'=>'20030311000000Z', # r23600 + 'michal'=>'20030508000000Z', # r113414 + 'michau'=>'20050821124648Z', + 'michele'=>'20080411160520Z', + 'michi'=>'20030418104123Z', + 'midon'=>'20080606225810Z', + 'mikagoeckel'=>'20060830183629Z', + 'mikedd'=>'20070330211850Z', + 'mikeh'=>'20020614000000Z', # r228411 + 'mikem'=>'20040922003433Z', + 'mikemccand'=>'20061115174932Z', + 'mikus'=>'20060530190124Z', + 'milan'=>'20050131104928Z', + 'milinda'=>'20070228034258Z', + 'minchau'=>'20030424000000Z', # r337442 + 'mindbridge'=>'20020917000000Z', # r242883 + 'minfrin'=>'20010310000000Z', # r88485 + 'mischmitz'=>'20070907215410Z', + 'mjc'=>'19960301000000Z', # r76350 + 'mkalen'=>'20040710010707Z', + 'mkettler'=>'20080116220738Z', + 'mkg'=>'20081112232623Z', + 'mkienenb'=>'20051123000000Z', # r348550 + 'mkleint'=>'20060411132339Z', + 'mkostrze'=>'20040323000000Z', # r324505 + 'mkwan'=>'20020812000000Z', # r343688 + 'mlangham'=>'20030521000000Z', # r24503 + 'mlink'=>'20010308000000Z', # r321797 + 'mlittle'=>'20061109030000Z', + 'mloenko'=>'20060331124235Z', + 'mlovett'=>'20061109025915Z', + 'mmanders'=>'20010613000000Z', # r283668 + 'mmao'=>'20060820232257Z', + 'mmarinschek'=>'20041007000027Z', + 'mmarkov'=>'20071016014237Z', + 'mmartinec'=>'20070626023226Z', + 'mmay'=>'20031215073708Z', + 'mmerz'=>'20040826194511Z', + 'mmidy'=>'20000717000000Z', # r333150 + 'mnash'=>'20040701000000Z', + 'mnour'=>'20070309235257Z', + 'mode'=>'19991015000000Z', # r281020 + 'monteith'=>'20081209195847Z', + 'mor'=>'20080104031216Z', + 'morciuch'=>'20020816000000Z', # r183474 + 'morgand'=>'20010108000000Z', # r216474 + 'morrijr'=>'20010402000000Z', # r31242 + 'morten'=>'20010501000000Z', # r334666 + 'moseley'=>'20020405000000Z', # r66044 + 'mperham'=>'20051220201930Z', + 'mpfingsthorn'=>'20050729132100Z', + 'mpo'=>'20020731100947Z', + 'mprudhom'=>'20060723194446Z', + 'mraible'=>'20050601140947Z', + 'mrakesh'=>'20070330211803Z', + 'mrdon'=>'20030804000000Z', # r50897 + 'mreutegg'=>'20040914192000Z', + 'mrglavas'=>'20030616000000Z', # r319258 + 'mrinal'=>'20090103030614Z', + 'mriou'=>'20050423134745Z', + 'mrisaliti'=>'20071208185504Z', + 'mryan3'=>'20081015213532Z', + 'mschulte'=>'20070626023035Z', + 'msmith'=>'20010328000000Z', # r203188 + 'mss'=>'20041105060726Z', + 'mstover1'=>'20010307000000Z', # r322619 + 'mszefler'=>'20060621210538Z', + 'mteira'=>'20080908203316Z', + 'mturk'=>'20020623000000Z', # r297569 + 'mturyn'=>'20060614235952Z', + 'mtylenda'=>'20090227180045Z', + 'mukund'=>'20080311172701Z', + 'mullan'=>'20050607175345Z', + 'musachy'=>'20070215031520Z', + 'muthulee'=>'20031121000000Z', # r249894 + 'mvdb'=>'20020613000000Z', # r128875 + 'mvescovi'=>'20061004221428Z', + 'mwebb'=>'20070516012827Z', + 'mwiederkehr'=>'20081209195858Z', + 'mwomack'=>'20020510000000Z', # r309518 + 'mxmanghi'=>'20040701000000Z', + 'myoder'=>'20050714205354Z', + 'myrnavl'=>'20061115174903Z', + 'mzaun'=>'20050318184305Z', + 'nabeel'=>'20060523135044Z', + 'nachbaur'=>'20040710010400Z', + 'nacho'=>'20000404000000Z', # r281731 + 'nadika'=>'20030701000000Z', # r249250 + 'nadinem'=>'20061122185724Z', + 'nadiramra'=>'20050423134722Z', + 'nagy'=>'20010628000000Z', # r262332 + 'namit'=>'20090225194737Z', + 'nandana'=>'20071208185500Z', + 'nandika'=>'20050527162946Z', + 'nash'=>'20070927194830Z', + 'natalia'=>'20070711042839Z', + 'nava'=>'20040701000000Z', + 'nbubna'=>'20030124000000Z', # r71612 + 'nchalumeau'=>'20050926174255Z', + 'nd'=>'20020910000000Z', # r96729 + 'ndbeyer'=>'20060606005733Z', + 'nddelima'=>'20040603055538Z', + 'ndlesiecki'=>'20010925000000Z', # r234852 + 'ndw'=>'20020130000000Z', # r225950 + 'neeme'=>'20000630000000Z', # r181493 + 'neeraj'=>'20020122000000Z', # r318115 + 'neilg'=>'20010119000000Z', # r316796 + 'neilotoole'=>'20041211000000Z', # r131824 + 'neoflux'=>'20040701000000Z', + 'nettings'=>'20060921010754Z', + 'ngallardo'=>'20060802010826Z', + 'ngn'=>'20060107174839Z', + 'nhope'=>'20061109030102Z', + 'niall'=>'20050311000000Z', # r312245 + 'niallp'=>'20040608000000Z', # r51577 + 'nick'=>'20050609113100Z', + 'nickchalko'=>'20030123000000Z', # r32880 + 'nicko'=>'20040123000000Z', # r311935 + 'niclas'=>'20031117000000Z', # r18181 + 'nico'=>'20010125000000Z', # r268521 + 'nicolaken'=>'20020312000000Z', # r352210 + 'nicolas'=>'20071208185455Z', + 'nigel'=>'20070228034326Z', + 'nikke'=>'20071208185444Z', + 'niklas'=>'20050423134754Z', + 'nilgun'=>'20080718165046Z', + 'nilsga'=>'20060928031650Z', + 'ningjiang'=>'20060907020256Z', + 'niq'=>'20040625000000Z', # r104034 + 'niranjan'=>'20080212193732Z', + 'nithya'=>'20041116020515Z', + 'nlehuen'=>'20041218134500Z', + 'nlevitt'=>'20040603055538Z', + 'nlothian'=>'20040225000000Z', # r35899 + 'nmaves'=>'20051007054349Z', + 'nmittler'=>'20060331124245Z', + 'nmukhi'=>'20020917000000Z', # r241122 + 'noble'=>'20090514033355Z', + 'noel'=>'20021102000000Z', # r108193 + 'noelgrandin'=>'20090508011740Z', + 'noirin'=>'20060112140427Z', + 'noodl'=>'20070711042812Z', + 'norman'=>'20060509013753Z', + 'nsandhu'=>'20071127212901Z', + 'nsantos'=>'20071127212905Z', + 'nslater'=>'20080321174856Z', + 'nsochele'=>'20020925000000Z', # r201042 + 'nstein'=>'20060317185530Z', + 'nthaker'=>'20061109025937Z', + 'nuttycom'=>'20060816181500Z', + 'nuwan'=>'20030805000000Z', # r249446 + 'oalexeev'=>'20010714000000Z', # r48483 + 'oberhack'=>'20040125000000Z', # r18804 + 'ocastaneda'=>'20081112232559Z', + 'oching'=>'20060411132322Z', + 'odeakin'=>'20061101190626Z', + 'oersoy'=>'20060928031738Z', + 'oglueck'=>'20020919000000Z', # r133835 + 'ogusakov'=>'20080618181220Z', + 'oheger'=>'20041112231136Z', + 'okid'=>'20080423163438Z', + 'okiessler'=>'20050601141019Z', + 'olamy'=>'20070907215114Z', + 'olegk'=>'20030125000000Z', # r134026 + 'olegnitz'=>'20021013000000Z', # r361440 + 'olegt'=>'20021118000000Z', # r195557 + 'olga'=>'20071025234801Z', + 'oliverm'=>'20030922000000Z', # r362932 + 'ollie'=>'20060123164106Z', + 'olston'=>'20071025234803Z', + 'omalley'=>'20060414201215Z', + 'orlikowski'=>'20010116000000Z', # r87695 + 'oros'=>'20030113000000Z', # r322992 + 'oshani'=>'20060802010755Z', + 'otis'=>'20011104000000Z', # r149625 + 'ovidiu'=>'20040701000000Z', + 'owenb'=>'20020606000000Z', # r240913 + 'oyilmazel'=>'20080212193744Z', + 'oysteing'=>'20070830223759Z', + 'ozeigermann'=>'20031114000000Z', # r206491 + 'painter'=>'20040423220612Z', + 'pamarcelot'=>'20060928031719Z', + 'paolo'=>'20080321174907Z', + 'parin'=>'20050906143402Z', + 'parker'=>'20040224000000Z', # r6844 + 'parsonsd'=>'20081125224436Z', + 'pathos'=>'20010227000000Z', # r309030 + 'patrickl'=>'20011106000000Z', # r286989 + 'patthoyts'=>'20040624230547Z', + 'pauldick'=>'20000331000000Z', # r338415 + 'paulrbrown'=>'20060415113124Z', + 'pauls'=>'20060317185548Z', + 'paulsp'=>'20010810000000Z', # r182537 + 'pavani'=>'20040701000000Z', + 'pbenedict'=>'20060719164532Z', + 'pbwest'=>'20020427000000Z', # r194750 + 'pcal'=>'20031017042509Z', + 'pcl'=>'20050523235428Z', + 'pcourcoux'=>'20040913175725Z', + 'pctony'=>'20070614181728Z', + 'pdodds'=>'20051209153339Z', + 'pdp8'=>'20070412203150Z', + 'peiyongz'=>'20010612000000Z', # r172773 + 'pepper'=>'20001203000000Z', # r87159 + 'pero'=>'20040908003256Z', + 'perrin'=>'20040704000000Z', # r67699 + 'perryan'=>'20041001000000Z', # r259308 + 'peter_jones'=>'20070412203436Z', + 'peterbr'=>'20020620000000Z', # r314181 + 'peterjm'=>'20060317185543Z', + 'peterjones'=>'20060820232110Z', + 'peterreilly'=>'20030527095536Z', + 'pferraro'=>'20040903190320Z', + 'pfisher'=>'20040701000000Z', + 'pgier'=>'20080311172718Z', + 'pgoldstein'=>'20020806000000Z', # r107954 + 'pgollucci'=>'20050714205313Z', + 'pherweg'=>'20040101000000Z', # r197087 + 'phil'=>'20070215031436Z', + 'phred'=>'20060802010958Z', + 'phunsberger'=>'20060802010625Z', + 'phunt'=>'20080522205114Z', + 'pier'=>'19991017000000Z', # r52569 + 'pierred'=>'20000811000000Z', # r284949 + 'pietsch'=>'20020529000000Z', # r194844 + 'pini'=>'20060331142656Z', + 'piotrp'=>'20021110000000Z', # r241238 + 'pisong'=>'20080522205130Z', + 'pjaol'=>'20090115183650Z', + 'pjones'=>'20081021154959Z', + 'pkoch'=>'20070920152357Z', + 'pkosiorowski'=>'20050714205408Z', + 'pkosuru'=>'20060415112459Z', + 'pkriens'=>'20080411160510Z', + 'pledbrook'=>'20080618181223Z', + 'pleff'=>'20050930170203Z', + 'plightbo'=>'20060123163701Z', + 'plynch'=>'20020624000000Z', # r118039 + 'pmahoney'=>'20070614181435Z', + 'pmalik'=>'20090115183643Z', + 'pmcmahan'=>'20060820231908Z', + 'pmd'=>'20070201025932Z', + 'pnever'=>'20020216000000Z', # r204150 + 'polx'=>'20031225000000Z', # r135913 + 'ppakulski'=>'20070110182541Z', + 'ppiegaze'=>'20040914191951Z', + 'ppoddar'=>'20060723194359Z', + 'pquerna'=>'20040710010445Z', + 'prabalig'=>'20071208185449Z', + 'pradeepkth'=>'20090115183632Z', + 'pradine'=>'20060914005758Z', + 'prasad'=>'20061019200611Z', + 'prasadc'=>'20090225194739Z', + 'prebriy'=>'20080522205128Z', + 'prestonf'=>'20040902163734Z', + 'prickett'=>'20020212000000Z', # r146787 + 'prophecy'=>'20020619000000Z', # r360634 + 'proyal'=>'20020424000000Z', # r13448 + 'prussell'=>'20040923000000Z', # r47124 + 'pschneider'=>'20070412203612Z', + 'pshah'=>'20060317185410Z', + 'psmith'=>'20030428000000Z', # r311528 + 'psteitz'=>'20030820000000Z', # r137636 + 'ptahchiev'=>'20070412202842Z', + 'pvillacorta'=>'20051209152934Z', + 'pyang'=>'20060717003219Z', + 'pzf'=>'20051013000000Z', # r320784 + 'qiuxx'=>'20040701000000Z', + 'quellhorst'=>'20060830183946Z', + 'quinlan'=>'20020515000000Z', # r2382 + 'quintonm'=>'20030103000000Z', # r220837 + 'radup'=>'20040912115110Z', + 'rafal'=>'20040701000000Z', + 'rafale'=>'20070711043029Z', + 'ragaller'=>'20070920152403Z', + 'raghu'=>'20030201000000Z', # r361961 + 'rahul'=>'20050714205319Z', + 'rahulj'=>'19991110000000Z', # r171396 + 'rahuls'=>'20011127000000Z', # r317944 + 'rajdavies'=>'20051209152026Z', + 'rajith'=>'20060802010729Z', + 'ramani'=>'20080104031240Z', + 'rami'=>'20041106092403Z', + 'ramirjf'=>'20070412203214Z', + 'ramkumar'=>'20081021154957Z', + 'rana_b'=>'20030427000000Z', # r306665 + 'randy'=>'19960721000000Z', # r76654 + 'rangadi'=>'20071212024006Z', + 'rangika'=>'20041116020515Z', + 'raphael'=>'20010326000000Z', # r182200 + 'raul'=>'20040731162546Z', + 'rayb'=>'20070228034354Z', + 'rbb'=>'19990817000000Z', # r59151 + 'rbowen'=>'20000912000000Z', # r86205 + 'rdecampo'=>'20030830000000Z', # r311902 + 'rdonkin'=>'20010328000000Z', # r168913 + 'rebarraz'=>'20081026004632Z', + 'recordond'=>'20060820231834Z', + 'rederpj'=>'20010320000000Z', # r88541 + 'regisxu'=>'20090326020000Z', + 'reiher'=>'20080731032738Z', + 'reinhard'=>'20030630000000Z', # r24840 + 'remm'=>'20000509000000Z', # r202568 + 'renaud'=>'20061109030044Z', + 'reschke'=>'20060914005728Z', + 'resendes'=>'20070412203335Z', + 'rfeng'=>'20040701000000Z', + 'rfrovarp'=>'20070528024813Z', + 'rgardler'=>'20040102141249Z', + 'rgielen'=>'20060222220600Z', + 'rgodfrey'=>'20070127223159Z', + 'rgoers'=>'20041107014751Z', + 'rgrabowski'=>'20050611164835Z', + 'rgraham'=>'20050729132103Z', + 'rgreig'=>'20060914005931Z', + 'rhillegas'=>'20060127031530Z', + 'rhoegg'=>'20030124000000Z', # r233834 + 'rhs'=>'20060914010056Z', + 'rian'=>'20040701000000Z', + 'ricardo'=>'20031123000000Z', # r26501 + 'riccole'=>'20081209195851Z', + 'rich'=>'20040715192005Z', + 'richdougherty'=>'20080821235444Z', + 'richter'=>'19980714000000Z', # r293613 + 'rici'=>'20050601140958Z', + 'rick'=>'20041106093413Z', + 'rickhall'=>'20050807205111Z', + 'rickmcguire'=>'20060415112822Z', + 'ridabenjelloun'=>'20070412202816Z', + 'ridruejo'=>'20000229000000Z', # r84684 + 'rineholt'=>'20011106000000Z', # r245677 + 'rinku'=>'20061210023302Z', + 'ritchiem'=>'20060914010037Z', + 'rittmey'=>'20030423000000Z', # r323184 + 'rjan'=>'20080221195111Z', + 'rjmann'=>'20070425132847Z', + 'rjung'=>'20060507190751Z', + 'rkellogg'=>'20030628000000Z', # r263182 + 'rleland'=>'20010307000000Z', # r48210 + 'rlewisshell'=>'20011203000000Z', # r242332 + 'rlubke'=>'20011212000000Z', # r230106 + 'rmenschel'=>'20050729132106Z', + 'rmonson'=>'20040701000000Z', + 'rmurthy'=>'20090326020057Z', + 'robbie'=>'20090225194745Z', + 'robbinspg'=>'20051221165549Z', + 'robertdzeigler'=>'20081209195842Z', + 'robertlazarski'=>'20060317185428Z', + 'roberto'=>'20050226162706Z', + 'robinsona'=>'20070215031606Z', + 'robweir'=>'19991218000000Z', # r338273 + 'robyates'=>'20060712200429Z', + 'rogerrut'=>'20040208225139Z', + 'roku'=>'20040209000000Z', # r42326 + 'rolandw'=>'20060326214124Z', + 'romkal'=>'20080116220746Z', + 'ronald'=>'19990411000000Z', # r83048 + 'ronnie'=>'20011228000000Z', # r322134 + 'rony'=>'20050504191751Z', + 'rooneg'=>'20041205000000Z', # r109910 + 'roshan'=>'20030625000000Z', # r249173 + 'rossb'=>'20040701000000Z', + 'rossd'=>'20060317185402Z', + 'rotan'=>'20040715192021Z', + 'rott'=>'20070215031542Z', + 'roughley'=>'20060317185548Z', + 'roxspring'=>'20020828000000Z', # r127404 + 'rpalepu'=>'20060123192602Z', + 'rpenoyer'=>'20031114060215Z', + 'rpluem'=>'20051001181433Z', + 'rr'=>'20061019200309Z', + 'rrhodes'=>'20040809205403Z', + 'rsaba'=>'20051209153116Z', + 'rscheifler'=>'20070412203308Z', + 'rscott'=>'20060928031800Z', + 'rse'=>'19970713000000Z', # r78602 + 'rsfeir'=>'20040713224614Z', + 'rsitze'=>'20020222000000Z', # r246479 + 'rsivaram'=>'20080116220748Z', + 'rubys'=>'19991208000000Z', # r281267 + 'ruchith'=>'20050209150317Z', + 'ruchithf'=>'20050602161830Z', + 'rudolf'=>'20090225194721Z', + 'runping'=>'20071212024017Z', + 'rupertlssmith'=>'20070425132555Z', + 'ruppert'=>'20070302211209Z', + 'ruwan'=>'20061115175047Z', + 'rwaldhoff'=>'20010406000000Z', # r148227 + 'rwatler'=>'20041218134623Z', + 'rwinston'=>'20040602072758Z', + 'rwyles'=>'20090311132334Z', + 'ryan'=>'20070425132945Z', + 'ryman'=>'20050428213343Z', + 'sabob'=>'20080731032753Z', + 'sackley'=>'20020407000000Z', # r352350 + 'sahan'=>'20060123192608Z', + 'sai'=>'20090326020019Z', + 'sameer'=>'19961126000000Z', # r77046 + 'saminda'=>'20050906143424Z', + 'samisa'=>'20040426193017Z', + 'samjoyce'=>'20060914010325Z', + 'sandakith'=>'20061109030201Z', + 'sanders'=>'20010413000000Z', # r143386 + 'sandygao'=>'20010605000000Z', # r317206 + 'sandymac'=>'20060226160453Z', + 'sanjaya'=>'20030623000000Z', # r249159 + 'sanjayak'=>'20071127214732Z', + 'sanjiva'=>'20000615000000Z', # r261930 + 'sanka'=>'20050527162933Z', + 'santiagopg'=>'20020402000000Z', # r336212 + 'santillan'=>'20060802011053Z', + 'saram'=>'20090115183636Z', + 'sascha'=>'19991229000000Z', # r59556 + 'satheesh'=>'20040914234121Z', + 'saua'=>'20020627000000Z', # r360675 + 'sbailliez'=>'20010731000000Z', # r269411 + 'sberlin'=>'20080606225812Z', + 'sboag'=>'19991109000000Z', # r333118 + 'sboden'=>'20051007052516Z', + 'sboehme'=>'20050601141014Z', + 'sboyd'=>'20060614235844Z', + 'sbrewin'=>'20031205054419Z', + 'scamp'=>'20041116020503Z', + 'scantor'=>'20070425132916Z', + 'sccomer'=>'20081026004623Z', + 'schallm'=>'20081015213516Z', + 'schemers'=>'20060317185406Z', + 'schepers'=>'20060615000013Z', + 'scheu'=>'20011106000000Z', # r245669 + 'schof'=>'20090803183856Z', + 'schor'=>'20061109025755Z', + 'schultz'=>'20080221195125Z', + 'scohen'=>'20030228000000Z', # r139352 + 'scolebourne'=>'20020620000000Z', # r146100 + 'scotsmatrix'=>'20061122184706Z', + 'scottganyo'=>'20010925000000Z', # r149592 + 'scottkurz'=>'20080618181216Z', + 'scottryan'=>'20040715192035Z', + 'sctemme'=>'20020819000000Z', # r96447 + 'sdeboy'=>'20030428000000Z', # r311527 + 'seade'=>'20030107000000Z', # r322961 + 'seanahn'=>'20090115183654Z', + 'seanoc'=>'20060820232317Z', + 'sebor'=>'20050714205332Z', + 'sebb'=>'20030923000000Z', # LDAP record was recreated in 2011; date is the earliest commit I could find + 'seelmann'=>'20061221220407Z', + 'seguin'=>'20010512000000Z', # r295282 + 'senaka'=>'20080128212940Z', + 'serge'=>'19990709000000Z', # r107023 + 'sergey'=>'20060112145526Z', + 'sergeyb'=>'20040701000000Z', + 'sethcall'=>'20081026004634Z', + 'sfermigier'=>'20090508011749Z', + 'sfrenot'=>'20060705155006Z', + 'sgala'=>'20000829000000Z', # r181686 + 'sgoeschl'=>'20041205181824Z', + 'sgoldstein'=>'20040710010526Z', + 'sgoyal'=>'20081112232644Z', + 'shade'=>'20090129135057Z', + 'shalin'=>'20080718165056Z', + 'shankar'=>'20071208185451Z', + 'shannon'=>'20020530000000Z', # r314129 + 'shanti'=>'20081015213530Z', + 'sharad'=>'20090326020051Z', + 'sharathreddy'=>'20060606005503Z', + 'shash'=>'20040624230551Z', + 'shawn'=>'20000825000000Z', # r216697 + 'sheetal'=>'20081015213523Z', + 'shemnon'=>'20000112000000Z', # r229886 + 'shesmer'=>'20010308000000Z', # r182158 + 'shinobu'=>'20060830183813Z', + 'shinsuke'=>'20040903190336Z', + 'shivahr'=>'20070907215313Z', + 'shuber'=>'20051102142419Z', + 'shuston'=>'20080908203314Z', + 'shv'=>'20071212024015Z', + 'sichen'=>'20060326214126Z', + 'sidler'=>'20020109000000Z', # r71548 + 'sidney'=>'20040317000000Z', # r9570 + 'simon'=>'20040701000000Z', + 'simoneg'=>'20060411135656Z', + 'simonw'=>'20060921010817Z', + 'simuvid'=>'20090211221707Z', + 'siren'=>'20050201133129Z', + 'sisbell'=>'20061210023334Z', + 'sjanuary'=>'20080128212933Z', + 'sjlee'=>'20080311172723Z', + 'sjur'=>'20061109025853Z', + 'sk'=>'20040701000000Z', + 'skestle'=>'20070516012756Z', + 'skim'=>'20060723194505Z', + 'skitching'=>'20040216000000Z', # r132561 + 'slacoin'=>'20090508011747Z', + 'slaubach'=>'20021004000000Z', # r352877 + 'slava'=>'20050425190856Z', + 'slaws'=>'20070127223106Z', + 'slessard'=>'20060830184053Z', + 'slive'=>'20000909000000Z', # r86182 + 'smartini'=>'20090306145828Z', + 'smilek'=>'20060802011029Z', + 'smishura'=>'20060331124237Z', + 'smor'=>'20020708000000Z', # r118333 + 'smorgrav'=>'20060331142658Z', + 'sms'=>'20090115183639Z', + 'snichol'=>'20020617000000Z', # r262431 + 'snicoll'=>'20050821124651Z', + 'snimalan'=>'20040429000000Z', # r224729 + 'snoopdave'=>'20050601141003Z', + 'sobryan'=>'20070718014621Z', + 'soc-xzw'=>'20050714205323Z', + 'soldis'=>'20030706000000Z', # r100466 + 'solprovider'=>'20051125184609Z', + 'spepping'=>'20040527000000Z', # r197644 + 'spinder'=>'20051023073133Z', + 'spoole'=>'20081219185917Z', + 'sppatel'=>'20050913005324Z', + 'sradia'=>'20090326020055Z', + 'sraeburn'=>'20030708000000Z', # r50735 + 'srowen'=>'20080411160526Z', + 'ssegu'=>'20061221220236Z', + 'ssilvert'=>'20090803183856Z', + 'stack'=>'20070626023418Z', + 'stan'=>'20090514033346Z', + 'stas'=>'20010326000000Z', # r68191 + 'stefan'=>'20030315000000Z', # r205898 + 'stefano'=>'19980903000000Z', # r322534 + 'stellagjj'=>'20080423163436Z', + 'stephan'=>'19990622000000Z', # r168698 + 'stephenh'=>'20020725000000Z', # r228486 + 'sterling'=>'20030422125008Z', + 'steshaw'=>'20060914010138Z', + 'steveh'=>'20040716184227Z', + 'stevehay'=>'20070425132751Z', + 'stevel'=>'20010927000000Z', # r269728 + 'stevencaswell'=>'20020726000000Z', # r136949 + 'stevendolg'=>'20080821235438Z', + 'stevenn'=>'20020226000000Z', # r7073 + 'sthepper'=>'20031002122646Z', + 'stocco'=>'20040715192050Z', + 'stoddard'=>'19980803000000Z', # r81851 + 'striker'=>'20010630000000Z', # r61831 + 'stroucki'=>'20081015213534Z', + 'struberg'=>'20090826034703Z', + 'suguri'=>'20050103161355Z', + 'sullis'=>'20020621000000Z', # r133690 + 'sumedha'=>'20070425132626Z', + 'supun'=>'20070228034220Z', + 'suresht'=>'20060606005156Z', + 'susantha'=>'20030625000000Z', # r249164 + 'susie'=>'20040701000000Z', + 'sussman'=>'20001116000000Z', # r65374 + 'sviens'=>'20031109000000Z', # r262614 + 'svieujot'=>'20041007000042Z', + 'svkrish'=>'20060921010836Z', + 'syedrikov'=>'20060914010410Z', + 'sylvain'=>'20030309000000Z', # r23570 + 'szetszwo'=>'20080821235432Z', + 'szoerner'=>'20050930161308Z', + 'tabish'=>'20060914005243Z', + 'takashi'=>'20080505204033Z', + 'takezoe'=>'20080731032755Z', + 'taton'=>'20070907215029Z', + 'taylor'=>'20001203000000Z', # r181826 + 'tbennett'=>'20040224000000Z', # r19081 + 'tcopeland'=>'20020226000000Z', # r116482 + 'tcunning'=>'20080516193931Z', + 'tcurdt'=>'20030311000000Z', # r23609 + 'tdawson'=>'20010613000000Z', # r216646 + 'tdonovan'=>'20080522205109Z', + 'tdunning'=>'20080505204053Z', + 'tedst'=>'20080221195129Z', + 'tejeswar'=>'20060914010432Z', + 'tekgrrl'=>'20090508011742Z', + 'tellison'=>'20051211223144Z', + 'termie'=>'20080104031218Z', + 'tfischer'=>'20041205181744Z', + 'thads'=>'20030228000000Z', # r323095 + 'theory'=>'20040707195730Z', + 'thepish'=>'20040701000000Z', + 'thiagohp'=>'20090225194723Z', + 'thies'=>'20040701000000Z', + 'thilina'=>'20050523235438Z', + 'thma'=>'20020620000000Z', # r360645 + 'thobbs'=>'20090427220038Z', + 'thomanie'=>'20080411160522Z', + 'thomasm'=>'20070820141245Z', + 'thommay'=>'20020623000000Z', # r63517 + 'thorhauer'=>'20011017000000Z', # r220468 + 'thorpe'=>'20081112232629Z', + 'thorsten'=>'20030418104123Z', + 'thrantal'=>'20080505204044Z', + 'tijs'=>'20070110182516Z', + 'tim'=>'20031208222818Z', + 'tjones'=>'20040308214236Z', + 'tkirby'=>'20080618181218Z', + 'tkormann'=>'20001013000000Z', # r198797 + 'tli'=>'20060820232130Z', + 'tmjee'=>'20060331133434Z', + 'tmnk'=>'20050617132328Z', + 'tng'=>'20001206000000Z', # r172471 + 'toback'=>'20060317185524Z', + 'tobrien'=>'20030203000000Z', # r143548 + 'tomasr'=>'20070425132724Z', + 'tomdz'=>'20031215000000Z', # r363172 + 'tomeks'=>'20070528025038Z', + 'tomj'=>'20010905000000Z', # r245267 + 'tomsp'=>'20041007000011Z', + 'tomwhite'=>'20070215031651Z', + 'tongfin'=>'20081118230924Z', + 'tony'=>'20030922000000Z', # r25791 + 'tonywu'=>'20070614181951Z', + 'tore'=>'20010416000000Z', # r194212 + 'torehalset'=>'20060414170212Z', + 'torsten'=>'20080606225805Z', + 'toshi'=>'20030807000000Z', # r263186 + 'tpeng'=>'20080423163426Z', + 'trawick'=>'20000322000000Z', # r59731 + 'treilly'=>'20040404133124Z', + 'tripod'=>'20040914192007Z', + 'tross'=>'20080516193936Z', + 'trotter'=>'20060907020434Z', + 'truk'=>'20040130000000Z', # r299128 + 'trustin'=>'20041007000302Z', + 'trygvis'=>'20040505000000Z', # r122258 + 'tschlabach'=>'20041207000000Z', # r110104 + 'tschneider'=>'20070215031459Z', + 'tsvetelin'=>'20031024000000Z', # r243620 + 'tterm'=>'20070323184859Z', + 'ttriemstra'=>'20050714205348Z', + 'turner'=>'20020919000000Z', # r139843 + 'tv'=>'20051121000000Z', # r345880 + 'tveil'=>'20080618181227Z', + 'tvolkert'=>'20090225194731Z', + 'tw'=>'20061019200329Z', + 'twgoetz'=>'20061019200454Z', + 'twilliams'=>'20050716171454Z', + 'twl'=>'19991109000000Z', # r171387 + 'ugo'=>'20030803022443Z', + 'ukuester'=>'20051023072708Z', + 'ulbricht'=>'20060712200311Z', + 'ulhasbhole'=>'20060820231931Z', + 'umagesh'=>'20011120000000Z', # r269965 + 'uncled'=>'20040914191942Z', + 'unico'=>'20031021194938Z', + 'unrealjiang'=>'20060820232032Z', + 'upayavira'=>'20030604000000Z', # r24625 + 'upul'=>'20071120160908Z', + 'uschindler'=>'20081219185921Z', + 'utkarsh'=>'20071025234806Z', + 'vajda'=>'20050423134802Z', + 'vamsic007'=>'20061019200542Z', + 'vanto'=>'20070718014732Z', + 'varlax'=>'20061109025834Z', + 'vborja'=>'20080212193741Z', + 'vdichev'=>'20081219185926Z', + 'vdkoogh'=>'20020828000000Z', # r350530 + 'veithen'=>'20080221195113Z', + 'venkat'=>'20041220233434Z', + 'venu'=>'20030908000000Z', # r319383 + 'vgoenka'=>'20060606004513Z', + 'vgritsenko'=>'20020531000000Z', # r314137 + 'vhardy'=>'20001011000000Z', # r198788 + 'vhennebert'=>'20061019200350Z', + 'vidyanand'=>'20021122000000Z', # r248628 + 'viet'=>'20080128212947Z', + 'vikas'=>'20051017072315Z', + 'villard'=>'20030303000000Z', # r337306 + 'vinayc'=>'20020628000000Z', # r13996 + 'vincenzo'=>'20030618000000Z', # r108810 + 'vinh'=>'20080618181212Z', + 'vinod'=>'20070412203240Z', + 'vinoski'=>'20060914010302Z', + 'vishal'=>'20040405115500Z', + 'vitek'=>'20080104031259Z', + 'vk'=>'20041007000245Z', + 'vkumar'=>'20080128212928Z', + 'vladimir'=>'20021023000000Z', # r192182 + 'vmassol'=>'20010318000000Z', # r48235 + 'vmasutin'=>'20071120160916Z', + 'vmote'=>'20021127000000Z', # r195640 + 'vmz'=>'20080128212942Z', + 'vnarayanan'=>'20080423163424Z', + 'vouk'=>'20081112232625Z', + 'vramdal'=>'20090406194959Z', + 'vsalvato'=>'20040715192103Z', + 'vsiveton'=>'20050607175355Z', + 'vtence'=>'20040212113207Z', + 'vtpavan'=>'20031125000000Z', # r249928 + 'waldo'=>'20070412203019Z', + 'walkerr'=>'20060123192604Z', + 'wam'=>'20020214000000Z', # r204139 + 'wassa'=>'20050428212542Z', + 'wave'=>'20080321174910Z', + 'wburrows'=>'20041204021650Z', + 'wcloeten'=>'20001128000000Z', # r262039 + 'weaver'=>'20030320000000Z', # r183929 + 'weber'=>'20050930170213Z', + 'werken'=>'20001101000000Z', # r72535 + 'werner'=>'20040224000000Z', # r240571 + 'werpu'=>'20050926174233Z', + 'wesmckean'=>'20031114060145Z', + 'wesw'=>'20080204143433Z', + 'wglass'=>'20050103161337Z', + 'whitlock'=>'20020610000000Z', # r240926 + 'whoschek'=>'20050821191650Z', + 'wire'=>'20041205181835Z', + 'wisneskid'=>'20061221220323Z', + 'wjaniszewski'=>'20080731032805Z', + 'wjwashburn'=>'20060705155033Z', + 'wombachera'=>'20041205181805Z', + 'woodroy'=>'20070830223703Z', + 'woolfel'=>'20030819013017Z', + 'woonsan'=>'20070808193040Z', + 'wrowe'=>'20000428000000Z', # r59974 + 'wsanchez'=>'19990427000000Z', # r83120 + 'wsmoak'=>'20050714205309Z', + 'wsobel'=>'20081015213519Z', + 'wtam'=>'20081125224434Z', + 'wtan'=>'20060830183555Z', + 'wypoon'=>'20081118230920Z', + 'xavier'=>'20061109025705Z', + 'xiping'=>'20090415173938Z', + 'xli'=>'20070307012624Z', + 'xuhaihong'=>'20090306145822Z', + 'yackley'=>'20040512000000Z', # r10597 + 'yana'=>'20051007055710Z', + 'yegor'=>'20070127223330Z', + 'yhemanth'=>'20080321174850Z', + 'ymikulski'=>'20040701000000Z', + 'yoavs'=>'20030607000000Z', # r301931 + 'yonghoha'=>'20080623210608Z', + 'yonik'=>'20051025235930Z', + 'yoonjoosun'=>'20080623210613Z', + 'yoshiki'=>'20010111000000Z', # r87651 + 'ypark'=>'20081026004636Z', + 'ytalwar'=>'20050125130402Z', + 'yunfengma'=>'20080718165055Z', + 'zhangfan'=>'20080423163431Z', + 'zhanghuangzhu'=>'20070614181850Z', + 'zhen'=>'20080104031242Z', + 'zheng'=>'20051007060353Z', + 'zieg'=>'20030910101847Z', + 'zongaro'=>'20020729000000Z', # r336600 + 'zshao'=>'20080731032747Z' } end diff --git a/lib/whimsy/asf/podling.rb b/lib/whimsy/asf/podling.rb index b0ffb8c796..222fe74723 100644 --- a/lib/whimsy/asf/podling.rb +++ b/lib/whimsy/asf/podling.rb @@ -448,10 +448,10 @@ def self.namesearch begin res = Net::HTTP.get_response(URI(query)) res.value() # Raises error if not OK - file = File.new(cache, "wb") # Allow for non-UTF-8 chars + file = File.new(cache, 'wb') # Allow for non-UTF-8 chars file.write res.body rescue StandardError => e - Wunderbar.warn "ASF::Podling.namesearch: " + e.message + Wunderbar.warn 'ASF::Podling.namesearch: ' + e.message FileUtils.touch cache # Don't try again for a while end end diff --git a/lib/whimsy/asf/rack.rb b/lib/whimsy/asf/rack.rb index bdd531e6e0..7a4365d328 100644 --- a/lib/whimsy/asf/rack.rb +++ b/lib/whimsy/asf/rack.rb @@ -34,7 +34,7 @@ class << env; attr_accessor :user, :password; end class Committers < Rack::Auth::Basic # Specify 'ASF Committers' as the HTTP auth Realm def initialize(app) - super(app, "ASF Committers", &proc {}) + super(app, 'ASF Committers', &proc {}) end # Returns unauthorized unless running in test mode or @@ -60,7 +60,7 @@ def call(env) class MembersAndOfficers < Rack::Auth::Basic # Specify 'ASF Members and Officers' as the HTTP auth Realm def initialize(app, &block) - super(app, "ASF Members and Officers", &proc {}) + super(app, 'ASF Members and Officers', &proc {}) @block = block end diff --git a/lib/whimsy/asf/status.rb b/lib/whimsy/asf/status.rb index ae04bf5fe8..38f72861fa 100644 --- a/lib/whimsy/asf/status.rb +++ b/lib/whimsy/asf/status.rb @@ -7,7 +7,7 @@ # common methods module Status - ACTIVE_HOSTNAME = "whimsy.apache.org" + ACTIVE_HOSTNAME = 'whimsy.apache.org' # Cache unchanging values @currentIP = nil # may not be resolvable diff --git a/lib/whimsy/asf/svn.rb b/lib/whimsy/asf/svn.rb index cd030f58a3..41b22fc35c 100644 --- a/lib/whimsy/asf/svn.rb +++ b/lib/whimsy/asf/svn.rb @@ -51,7 +51,7 @@ def self.repos if repo_override svn_over = repo_override[:svn] if svn_over - Wunderbar.warn("Found override for repository.yml[:svn]") + Wunderbar.warn('Found override for repository.yml[:svn]') @@repository_entries[:svn].merge!(svn_over) end end @@ -192,7 +192,7 @@ def self.find!(name) unless result entry = repo_entry(name) if entry - raise Exception.new("Unable to find svn checkout for " + + raise Exception.new('Unable to find svn checkout for ' + "#{@base + entry['url']} (#{name})") else raise Exception.new("Unable to find svn checkout for #{name}") @@ -318,7 +318,7 @@ def self._svn_build_cmd(command, path, options) Wunderbar.error "Invalid option #{cmd.inspect}" unless cmd =~ %r{^(--[a-z][a-z=]+|-l\d+|-[a-z])$} end else - raise ArgumentError.new "command must be a String or an Array of Strings" + raise ArgumentError.new 'command must be a String or an Array of Strings' end end # build svn command @@ -536,8 +536,8 @@ def self.svn_(command, path, _, options = {}) end # convert auth for use by _svn_build_cmd auth.flatten.each_slice(2) do |a, b| - options[:user] = b if a == "--username" - options[:password] = b if a == "--password" + options[:user] = b if a == '--username' + options[:password] = b if a == '--password' end end @@ -1003,8 +1003,8 @@ def self.updatelisting(name, user=nil, password=nil, storedates=false, dir = nil return nil, "Cannot find URL for '#{name}'" end listfile, listfiletmp = self.listingNames(name, dir) - filerev = "0" - svnrev = "?" + filerev = '0' + svnrev = '?' filedates = false begin open(listfile) do |l| @@ -1066,7 +1066,7 @@ def self.updatelisting(name, user=nil, password=nil, storedates=false, dir = nil # The tag should be regarded as opaque def self.getlisting(name, tag=nil, trimSlash = true, getEpoch = false, dir = nil) listfile, _ = self.listingNames(name, dir) - curtag = "%s:%s:%d" % [trimSlash, getEpoch, File.mtime(listfile)] + curtag = '%s:%s:%d' % [trimSlash, getEpoch, File.mtime(listfile)] if curtag == tag return curtag, nil else @@ -1126,8 +1126,8 @@ def self.listingNames(name, dir = nil) else dir = self.svn_parent end - return File.join(dir, "%s.txt" % name), - File.join(dir, "%s.tmp" % name) + return File.join(dir, '%s.txt' % name), + File.join(dir, '%s.tmp' % name) end # Get all the SVN entries diff --git a/lib/whimsy/asf/themes.rb b/lib/whimsy/asf/themes.rb index f20463257e..c55e309f8d 100644 --- a/lib/whimsy/asf/themes.rb +++ b/lib/whimsy/asf/themes.rb @@ -4,7 +4,7 @@ class Wunderbar::HtmlMarkup # DEPRECATED Wrap content with nicer fluid margins - def _whimsy_content colstyle="col-lg-11" + def _whimsy_content colstyle='col-lg-11' _div.content.container_fluid do _div.row do _div class: colstyle do @@ -67,8 +67,8 @@ def _whimsy_nav _nav.navbar.navbar_default do _div.container_fluid do _div.navbar_header do - _button.navbar_toggle.collapsed type: "button", data_toggle: "collapse", data_target: "#navbar_collapse", aria_expanded: "false" do - _span.sr_only "Toggle navigation" + _button.navbar_toggle.collapsed type: 'button', data_toggle: 'collapse', data_target: '#navbar_collapse', aria_expanded: 'false' do + _span.sr_only 'Toggle navigation' _span.icon_bar _span.icon_bar end @@ -76,7 +76,7 @@ def _whimsy_nav _img title: 'Whimsy project home', alt: 'Whimsy hat logo', src: '/whimsy.svg', height: 30 end end - _div.collapse.navbar_collapse id: "navbar_collapse" do + _div.collapse.navbar_collapse id: 'navbar_collapse' do _ul.nav.navbar_nav do _li do _a 'Code', href: 'https://github.com/apache/whimsy/' @@ -90,7 +90,7 @@ def _whimsy_nav end _ul.nav.navbar_nav.navbar_right do _li.dropdown do - _a.dropdown_toggle href: "#", data_toggle: "dropdown", role: "button", aria_haspopup: "true", aria_expanded: "false" do + _a.dropdown_toggle href: '#', data_toggle: 'dropdown', role: 'button', aria_haspopup: 'true', aria_expanded: 'false' do _img title: 'Apache Home', alt: 'Apache feather logo', src: 'https://www.apache.org/img/feather_glyph_notm.png', height: 30 _ ' Apache' _span.caret @@ -150,7 +150,7 @@ def _whimsy_body(title: nil, end end _div.col_md_4 do - _whimsy_panel relatedtitle, style: "panel-default" do + _whimsy_panel relatedtitle, style: 'panel-default' do _ul list_style_position: 'inside' do if related related.each do |url, desc| @@ -206,19 +206,19 @@ def _whimsy_body(title: nil, # @param n unique number of this item (for nav links) # @param itemclass optional panel-success or similar styling def _whimsy_accordion_item(listid: 'accordion', itemid: nil, itemtitle: '', n: 0, itemclass: nil) - raise ArgumentError.new("itemid must not be nil") if not itemid + raise ArgumentError.new('itemid must not be nil') if not itemid args = {id: itemid} args[:class] = itemclass if itemclass _div!.panel.panel_default args do - _div!.panel_heading role: "tab", id: "#{listid}h#{n}" do + _div!.panel_heading role: 'tab', id: "#{listid}h#{n}" do _h4!.panel_title do - _a!.collapsed role: "button", data_toggle: "collapse", aria_expanded: "false", data_parent: "##{listid}", href: "##{listid}c#{n}", aria_controls: "#{listid}c#{n}" do + _a!.collapsed role: 'button', data_toggle: 'collapse', aria_expanded: 'false', data_parent: "##{listid}", href: "##{listid}c#{n}", aria_controls: "#{listid}c#{n}" do _ "#{itemtitle} " _span.glyphicon.glyphicon_chevron_down id: "#{itemid}-nav" end end end - _div!.panel_collapse.collapse id: "#{listid}c#{n}", role: "tabpanel", aria_labelledby: "#{listid}h#{n}" do + _div!.panel_collapse.collapse id: "#{listid}c#{n}", role: 'tabpanel', aria_labelledby: "#{listid}h#{n}" do _div!.panel_body do yield end diff --git a/lib/whimsy/cache.rb b/lib/whimsy/cache.rb index 420e17dbb1..6f9da52b7b 100644 --- a/lib/whimsy/cache.rb +++ b/lib/whimsy/cache.rb @@ -92,7 +92,7 @@ def init_cache(path) begin FileUtils.mkdir_p path Wunderbar.info "Created the cache #{path}" - raise Exception.new("Not writable") unless File.writable?(path) + raise Exception.new('Not writable') unless File.writable?(path) rescue Exception => e Wunderbar.warn "Could not create the cache #{path} - #{e}" @enabled = false diff --git a/lib/whimsy/lockfile.rb b/lib/whimsy/lockfile.rb index 7a758e67e4..8d40cd2874 100644 --- a/lib/whimsy/lockfile.rb +++ b/lib/whimsy/lockfile.rb @@ -98,9 +98,9 @@ def self.lockfile(filename, mode=nil, lockmode=nil) puts ret.inspect if ret if ret.is_a? Errno::EEXIST - puts "Already exists!" + puts 'Already exists!' else - puts "Some other error" + puts 'Some other error' end end puts File.read(name) unless ret diff --git a/lib/whimsy/logparser.rb b/lib/whimsy/logparser.rb index 52838f77f7..1992849463 100755 --- a/lib/whimsy/logparser.rb +++ b/lib/whimsy/logparser.rb @@ -58,7 +58,7 @@ module LogParser TRUNCATE = 6 # Ensure consistency in keys TIME_OFFSET = 10_000_000.0 # Offset milliseconds slightly for array entries # Ignore error lines from other tools with long tracebacks - IGNORE_TRACEBACKS = ["rack.rb", "asf/themes", "phusion_passenger"] + IGNORE_TRACEBACKS = ['rack.rb', 'asf/themes', 'phusion_passenger'] # Read a text or .gz file # @param f filename: .log or .log.gz diff --git a/lib/whimsy/sitewebsite.rb b/lib/whimsy/sitewebsite.rb index c6b392c825..d5cea75b29 100644 --- a/lib/whimsy/sitewebsite.rb +++ b/lib/whimsy/sitewebsite.rb @@ -102,7 +102,7 @@ def display_check(col, sites, analysis, checks, tlp = true) _br _a checks[col][SiteStandards::CHECK_DOC], href: checks[col][SiteStandards::CHECK_POLICY] end - _li.small " Click column badges to sort" + _li.small ' Click column badges to sort' else _span.text_danger %{WARNING: the site checker may not understand type: #{col}, results may not be complete/available.} @@ -153,11 +153,11 @@ def display_overview(sites, analysis, checks, tlp = true) title: "Site Check - All #{tlp ? 'Project' : 'Podling'} Results", helpblock: -> { _ul.list_inline do - _li.small "Data key: " + _li.small 'Data key: ' analysis[1].each do |cls, desc| _li.label desc, class: cls end - _li.small " Click column badges to sort" + _li.small ' Click column badges to sort' end } ) do @@ -202,7 +202,7 @@ def display_overview(sites, analysis, checks, tlp = true) # Display an error page if a suburl we're given isn't supported def display_error(path) _whimsy_panel_table( - title: "ERROR - bad url provided", + title: 'ERROR - bad url provided', helpblock: -> { _a href: '../', aria_label: 'Home to site checker' do _span.glyphicon.glyphicon_home :aria_hidden diff --git a/lib/whimsy/utf8-utils.rb b/lib/whimsy/utf8-utils.rb index 053030570d..3abd96bc85 100755 --- a/lib/whimsy/utf8-utils.rb +++ b/lib/whimsy/utf8-utils.rb @@ -11,8 +11,8 @@ module UTF8Utils # If that does not work, then it tries ISO-8859-1 def self.repair(src, dst, verbose=false) opts = {undef: :replace, invalid: :replace} - ec1 = Encoding::Converter.new('utf8-softbank', "UTF-8", **opts) - ec2 = Encoding::Converter.new('iso-8859-1', "UTF-8", **opts) + ec1 = Encoding::Converter.new('utf8-softbank', 'UTF-8', **opts) + ec2 = Encoding::Converter.new('iso-8859-1', 'UTF-8', **opts) open(dst,'w:utf-8') do |w| open(src,'rb').each do |l| diff --git a/tools/agenda_summary.rb b/tools/agenda_summary.rb index a45b530464..e101f89d51 100755 --- a/tools/agenda_summary.rb +++ b/tools/agenda_summary.rb @@ -15,7 +15,7 @@ # @return stats hash of of various statistics from minutes def summarize_all(dir = BOARD) summaries = Hash.new{|h,k| h[k] = {} } - Dir[File.join(dir, 'archived_agendas', "board_agenda_2*.txt")].sort.each do |f| + Dir[File.join(dir, 'archived_agendas', 'board_agenda_2*.txt')].sort.each do |f| summaries[File.basename(f, '.*')] = ASF::Board::Agenda.summarize(f) end allpmcs = Set.new() @@ -34,9 +34,9 @@ def summarize_all(dir = BOARD) end #### Main method - process default files and output JSON -outfile = "meeting-summary.json" +outfile = 'meeting-summary.json' summaries = summarize_all() -File.open(outfile, "w") do |f| +File.open(outfile, 'w') do |f| f.puts JSON.pretty_generate(summaries) end puts "DONE: emitted #{outfile}" diff --git a/tools/collate_minutes.rb b/tools/collate_minutes.rb index 0ba6cb529c..1fc32e9952 100755 --- a/tools/collate_minutes.rb +++ b/tools/collate_minutes.rb @@ -54,7 +54,7 @@ TIME_DIFF = (ARGV.shift || '300').to_i # Allow override of seconds of time diff (WHIMSY-204) for testing MINUTES_NAME = "board_minutes_#{YYYYMMDD}.txt" -MINUTES_PATH = File.join(SVN_SITE_RECORDS_MINUTES, "*", MINUTES_NAME) +MINUTES_PATH = File.join(SVN_SITE_RECORDS_MINUTES, '*', MINUTES_NAME) Wunderbar.info "Processing minutes matching #{MINUTES_NAME}" @@ -88,7 +88,7 @@ end end -Wunderbar.info "Processing input files" +Wunderbar.info 'Processing input files' # mapping of committee names to canonical names (generally from ldap) canonical = Hash.new {|hash, name| name} @@ -119,7 +119,7 @@ Wunderbar.info "Using #{local_copy}" cinfo = JSON.parse(File.read(local_copy)) else - Wunderbar.info "Fetching remote copy of committee-info.json" + Wunderbar.info 'Fetching remote copy of committee-info.json' response = Net::HTTP.get_response(URI(DATAURI)) response.value() # Raises error if not OK cinfo = JSON.parse(response.body) @@ -141,13 +141,13 @@ $calendar = Nokogiri::HTML(http.request(get).body.gsub('»', '»').gsub(' ', ' ')) # Link to headerlink css -link = Nokogiri::XML::Node.new "link", $calendar +link = Nokogiri::XML::Node.new 'link', $calendar link.set_attribute('rel', 'stylesheet') link.set_attribute('href', 'https://www.apache.org/css/headerlink.css') $calendar.at('head').add_child(link) # add some style -style = Nokogiri::XML::Node.new "style", $calendar +style = Nokogiri::XML::Node.new 'style', $calendar style.content = %{ table { border: 1px solid #ccc; @@ -728,7 +728,7 @@ def name_changes(title) end if DUMP_PENDING - puts "Dump of pending data for " + date + puts 'Dump of pending data for ' + date pending.each do |k,v| puts "#{k} #{k == v.attach ? '==' : '!='} #{v.attach}" puts v.title @@ -756,13 +756,13 @@ def name_changes(title) end if DUMP_AGENDA - puts "Dump of agenda data for this run" + puts 'Dump of agenda data for this run' agenda.each do |title, reports| p [reports.length > 1 ? '>1' : '=1', reports.last.attach[0..1], reports.length, title] end end -Wunderbar.info "Starting to generate output" +Wunderbar.info 'Starting to generate output' # determine link for each report link = {} @@ -786,7 +786,7 @@ def layout(title = nil) $calendar.at('title').content = "Board Meeting Minutes - #{title}" # $calendar.at('h2').content = "Board Meeting Minutes - #{title}" else - $calendar.at('title').content = "Board Meeting Minutes" + $calendar.at('title').content = 'Board Meeting Minutes' # $calendar.at('h2').content = "Board Meeting Minutes" end @@ -811,7 +811,7 @@ def layout(title = nil) x.text! "Last run: #{STAMP}. The data is extracted from a list of" end x.a 'minutes', :href => 'http://www.apache.org/foundation/records/minutes/' - x.text! "which have been approved by the Board." + x.text! 'which have been approved by the Board.' x.br x.strong 'Please Note' # squiggly heredoc causes problems for Eclipse plugin, but leading spaces don't matter here @@ -876,13 +876,13 @@ def remove_date(page) _id = report.meeting.gsub('_', '-') x.h2 id: _id do if report.posted - href = "http://apache.org/foundation/records/minutes/" + + href = 'http://apache.org/foundation/records/minutes/' + "#{report.meeting[0...4]}/board_minutes_#{report.meeting}.txt" else href = ASF::SVN.svnpath!('foundation_board', "board_minutes_#{report.meeting}.txt") end - x.a Date.parse(report.meeting.gsub('_','/')).strftime("%d %b %Y"), + x.a Date.parse(report.meeting.gsub('_','/')).strftime('%d %b %Y'), href: href, id: "minutes_#{report.meeting}" if report.owners x.span "[#{report.owners}]", :style => 'font-size: 14px' @@ -893,8 +893,8 @@ def remove_date(page) x.h3 report.subtitle if report.subtitle if report.posted - text = report.text.gsub(/^\t+/) {|tabs| " " * (8*tabs.length)} - text.gsub!(/ *$/, "") + text = report.text.gsub(/^\t+/) {|tabs| ' ' * (8*tabs.length)} + text.gsub!(/ *$/, '') indent = text.scan(/^([ ]+)/).flatten.min.to_s.length - 1 text.gsub! /^#{' '*indent}/, '' if indent > 0 text = $1 + text if text =~ /\A\w.*\n(\s+)/ @@ -904,7 +904,7 @@ def remove_date(page) if report.comments and report.comments.strip != '' report.comments.split(/\n\s*\n/).each do |p| - x.p p, :style => "width: 40em" + x.p p, :style => 'width: 40em' end elsif text.strip.empty? if report.subtitle and not report.subtitle.empty? @@ -949,7 +949,7 @@ def remove_date(page) # output index agenda = agenda.sort_by {|title, reports| title.downcase} page = layout do |x| - x.h2 "Executive Officer Reports", :id => 'executive' + x.h2 'Executive Officer Reports', :id => 'executive' x.ul do agenda.each do |title, reports| next unless reports.last.attach =~ /^\*/ @@ -959,7 +959,7 @@ def remove_date(page) end end end - x.h2 "Additional Officer Reports", :id => 'officer' + x.h2 'Additional Officer Reports', :id => 'officer' x.ul do agenda.each do |title, reports| next unless reports.last.attach =~ /^\d/ @@ -969,7 +969,7 @@ def remove_date(page) end end end - x.h2 "Committee Reports", :id => 'committee' + x.h2 'Committee Reports', :id => 'committee' list = [] agenda.each do |title, reports| next unless reports.last.attach =~ /^[A-Z]/ @@ -1001,7 +1001,7 @@ def remove_date(page) end end end - x.h2 "Podling Reports", :id => 'podling' + x.h2 'Podling Reports', :id => 'podling' list = [] agenda.each do |title, reports| next unless reports.last.attach =~ /^[.]/ @@ -1034,7 +1034,7 @@ def remove_date(page) end end end - x.h2 "Repeating Special Orders", :id => 'orders' + x.h2 'Repeating Special Orders', :id => 'orders' x.ul do agenda.each do |title, reports| next unless reports.last.attach =~ /^@/ @@ -1044,7 +1044,7 @@ def remove_date(page) end end end - x.h2 "Other Attachments, Special Orders, and Discussions", :id => 'other' + x.h2 'Other Attachments, Special Orders, and Discussions', :id => 'other' x.ul do other = {} agenda.each do |title, reports| @@ -1058,7 +1058,7 @@ def remove_date(page) end end end - x.h2 "Other Agenda Items", :id => 'agenda' + x.h2 'Other Agenda Items', :id => 'agenda' x.ul do agenda.each do |title, reports| next unless reports.last.attach =~ /^\+/ diff --git a/tools/comdevtalks.rb b/tools/comdevtalks.rb index fb935b6393..58bbdeeba2 100644 --- a/tools/comdevtalks.rb +++ b/tools/comdevtalks.rb @@ -15,12 +15,12 @@ def parse_talks(dir = COMDEVDIR) talks = {} submitters = {} - Dir[File.join(dir, "*.yaml")].each do |fname| + Dir[File.join(dir, '*.yaml')].each do |fname| begin if fname =~ /_/ - talks[File.basename(fname, ".*")] = YAML.safe_load(File.read(fname)) + talks[File.basename(fname, '.*')] = YAML.safe_load(File.read(fname)) elsif fname !~ /SKIPFILE/ - submitters[File.basename(fname, ".*")] = YAML.safe_load(File.read(fname)) + submitters[File.basename(fname, '.*')] = YAML.safe_load(File.read(fname)) end rescue Exception => e puts "Bogosity! analyzing #{fname} raised #{e.message[0..255]}" @@ -36,90 +36,90 @@ 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." \ + '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 and how does it work?\n\nLearn the core behaviors that make up the Apache Way, " \ - "and how they are used in successful Apache projects from core technologies, to big data, to " \ + 'and how they are used in successful Apache projects from core technologies, to big data, to ' \ "user facing projects.\n\nThe behaviors in the Apache Way are required for all Apache projects, " \ - "but can be simply used by any open source projects. Distributed " \ - "decision making, open communication, do-ocracy, and diverse communities are the cornerstones." \ + 'but can be simply used by any open source projects. Distributed ' \ + 'decision making, open communication, do-ocracy, and diverse communities are the cornerstones.' \ "\n\nBenefit from the experience of over 5,000 Apache committers and 170 successful projects by " \ "applying these behaviors and techniques in your own projects! \n", - "audience" => "Community managers, developers, project managers involved with FOSS projects.", - "slides" => "http://shaneslides.com/apachecon/TheApacheWay-Intro-ApacheConNA2017.html", - "video" => "https://www.youtube.com/watch?v=hpAv54KIgK8", - "topics" => ["apacheway", "community"], - "present_at" => ["http://apachecon.com/2017"], - "present_date" => "2017-05-16" + 'audience' => 'Community managers, developers, project managers involved with FOSS projects.', + 'slides' => 'http://shaneslides.com/apachecon/TheApacheWay-Intro-ApacheConNA2017.html', + 'video' => 'https://www.youtube.com/watch?v=hpAv54KIgK8', + 'topics' => ['apacheway', 'community'], + 'present_at' => ['http://apachecon.com/2017'], + 'present_date' => '2017-05-16' }, - "Committed_To_The_Apache_Way" => { - "title" => "Committed To The Apache Way", - "teaser" => "Learn how being involved in an Apache project is not just about code.", - "submitter" => "sharan", - "speakers" => ["sharan"], - "abstract" => "'To be committed' is a strange phrase. In the past it was used to describe people who were sent " \ + 'Committed_To_The_Apache_Way' => { + 'title' => 'Committed To The Apache Way', + 'teaser' => 'Learn how being involved in an Apache project is not just about code.', + 'submitter' => 'sharan', + 'speakers' => ['sharan'], + 'abstract' => "'To be committed' is a strange phrase. In the past it was used to describe people who were sent " \ "to mental institutions or 'facilities'. Fast forward to today and words like committed and " \ - "commitment are used throughout the Open Source world. Are we all a little crazy? - Perhaps!" \ + 'commitment are used throughout the Open Source world. Are we all a little crazy? - Perhaps!' \ "\n\nIn this presentation Sharan shares her thoughts and experiences about being a Committer, " \ "life at the ASF (facility) and how not being able to code is still OK.\n", - "audience" => "Community managers, developers, project managers involved with FOSS projects.", + 'audience' => 'Community managers, developers, project managers involved with FOSS projects.', # 404 "slides" => "http://events.linuxfoundation.org/sites/events/files/slides/Commited%20to%20Apache.pdf", - "slides" => nil, - "video" => "https://www.youtube.com/watch?v=vT-kxmoLs5k&index=25&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp", - "topics" => ["community", "contributors"], - "present_at" => ["http://apachecon.com/2017"], - "present_date" => "2017-05-16" + 'slides' => nil, + 'video' => 'https://www.youtube.com/watch?v=vT-kxmoLs5k&index=25&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp', + 'topics' => ['community', 'contributors'], + 'present_at' => ['http://apachecon.com/2017'], + 'present_date' => '2017-05-16' }, - "From_Dev_To_User" => { - "title" => "From dev@ to user@ to the Apache Way", - "teaser" => "The story of how an existing project community improved by coming to Apache.", - "submitter" => "sblackmon", - "speakers" => ["sblackmon"], - "abstract" => "This talk will cover the journey of Apache Streams (incubating) beyond a solution solely " \ - "by and for java developers, toward a solution that can provide value for anyone, anywhere " \ - "along the experience spectrum, regardless of technical preferences. " \ + 'From_Dev_To_User' => { + 'title' => 'From dev@ to user@ to the Apache Way', + 'teaser' => 'The story of how an existing project community improved by coming to Apache.', + 'submitter' => 'sblackmon', + 'speakers' => ['sblackmon'], + 'abstract' => 'This talk will cover the journey of Apache Streams (incubating) beyond a solution solely ' \ + 'by and for java developers, toward a solution that can provide value for anyone, anywhere ' \ + 'along the experience spectrum, regardless of technical preferences. ' \ "We'll share feedback that served as concentrate focus on mission and usability. " \ "\n\nWe'll walk through some of the improvements made to project code and tooling (maven), " \ - "documentation (website, examples), and usability (command line interface, maven plugins, " \ - "zeppelin support, network APIs) to move the project from dev@ to user@, and the " \ + 'documentation (website, examples), and usability (command line interface, maven plugins, ' \ + 'zeppelin support, network APIs) to move the project from dev@ to user@, and the ' \ "opportunities we see to increase usability and relevance still further.\n", - "audience" => "Community managers, developers, project managers involved with FOSS projects.", + 'audience' => 'Community managers, developers, project managers involved with FOSS projects.', # 404 "slides" => "http://events.linuxfoundation.org/sites/events/files/slides/ApacheConNA2017-Blackmon.pdf", - "slides" => nil, - "video" => "https://www.youtube.com/watch?v=E9A54x6af8o&index=27&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp", - "topics" => ["incubator", "apacheway"], - "present_at" => ["http://apachecon.com/2017"], - "present_date" => "2017-05-16" + 'slides' => nil, + 'video' => 'https://www.youtube.com/watch?v=E9A54x6af8o&index=27&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp', + 'topics' => ['incubator', 'apacheway'], + 'present_at' => ['http://apachecon.com/2017'], + 'present_date' => '2017-05-16' }, - "Tale_Of_Two_Developers" => { - "title" => "A Tale of Two Developers: Finding Harmony Between Commercial Software Development and the Apache Way", - "teaser" => "Learn from the real-life lunchtime dialog between an experienced Apache committer and a new coder.", - "submitter" => "wang", - "speakers" => ["wang", "Alex Leblang"], - "abstract" => "Apache community members can reference tenets from the Apache Way such as \u201Ccommunity over " \ + 'Tale_Of_Two_Developers' => { + 'title' => 'A Tale of Two Developers: Finding Harmony Between Commercial Software Development and the Apache Way', + 'teaser' => 'Learn from the real-life lunchtime dialog between an experienced Apache committer and a new coder.', + 'submitter' => 'wang', + 'speakers' => ['wang', 'Alex Leblang'], + 'abstract' => "Apache community members can reference tenets from the Apache Way such as \u201Ccommunity over " \ "code\u201D and \u201Copenness\u201D as if it were second nature. While they may sound simple, " \ - "these concepts can be foreign to developers coming to open source for the first time. " \ - "Success as an Apache contributor stresses skills not emphasized in other types of software " \ - "development, including reconciling the requirements of the upstream development process with " \ + 'these concepts can be foreign to developers coming to open source for the first time. ' \ + 'Success as an Apache contributor stresses skills not emphasized in other types of software ' \ + 'development, including reconciling the requirements of the upstream development process with ' \ "the realities of running a commercial software business.\n\n" \ - "With the assistance of choreographed Socratic dialogue, our two protagonists, an experienced " \ - "Apache committer and an enthusiastic young gun contributor, explore the tensions of working on " \ - "an Apache project as employees of a for-profit company. The audience will learn practical " \ - "advice and problem solving techniques for working effectively as part of an Apache community. " \ - "By the end, our greenhorn comes to understand that the yin and yang of commercial software " \ + 'With the assistance of choreographed Socratic dialogue, our two protagonists, an experienced ' \ + 'Apache committer and an enthusiastic young gun contributor, explore the tensions of working on ' \ + 'an Apache project as employees of a for-profit company. The audience will learn practical ' \ + 'advice and problem solving techniques for working effectively as part of an Apache community. ' \ + 'By the end, our greenhorn comes to understand that the yin and yang of commercial software ' \ "development and the Apache Way can exist in harmony.\n\nOur talk contextualizes the Apache Way " \ - "for developers who are paid to work on open-source full-time, drawn from our real-world " \ - "experience working at Cloudera. " \ - "This is presented through a series of short vignettes accompanied by intervening discussion and " \ - "review slides. Tenets of the Apache Way like meritocracy, community, and hats are introduced " \ - "and referred to throughout as the backbone to building strong open-source communities. " \ - "We examine the tension between corporate pressures and open-source, emphasizing the underlying " \ + 'for developers who are paid to work on open-source full-time, drawn from our real-world ' \ + 'experience working at Cloudera. ' \ + 'This is presented through a series of short vignettes accompanied by intervening discussion and ' \ + 'review slides. Tenets of the Apache Way like meritocracy, community, and hats are introduced ' \ + 'and referred to throughout as the backbone to building strong open-source communities. ' \ + 'We examine the tension between corporate pressures and open-source, emphasizing the underlying ' \ "value that companies gain from open-source software.\n\n" \ "Our two main characters are:\n* Alex, an energetic young developer who is new to open source " \ "but not to development. Excited to get stuff done on this new project.\n* Andrew, a long-time " \ @@ -128,75 +128,75 @@ def get_talks_submitters() "Alex as someone getting started as a new contributor\n* Act 2: How to build consensus when " \ "there's conflict (e.g. someone -1's your patch), public communication, demonstrating merit " \ "and the path to committership\n* Act 3: No jerks allowed. Andrew does a heel turn and is " \ - "ruling the project with an iron fist, Alex intervenes in a " \ - "come-to-jesus/student-becomes-the-teacher moment. Re-emphasize the importance of community, " \ + 'ruling the project with an iron fist, Alex intervenes in a ' \ + 'come-to-jesus/student-becomes-the-teacher moment. Re-emphasize the importance of community, ' \ "and how dictators are bad for projects.\n", - "audience" => "Community managers, developers, project managers involved with FOSS projects.", - "slides" => nil, - "video" => "https://www.youtube.com/watch?v=ea_9qkaTeVw&index=26&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp", - "topics" => ["apacheway", "developers"], - "present_at" => ["http://apachecon.com/2017"], - "present_date" => "2017-05-16" + 'audience' => 'Community managers, developers, project managers involved with FOSS projects.', + 'slides' => nil, + 'video' => 'https://www.youtube.com/watch?v=ea_9qkaTeVw&index=26&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp', + 'topics' => ['apacheway', 'developers'], + 'present_at' => ['http://apachecon.com/2017'], + 'present_date' => '2017-05-16' } } 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 " \ + '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, and we have cats. Shane blogs at " \ + 'a Member of the ASF, a baker, and a punny guy. Oh, and we have cats. Shane blogs at ' \ "http://communityovercode.com/ and regularly speaks on FOSS governance and branding topics.\n" }, - "README" => { - "title" => "Talk Title: Strings with colons must be quoted", - "teaser" => "Teaser is one sentence for use on session grids or tweets or the like (where supported).", - "submitter" => "curcuru", - "speakers" => ["curcuru", "Court Jester"], - "abstract" => "Abstracts are the full description of a talk, session, or panel that has already been presented." \ + 'README' => { + 'title' => 'Talk Title: Strings with colons must be quoted', + 'teaser' => 'Teaser is one sentence for use on session grids or tweets or the like (where supported).', + 'submitter' => 'curcuru', + 'speakers' => ['curcuru', 'Court Jester'], + 'abstract' => 'Abstracts are the full description of a talk, session, or panel that has already been presented.' \ "\n\nAbstracts may have line breaks, and some systems may allow **formatting** or the like.\n\n" \ - "Using the YAML pipe \"|\" character for a literal multiline scalar means linebreaks are " \ + 'Using the YAML pipe "|" character for a literal multiline scalar means linebreaks are ' \ "preserved in the abstract. \n", - "audience" => "Brief description of the expected audience for this talk.", - "slides" => "URL.to/posted-slides", - "video" => "URL.to/posted-video?if-any", - "present_at" => ["URL.to/last-conference-presented-at"], - "present_date" => "2017-05-16" + 'audience' => 'Brief description of the expected audience for this talk.', + 'slides' => 'URL.to/posted-slides', + 'video' => 'URL.to/posted-video?if-any', + 'present_at' => ['URL.to/last-conference-presented-at'], + 'present_date' => '2017-05-16' }, - "sblackmon" => { - "name" => "Steve Blackmon", - "website" => nil, - "twitter" => "steveblackmon", - "facebook" => nil, - "bio" => "VP Technology at People Pattern, previously Director of Data Science at W2O Group, co-founder of " \ - "Ravel, stints at Boeing, Lockheed Martin, and Accenture. Committer and PMC for Apache Streams " \ - "(incubating). " \ + 'sblackmon' => { + 'name' => 'Steve Blackmon', + 'website' => nil, + 'twitter' => 'steveblackmon', + 'facebook' => nil, + 'bio' => 'VP Technology at People Pattern, previously Director of Data Science at W2O Group, co-founder of ' \ + 'Ravel, stints at Boeing, Lockheed Martin, and Accenture. Committer and PMC for Apache Streams ' \ + '(incubating). ' \ "Experienced user of Spark, Storm, Hadoop, Pig, Hive, Nutch, Cassandra, Tinkerpop, and more.\n" }, - "sharan" => { - "name" => "Sharan Foga", - "website" => nil, - "twitter" => nil, - "facebook" => nil, - "bio" => "Sharan Foga have been involved with the ASF since 2008 and has presented at previous Apachecons " \ - "(Vancouver 2016, Budapest 2015 & 2014). She enjoys working on community management and related areas " \ + 'sharan' => { + 'name' => 'Sharan Foga', + 'website' => nil, + 'twitter' => nil, + 'facebook' => nil, + 'bio' => 'Sharan Foga have been involved with the ASF since 2008 and has presented at previous Apachecons ' \ + '(Vancouver 2016, Budapest 2015 & 2014). She enjoys working on community management and related areas ' \ "and is a Committer and PMC Member for Apache OFBiz and Community Development.\n" }, - "wang" => { - "name" => "Andrew Wang", - "website" => "http://umbrant.com/", - "twitter" => nil, - "facebook" => nil, - "bio" => "Andrew Wang is a software engineer at Cloudera on the HDFS team, where he has worked on projects " \ - "including in-memory caching, transparent encryption, and erasure coding. Previously, he was a PhD " \ - "student in the AMP Lab at UC Berkeley, where he worked on problems related to distributed systems " \ - "and warehouse-scale computing. He is a committer and PMC member on the Apache Hadoop project, a " \ - "committer on Apache Kudu (incubating), and holds masters and bachelors degrees in computer science " \ - "from UC Berkeley and UVa respectively. Andrew has spoken at conferences including Hadoop Summit EU, " \ + 'wang' => { + 'name' => 'Andrew Wang', + 'website' => 'http://umbrant.com/', + 'twitter' => nil, + 'facebook' => nil, + 'bio' => 'Andrew Wang is a software engineer at Cloudera on the HDFS team, where he has worked on projects ' \ + 'including in-memory caching, transparent encryption, and erasure coding. Previously, he was a PhD ' \ + 'student in the AMP Lab at UC Berkeley, where he worked on problems related to distributed systems ' \ + 'and warehouse-scale computing. He is a committer and PMC member on the Apache Hadoop project, a ' \ + 'committer on Apache Kudu (incubating), and holds masters and bachelors degrees in computer science ' \ + 'from UC Berkeley and UVa respectively. Andrew has spoken at conferences including Hadoop Summit EU, ' \ "Strata NYC, Strata London, HBaseCon, ACM SoCC, and USENIX HotCloud.\n" } } @@ -208,13 +208,13 @@ def get_talks_submitters() # Main method for command line use if __FILE__ == $PROGRAM_NAME dir = COMDEVDIR - outfile = File.join(dir, "comdevtalks.json") + outfile = File.join(dir, 'comdevtalks.json') puts "BEGIN: Parsing YAMLs in #{dir}" talks, submitters = parse_talks dir results = {} results['talks'] = talks results['submitters'] = submitters - File.open(outfile, "w") do |f| + File.open(outfile, 'w') do |f| f.puts JSON.pretty_generate(results) end puts talks diff --git a/tools/download_check.rb b/tools/download_check.rb index 27ab7568e7..258f88a7b7 100755 --- a/tools/download_check.rb +++ b/tools/download_check.rb @@ -65,13 +65,13 @@ def init @fails = 0 if $NO_CHECK_LINKS $NOFOLLOW = true - I "Will not check links" + I 'Will not check links' elsif $ALWAYS_CHECK_LINKS - I "Will check links even if download page has errors" + I 'Will check links even if download page has errors' else - I "Will check links if download page has no errors" + I 'Will check links if download page has no errors' end - I "Will %s archive.apache.org links in checks" % ($ARCHIVE_CHECK ? 'include' : 'not include') + I 'Will %s archive.apache.org links in checks' % ($ARCHIVE_CHECK ? 'include' : 'not include') end # save the result of a test @@ -138,11 +138,11 @@ def displayHTML end if @fails > 0 - showList(fatals, "Fatal errors:") - showList(errors, "Errors:") + showList(fatals, 'Fatal errors:') + showList(errors, 'Errors:') end - showList(warns, "Warnings:") + showList(warns, 'Warnings:') _h2_ 'Tests performed' _ol do @@ -155,7 +155,7 @@ def check_url(url) uri = URI.parse(url) unless uri.scheme W "No scheme for URL #{url}, assuming http" - uri = URI.parse("http:" + url) + uri = URI.parse('http:' + url) end return uri if %w{http https}.include? uri.scheme raise ArgumentError.new("Unexpected url: #{url}") @@ -245,8 +245,8 @@ def check_hash_loc(h, tlp) tlpQE = Regexp.escape(tlp) # in case of meta-chars tlpQE = "(?:ooo|#{tlpQE})" if tlp == 'openoffice' tlpQE = "(?:lucene|#{tlpQE})" if tlp == 'solr' # temporary override - tlpQE = "(?:tubemq|inlong)" if tlp == 'inlong' # renamed - tlpQE = "(?:hadoop/)?ozone" if tlp == 'ozone' # moved + tlpQE = '(?:tubemq|inlong)' if tlp == 'inlong' # renamed + tlpQE = '(?:hadoop/)?ozone' if tlp == 'ozone' # moved if h =~ %r{^(https?)://(?:(archive|www)\.)?apache\.org/dist/(?:incubator/)?#{tlpQE}/.*?([^/]+)\.(\w{3,6})$} WE "HTTPS! #{h}" unless $1 == 'https' return $2 || '', $3, $4 # allow for no host before apache.org @@ -274,7 +274,7 @@ def get_links(path, body, checkSpaces=false) doc = Nokogiri::HTML(body) nodeset = doc.css('a[href]') # Get anchors w href attribute via css nodeset.map { |node| - tmp = node.attribute("href").to_s + tmp = node.attribute('href').to_s href = tmp.strip if checkSpaces && tmp != href W "Spurious space(s) in '#{tmp}'" @@ -404,10 +404,10 @@ def _checkDownloadPage(path, tlp, version) W "Found reference to NIGHTLY or SNAPSHOT docs?: #{n}" else # ignore trafficcontrol bugfix message - unless n.include? "Fixed TO log warnings when generating snapshots" or - n.include? "Kafka Raft support for snapshots" or - n.include? "zkSnapshotC" or # ZooKeepeer - n.include? "/issues.apache.org/jira/browse/" # Daffodil + unless n.include? 'Fixed TO log warnings when generating snapshots' or + n.include? 'Kafka Raft support for snapshots' or + n.include? 'zkSnapshotC' or # ZooKeepeer + n.include? '/issues.apache.org/jira/browse/' # Daffodil W "Found reference to NIGHTLY or SNAPSHOT builds: #{n}" end end @@ -437,12 +437,12 @@ def _checkDownloadPage(path, tlp, version) end if $CLI - puts "Checking link syntax" + puts 'Checking link syntax' links.each do |h, t| if h =~ %r{^([a-z]{3,6})://} - W "scheme? %s %s" % [h, t] unless %w(http https).include? $1 + W 'scheme? %s %s' % [h, t] unless %w(http https).include? $1 else - W "syntax? %s %s" % [h, t] unless h.start_with? '//' + W 'syntax? %s %s' % [h, t] unless h.start_with? '//' end end end @@ -607,7 +607,7 @@ def _checkDownloadPage(path, tlp, version) $vercheck.each do |k, w| v = w.dup typ = v.shift - unless v.include? "asc" and v.any? {|e| e =~ /^sha\d+$/ or e == 'md5' or e == 'sha' or e == 'mds'} + unless v.include? 'asc' and v.any? {|e| e =~ /^sha\d+$/ or e == 'md5' or e == 'sha' or e == 'mds'} if typ == 'live' E "#{k} missing sig/hash: (found only: #{v.inspect})" elsif typ == 'archive' || typ == 'maven' # Maven does not include recent hash types; so warn only @@ -620,13 +620,13 @@ def _checkDownloadPage(path, tlp, version) end if @fails > 0 and not $ALWAYS_CHECK_LINKS - W "** Not checking links **" + W '** Not checking links **' $NOFOLLOW = true end # Still check links if versions not seen if $versions.size == 0 - E "Could not detect any artifact versions -- perhaps it needs JavaScript?" + E 'Could not detect any artifact versions -- perhaps it needs JavaScript?' end # Check if the links can be read @@ -834,31 +834,31 @@ def doPost(options) checkDownloadPage(url, tlp, version) # display the test results as text - puts "" - puts "=================" - puts "" + puts '' + puts '=================' + puts '' @tests.each { |t| t.map {|k, v| puts "#{k}: - #{v}"}} - puts "" + puts '' testentries(:W).each { |t| t.map {|k, v| puts "#{k}: - #{v}"}} testentries(:E).each { |t| t.map {|k, v| puts "#{k}: - #{v}"}} testentries(:F).each { |t| t.map {|k, v| puts "#{k}: - #{v}"}} - puts "" + puts '' # Only show in CLI version for now - puts "Version summary" + puts 'Version summary' $versions.sort.each do |k, v| puts k v.sort.each do |l, w| puts " #{l} #{w}" end end - puts "" + puts '' if @fails > 0 puts "NAK: #{url} had #{@fails} errors" else puts "OK: #{url} passed all the tests" end - puts "" + puts '' end diff --git a/tools/fixroster.rb b/tools/fixroster.rb index bb7b714843..1f1ae85438 100644 --- a/tools/fixroster.rb +++ b/tools/fixroster.rb @@ -3,7 +3,7 @@ # Script to normalise committee-info.txt so there are at least 2 spaces between fields in PMC section # Default to UTF-8 for IO -ENV['LANG'] ||= "en_US.UTF-8" +ENV['LANG'] ||= 'en_US.UTF-8' Encoding.default_external = Encoding::UTF_8 Encoding.default_internal = Encoding::UTF_8 @@ -50,5 +50,5 @@ end end - puts "Done" + puts 'Done' end \ No newline at end of file diff --git a/tools/iclasort.rb b/tools/iclasort.rb index c767b81e2d..6048ed3baf 100644 --- a/tools/iclasort.rb +++ b/tools/iclasort.rb @@ -14,7 +14,7 @@ if source == sorted puts 'no change' else - puts "Writing sorted file" + puts 'Writing sorted file' File.write(iclas, sorted) system 'svn', 'diff', iclas end diff --git a/tools/mboxhdr2csv.rb b/tools/mboxhdr2csv.rb index c6babc786b..e093ee2523 100644 --- a/tools/mboxhdr2csv.rb +++ b/tools/mboxhdr2csv.rb @@ -362,9 +362,9 @@ def mbox2stats(f) # Side effect: writes out f.chomp(ext).json files # @note writes string VERSION for differentiating from other *.json def scan_dir_mbox2stats(dir, ext = MBOX_EXT) - Dir[File.join(dir, "**", "*#{ext}")].sort.each do |f| + Dir[File.join(dir, '**', "*#{ext}")].sort.each do |f| mails, errs = mbox2stats(f) - File.open("#{f.chomp(ext)}.json", "w") do |fout| + File.open("#{f.chomp(ext)}.json", 'w') do |fout| fout.puts JSON.pretty_generate([VERSION, mails, errs]) end end @@ -377,7 +377,7 @@ def scan_dir_mbox2stats(dir, ext = MBOX_EXT) def scan_dir_stats2csv(dir, outname, ext = '.json') errors = [] jzons = [] - Dir[File.join(dir, "**", "*#{ext}")].sort.each do |f| + Dir[File.join(dir, '**', "*#{ext}")].sort.each do |f| begin tmp = JSON.parse(File.read(f)) if tmp[0].kind_of?(String) && tmp[0].start_with?(VERSION) @@ -393,7 +393,7 @@ def scan_dir_stats2csv(dir, outname, ext = '.json') puts "#{__method__} processing #{jzons.length} mbox json files" # Write out headers and the first array in new csv csvfile = File.join(dir, outname) - csv = CSV.open(csvfile, "w", headers: %w( year month day weekday hour zone listid who subject lines links committer messageid inreplyto ), write_headers: true) + csv = CSV.open(csvfile, 'w', headers: %w( year month day weekday hour zone listid who subject lines links committer messageid inreplyto ), write_headers: true) jzons.shift[0].each do |m| csv << [ m['y'], m['m'], m['d'], m['w'], m['h'], m['z'], m['listid'], m['who'], m['subject'], m['lines'], m['links'], m['committer'], m['messageid'], m['inreplyto'] ] end @@ -432,7 +432,7 @@ def optparse opts.on('-oOUTPUT.CSV', '--output OUTPUT.CSV', "Filename to output rows into; default #{DEFAULT_OUTPUT}") do |o| options[:output] = o end - opts.on('-j', '--json', "Process .mbox to .json (optional)") do + opts.on('-j', '--json', 'Process .mbox to .json (optional)') do options[:json] = true end begin @@ -463,5 +463,5 @@ def optparse puts "ERROR: #{e}" end end - puts "END" + puts 'END' end diff --git a/tools/mirror_check.rb b/tools/mirror_check.rb index a631e803ed..6271c0c24b 100755 --- a/tools/mirror_check.rb +++ b/tools/mirror_check.rb @@ -109,7 +109,7 @@ def getHTTPHdrs(url) http.request(request) end -def check_redirect(base, page, expectedLocation, severity=:W, expectedStatus = "302", log=true) +def check_redirect(base, page, expectedLocation, severity=:W, expectedStatus = '302', log=true) path = base + page response = getHTTPHdrs(path) if response.code != expectedStatus @@ -124,7 +124,7 @@ def check_redirect(base, page, expectedLocation, severity=:W, expectedStatus = " response end -def check_CT(base, page, severity=:E, expectedStatus = "200") +def check_CT(base, page, severity=:E, expectedStatus = '200') path = base + page response = getHTTPHdrs(path) if response.code != expectedStatus @@ -151,7 +151,7 @@ def getHTTP(url) end # check page can be read => body -def check_page(base, page, severity=:E, expectedStatus="200", log=true) +def check_page(base, page, severity=:E, expectedStatus='200', log=true) path = base + page response = getHTTP(path) code = response.code || '?' @@ -276,9 +276,9 @@ def checkHTTP(base) body = check_page(base, '') checkHdrFtr(base, body) if %r{<(img|IMG) (src|SRC)="/icons/}.match(body) - I "Index page has icons as expected" + I 'Index page has icons as expected' else - W "Missing or unexpected img icon tags" + W 'Missing or unexpected img icon tags' end checkIndex(body, :tlps) @@ -286,7 +286,7 @@ def checkHTTP(base) checkHdrFtr(base+'incubator/', ibody) checkIndex(ibody, :podlings) - check_page(base, 'harmony/', :E, expectedStatus="404") + check_page(base, 'harmony/', :E, expectedStatus='404') zbody = check_page(base, HTTPDIR) # Not sure this is useful on its own anymore @@ -310,7 +310,7 @@ def checkHTTP(base) W "Index page for #{HTTPDIR} does not contain the expected footer text" end - check_page(base,HTTP404,:E, expectedStatus="404") + check_page(base,HTTP404,:E, expectedStatus='404') # Check that archives don't have Content-Encoding MIRRORTEST_FILES.each do |file| @@ -326,8 +326,8 @@ def init end def setup - tlps = parseIndexPage(check_page('https://downloads.apache.org/','',:F,"200",log=false)) - podlings = parseIndexPage(check_page('https://downloads.apache.org/incubator/','',:F,"200",false)) + tlps = parseIndexPage(check_page('https://downloads.apache.org/','',:F,'200',log=false)) + podlings = parseIndexPage(check_page('https://downloads.apache.org/incubator/','',:F,'200',false)) @pages = {:tlps => tlps, :podlings => podlings} end @@ -356,9 +356,9 @@ def display end if @fails > 0 - showList(fatals, "Fatal errors:") - showList(errors, "Errors:") - showList(warns, "Warnings:") + showList(fatals, 'Fatal errors:') + showList(errors, 'Errors:') + showList(warns, 'Warnings:') # Cannot easily copy/paste URLs; use layout suitable for copy/paste into e.g. JIRA issue/e-mail _p do _ 'Please see the Apache mirror configuration instructions [1] for further details on configuring your mirror server.' @@ -385,7 +385,7 @@ def doPost(url) if __FILE__ == $0 init - url = ""+ARGV[0] || "localhost" # easier to test in an IDE + url = ''+ARGV[0] || 'localhost' # easier to test in an IDE checkHTTP(url) # display the test results @tests.each { |t| t.map{|k, v| puts "#{k}: - #{v}"}} diff --git a/tools/mkconf.rb b/tools/mkconf.rb index a7178a50b7..1963e2c690 100755 --- a/tools/mkconf.rb +++ b/tools/mkconf.rb @@ -22,11 +22,11 @@ # EOF -conf.sub! 'SetEnv HOME /var/www',"""SetEnv HOME /var/www +conf.sub! 'SetEnv HOME /var/www',''"SetEnv HOME /var/www # to agree with Dockerfile (ensure svn does not complain) SetEnv LANG C.UTF-8 -SetEnv LC_ALL C.UTF-8""" +SetEnv LC_ALL C.UTF-8"'' conf.sub! 'VirtualHost *:443', 'VirtualHost *:80' conf.sub! /ServerName whimsy(.*?)\.apache\.org/, 'ServerName whimsy.local' @@ -41,7 +41,7 @@ conf.gsub! /\n\s*SSL.*/, '' conf.gsub! /\n\s*## SSL.*/, '' -conf.gsub! "SetEnv HTTPS", "# SetEnv HTTPS" +conf.gsub! 'SetEnv HTTPS', '# SetEnv HTTPS' conf.gsub! '/x1/srv/whimsy', '/srv/whimsy' @@ -57,7 +57,7 @@ conf.gsub! /AuthLDAPBindDN .*/, 'AuthLDAPBindDN <%= ldapbinddn %>' conf.gsub! /AuthLDAPBindPassword .*/, 'AuthLDAPBindPassword "<%= ldapbindpw %>"' -appendix="""# Needs libapache2-mod-svn to be installed +appendix=''"# Needs libapache2-mod-svn to be installed # These are separate repos, as per the real ones DAV svn @@ -77,11 +77,11 @@ SetOutputFilter DEFLATE -""" +"'' conf.sub! '', appendix -conf.gsub! %r{ $}, "" # Trailing spaces +conf.gsub! %r{ $}, '' # Trailing spaces if ARGV.empty? puts conf diff --git a/tools/moderationhelper.rb b/tools/moderationhelper.rb index a57a7f4f13..01046ade2a 100755 --- a/tools/moderationhelper.rb +++ b/tools/moderationhelper.rb @@ -62,7 +62,7 @@ end _p do _span.text_danger 'BETA SOFTWARE: double-check the command first. ' - _a "Feedback welcome!", href: "mailto:dev@whimsical.apache.org?Subject=Feedback on moderation helper app" + _a 'Feedback welcome!', href: 'mailto:dev@whimsical.apache.org?Subject=Feedback on moderation helper app' end _p do _span '** If you are not a moderator, you can contact them by emailing -owner@.apache.org **' @@ -121,13 +121,13 @@ _tr do _td do _label do - _input type: "radio", name: "cmd", value: "list", required: true, checked: (@cmd == "list") + _input type: 'radio', name: 'cmd', value: 'list', required: true, checked: (@cmd == 'list') _ 'list (current subscribers)' end end _td do _label do - _input type: "radio", name: "cmd", value: "subscribe", required: true, checked: (@cmd == "subscribe") + _input type: 'radio', name: 'cmd', value: 'subscribe', required: true, checked: (@cmd == 'subscribe') _ 'subscribe (normal subscription: can post and gets messages)' end end @@ -135,13 +135,13 @@ _tr do _td do _label do - _input type: "radio", name: "cmd", value: "log", required: true, checked: (@cmd == "log") + _input type: 'radio', name: 'cmd', value: 'log', required: true, checked: (@cmd == 'log') _ 'log (history of subscription changes)' end end _td do _label do - _input type: "radio", name: "cmd", value: "unsubscribe", required: true, checked: (@cmd == "unsubscribe" || @cmd == nil) + _input type: 'radio', name: 'cmd', value: 'unsubscribe', required: true, checked: (@cmd == 'unsubscribe' || @cmd == nil) _ 'unsubscribe (from list)' end end @@ -149,13 +149,13 @@ _tr do _td do _label do - _input type: "radio", name: "cmd", value: "allow-list", required: true, checked: (@cmd == "allow-list") + _input type: 'radio', name: 'cmd', value: 'allow-list', required: true, checked: (@cmd == 'allow-list') _ 'allow-list (currently allowed to post)' end end _td do _label do - _input type: "radio", name: "cmd", value: "allow-subscribe", required: true, checked: (@cmd == "allow-subscribe") + _input type: 'radio', name: 'cmd', value: 'allow-subscribe', required: true, checked: (@cmd == 'allow-subscribe') _ 'allow-subscribe (allow posting without getting messages - e.g. for bots)' end end @@ -163,13 +163,13 @@ _tr do _td do _label do - _input type: "radio", name: "cmd", value: "allow-log", required: true, checked: (@cmd == "allow-log") + _input type: 'radio', name: 'cmd', value: 'allow-log', required: true, checked: (@cmd == 'allow-log') _ 'allow-log (history of subscriptions to allow list)' end end _td do _label do - _input type: "radio", name: "cmd", value: "allow-unsubscribe", required: true, checked: (@cmd == "allow-unsubscribe") + _input type: 'radio', name: 'cmd', value: 'allow-unsubscribe', required: true, checked: (@cmd == 'allow-unsubscribe') _ 'allow-unsubscribe (drop allow posting)' end end @@ -177,13 +177,13 @@ _tr do _td do _label do - _input type: "radio", name: "cmd", value: "deny-list", required: true, checked: (@cmd == "deny-list") + _input type: 'radio', name: 'cmd', value: 'deny-list', required: true, checked: (@cmd == 'deny-list') _ 'deny-list (list those currently denied to post)' end end _td do _label do - _input type: "radio", name: "cmd", value: "deny-subscribe", required: true, checked: (@cmd == "deny-subscribe") + _input type: 'radio', name: 'cmd', value: 'deny-subscribe', required: true, checked: (@cmd == 'deny-subscribe') _ 'deny-subscribe (prevent subscriber from posting)' end end @@ -191,13 +191,13 @@ _tr do _td do _label do - _input type: "radio", name: "cmd", value: "deny-log", required: true, checked: (@cmd == "deny-log") + _input type: 'radio', name: 'cmd', value: 'deny-log', required: true, checked: (@cmd == 'deny-log') _ 'deny-log (history of deny subscriptions)' end end _td do _label do - _input type: "radio", name: "cmd", value: "deny-unsubscribe", required: true, checked: (@cmd == "deny-unsubscribe") + _input type: 'radio', name: 'cmd', value: 'deny-unsubscribe', required: true, checked: (@cmd == 'deny-unsubscribe') _ 'deny-unsubscribe (remove from list of denied posters)' end end @@ -205,13 +205,13 @@ _tr do _td do _label do - _input type: "radio", name: "cmd", value: "sendsubscribertomod-list", required: true, checked: (@cmd == "sendsubscribertomod-subscribe") + _input type: 'radio', name: 'cmd', value: 'sendsubscribertomod-list', required: true, checked: (@cmd == 'sendsubscribertomod-subscribe') _ 'sendsubscribertomod-list (list of moderated subscribers)' end end _td do _label do - _input type: "radio", name: "cmd", value: "sendsubscribertomod-subscribe", required: true, checked: (@cmd == "sendsubscribertomod-subscribe") + _input type: 'radio', name: 'cmd', value: 'sendsubscribertomod-subscribe', required: true, checked: (@cmd == 'sendsubscribertomod-subscribe') _ 'sendsubscribertomod-subscribe (add to list of moderated subscribers - ask INFRA to enable this for the list)' end end @@ -219,13 +219,13 @@ _tr do _td do _label do - _input type: "radio", name: "cmd", value: "sendsubscribertomod-log", required: true, checked: (@cmd == "sendsubscribertomod-subscribe") + _input type: 'radio', name: 'cmd', value: 'sendsubscribertomod-log', required: true, checked: (@cmd == 'sendsubscribertomod-subscribe') _ 'sendsubscribertomod-log (history of moderated subscribers)' end end _td do _label do - _input type: "radio", name: "cmd", value: "sendsubscribertomod-unsubscribe", required: true, checked: (@cmd == "sendsubscribertomod-unsubscribe") + _input type: 'radio', name: 'cmd', value: 'sendsubscribertomod-unsubscribe', required: true, checked: (@cmd == 'sendsubscribertomod-unsubscribe') _ 'sendsubscribertomod-unsubscribe (remove from list of moderated subscribers)' end end diff --git a/tools/modify_pmcchairs.rb b/tools/modify_pmcchairs.rb index 69e3459eed..a185d836e4 100755 --- a/tools/modify_pmcchairs.rb +++ b/tools/modify_pmcchairs.rb @@ -10,7 +10,7 @@ # extract action to be performed dryrun = ARGV.delete('--dryrun') puts 'Dry run:' if dryrun -action = ARGV.delete('--add') || ARGV.delete("--rm") +action = ARGV.delete('--add') || ARGV.delete('--rm') # map arguments provided to people people = ARGV.map {|id| ASF::Person[id]} diff --git a/tools/namemap.rb b/tools/namemap.rb index 52043b0cf0..5bd8ae4e88 100644 --- a/tools/namemap.rb +++ b/tools/namemap.rb @@ -188,7 +188,7 @@ def compare(cids, cmails, oids, omails) end end else # No id match, log it - matches[cid] = "NONE:no id match found" + matches[cid] = 'NONE:no id match found' end end diff --git a/tools/parsemail.rb b/tools/parsemail.rb index 709ce35aba..ea1e529d04 100755 --- a/tools/parsemail.rb +++ b/tools/parsemail.rb @@ -81,7 +81,7 @@ def self.parse_dir(maildir, yamlfile) MessageId: mail.message_id, # could be nil EnvelopeFrom: mail.envelope_from, EnvelopeDate: mail.envelope_date.to_s, # effectively the delivery date to the mailing list - InReplyTo: mail["In-Reply-To"]&.decoded, # will be nil if not present + InReplyTo: mail['In-Reply-To']&.decoded, # will be nil if not present } data[name] = entry end @@ -90,7 +90,7 @@ def self.parse_dir(maildir, yamlfile) log :INFO, "Found #{entries} files, with #{dupes} duplicates, giving #{data.size} new entries" if data.size == 0 - log :INFO, "No new entries found, updating last date" + log :INFO, 'No new entries found, updating last date' FileUtils.touch yamlfile # needed to skip processing next time # Should not happen often, an updated dir should result in updating the yaml else diff --git a/tools/ponyapi.rb b/tools/ponyapi.rb index fef0487163..a53a10ff3f 100755 --- a/tools/ponyapi.rb +++ b/tools/ponyapi.rb @@ -12,10 +12,10 @@ module PonyAPI PONYHOST = ENV['PONYHOST'] || 'https://lists.apache.org/' PONYSTATS = PONYHOST + 'api/stats.lua?list=%{list}&domain=%{domain}&d=%{year}-%{month}' # board&domain=apache.org&d=2017-04 becomes board-apache-org-201704-stats.json - STATSMBOX = "%{list}-%{domNoDot}-%.04d%.02d-stats.json" # used to generate output file name - SUMMARYJSON = "%{list}-%{domNoDot}-%.04d%.02d-summary.json" # used to generate output file name + STATSMBOX = '%{list}-%{domNoDot}-%.04d%.02d-stats.json' # used to generate output file name + SUMMARYJSON = '%{list}-%{domNoDot}-%.04d%.02d-summary.json' # used to generate output file name PONYMBOX = PONYHOST + 'api/mbox.lua?list=%{list}@%{domain}&date=%{year}-%{month}' # board@apache.org&date=2016-06 becomes board-apache-org-201707.mbox - FILEMBOX = "%{list}-%{domNoDot}-%.04d%.02d.mbox" # used to generate output file name + FILEMBOX = '%{list}-%{domNoDot}-%.04d%.02d.mbox' # used to generate output file name PONYPREFS = PONYHOST + 'api/preferences.lua' # => preferences.json extend self @@ -207,7 +207,7 @@ def make_args(list, subdomain, year, month) def get_cookie() unless $stdin.isatty - puts "WARN:Input is not a tty; cannot prompt for a cookie" + puts 'WARN:Input is not a tty; cannot prompt for a cookie' return nil end require 'io/console' diff --git a/tools/ponypoop.rb b/tools/ponypoop.rb index f6286bf1bd..8655927ccf 100755 --- a/tools/ponypoop.rb +++ b/tools/ponypoop.rb @@ -113,7 +113,7 @@ def run_analyze_stats(dir, list, subject_regex) subjects = analyze_stats(fname, results, subject_regex, errors) if subjects responses = subjects.select {|subj| subj =~ /Re:/i }.size - File.open("#{fname.chomp('.json')}.txt", "w") do |f| + File.open("#{fname.chomp('.json')}.txt", 'w') do |f| f.puts "COUNTS - Replies:#{responses}, New Messages:#{subjects.size - responses}" subjects.sort.each do |s| f.puts s.delete("\n") @@ -132,7 +132,7 @@ def run_analyze_stats(dir, list, subject_regex) results.last["error#{index}"] = item end end - File.open("#{output}.json", "w") do |f| + File.open("#{output}.json", 'w') do |f| f.puts JSON.pretty_generate(results) end diff --git a/tools/proxyhelper.rb b/tools/proxyhelper.rb index 2740cc9ff5..e485e339f2 100644 --- a/tools/proxyhelper.rb +++ b/tools/proxyhelper.rb @@ -38,7 +38,7 @@ def reminder_lines(meeting = File.basename(Dir[File.join(MEETINGS, '2*')].max)) end #### Main method - TODO needs to be integrated into meeting process -puts "START: reminder_lines()" +puts 'START: reminder_lines()' p = reminder_lines puts p diff --git a/tools/pubsub-ci-email.rb b/tools/pubsub-ci-email.rb index f03dc62e90..f28e22c1c7 100755 --- a/tools/pubsub-ci-email.rb +++ b/tools/pubsub-ci-email.rb @@ -13,7 +13,7 @@ require 'whimsy/asf/json-utils' def stamp(*s) - "%s: %s" % [Time.now.gmtime.to_s, s.join(' ')] + '%s: %s' % [Time.now.gmtime.to_s, s.join(' ')] end def mail_notify(subject, body=nil) @@ -33,7 +33,7 @@ def mail_notify(subject, body=nil) class PubSub require 'fileutils' - ALIVE = File.join("/tmp", "#{File.basename(__FILE__)}.alive") # TESTING ONLY + ALIVE = File.join('/tmp', "#{File.basename(__FILE__)}.alive") # TESTING ONLY @restartable = false @updated = false @@ -77,22 +77,22 @@ def self.listen(url, creds, options={}) yield event # return the event to the caller end else - puts stamp "Partial chunk" if debug + puts stamp 'Partial chunk' if debug end unless mtime == File.mtime(__FILE__) - puts stamp "File updated" if debug + puts stamp 'File updated' if debug @updated = true done = true end break if done end # reading chunks - puts stamp "Done reading chunks" if debug + puts stamp 'Done reading chunks' if debug break if done end # read response - puts stamp "Done reading response" if debug + puts stamp 'Done reading response' if debug break if done end # net start - puts stamp "Done with start" if debug + puts stamp 'Done with start' if debug rescue Errno::ECONNREFUSED => e @restartable = true except = e @@ -103,11 +103,11 @@ def self.listen(url, creds, options={}) puts stamp e.inspect puts stamp e.backtrace end - puts stamp "Done with thread" if debug + puts stamp 'Done with thread' if debug end # thread puts stamp "Pubsub thread started #{url} ..." ps_thread.join - subject = "Pubsub thread finished %s..." % (@updated ? '(code updated) ' : '') + subject = 'Pubsub thread finished %s...' % (@updated ? '(code updated) ' : '') puts stamp subject mail_notify subject, <<~EOD Restartable: #{@restartable} @@ -167,9 +167,9 @@ def do_diff(initialhash, currenthash, triggerrev) before = parse_content(fetch_revision(initialrev)) after = parse_content(fetch_revision(currentrev)) if before == after - puts stamp "No changes detected" + puts stamp 'No changes detected' else - puts stamp "Analysing changes" + puts stamp 'Analysing changes' end # N.B. before/after are hashes: committee_name => {roster hash} ASFJSON.cmphash(before, after) do |bc, type, key, args| @@ -219,7 +219,7 @@ def do_diff(initialhash, currenthash, triggerrev) EOD mail = Mail.new do from "#{currentcommittername} <#{currentcommitter}@apache.org>" - sender "notifications@whimsical.apache.org" + sender 'notifications@whimsical.apache.org' # Uncomment the following line when going live # to "board@apache.org,#{mail_list}" bcc 'notifications@whimsical.apache.org' # keep track of mails @@ -274,7 +274,7 @@ def process(event) ASF::Mail.configure if ARGV.delete('--testchange') - handle_change (ARGV.shift or raise "Need change id") + handle_change (ARGV.shift or raise 'Need change id') exit end @@ -324,7 +324,7 @@ def process(event) user ||= Etc.getlogin pubsub_CRED = [user, STDIN.getpass("Password for #{user}: ")] else - pubsub_CRED = File.read(pubsub_FILE).chomp.split(':') or raise ArgumentError.new "Missing credentials" + pubsub_CRED = File.read(pubsub_FILE).chomp.split(':') or raise ArgumentError.new 'Missing credentials' end # Catchup on any missed entries diff --git a/tools/pubsub.rb b/tools/pubsub.rb index ffb036de10..4051e2445d 100644 --- a/tools/pubsub.rb +++ b/tools/pubsub.rb @@ -37,27 +37,27 @@ options.group = group end - opts.on '-p', '--pidfile path', "Optional pid file location" do |path| + opts.on '-p', '--pidfile path', 'Optional pid file location' do |path| options.pidfile = path end - opts.on '-d', '--daemonize', "Run as daemon" do + opts.on '-d', '--daemonize', 'Run as daemon' do options.daemonize = true end - opts.on '--puppet', "Use puppet agent to update" do + opts.on '--puppet', 'Use puppet agent to update' do options.puppet = true end - opts.on '-s', '--stream', "StreamURL" do |url| + opts.on '-s', '--stream', 'StreamURL' do |url| options.streamURL = url end - opts.on '-r', '--remote', "Git Clone URL" do |url| + opts.on '-r', '--remote', 'Git Clone URL' do |url| options.streamURL = url end - opts.on '-c', '--clone', "Git Clone Directory" do |path| + opts.on '-c', '--clone', 'Git Clone Directory' do |path| options.local = path end diff --git a/tools/pubsub2rake.rb b/tools/pubsub2rake.rb index a630229f5b..3318b34b11 100755 --- a/tools/pubsub2rake.rb +++ b/tools/pubsub2rake.rb @@ -8,7 +8,7 @@ require 'whimsy/asf/svn' def stamp(*s) - "%s: %s" % [Time.now.gmtime.to_s, s.join(' ')] + '%s: %s' % [Time.now.gmtime.to_s, s.join(' ')] end # need to fetch all topics to ensure mixed commits are seen @@ -17,7 +17,7 @@ def stamp(*s) class PubSub require 'fileutils' - ALIVE = File.join("/tmp", "#{File.basename(__FILE__)}.alive") # TESTING ONLY + ALIVE = File.join('/tmp', "#{File.basename(__FILE__)}.alive") # TESTING ONLY @restartable = false @updated = false @@ -60,22 +60,22 @@ def self.listen(url, creds, options={}) yield event end else - puts stamp "Partial chunk" if debug + puts stamp 'Partial chunk' if debug end unless mtime == File.mtime(__FILE__) - puts stamp "File updated" if debug + puts stamp 'File updated' if debug @updated = true done = true end break if done end # reading chunks - puts stamp "Done reading chunks" if debug + puts stamp 'Done reading chunks' if debug break if done end # read response - puts stamp "Done reading response" if debug + puts stamp 'Done reading response' if debug break if done end # net start - puts stamp "Done with start" if debug + puts stamp 'Done with start' if debug rescue Errno::ECONNREFUSED => e @restartable = true $stderr.puts stamp e.inspect @@ -84,11 +84,11 @@ def self.listen(url, creds, options={}) $stderr.puts stamp e.inspect $stderr.puts stamp e.backtrace end - puts stamp "Done with thread" if debug + puts stamp 'Done with thread' if debug end # thread puts stamp "Pubsub thread started #{url} ..." ps_thread.join - puts stamp "Pubsub thread finished %s..." % (@updated ? '(updated) ' : '') + puts stamp 'Pubsub thread finished %s...' % (@updated ? '(updated) ' : '') if @restartable $stderr.puts stamp 'restarting' @@ -130,7 +130,7 @@ def process(event) $hits += 1 log = event['commit']['log'].sub(/\n.*/m, '') # keep only first line id = event['commit']['id'] - puts "" + puts '' puts stamp id, path, log matches = Hash.new{|h, k| h[k] = Array.new} # key alias, value = array of matching files watching = WATCH[path] @@ -164,7 +164,7 @@ def process(event) if File.exist? '/srv/svn/pubsub2rake.trace' log = event['commit']['log'].sub(/\n.*/m, '') # keep only first line id = event['commit']['id'] - puts "" + puts '' puts stamp id, path, 'DBG', log end end # possible match @@ -210,7 +210,7 @@ def process(event) end if File.exist? pubsub_URL - puts "** Unit testing **" + puts '** Unit testing **' File.open(pubsub_URL).each_line do |line| event = nil begin diff --git a/tools/site-scan.rb b/tools/site-scan.rb index f3b7888f7b..8d197a65ba 100755 --- a/tools/site-scan.rb +++ b/tools/site-scan.rb @@ -34,7 +34,7 @@ def getText(txt, node, match=/Apache Software Foundation/i) newnode = node.parent end # ensure
is treated as a separator when extracting the combined text - newnode.css('br').each { |br| br.replace(" ") } + newnode.css('br').each { |br| br.replace(' ') } txt = squash(newnode.text) parent = true end @@ -67,7 +67,7 @@ def get_link_text(anode) # @return Hash of symbols: text|url found from a check made # @see SiteStandards for definitions of what we should scan for (in general) def parse(id, site, name, podling=false) - show_anyway = Time.now.gmtime.strftime("%H") == '08' # show suppressed errors once a day + show_anyway = Time.now.gmtime.strftime('%H') == '08' # show suppressed errors once a day data = {} # force https to avoid issue with cache (sites should use https anyway) site.sub!(%r{^http:},'https:') @@ -241,7 +241,7 @@ def parse(id, site, name, podling=false) # Check for resource loading from non-ASF domains if $skipresourcecheck - data[:resources] = "Not checked" + data[:resources] = 'Not checked' else cmd = ['node', '/srv/whimsy/tools/scan-page.js', site] out, err, status = exec_with_timeout(cmd, 60) diff --git a/tools/site_member_check.rb b/tools/site_member_check.rb index c4bfa62181..0387cd78bb 100755 --- a/tools/site_member_check.rb +++ b/tools/site_member_check.rb @@ -32,7 +32,7 @@ puts "Reading #{file}" contents = File.read(file) else - puts "Fetching members.md" + puts 'Fetching members.md' code, contents = ASF::Git.github(MEMBERS) raise "Could not read #{MEMBERS}, error: #{code}" unless code == '200' end @@ -45,8 +45,8 @@ # |^---|------|----------| # | id | Public Name | -puts "Checking member list" -puts "====================" +puts 'Checking member list' +puts '====================' s = StringScanner.new(contents) s.skip_until(/\| Id \| Name \| Projects \|\n/) @@ -73,8 +73,8 @@ puts '' -puts "Checking Emeritus list" -puts "======================" +puts 'Checking Emeritus list' +puts '======================' s.skip_until(/\| Id \| Name \|\n/) s.skip_until(/\n/) diff --git a/tools/tocsplit.rb b/tools/tocsplit.rb index 3e5bd98c74..32f94ad782 100755 --- a/tools/tocsplit.rb +++ b/tools/tocsplit.rb @@ -20,7 +20,7 @@ require 'digest' -file=ARGV.shift or raise "missing file" +file=ARGV.shift or raise 'missing file' TMP=ARGV.shift || '/tmp/tocsplit' $outn = 100 # so files sort diff --git a/tools/toucher.rb b/tools/toucher.rb index 1e7a3d72be..5082716534 100755 --- a/tools/toucher.rb +++ b/tools/toucher.rb @@ -28,7 +28,7 @@ restart = false touches = [] (modified + added + removed).each do |file| - restart ||= (File.basename(file) == "Gemfile.lock") + restart ||= (File.basename(file) == 'Gemfile.lock') watch.each do |path, restarts| touches += restarts if file.start_with? path + '/' end diff --git a/tools/travis-relay.rb b/tools/travis-relay.rb index f6399c2e6d..76bfeceab8 100644 --- a/tools/travis-relay.rb +++ b/tools/travis-relay.rb @@ -17,7 +17,7 @@ ASF::Mail.configure original = Mail.new(STDIN.read.encode(crlf_newline: true)) -exit unless original.from.include? "builds@travis-ci.org" +exit unless original.from.include? 'builds@travis-ci.org' copy = Mail.new diff --git a/tools/utf8-fix.rb b/tools/utf8-fix.rb index 5c5e9c47e7..b9b245c4dd 100755 --- a/tools/utf8-fix.rb +++ b/tools/utf8-fix.rb @@ -7,11 +7,11 @@ if __FILE__ == $0 verbose = !ARGV.delete('-v').nil? - src = ARGV.shift or raise Exception.new "need input file" + src = ARGV.shift or raise Exception.new 'need input file' dst = ARGV.shift || src + '.tmp' puts "Input: #{src} output: #{dst} verbose: #{verbose}" UTF8Utils::repair(src, dst, verbose) if verbose - puts "Above are the changed lines. Note that some may appear the same, but the encoding has changed." + puts 'Above are the changed lines. Note that some may appear the same, but the encoding has changed.' end end diff --git a/tools/vhosttest.rb b/tools/vhosttest.rb index ab6026644e..da4ff381f0 100755 --- a/tools/vhosttest.rb +++ b/tools/vhosttest.rb @@ -9,7 +9,7 @@ require 'whimsy/asf' # Allow override of local repo -IP = ARGV.shift or raise RuntimeError.new "Need path to infrastructure puppet checkout" +IP = ARGV.shift or raise RuntimeError.new 'Need path to infrastructure puppet checkout' # Allow override of yaml name base = ARGV.shift || 'whimsy-vm*' yaml = Dir["#{IP}/data/nodes/#{base}.apache.org.yaml"]. diff --git a/tools/votes2ini.rb b/tools/votes2ini.rb index c1bc06065d..8a13485e64 100755 --- a/tools/votes2ini.rb +++ b/tools/votes2ini.rb @@ -6,14 +6,14 @@ require 'json' -raw_file = Dir["/srv/svn/Meetings/*/raw_board_votes.json"].max +raw_file = Dir['/srv/svn/Meetings/*/raw_board_votes.json'].max raw_votes = JSON.parse(IO.read(raw_file)) txt_file = raw_file.sub('.json', '.txt') ini_file = File.dirname(raw_file) + '/board_nominations.ini' votes = '' raw_votes['votes'].sort_by {|_key, data| data['timestamp']}.each do |key, data| - time = Time.at(data['timestamp']).gmtime.strftime("%Y/%m/%d %H:%M:%S") + time = Time.at(data['timestamp']).gmtime.strftime('%Y/%m/%d %H:%M:%S') vote = data['vote'].split(' ').map {|vote| vote[-1]}.join.downcase votes += "[#{time}] #{key[0..31]} #{vote}\n" end diff --git a/tools/wwwdocs.rb b/tools/wwwdocs.rb index 6af183796a..3bc9913553 100755 --- a/tools/wwwdocs.rb +++ b/tools/wwwdocs.rb @@ -5,7 +5,7 @@ $LOAD_PATH.unshift '/srv/whimsy/lib' require 'wunderbar' require 'whimsy/asf' -SCANDIR = "../www" +SCANDIR = '../www' ISERR = '!' AUTHMAP = { # From whimsy-vm4.apache.org.yaml 'ASF Committers' => 'text-muted', @@ -16,7 +16,7 @@ } AUTHPUBLIC = 'glyphicon-eye-open' ASFSVN = /ASF::SVN/ -SCANDIRSVN = "../" +SCANDIRSVN = '../' WWWAUTH = /WWW-Authenticate: Basic realm/ CONSTANT_DEF = /(?[A-Z_]+)\s+=\s+['"](?[^#]+)['"]/ # Attempt to capture CONSTANT = "value" diff --git a/www/board/agenda/Gemfile b/www/board/agenda/Gemfile index 6805195347..422cf701be 100644 --- a/www/board/agenda/Gemfile +++ b/www/board/agenda/Gemfile @@ -33,7 +33,7 @@ gem 'rubyXL' gem 'chronic' group :test do - ENV['PUMA_DISABLE_SSL']="1" # https://github.com/puma/puma/issues/2839#issuecomment-1086173532 + ENV['PUMA_DISABLE_SSL']='1' # https://github.com/puma/puma/issues/2839#issuecomment-1086173532 gem 'rspec' gem 'puma' gem 'capybara' diff --git a/www/board/agenda/Rakefile b/www/board/agenda/Rakefile index e560b821fe..21d991c570 100644 --- a/www/board/agenda/Rakefile +++ b/www/board/agenda/Rakefile @@ -54,7 +54,7 @@ namespace :server do end end -task "touch" do +task 'touch' do sh 'touch', File.expand_path('../tmp/restart.txt', __FILE__) end diff --git a/www/board/agenda/Vagrantfile b/www/board/agenda/Vagrantfile index f0016f18b4..f744cb1226 100644 --- a/www/board/agenda/Vagrantfile +++ b/www/board/agenda/Vagrantfile @@ -12,7 +12,7 @@ Vagrant.configure(2) do |config| # Every Vagrant development environment requires a box. You can search for # boxes at https://atlas.hashicorp.com/search. - config.vm.box = "ubuntu/trusty64" + config.vm.box = 'ubuntu/trusty64' # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs @@ -22,7 +22,7 @@ Vagrant.configure(2) do |config| # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. - config.vm.network "forwarded_port", guest: 9292, host: 9292 + config.vm.network 'forwarded_port', guest: 9292, host: 9292 # Create a private network, which allows host-only access to the machine # using a specific IP. @@ -43,12 +43,12 @@ Vagrant.configure(2) do |config| # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # - config.vm.provider "virtualbox" do |vb| + config.vm.provider 'virtualbox' do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # Customize the amount of memory on the VM: - vb.memory = "1024" + vb.memory = '1024' end # # View the documentation for the provider you are using for more @@ -75,15 +75,15 @@ Vagrant.configure(2) do |config| script += File.read('Dockerfile') script.gsub! /^RUN /, '' script.gsub! /\s&& \\\n\s*/, "\n" - script.gsub! /^ADD .*\n/, "" - script.gsub! /^FROM .*\n/, "" - script.gsub! /^CMD .*\n/, "" - script.gsub! /^EXPOSE .*\s+/, "" + script.gsub! /^ADD .*\n/, '' + script.gsub! /^FROM .*\n/, '' + script.gsub! /^CMD .*\n/, '' + script.gsub! /^EXPOSE .*\s+/, '' script.gsub! /^ENV (\w+) (.*)/, '\1=\2' - script.gsub! /^WORKDIR /, "cd " - script.gsub! /\/home\/agenda/, "/vagrant" + script.gsub! /^WORKDIR /, 'cd ' + script.gsub! /\/home\/agenda/, '/vagrant' # provision "whimsy-agenda" VM from shell script config.vm.define 'whimsy-agenda' - config.vm.provision "shell", inline: script + config.vm.provision 'shell', inline: script end diff --git a/www/board/agenda/bin/remind-cronjob.rb b/www/board/agenda/bin/remind-cronjob.rb index d59c62ed13..245f94b3f0 100644 --- a/www/board/agenda/bin/remind-cronjob.rb +++ b/www/board/agenda/bin/remind-cronjob.rb @@ -27,15 +27,15 @@ def validate_board_file(name) # draft reminder text @reminder = ARGV.first || 'reminder1' -reminder = eval(File.read("views/actions/reminder-text.json.rb")) +reminder = eval(File.read('views/actions/reminder-text.json.rb')) # send reminders @agenda = File.basename(Dir[File.join(FOUNDATION_BOARD, 'board_agenda_*.txt')].max) -@from = "Whimsy " +@from = 'Whimsy ' @dryrun = true @subject = reminder[:subject] @message = reminder[:body] -response = eval(File.read("views/actions/send-reminders.json.rb")) +response = eval(File.read('views/actions/send-reminders.json.rb')) # dump results for debugging purposes puts JSON.pretty_generate(response) diff --git a/www/board/agenda/daemon/wsc.rb b/www/board/agenda/daemon/wsc.rb index 81620d1f34..264dcfbf70 100644 --- a/www/board/agenda/daemon/wsc.rb +++ b/www/board/agenda/daemon/wsc.rb @@ -29,31 +29,31 @@ opt_parser = OptionParser.new do |opts| opts.banner = "Usage: #{File.basename(__FILE__)} [options]" - opts.on "-h", "--host HOST", 'Host to connect to' do |host| + opts.on '-h', '--host HOST', 'Host to connect to' do |host| options.host = host end - opts.on "--port PORT", 'Port to connect to' do |port| + opts.on '--port PORT', 'Port to connect to' do |port| options.port = port end - opts.on "--path PORT", 'Path to connect to' do |path| + opts.on '--path PORT', 'Path to connect to' do |path| options.path = path end - opts.on "--secure", 'Use secure web sockets (wss)' do + opts.on '--secure', 'Use secure web sockets (wss)' do options.protocol = 'wss' end - opts.on "--noverify", 'Bypass SSL certificate verification' do + opts.on '--noverify', 'Bypass SSL certificate verification' do options.verify = false end - opts.on "--user USER", 'User to log in as' do |user| + opts.on '--user USER', 'User to log in as' do |user| options.user = user end - opts.on "--restart", 'restart WebSocket daemon process' do + opts.on '--restart', 'restart WebSocket daemon process' do options.restart = true end end diff --git a/www/board/agenda/daemon/wss.rb b/www/board/agenda/daemon/wss.rb index 279202f650..00e8744d9e 100755 --- a/www/board/agenda/daemon/wss.rb +++ b/www/board/agenda/daemon/wss.rb @@ -30,27 +30,27 @@ opt_parser = OptionParser.new do |opts| opts.banner = "Usage: #{File.basename(__FILE__)} [options]" - opts.on "-h", "--host HOST", 'Host to listen on' do |host| + opts.on '-h', '--host HOST', 'Host to listen on' do |host| options.host = host end - opts.on "-p", "--port PORT", 'Port to listen on' do |port| + opts.on '-p', '--port PORT', 'Port to listen on' do |port| options.port = port end - opts.on "-k", "--key KEY", 'Private key' do |key| + opts.on '-k', '--key KEY', 'Private key' do |key| options.privkey = key end - opts.on "-c", "--chain CHAIN", 'Certificate Chain' do |chain| + opts.on '-c', '--chain CHAIN', 'Certificate Chain' do |chain| options.chain = chain end - opts.on "--kill [SIGNAL]", 'Kill existing process' do |signal| + opts.on '--kill [SIGNAL]', 'Kill existing process' do |signal| options.kill = signal || 'INT' end - opts.on '-t', "--timeout [900]", 'inactivity timeout' do |timeout| + opts.on '-t', '--timeout [900]', 'inactivity timeout' do |timeout| options.timeout = timeout.to_i end end diff --git a/www/board/agenda/models/agenda.rb b/www/board/agenda/models/agenda.rb index 0de17b5d37..87b7a0ac39 100755 --- a/www/board/agenda/models/agenda.rb +++ b/www/board/agenda/models/agenda.rb @@ -201,7 +201,7 @@ def self.update(file, message, retries=20, auth: nil, &block) update(file, message, retries-1, &block) else Wunderbar.error _.target! # show the transcript - raise Exception.new("svn commit failed") + raise Exception.new('svn commit failed') end end diff --git a/www/board/agenda/models/minutes.rb b/www/board/agenda/models/minutes.rb index e8ff44fb78..ffcac62b51 100755 --- a/www/board/agenda/models/minutes.rb +++ b/www/board/agenda/models/minutes.rb @@ -7,13 +7,13 @@ def self.draft(agenda_txt, minutes_yaml) ((?:^\s{12}[^\n]*\n+)+\n) (.*?)\n\n\s2\.\sRoll\sCall/mx) do |meeting, number, backup| start = notes('Call to order') || '??:??' - meeting.gsub! "is scheduled", "was scheduled" - meeting.gsub! "will begin as", "began at" - meeting.gsub! "soon thereafter that", "#{start} when" - meeting.gsub! "quorum is", "quorum was" - meeting.gsub! "will be", "was" - meeting.gsub! %r{:\z}, "." - backup.gsub! "will be", "was" + meeting.gsub! 'is scheduled', 'was scheduled' + meeting.gsub! 'will begin as', 'began at' + meeting.gsub! 'soon thereafter that', "#{start} when" + meeting.gsub! 'quorum is', 'quorum was' + meeting.gsub! 'will be', 'was' + meeting.gsub! %r{:\z}, '.' + backup.gsub! 'will be', 'was' [meeting.reflow(4, 64), '', backup.reflow(4, 68)] end @@ -62,7 +62,7 @@ def self.draft(agenda_txt, minutes_yaml) elsif report.strip.empty? [section, title, report, "\n\n No report was submitted."] else - [section, title, report, ""] + [section, title, report, ''] end end end @@ -98,9 +98,9 @@ def self.draft(agenda_txt, minutes_yaml) order.sub! %r{\n \[.*?\n +\]\n}m, '' notes = notes(title.strip) if !notes or notes.empty? or notes.strip == 'tabled' - notes = "was tabled." + notes = 'was tabled.' elsif notes == 'unanimous' - notes = "was approved by Unanimous Vote of the directors present." + notes = 'was approved by Unanimous Vote of the directors present.' end notes = "Special Order 7#{section}, #{title}, " + notes order += "\n" unless order =~ /\n\Z/ diff --git a/www/board/agenda/models/reporter.rb b/www/board/agenda/models/reporter.rb index 93a74bee2f..b66451ed3c 100644 --- a/www/board/agenda/models/reporter.rb +++ b/www/board/agenda/models/reporter.rb @@ -44,7 +44,7 @@ def self.drafts(env, update=nil) request = Net::HTTP::Get.new(uri) request.basic_auth env.user, env.password response = http.request(request) - if response.code == "200" + if response.code == '200' report_status.merge! JSON.parse(response.body)['report_status'] else Wunderbar.error "Failed to fetch #{uri}: #{response.code}" diff --git a/www/board/agenda/routes.rb b/www/board/agenda/routes.rb index aecb99900a..a964320188 100755 --- a/www/board/agenda/routes.rb +++ b/www/board/agenda/routes.rb @@ -440,7 +440,7 @@ def server # get list of committers (for use in roll-call) get '/json/committers' do _json do - members = ASF.search_one(ASF::Group.base, "cn=member", 'memberUid').first + members = ASF.search_one(ASF::Group.base, 'cn=member', 'memberUid').first members = Hash[members.map {|name| [name, true]}] ASF.search_one(ASF::Person.base, 'uid=*', ['uid', 'cn']). map {|person| {id: person['uid'].first, @@ -562,15 +562,15 @@ def server else draft = {} # allow for missing yml file end - @minutes = dir("board_agenda_*.txt"). + @minutes = dir('board_agenda_*.txt'). map {|file| Date.parse(file[/\d[_\d]+/].gsub('_', '-'))}. reject {|date| date >= @meeting.to_date}. reject {|date| draft[date.strftime('%B %d, %Y')] == 'approved'}. sort template = File.join(ASF::SVN['foundation_board'], 'templates', 'board_agenda.erb') - @disabled = dir("board_agenda_*.txt"). - include? @meeting.strftime("board_agenda_%Y_%m_%d.txt") + @disabled = dir('board_agenda_*.txt'). + include? @meeting.strftime('board_agenda_%Y_%m_%d.txt') begin @agenda = Erubis::Eruby.new(IO.read(template)).result(binding) @@ -608,7 +608,7 @@ def server File.unlink currentpath File.symlink agenda, currentpath else - Wunderbar.warn "current.txt link does not exist, creating it" + Wunderbar.warn 'current.txt link does not exist, creating it' File.symlink agenda, currentpath ASF::SVN.svn!('add', currentpath) end @@ -633,7 +633,7 @@ def auto_remind(date, agenda) # draft reminder text @reminder = 'reminder1' # reminder template @tzlink = ASF::Board.tzlink(ASF::Board::TIMEZONE.utc_to_local(ASF::Board.nextMeeting)) - reminder = eval(File.read("views/actions/reminder-text.json.rb")) + reminder = eval(File.read('views/actions/reminder-text.json.rb')) # extract data @subject = reminder[:subject] @@ -646,5 +646,5 @@ def auto_remind(date, agenda) @meeting = date boardchair = ASF::Committee.officers.select{|h| h.name == 'boardchair'}.first.chairs.first[:name] @from = "\"#{boardchair}\" " - eval(File.read("views/actions/send-reminders.json.rb")) + eval(File.read('views/actions/send-reminders.json.rb')) end diff --git a/www/board/agenda/spec/actions_spec.rb b/www/board/agenda/spec/actions_spec.rb index c06c424b94..a4e3163fb1 100644 --- a/www/board/agenda/spec/actions_spec.rb +++ b/www/board/agenda/spec/actions_spec.rb @@ -18,7 +18,7 @@ # Index - split in two so that cleanup occurs after each step # describe 'index' do - it "should post new special orders" do + it 'should post new special orders' do @agenda = 'board_agenda_2015_02_18.txt' @attach = '7?' @title = 'Establish Test Project' @@ -37,7 +37,7 @@ # Roll Call # describe 'roll call' do - it "should support adding a guest" do + it 'should support adding a guest' do @agenda = 'board_agenda_2015_01_21.txt' @action = 'attend' @name = 'N. E. Member' @@ -57,7 +57,7 @@ expect(rollcall['text']).to match %r{Directors .* Absent:\s+Sam Ruby} end - it "should support moving a director back to attending" do + it 'should support moving a director back to attending' do @agenda = 'board_agenda_2015_02_18.txt' @action = 'attend' @name = 'Greg Stein' @@ -82,7 +82,7 @@ # PMC Report # describe 'pmc report' do - it "should post a comment" do + it 'should post a comment' do @initials = 'xx' @agenda = 'board_agenda_2015_01_21.txt' @attach = 'Z' @@ -93,7 +93,7 @@ expect(Pending.get('test')['initials']).to eq('xx') end - it "should remove a comment" do + it 'should remove a comment' do expect(Pending.get('test')['comments']['I']).to eq('Nice report!') @initials = 'xx' @@ -105,7 +105,7 @@ expect(Pending.get('test')['comments']).not_to include('I') end - it "should reset comments when the agenda changes" do + it 'should reset comments when the agenda changes' do expect(Pending.get('test')['comments']['I']).to eq('Nice report!') @initials = 'xx' @@ -117,7 +117,7 @@ expect(Pending.get('test')['comments']).not_to include('I') end - it "should approve a report" do + it 'should approve a report' do @agenda = 'board_agenda_2015_01_21.txt' @initials = 'jt' @attach = 'C' @@ -127,7 +127,7 @@ expect(Pending.get('test')['approved']).to include('C') end - it "should unapprove a report which is pending approval" do + it 'should unapprove a report which is pending approval' do expect(Pending.get('test')['approved']).to include('7') @agenda = 'board_agenda_2015_01_21.txt' @@ -139,7 +139,7 @@ expect(Pending.get('test')['approved']).not_to include('7') end - it "should unapprove a previously approved report" do + it 'should unapprove a previously approved report' do expect(Pending.get('test')['unapproved']).not_to include('BM') @agenda = 'board_agenda_2015_01_21.txt' @@ -151,7 +151,7 @@ expect(Pending.get('test')['unapproved']).to include('BM') end - it "should flag a report" do + it 'should flag a report' do expect(Pending.get('test')['flagged']).not_to include('J') @agenda = 'board_agenda_2015_01_21.txt' @@ -163,7 +163,7 @@ expect(Pending.get('test')['flagged']).to include('J') end - it "should unflag a report" do + it 'should unflag a report' do expect(Pending.get('test')['unflagged']).not_to include('AS') @agenda = 'board_agenda_2015_02_18.txt' @@ -175,7 +175,7 @@ expect(Pending.get('test')['unflagged']).to include('AS') end - it "should unflag a report which is pending being flagged" do + it 'should unflag a report which is pending being flagged' do expect(Pending.get('test')['flagged']).to include('H') @agenda = 'board_agenda_2015_01_21.txt' @@ -187,7 +187,7 @@ expect(Pending.get('test')['flagged']).not_to include('H') end - it "should post/edit a report" do + it 'should post/edit a report' do @agenda = 'board_agenda_2015_02_18.txt' @parsed = Agenda.parse @agenda, :quick poi = @parsed.find {|item| item['title'] == 'POI'} @@ -207,7 +207,7 @@ # Queue / Pending # describe 'pending queue' do - it "should commit pending comments and approvals" do + it 'should commit pending comments and approvals' do @pending = Pending.get('test') @parsed = Agenda.parse 'board_agenda_2015_01_21.txt', :quick expect(@pending['approved']).to include('7') @@ -295,8 +295,8 @@ end end - describe "action items" do - it "should combine existing and captured actions" do + describe 'action items' do + it 'should combine existing and captured actions' do eval(File.read('views/actions/potential-actions.json.rb')) bval = @actions.find {|action| action[:pmc] == 'BVal'} @@ -311,7 +311,7 @@ expect(wink[:date]).to eq('2015-01-21') end - it "should post action items" do + it 'should post action items' do eval(File.read('views/actions/potential-actions.json.rb')) rave = @actions.find {|action| action[:pmc] == 'Rave'} expect(rave[:text]).to match(/require a\n reflow/) @@ -329,8 +329,8 @@ end end - describe "reminders" do - skip "should draft initial reminders" do + describe 'reminders' do + skip 'should draft initial reminders' do @reminder = 'reminder1' response = eval(File.read('views/actions/reminder-text.json.rb')) expect(response[:subject]).to \ @@ -341,7 +341,7 @@ expect(response[:body]).to match(/Wed Feb 11th/) end - skip "should draft final reminders" do + skip 'should draft final reminders' do @reminder = 'reminder2' response = eval(File.read('views/actions/reminder-text.json.rb')) expect(response[:subject]).to \ diff --git a/www/board/agenda/spec/client_spec.rb b/www/board/agenda/spec/client_spec.rb index 2ef240a04c..94f3b25519 100644 --- a/www/board/agenda/spec/client_spec.rb +++ b/www/board/agenda/spec/client_spec.rb @@ -7,12 +7,12 @@ require_relative 'spec_helper' require_relative 'vue_server' -describe "client", type: :feature, server: :vue do +describe 'client', type: :feature, server: :vue do # # Agenda model # - describe "agenda model" do - it "should link pages in agenda traversal order" do + describe 'agenda model' do + it 'should link pages in agenda traversal order' do @parsed = Agenda.parse 'board_agenda_2015_02_18.txt', :quick on_vue_server do diff --git a/www/board/agenda/spec/filters_spec.rb b/www/board/agenda/spec/filters_spec.rb index 31bf6a1b6d..7e72d0c550 100644 --- a/www/board/agenda/spec/filters_spec.rb +++ b/www/board/agenda/spec/filters_spec.rb @@ -1,7 +1,7 @@ require_relative 'spec_helper' require_relative 'vue_server' -describe "filters", type: :feature, server: :vue do +describe 'filters', type: :feature, server: :vue do before :all do @parsed = Agenda.parse 'board_agenda_2015_02_18.txt', :quick end @@ -9,8 +9,8 @@ # # convert strings containing http:// in reports to links # - describe "hotlink" do - it "should convert http addresses to links" do + describe 'hotlink' do + it 'should convert http addresses to links' do @item = @parsed.find {|item| item['title'] == 'Clerezza'} on_vue_server do @@ -32,8 +32,8 @@ def render # # add local time to Call to order # - describe "call to order" do - it "should convert start time to local time on call to order" do + describe 'call to order' do + it 'should convert start time to local time on call to order' do @item = @parsed.find {|item| item['title'] == 'Call to order'} on_vue_server do @@ -55,11 +55,11 @@ def render # # link names to roster # - describe "roll call" do - it "should link people to roster info" do + describe 'roll call' do + it 'should link people to roster info' do @item = @parsed.find {|item| item['title'] == 'Roll Call'} @item['people'].replace({ - rubys: {name: "Sam Ruby", member: true, attending: true} + rubys: {name: 'Sam Ruby', member: true, attending: true} }) on_vue_server do diff --git a/www/board/agenda/spec/forms_spec.rb b/www/board/agenda/spec/forms_spec.rb index c406ef48ab..cc03494521 100644 --- a/www/board/agenda/spec/forms_spec.rb +++ b/www/board/agenda/spec/forms_spec.rb @@ -5,12 +5,12 @@ require_relative 'spec_helper' require_relative 'vue_server' -describe "forms", type: :feature, server: :vue do +describe 'forms', type: :feature, server: :vue do # # Comment form # - describe "comment form" do - it "has an add-comment form with a disabled Save button" do + describe 'comment form' do + it 'has an add-comment form with a disabled Save button' do on_vue_server do class TestCommentForm < Vue def render @@ -31,7 +31,7 @@ def render text: 'Save' end - it "should enable Save button after input" do + it 'should enable Save button after input' do on_vue_server do item = {} server = {pending: {}, initials: 'sr'} @@ -58,8 +58,8 @@ def render # # Post form # - describe "post form" do - it "should indicate when a reflow is needed" do + describe 'post form' do + it 'should indicate when a reflow is needed' do parsed = Agenda.parse 'board_agenda_2015_02_18.txt', :quick @item = parsed.find {|item| item['title'] == 'Executive Vice President'} on_vue_server do @@ -79,7 +79,7 @@ def render text: 'Reflow' end - it "should perform a reflow" do + it 'should perform a reflow' do parsed = Agenda.parse 'board_agenda_2015_02_18.txt', :quick @item = parsed.find {|item| item['title'] == 'Executive Vice President'} on_vue_server do @@ -106,8 +106,8 @@ def render # # Commit form # - describe "commit form" do - it "should generate a default commit message" do + describe 'commit form' do + it 'should generate a default commit message' do @parsed = Agenda.parse 'board_agenda_2015_02_18.txt', :quick on_vue_server do Agenda.load(@parsed) diff --git a/www/board/agenda/spec/index_spec.rb b/www/board/agenda/spec/index_spec.rb index a0a519ae6e..d1c2c9e8ae 100644 --- a/www/board/agenda/spec/index_spec.rb +++ b/www/board/agenda/spec/index_spec.rb @@ -5,7 +5,7 @@ require_relative 'spec_helper' feature 'index' do - it "should show an index page - without an index page" do + it 'should show an index page - without an index page' do visit '/2015-02-18/' # header @@ -46,7 +46,7 @@ text: 'Select Item Type' end - it "should show an index page - with pending changes" do + it 'should show an index page - with pending changes' do visit '/2015-01-21/' # header @@ -64,7 +64,7 @@ end - it "should show a summary" do + it 'should show a summary' do visit '/2015-02-18/' expect(page).to have_selector 'tr.available td', text: '84' # committee diff --git a/www/board/agenda/spec/navigate_spec.rb b/www/board/agenda/spec/navigate_spec.rb index b4855272e3..ad1a174215 100644 --- a/www/board/agenda/spec/navigate_spec.rb +++ b/www/board/agenda/spec/navigate_spec.rb @@ -15,8 +15,8 @@ end feature 'navigation', js: true do - it "should navigate to the Cocoon report and back" do - skip "headless browser test not run" if ENV['SKIP_NAVIGATION'] + it 'should navigate to the Cocoon report and back' do + skip 'headless browser test not run' if ENV['SKIP_NAVIGATION'] visit '/2015-02-18/Clerezza' expect(page).to have_content('Clerezza') # basic test diff --git a/www/board/agenda/spec/other_views_spec.rb b/www/board/agenda/spec/other_views_spec.rb index c2e090a55d..1ab5ae5660 100644 --- a/www/board/agenda/spec/other_views_spec.rb +++ b/www/board/agenda/spec/other_views_spec.rb @@ -5,14 +5,14 @@ require_relative 'spec_helper' feature 'other reports' do - it "should support search" do + it 'should support search' do visit '/2015-02-18/search?q=ruby' expect(page).to have_selector 'pre', text: 'Sam Ruby' expect(page).to have_selector 'h4 a', text: 'Qpid' end - it "should support comments" do + it 'should support comments' do visit '/2015-01-21/comments' # unseen items @@ -29,7 +29,7 @@ expect(page).to have_selector 'button', text: 'show seen' end - it "should support queued/pending approvals and comments" do + it 'should support queued/pending approvals and comments' do visit '/2015-01-21/queue' expect(page).to have_selector :xpath, @@ -52,7 +52,7 @@ 'Update AI: follow up with PMC for clarification'].join(' ') end - it "should follow the ready queue" do + it 'should follow the ready queue' do visit '/2015-01-21/queue/Onami' expect(page).to have_selector '.navbar-fixed-top.reviewed .navbar-brand', @@ -64,7 +64,7 @@ text: 'OpenOffice' end - it "should show shepherd reports" do + it 'should show shepherd reports' do visit '/2015-01-21/shepherd/Sam' # action items @@ -96,7 +96,7 @@ expect(page).not_to have_selector '.nextlink' end - it "should follow the shepherd queue" do + it 'should follow the shepherd queue' do visit '/2015-02-18/shepherd/queue/Hama' expect(page).to have_selector '.navbar-fixed-top.missing .navbar-brand', @@ -108,7 +108,7 @@ text: 'Mesos' end - it "should skip to missing/flagged items once meeting has started" do + it 'should skip to missing/flagged items once meeting has started' do visit '/2015-02-18/Vice-Chairman' expect(page).to have_selector '.nextlink[href="flagged/Abdera"]', text: 'Abdera' @@ -126,7 +126,7 @@ text: 'Xerces' end - it "should highlight and crosslink action items" do + it 'should highlight and crosslink action items' do visit '/2015-01-21/Action-Items' expect(page).to have_selector 'span.missing', text: /^\s*Status:$/ @@ -149,7 +149,7 @@ expect(page).to have_selector 'span', text: '2015-01-21 ]' end - it "should draft action items" do + it 'should draft action items' do yaml = 'test/work/data/board_minutes_2015_02_18.yml' minutes = YAML.load_file(yaml) begin @@ -164,7 +164,7 @@ end end - it "should show flagged items" do + it 'should show flagged items' do visit '/2015-02-18/flagged' expect(page).to have_selector 'h3 a', text: 'Lenya' @@ -172,7 +172,7 @@ expect(page).to have_selector 'pre span', text: 'rg: Last quarter' end - it "should show missing items" do + it 'should show missing items' do visit '/2015-02-18/missing' expect(page).to have_selector 'h3 a', text: 'Cassandra' @@ -191,7 +191,7 @@ text: 'send final reminders' end - it "should hypertext minutes" do + it 'should hypertext minutes' do visit '/2015-02-18/January-21-2015' expect(page).to have_selector \ @@ -199,7 +199,7 @@ text: 'board_minutes_2015_01_21.txt' end - it "should show a help page" do + it 'should show a help page' do visit '/2015-02-18/help' # navigation diff --git a/www/board/agenda/spec/parse_spec.rb b/www/board/agenda/spec/parse_spec.rb index 81327661ed..c27a5ec05f 100644 --- a/www/board/agenda/spec/parse_spec.rb +++ b/www/board/agenda/spec/parse_spec.rb @@ -5,21 +5,21 @@ require_relative 'spec_helper' feature 'parse' do - it "should parse an agenda file" do + it 'should parse an agenda file' do parsed = Agenda.parse('board_agenda_2015_01_21.txt', :quick) abdera = parsed.find {|item| item['title'] == 'Abdera'} - expect(abdera[:index]).to eq("Committee Reports") + expect(abdera[:index]).to eq('Committee Reports') ace = parsed.find {|item| item['title'] == 'ACE'} - expect(ace[:attach]).to eq("C") + expect(ace[:attach]).to eq('C') expect(ace['owner']).to eq('Marcel Offermans') expect(ace['missing']).to equal(true) expect(ace['comments']).to eq('cm: Reminder email sent') expect(ace['shepherd']).to eq('Brett') avro = parsed.find {|item| item['title'] == 'Avro'} - expect(avro[:attach]).to eq("I") + expect(avro[:attach]).to eq('I') expect(avro['owner']).to eq('Tom White') expect(avro['missing']).to equal(nil) expect(avro['comments']).to eq('') diff --git a/www/board/agenda/spec/reflow_spec.rb b/www/board/agenda/spec/reflow_spec.rb index d494d47895..310d829eba 100644 --- a/www/board/agenda/spec/reflow_spec.rb +++ b/www/board/agenda/spec/reflow_spec.rb @@ -5,12 +5,12 @@ require_relative 'spec_helper' require_relative 'vue_server' -describe "reflow", type: :feature, server: :vue do +describe 'reflow', type: :feature, server: :vue do # # Comment form # - describe "incubator rules" do - it "handles ordered lists" do + describe 'incubator rules' do + it 'handles ordered lists' do on_vue_server do class TestReflow < Vue def render @@ -24,7 +24,7 @@ def render expect(page.body).to eq "1. a\n2. b" end - it "handles questions and colons" do + it 'handles questions and colons' do on_vue_server do class TestReflow < Vue def render @@ -38,8 +38,8 @@ def render expect(page.body).to eq "a?\nb:\nc" end - it "leaves long URLs alone" do - @line = "[7] http://example.com" + "/foobar" * 12 + it 'leaves long URLs alone' do + @line = '[7] http://example.com' + '/foobar' * 12 on_vue_server do line = @line diff --git a/www/board/agenda/spec/reports_spec.rb b/www/board/agenda/spec/reports_spec.rb index df91c9fbbe..33a6c7b64a 100644 --- a/www/board/agenda/spec/reports_spec.rb +++ b/www/board/agenda/spec/reports_spec.rb @@ -5,7 +5,7 @@ require_relative 'spec_helper' feature 'report' do - it "should show the President report" do + it 'should show the President report' do visit '/2015-02-18/President' # header @@ -32,7 +32,7 @@ text: 'Treasurer' end - it "should show the Avro report" do + it 'should show the Avro report' do visit '/2015-02-18/ACE' # header @@ -74,14 +74,14 @@ "#post-report-message[value='Edit ACE Report']" end - it "should show pending comments" do + it 'should show pending comments' do visit '/2015-01-21/Avro' expect(page).to have_selector 'h5#pending', text: 'Pending Comment' expect(page).to have_selector 'div.commented pre', text: 'jt: Nice report!' expect(page).to have_selector 'button', text: 'edit comment' end - it "should show missing reports" do + it 'should show missing reports' do visit '/2015-02-18/DirectMemory' expect(page).to have_selector 'pre em', text: 'Missing' expect(page).not_to have_selector 'dt', text: 'Approved' @@ -104,7 +104,7 @@ "#post-report-message[value='Post DirectMemory Report']" end - it "should show action items" do + it 'should show action items' do visit '/2015-01-21/DirectMemory' expect(page).to have_selector 'pre.report', text: '* Sam: Follow up with a more complete report next month' @@ -112,7 +112,7 @@ text: 'Action Items' end - it "should show draft minutes" do + it 'should show draft minutes' do visit '/2015-02-18/Drill' expect(page).to have_selector 'h4', text: 'Minutes' @@ -121,7 +121,7 @@ end - it "should show reports with warnings" do + it 'should show reports with warnings' do visit '/2015-01-21/Change-Labs-Chair' expect(page).to have_selector '.navbar-fixed-top.missing .navbar-brand', diff --git a/www/board/agenda/spec/secretary_spec.rb b/www/board/agenda/spec/secretary_spec.rb index 93c18c2c6e..1f8b5474a0 100644 --- a/www/board/agenda/spec/secretary_spec.rb +++ b/www/board/agenda/spec/secretary_spec.rb @@ -9,12 +9,12 @@ page.driver.header 'REMOTE_USER', SEC_ID # must be a non-director member of the secretarial team end - it "should allow timestamps to be edited" do + it 'should allow timestamps to be edited' do visit '/2015-02-18/Call-to-order' expect(page).to have_selector 'button', text: 'edit minutes' end - it "should take roll" do + it 'should take roll' do visit '/2015-02-18/Roll-Call' expect(page).to have_selector('h3', text: 'Directors') expect(page).to have_selector('a', text: 'Sean Kelly') @@ -23,7 +23,7 @@ expect(page).to have_selector('h3', text: 'Minutes') end - it "should show minute specific options" do + it 'should show minute specific options' do visit '/2015-02-18/January-21-2015' expect(page).to have_selector 'button', text: 'Cancel' expect(page).to have_selector 'button', text: 'Delete' @@ -32,7 +32,7 @@ expect(page).to have_selector 'button', text: 'Save' end - it "should prompt for action items" do + it 'should prompt for action items' do visit '/2015-02-18/Hama' expect(page).to have_selector 'button', text: 'add minutes' expect(page).to have_selector 'option', text: 'Sam' @@ -40,7 +40,7 @@ expect(page).to have_selector 'button', text: '+ AI' end - it "should show comments and edit minutes" do + it 'should show comments and edit minutes' do visit '/2015-02-18/Perl' expect(page).to have_selector 'button', text: 'edit minutes' expect(page).to have_selector 'h3', text: 'Comments' @@ -50,7 +50,7 @@ expect(page).to have_selector 'button', text: 'Delete' end - it "should show vote" do + it 'should show vote' do visit '/2015-02-18/Change-MINA-Chair' expect(page).to have_selector 'button', text: 'vote' expect(page).to have_selector 'span', text: 'Reverse roll call vote' @@ -59,12 +59,12 @@ expect(page).to have_selector 'button', text: 'Unanimous' end - it "should timestamp adjournment" do + it 'should timestamp adjournment' do visit '/2015-02-18/Adjournment' expect(page).to have_selector 'button', text: 'timestamp' end - it "should draft minutes" do + it 'should draft minutes' do completed '2015-02-18' do visit '/2015-02-18/Adjournment' expect(page).not_to have_selector 'button', text: 'timestamp' @@ -97,7 +97,7 @@ end end - it "should publish minutes" do + it 'should publish minutes' do visit '/2015-01-21/' expect(page).to have_selector 'textarea', text: '[21 January 2015](../records/minutes/2015/board_minutes_2015_01_21.txt)' diff --git a/www/board/agenda/spec/spec_helper.rb b/www/board/agenda/spec/spec_helper.rb index 4ef7edcaeb..2ca1fe62c4 100644 --- a/www/board/agenda/spec/spec_helper.rb +++ b/www/board/agenda/spec/spec_helper.rb @@ -9,7 +9,7 @@ ENV['RACK_ENV'] = 'test' ENV['REMOTE_USER'] = 'test' require 'capybara/rspec' -require "selenium-webdriver" +require 'selenium-webdriver' require_relative '../main' Capybara.app = Sinatra::Application Capybara.javascript_driver = :selenium_chrome_headless @@ -83,21 +83,21 @@ def system(*args) DUMMY = { 'ldapsearch -x -LLL -b ou=groups,ou=services,dc=apache,dc=org -s one cn=pmc-chairs member memberUid' => - [{"member" => []}], + [{'member' => []}], 'ldapsearch -x -LLL -b ou=groups,dc=apache,dc=org -s one cn=member memberUid' => [[]], 'ldapsearch -x -LLL -b ou=groups,ou=services,dc=apache,dc=org -s one cn=board member memberUid' => - [{"member" => []}], + [{'member' => []}], 'ldapsearch -x -LLL -b ou=groups,ou=services,dc=apache,dc=org -s sub cn=asf-secretary dn' => - [["cn=asf-secretary,ou=groups,ou=services,dc=apache,dc=org"]], + [['cn=asf-secretary,ou=groups,ou=services,dc=apache,dc=org']], 'ldapsearch -x -LLL -b ou=groups,ou=services,dc=apache,dc=org -s one cn=asf-secretary member memberUid' => - [{"member"=>["uid=#{SEC_ID},ou=people,dc=apache,dc=org"], "dn"=>["cn=asf-secretary,ou=groups,ou=services,dc=apache,dc=org"]}], + [{'member'=>["uid=#{SEC_ID},ou=people,dc=apache,dc=org"], 'dn'=>['cn=asf-secretary,ou=groups,ou=services,dc=apache,dc=org']}], 'ldapsearch -x -LLL -b ou=groups,ou=services,dc=apache,dc=org -s sub cn=board dn' => [['cn=board,ou=groups,ou=services,dc=apache,dc=org']], 'ldapsearch -x -LLL -b ou=groups,ou=services,dc=apache,dc=org -s sub cn=pmc-chairs dn' => [[]], "ldapsearch -x -LLL -b ou=people,dc=apache,dc=org -s one uid=#{SEC_ID} " => - [{"uid"=>["#{SEC_ID}"], "dn"=>["uid=#{SEC_ID},ou=people,dc=apache,dc=org"]}], + [{'uid'=>["#{SEC_ID}"], 'dn'=>["uid=#{SEC_ID},ou=people,dc=apache,dc=org"]}], } diff --git a/www/board/agenda/spec/vue_server.rb b/www/board/agenda/spec/vue_server.rb index 97bc2ef861..aab8f8e1a8 100644 --- a/www/board/agenda/spec/vue_server.rb +++ b/www/board/agenda/spec/vue_server.rb @@ -72,7 +72,7 @@ def self.stop # the server itself @@server = proc do - _cleanup = require("jsdom-global/register") + _cleanup = require('jsdom-global/register') delete global.XMLHttpRequest process.env.VUE_ENV = 'server' @@ -151,7 +151,7 @@ def app.querySelector(selector) end end -shared_context "vue_server", server: :vue do +shared_context 'vue_server', server: :vue do # # administrivia # diff --git a/www/board/agenda/test/stresstest.rb b/www/board/agenda/test/stresstest.rb index bf287e4e0f..d42a49e04c 100644 --- a/www/board/agenda/test/stresstest.rb +++ b/www/board/agenda/test/stresstest.rb @@ -19,7 +19,7 @@ # wait for server to start 10.times do |i| begin - Net::HTTP.get_response(URI.parse("http://localhost:3000/")) + Net::HTTP.get_response(URI.parse('http://localhost:3000/')) break rescue Errno::ECONNREFUSED end @@ -35,20 +35,20 @@ File.unlink "test/work/data/#{userid}.yml" rescue nil # approve tomcat - uri = URI.parse("http://localhost:3000/json/approve") + uri = URI.parse('http://localhost:3000/json/approve') http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Post.new(uri.request_uri) - request.basic_auth(userid, "password") - request.set_form_data agenda: "board_agenda_2015_02_18.txt", + request.basic_auth(userid, 'password') + request.set_form_data agenda: 'board_agenda_2015_02_18.txt', initials: initials, request: 'approve', attach: 'BX' response = http.request(request) # commit - uri = URI.parse("http://localhost:3000/json/commit") + uri = URI.parse('http://localhost:3000/json/commit') http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Post.new(uri.request_uri) - request.basic_auth(userid, "password") - request.set_form_data message: "approve tomcat", initials: initials + request.basic_auth(userid, 'password') + request.set_form_data message: 'approve tomcat', initials: initials response = http.request(request) # File.write("#{userid}.response", response.body.force_encoding('utf-8')) end diff --git a/www/board/agenda/views/actions/attend.json.rb b/www/board/agenda/views/actions/attend.json.rb index 0ece18bac9..aea521f3b4 100644 --- a/www/board/agenda/views/actions/attend.json.rb +++ b/www/board/agenda/views/actions/attend.json.rb @@ -3,9 +3,9 @@ # if @action == 'regrets' - message = "Regrets for the meeting." + message = 'Regrets for the meeting.' else - message = "I plan to attend the meeting." + message = 'I plan to attend the meeting.' end Agenda.update(@agenda, message) do |agenda| diff --git a/www/board/agenda/views/actions/commit.json.rb b/www/board/agenda/views/actions/commit.json.rb index 842e06bb5a..26724f1f99 100644 --- a/www/board/agenda/views/actions/commit.json.rb +++ b/www/board/agenda/views/actions/commit.json.rb @@ -70,7 +70,7 @@ approvals = approvals.strip.split(/(?:,\s*|\s+)/) if approvals.delete(initials) if approvals.empty? - match[/approved:(.*?)\n/, 1] = "" + match[/approved:(.*?)\n/, 1] = '' else match[/approved: (.*?)\n/, 1] = approvals.join(', ') end @@ -153,7 +153,7 @@ replacement.puts ' ]' end - replacement.print " Status:" + replacement.print ' Status:' replacement.print " #{action[:status]}" unless action[:status].empty? replacement.puts replacement.puts diff --git a/www/board/agenda/views/actions/financials.json.rb b/www/board/agenda/views/actions/financials.json.rb index a928839cc7..95be2febe5 100644 --- a/www/board/agenda/views/actions/financials.json.rb +++ b/www/board/agenda/views/actions/financials.json.rb @@ -14,7 +14,7 @@ # parse worksheet # https://github.com/weshatheleopard/rubyXL/issues/235 begin - stdout, $stdout = $stdout, File.new("/dev/null", "w") + stdout, $stdout = $stdout, File.new('/dev/null', 'w') workbook = RubyXL::Parser.parse_buffer(Base64.decode64(@spreadsheet)) ensure $stdout = stdout @@ -71,7 +71,7 @@ # move headings from second to seventh row headings[2] = headings[6] = 'Budget' 1.upto(7) do |i| - headings[i] = headings[i].strftime("%b-%y") if headings[i].is_a? DateTime + headings[i] = headings[i].strftime('%b-%y') if headings[i].is_a? DateTime headings[i] = headings[i].rjust(12) if headings[i] end rows.insert(blank+1, headings) diff --git a/www/board/agenda/views/actions/post.json.rb b/www/board/agenda/views/actions/post.json.rb index 0181c8f8ef..20b9ddb9d1 100644 --- a/www/board/agenda/views/actions/post.json.rb +++ b/www/board/agenda/views/actions/post.json.rb @@ -41,13 +41,13 @@ projectName = project.display_name parsed.each do |report| if report['title'] == projectName - raise "report already posted" unless @digest or report['missing'] + raise 'report already posted' unless @digest or report['missing'] attach = @attach = report[:attach] @digest ||= report['digest'] end end elsif not ENV['RACK_ENV'] == 'test' - raise "not authorized to post to the board agenda" unless member_or_officer + raise 'not authorized to post to the board agenda' unless member_or_officer end # remove trailing whitespace @@ -71,7 +71,7 @@ title = " #{order}. #{@title}\n\n" # update the commit message that will be used - @message.sub! "7X", "7#{order}" + @message.sub! '7X', "7#{order}" # insert into agenda agenda[/\n() 8\. Discussion Items/, 1] = "#{title}#{@report}\n\n" @@ -91,7 +91,7 @@ title = " #{item}. #{@title}\n\n" # update the commit message that will be used - @message.sub! "8X", "8#{item}" + @message.sub! '8X', "8#{item}" # insert into agenda agenda[/\n() 9\. .*Action Items/, 1] = "#{title}#{@report}\n\n" @@ -134,7 +134,7 @@ if not item raise Exception.new("Attachment #{@attach.inspect} not found") elsif @digest != item['digest'] - raise Exception.new("Merge conflict") + raise Exception.new('Merge conflict') end spacing = "\n\n" @@ -155,7 +155,7 @@ spacing = "\n\n\n" end - spacing = "" if @report.empty? + spacing = '' if @report.empty? # President report has a custom footer - retain it if item['title'] == 'President' and agenda[pattern] diff --git a/www/board/agenda/views/actions/posted-reports.json.rb b/www/board/agenda/views/actions/posted-reports.json.rb index 6ff2bb8d27..86a2e5bfcc 100755 --- a/www/board/agenda/views/actions/posted-reports.json.rb +++ b/www/board/agenda/views/actions/posted-reports.json.rb @@ -9,7 +9,7 @@ require 'whimsy/asf/agenda' # link to board private-arch -THREAD = "https://lists.apache.org/thread.html/" +THREAD = 'https://lists.apache.org/thread.html/' ARCHIVE = '/srv/mail/board' if @path and @path =~ /^\d+\/\w+$/ diff --git a/www/board/agenda/views/actions/potential-actions.json.rb b/www/board/agenda/views/actions/potential-actions.json.rb index 1b6d77c67a..5517fc8640 100644 --- a/www/board/agenda/views/actions/potential-actions.json.rb +++ b/www/board/agenda/views/actions/potential-actions.json.rb @@ -11,7 +11,7 @@ select {|file| file <= today}.sort.last end -raise IOError.new("No previous agenda found") unless base +raise IOError.new('No previous agenda found') unless base parsed = ASF::Board::Agenda.parse(IO.read(base), true) actions = parsed.find {|item| item['title'] == 'Action Items'}['actions'] diff --git a/www/board/agenda/views/actions/publish.json.rb b/www/board/agenda/views/actions/publish.json.rb index 9ec73cbb1f..ef51f1e460 100755 --- a/www/board/agenda/views/actions/publish.json.rb +++ b/www/board/agenda/views/actions/publish.json.rb @@ -1,5 +1,5 @@ -""" +''" Publish approved minutes on the public web site @@ -25,7 +25,7 @@ - archive agenda if it exists - commit changes if any -""" +"'' require 'date' require 'whimsy/asf/svn' @@ -47,7 +47,7 @@ # extract date and year from minutes date = Date.parse(@date.gsub('_', '-')) year = date.year -fdate = date.strftime("%d %B %Y") +fdate = date.strftime('%d %B %Y') minutes = "board_minutes_#{@date}.txt" diff --git a/www/board/agenda/views/actions/remind-actions.json.rb b/www/board/agenda/views/actions/remind-actions.json.rb index d51f4a5784..89eded6663 100644 --- a/www/board/agenda/views/actions/remind-actions.json.rb +++ b/www/board/agenda/views/actions/remind-actions.json.rb @@ -45,7 +45,7 @@ mail = Mail.new do from from to "#{person.public_name} <#{person.id}@apache.org>" - bcc "board-private@apache.org" + bcc 'board-private@apache.org' subject 'Action Item reminder' body Erubis::Eruby.new(template).result(binding) diff --git a/www/board/agenda/views/actions/reminder-text.json.rb b/www/board/agenda/views/actions/reminder-text.json.rb index 0a99db5815..d8faa0326c 100644 --- a/www/board/agenda/views/actions/reminder-text.json.rb +++ b/www/board/agenda/views/actions/reminder-text.json.rb @@ -21,12 +21,12 @@ view = { project: '{{{project}}}', link: '{{{link}}}', - meetingDate: meeting.strftime("%a, %d %b %Y at %H:%M %Z"), - month: meeting.strftime("%B"), + meetingDate: meeting.strftime('%a, %d %b %Y at %H:%M %Z'), + month: meeting.strftime('%B'), year: meeting.year.to_s, timeZoneInfo: timeZoneInfo, dueDate: dueDate.strftime("%a %b #{dueDate.day.ordinalize}"), - agenda: meeting.strftime("https://whimsy.apache.org/board/agenda/%Y-%m-%d/") + agenda: meeting.strftime('https://whimsy.apache.org/board/agenda/%Y-%m-%d/') } # perform the substitution diff --git a/www/board/agenda/views/actions/responses.json.rb b/www/board/agenda/views/actions/responses.json.rb index ffdb925f14..604146fec4 100644 --- a/www/board/agenda/views/actions/responses.json.rb +++ b/www/board/agenda/views/actions/responses.json.rb @@ -5,7 +5,7 @@ require 'date' maildir = '/srv/mail/board/' -start = maildir + (Date.today - 365).strftime("%Y%m") +start = maildir + (Date.today - 365).strftime('%Y%m') responses = {} diff --git a/www/board/agenda/views/actions/todos.json.rb b/www/board/agenda/views/actions/todos.json.rb index 88b5f03910..88569e7cbe 100644 --- a/www/board/agenda/views/actions/todos.json.rb +++ b/www/board/agenda/views/actions/todos.json.rb @@ -196,12 +196,12 @@ cc 'Apache Board ' - subject "Congratulations on your new role at Apache - next steps" + subject 'Congratulations on your new role at Apache - next steps' body "Dear newly-appointed PMC Chair(s),\n\n" + "Congratulations on being appointed by the board as a project VP and Chair of your PMC!\n\n" + "Please read the following list of required to-dos for new Chairs, which includes key links to all the duties and responsibilities of being a Chair.\n\n" + - " https://apache.org/dev/pmc-chair" + + ' https://apache.org/dev/pmc-chair' + "\n\nWarm regards,\n\n#{sender.public_name}\nOn Behalf of the ASF Board" end diff --git a/www/board/agenda/views/buttons/add-comment.js.rb b/www/board/agenda/views/buttons/add-comment.js.rb index fe93ba2770..e8a2b7a65f 100644 --- a/www/board/agenda/views/buttons/add-comment.js.rb +++ b/www/board/agenda/views/buttons/add-comment.js.rb @@ -70,7 +70,7 @@ def mounted() # autofocus on comment text jQuery('#comment-form').on 'shown.bs.modal' do - document.getElementById("comment-text").focus() + document.getElementById('comment-text').focus() end end @@ -84,7 +84,7 @@ def save(event) data = { agenda: Agenda.file, attach: @@item.attach, - initials: document.getElementById("comment-initials").value || + initials: document.getElementById('comment-initials').value || User.initials, comment: @comment } diff --git a/www/board/agenda/views/buttons/add-minutes.js.rb b/www/board/agenda/views/buttons/add-minutes.js.rb index 368985b5de..37fb6072f3 100644 --- a/www/board/agenda/views/buttons/add-minutes.js.rb +++ b/www/board/agenda/views/buttons/add-minutes.js.rb @@ -81,7 +81,7 @@ def mounted() # autofocus on minute text jQuery('#minute-form').on 'shown.bs.modal' do - document.getElementById("minute-text").focus() + document.getElementById('minute-text').focus() end end diff --git a/www/board/agenda/views/buttons/commit.js.rb b/www/board/agenda/views/buttons/commit.js.rb index 39f286c59f..4c61fca17b 100644 --- a/www/board/agenda/views/buttons/commit.js.rb +++ b/www/board/agenda/views/buttons/commit.js.rb @@ -38,7 +38,7 @@ def render # autofocus on comment text def mounted() jQuery('#commit-form').on 'shown.bs.modal' do - document.getElementById("commit-text").focus() + document.getElementById('commit-text').focus() end end diff --git a/www/board/agenda/views/buttons/draft-minutes.js.rb b/www/board/agenda/views/buttons/draft-minutes.js.rb index 5121195ab9..7029b298d2 100644 --- a/www/board/agenda/views/buttons/draft-minutes.js.rb +++ b/www/board/agenda/views/buttons/draft-minutes.js.rb @@ -33,7 +33,7 @@ def mounted() @draft = '' jQuery('#draft-minute-form').on 'shown.bs.modal' do retrieve "draft/#{Agenda.title.gsub('-', '_')}", :text do |draft| - document.getElementById("draft-minute-text").focus() + document.getElementById('draft-minute-text').focus() @disabled = false @draft = draft jQuery('#draft-minute-text').animate(scrollTop: 0) diff --git a/www/board/agenda/views/buttons/email.js.rb b/www/board/agenda/views/buttons/email.js.rb index d0edd53b73..683f236f4b 100644 --- a/www/board/agenda/views/buttons/email.js.rb +++ b/www/board/agenda/views/buttons/email.js.rb @@ -79,7 +79,7 @@ def launch_email_client(event) # strip indentation; concatenate lines within a paragraph indent = body[/^\s*/] - body = body.strip().gsub(/#{indent}/, "\n").gsub(/(\S)\n(\S)/, "$1 $2") + body = body.strip().gsub(/#{indent}/, "\n").gsub(/(\S)\n(\S)/, '$1 $2') else subject = "#{@@item.title} Board Report" body = @@item.comments.join("\n\n") @@ -122,26 +122,26 @@ def render # input field: to _div.form_group.row do _label.col_sm_2 'To', for: 'email-to' - _input.col_sm_10.email_to! placeholder: "destination email address", + _input.col_sm_10.email_to! placeholder: 'destination email address', disabled: @disabled, value: @@email.to end # input field: cc _div.form_group.row do _label.col_sm_2 'CC', for: 'email-cc' - _input.col_sm_10.email_cc! placeholder: "cc list", disabled: @disabled, + _input.col_sm_10.email_cc! placeholder: 'cc list', disabled: @disabled, value: @@email.cc end # input field: subject _div.form_group.row do _label.col_sm_2 'Subject', for: 'email-subject' - _input.col_sm_10.email_subject! placeholder: "email subject", + _input.col_sm_10.email_subject! placeholder: 'email subject', disabled: @disabled, value: @@email.subject end # input field: body - _textarea.email_body! label: 'Body', placeholder: "email text", + _textarea.email_body! label: 'Body', placeholder: 'email text', disabled: @disabled, value: @@email.body, rows: 10 _button.btn_default 'Cancel', type: 'button', data_dismiss: 'modal' diff --git a/www/board/agenda/views/buttons/message.js.rb b/www/board/agenda/views/buttons/message.js.rb index e39ab8e90a..8ba2a68080 100644 --- a/www/board/agenda/views/buttons/message.js.rb +++ b/www/board/agenda/views/buttons/message.js.rb @@ -16,7 +16,7 @@ def render # autofocus on the chat message when the page is initially displayed def mounted() - document.getElementById("chatMessage").focus() + document.getElementById('chatMessage').focus() end # send message to server diff --git a/www/board/agenda/views/buttons/post.js.rb b/www/board/agenda/views/buttons/post.js.rb index ddffb62376..0b9afcd243 100644 --- a/www/board/agenda/views/buttons/post.js.rb +++ b/www/board/agenda/views/buttons/post.js.rb @@ -336,8 +336,8 @@ def updated() # set focus, scroll def reposition() # set focus once modal is shown - title = document.getElementById("post-report-title") - text = document.getElementById("post-report-text") + title = document.getElementById('post-report-title') + text = document.getElementById('post-report-text') if title || text (title || text).focus() @@ -403,17 +403,17 @@ def retitle() when 'post item', 'Discussion Item' @header = 'Add Discussion Item' @label = 'text' - @message = "Add Discussion Item" + @message = 'Add Discussion Item' when 'post items' @header = 'Post Discussion Items' @label = 'text' - @message = "Post Discussion Items" + @message = 'Post Discussion Items' when 'edit items' @header = 'Edit Discussion Items' @label = 'text' - @message = "Edit Discussion Items" + @message = 'Edit Discussion Items' end if not @edited diff --git a/www/board/agenda/views/buttons/publish-minutes.js.rb b/www/board/agenda/views/buttons/publish-minutes.js.rb index 9946915c05..20ed477125 100644 --- a/www/board/agenda/views/buttons/publish-minutes.js.rb +++ b/www/board/agenda/views/buttons/publish-minutes.js.rb @@ -53,7 +53,7 @@ def created() # autofocus on minute text def mounted() jQuery('#publish-minutes-form').on 'shown.bs.modal' do - document.getElementById("summary-text").focus() + document.getElementById('summary-text').focus() end end diff --git a/www/board/agenda/views/buttons/remind-actions.js.rb b/www/board/agenda/views/buttons/remind-actions.js.rb index 1a196b9aae..f3ba64b20c 100644 --- a/www/board/agenda/views/buttons/remind-actions.js.rb +++ b/www/board/agenda/views/buttons/remind-actions.js.rb @@ -5,7 +5,7 @@ class ActionReminder < Vue def initialize @disabled = false @list = @@item.actions.map do |action| - Object.assign({complete: action.status != ""}, action) + Object.assign({complete: action.status != ''}, action) end end @@ -50,18 +50,18 @@ def click(event) @disabled = true post 'remind-actions', data do |response| if not response - alert("Server error - check console log") + alert('Server error - check console log') elsif dryrun console.log Object.values(response.sent).join("\n---\n\n") response.delete(:sent) console.log response - alert("Dry run - check console log") + alert('Dry run - check console log') elsif response.count == @list.length alert("Reminders have been sent to: #{response.sent.keys.join(', ')}.") elsif response.count and response.unsent alert("Error: no emails were sent to #{response.unsent.inspect}") else - alert("No reminders were sent") + alert('No reminders were sent') end @disabled = false diff --git a/www/board/agenda/views/buttons/reminders.js.rb b/www/board/agenda/views/buttons/reminders.js.rb index fc22bd668a..b0fd31436e 100644 --- a/www/board/agenda/views/buttons/reminders.js.rb +++ b/www/board/agenda/views/buttons/reminders.js.rb @@ -102,16 +102,16 @@ def click(event) post 'send-reminders', data do |response| if not response - alert("Server error - check console log") + alert('Server error - check console log') elsif dryrun console.log response - alert("Dry run - check console log") + alert('Dry run - check console log') elsif response.count == data.pmcs.length alert("Reminders have been sent to: #{data.pmcs.join(', ')}.") elsif response.count and response.unsent alert("Error: no emails were sent to #{response.unsent.inspect}") else - alert("No reminders were sent") + alert('No reminders were sent') end event.target.disabled = true diff --git a/www/board/agenda/views/buttons/summary.js.rb b/www/board/agenda/views/buttons/summary.js.rb index 3fe6fe87fb..8108bc205e 100644 --- a/www/board/agenda/views/buttons/summary.js.rb +++ b/www/board/agenda/views/buttons/summary.js.rb @@ -31,7 +31,7 @@ def mounted() @summary = '' jQuery('#summary-form').on 'show.bs.modal' do retrieve "summary/#{Agenda.title}", :text do |summary| - document.getElementById("summary-text").focus() + document.getElementById('summary-text').focus() @disabled = false @summary = summary jQuery('#summary-text').animate(scrollTop: 0) diff --git a/www/board/agenda/views/buttons/vote.js.rb b/www/board/agenda/views/buttons/vote.js.rb index 2e0020fcb9..6607d3e5f9 100644 --- a/www/board/agenda/views/buttons/vote.js.rb +++ b/www/board/agenda/views/buttons/vote.js.rb @@ -57,7 +57,7 @@ def mounted() # autofocus on comment text jQuery('#vote-form').on 'shown.bs.modal' do - document.getElementById("vote-text").focus() + document.getElementById('vote-text').focus() end end @@ -70,9 +70,9 @@ def setup(item) month = Date.new(Date.parse(Agenda.date)).getMonth() attach = item.attach.charCodeAt(1) if (month + attach) % 2 == 0 - @votetype = "Roll call" + @votetype = 'Roll call' else - @votetype = "Reverse roll call" + @votetype = 'Reverse roll call' @directors = @directors.split("\n").reverse().join("\n") end diff --git a/www/board/agenda/views/committers_report.text.rb b/www/board/agenda/views/committers_report.text.rb index ccd9fa5b05..b9afbbc1cd 100644 --- a/www/board/agenda/views/committers_report.text.rb +++ b/www/board/agenda/views/committers_report.text.rb @@ -68,7 +68,7 @@ # Find out the date of the next board report next_meeting = ASF::Board.nextMeeting -@next_meeting = next_meeting.day.ordinalize + " of " + +@next_meeting = next_meeting.day.ordinalize + ' of ' + next_meeting.strftime('%B') # author of the email diff --git a/www/board/agenda/views/elements/additional-info.js.rb b/www/board/agenda/views/elements/additional-info.js.rb index a6b917e596..32a44ff3db 100644 --- a/www/board/agenda/views/elements/additional-info.js.rb +++ b/www/board/agenda/views/elements/additional-info.js.rb @@ -117,7 +117,7 @@ def render count -= 1 if date < '2017_11' if count == 0 - link = "(no responses)" + link = '(no responses)' elsif count == 1 link = '(1 response)' else diff --git a/www/board/agenda/views/keyboard.js.rb b/www/board/agenda/views/keyboard.js.rb index 6243435c34..6d9bcba96f 100644 --- a/www/board/agenda/views/keyboard.js.rb +++ b/www/board/agenda/views/keyboard.js.rb @@ -13,23 +13,23 @@ def (document.body).onkeydown(event) %w(input textarea).include? document.activeElement.tagName.downcase() if event.keyCode == 37 # '<-' - link = document.querySelector("a[rel=prev]") + link = document.querySelector('a[rel=prev]') if link link.click() return false end elsif event.keyCode == 39 # '->' - link = document.querySelector("a[rel=next]") + link = document.querySelector('a[rel=next]') if link link.click() return false end elsif event.keyCode == 13 # 'enter' - link = document.querySelector(".default") + link = document.querySelector('.default') Main.navigate link.getAttribute('href') if link return false elsif event.keyCode == 'C'.ord - link = document.getElementById("comments") + link = document.getElementById('comments') if link jQuery('html, body').animate({scrollTop: link.offsetTop}, :slow); else @@ -37,14 +37,14 @@ def (document.body).onkeydown(event) end return false elsif event.keyCode == 'I'.ord - info = document.getElementById("info") + info = document.getElementById('info') info.click() if info return false elsif event.keyCode == 'M'.ord Main.navigate 'missing' return false elsif event.keyCode == 'N'.ord - document.getElementById("nav").click() + document.getElementById('nav').click() return false elsif event.keyCode == 'A'.ord Main.navigate '.' @@ -54,7 +54,7 @@ def (document.body).onkeydown(event) User.role = :secretary Main.refresh() else - link = document.getElementById("shepherd") + link = document.getElementById('shepherd') Main.navigate link.getAttribute('href') if link end return false @@ -65,16 +65,16 @@ def (document.body).onkeydown(event) return false end elsif event.keyCode == 'Q'.ord - Main.navigate "queue" + Main.navigate 'queue' return false elsif event.keyCode == 'F'.ord - Main.navigate "flagged" + Main.navigate 'flagged' return false elsif event.keyCode == 'B'.ord - Main.navigate "backchannel" + Main.navigate 'backchannel' return false elsif event.shiftKey and event.keyCode == 191 # "?" - Main.navigate "help" + Main.navigate 'help' return false elsif event.keyCode == 'R'.ord Header.clock_counter += 1 @@ -86,7 +86,7 @@ def (document.body).onkeydown(event) end return false elsif event.keyCode == '='.ord or event.keyCode == 187 # "=" - Main.navigate "cache/" + Main.navigate 'cache/' return false end end diff --git a/www/board/agenda/views/layout/footer.js.rb b/www/board/agenda/views/layout/footer.js.rb index d9e6d90d57..dad78a2ab6 100644 --- a/www/board/agenda/views/layout/footer.js.rb +++ b/www/board/agenda/views/layout/footer.js.rb @@ -52,7 +52,7 @@ def render prefix = '' end - link ||= {href: "flagged", title: 'Flagged'} + link ||= {href: 'flagged', title: 'Flagged'} end elsif meeting_day and @@item.attach =~ /\d/ and @@ -121,7 +121,7 @@ def render link = link.next end end - link ||= {href: "flagged", title: 'Flagged'} + link ||= {href: 'flagged', title: 'Flagged'} elsif meeting_day and link and @@item.attach =~ /^\d[A-Z]/ and link.attach =~ /^\d/ diff --git a/www/board/agenda/views/layout/header.js.rb b/www/board/agenda/views/layout/header.js.rb index 0c3024deb6..f484928fa1 100644 --- a/www/board/agenda/views/layout/header.js.rb +++ b/www/board/agenda/views/layout/header.js.rb @@ -47,7 +47,7 @@ def render elsif @@item.online _li.dropdown do - _a.dropdown_toggle.info! data_toggle: "dropdown" do + _a.dropdown_toggle.info! data_toggle: 'dropdown' do _ 'online' _b.caret end @@ -61,7 +61,7 @@ def render else _li.dropdown do - _a.dropdown_toggle.info! data_toggle: "dropdown" do + _a.dropdown_toggle.info! data_toggle: 'dropdown' do _ 'summary' _b.caret end @@ -84,7 +84,7 @@ def render # 'navigation' dropdown # _li.dropdown do - _a.dropdown_toggle.nav! data_toggle: "dropdown" do + _a.dropdown_toggle.nav! data_toggle: 'dropdown' do _ 'navigation' _b.caret end diff --git a/www/board/agenda/views/models/chat.js.rb b/www/board/agenda/views/models/chat.js.rb index b4822a1f0a..d20203dfc8 100644 --- a/www/board/agenda/views/models/chat.js.rb +++ b/www/board/agenda/views/models/chat.js.rb @@ -203,12 +203,12 @@ def self.status diff = Agenda.find('Call-to-order').timestamp - Date.new().getTime() if Minutes.complete - "meeting has completed" + 'meeting has completed' elsif Minutes.started if @@topic.subtype == :status @@topic.text else - "meeting has started" + 'meeting has started' end elsif diff > 86_400_000 * 3/2 "meeting will start in about #{Math.floor(diff/86_400_000+0.5)} days" @@ -219,7 +219,7 @@ def self.status elsif diff > 90_000 "meeting will start in about #{Math.floor(diff/60_000+0.5)} minutes" else - "meeting will start shortly" + 'meeting will start shortly' end end end diff --git a/www/board/agenda/views/models/events.js.rb b/www/board/agenda/views/models/events.js.rb index 1fc7d7273d..f20d89ae42 100644 --- a/www/board/agenda/views/models/events.js.rb +++ b/www/board/agenda/views/models/events.js.rb @@ -94,7 +94,7 @@ def self.negotiate() self.master() else options = {credentials: 'include'} - request = Request.new("../session.json", options) + request = Request.new('../session.json', options) fetch(request).then do |response| response.json().then do |json| Server.session = json.session @@ -201,7 +201,7 @@ def self.dispatch(data) if message.type == :unauthorized options = {credentials: 'include'} - request = Request.new("../session.json", options) + request = Request.new('../session.json', options) fetch(request).then do |response| response.json().then do |json| self.log json @@ -226,10 +226,10 @@ def self.prefix return @@prefix if @@prefix # determine localStorage variable prefix based on url up to the date - base = document.getElementsByTagName("base")[0].href + base = document.getElementsByTagName('base')[0].href origin = location.origin if not origin # compatibility: http://s.apache.org/X2L - origin = window.location.protocol + "//" + window.location.hostname + + origin = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '') end diff --git a/www/board/agenda/views/models/jsonstorage.js.rb b/www/board/agenda/views/models/jsonstorage.js.rb index 3b63bc64bc..a3a82b02b2 100644 --- a/www/board/agenda/views/models/jsonstorage.js.rb +++ b/www/board/agenda/views/models/jsonstorage.js.rb @@ -10,10 +10,10 @@ class JSONStorage def self.prefix return @@prefix if @@prefix - base = document.getElementsByTagName("base")[0].href + base = document.getElementsByTagName('base')[0].href origin = location.origin if not origin # compatibility: http://s.apache.org/X2L - origin = window.location.protocol + "//" + window.location.hostname + + origin = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '') end diff --git a/www/board/agenda/views/models/pending.js.rb b/www/board/agenda/views/models/pending.js.rb index 75d99ae43f..c8f69de16d 100644 --- a/www/board/agenda/views/models/pending.js.rb +++ b/www/board/agenda/views/models/pending.js.rb @@ -119,7 +119,7 @@ def self.offline_enabled # offline storage using IndexDB def self.dbopen(&block) - request = indexedDB.open("whimsy/board/agenda", 1) + request = indexedDB.open('whimsy/board/agenda', 1) def request.onerror(event) console.log 'pending database not available' @@ -139,8 +139,8 @@ def request.onupgradeneeded(event) # is no data, or if the data is for another month's agenda def self.dbget(&block) self.dbopen do |db| - tx = db.transaction("pending", :readonly) - store = tx.objectStore("pending") + tx = db.transaction('pending', :readonly) + store = tx.objectStore('pending') request = store.get('pending') def request.onerror(event) @@ -160,8 +160,8 @@ def request.onsuccess(event) # update pending value. def self.dbput(value) self.dbopen do |db| - tx = db.transaction("pending", :readwrite) - store = tx.objectStore("pending") + tx = db.transaction('pending', :readwrite) + store = tx.objectStore('pending') request = store.put(key: 'pending', agenda: Agenda.date, value: value) def request.onerror(event) diff --git a/www/board/agenda/views/new.html.rb b/www/board/agenda/views/new.html.rb index 3f5e3c22a8..eb1a8804be 100644 --- a/www/board/agenda/views/new.html.rb +++ b/www/board/agenda/views/new.html.rb @@ -22,23 +22,23 @@ _div.commented do _h4 'Committees expected to report next month, and why:' - _pre.commented @next_month.gsub(@next_month.scan(/\s+#/).max.to_s, " -") + _pre.commented @next_month.gsub(@next_month.scan(/\s+#/).max.to_s, ' -') end if @next_month.include? "through #@prev_month" _h3.missing do _ "List still shows a committee as reporting through #@prev_month." - _ "Perhaps committee-info.txt was not updated?" + _ 'Perhaps committee-info.txt was not updated?' end elsif not @next_month.include? @prev_month _h3.missing do _ "No reports were marked missing or rejected in #@prev_month." - _ "Perhaps committee-info.txt was not updated?" + _ 'Perhaps committee-info.txt was not updated?' end end end - _form method: 'post', action: @meeting.strftime("%Y-%m-%d/") do + _form method: 'post', action: @meeting.strftime('%Y-%m-%d/') do _div.text_center do _button.btn.btn_primary 'Post', disabled: @disabled diff --git a/www/board/agenda/views/pages/action-items.js.rb b/www/board/agenda/views/pages/action-items.js.rb index 416724a18f..869ed65d93 100644 --- a/www/board/agenda/views/pages/action-items.js.rb +++ b/www/board/agenda/views/pages/action-items.js.rb @@ -91,7 +91,7 @@ def render Vue.createElement('span', options) do # highlight missing action item status updates if pending - _span "Status: " + _span 'Status: ' pending.status.split("\n").each do |line| match = line.match(/^( *)(.*)/) _span match[1] @@ -165,7 +165,7 @@ def render end _ "* #{action.owner}: #{action.text.gsub("\n", "\n ")}\n" - _ " [ " + _ ' [ ' if action.item _Link text: action.item.title, href: action.item.href, class: action.item.color diff --git a/www/board/agenda/views/pages/fy23.js.rb b/www/board/agenda/views/pages/fy23.js.rb index 1f4b4cb5c6..6583b81181 100644 --- a/www/board/agenda/views/pages/fy23.js.rb +++ b/www/board/agenda/views/pages/fy23.js.rb @@ -35,8 +35,8 @@ def render .table tbody tr td a {color: blue; text-decoration:underline} } - _p "Instructions: change any input field and press the tab key to see " + - "new results. Try to keep FY23 Budget Cash non-negative." + _p 'Instructions: change any input field and press the tab key to see ' + + 'new results. Try to keep FY23 Budget Cash non-negative.' _table.table.table_sm.table_striped do _thead do @@ -274,7 +274,7 @@ def render end end - _p "Units are in thousands of dollars US." + _p 'Units are in thousands of dollars US.' end # evaluate computed fields diff --git a/www/board/agenda/views/pages/report.js.rb b/www/board/agenda/views/pages/report.js.rb index a3403a4561..d1c9c03a19 100644 --- a/www/board/agenda/views/pages/report.js.rb +++ b/www/board/agenda/views/pages/report.js.rb @@ -156,7 +156,7 @@ def linebreak(text) line = info[0] index = info[1] replacement = '' + - Flow.text(line) + "" + Flow.text(line) + '' text = text.slice(0, index) + replacement + text.slice(index + line.length) diff --git a/www/board/agenda/views/pages/roll-call.js.rb b/www/board/agenda/views/pages/roll-call.js.rb index 9074f9a31c..fbae37b886 100644 --- a/www/board/agenda/views/pages/roll-call.js.rb +++ b/www/board/agenda/views/pages/roll-call.js.rb @@ -120,7 +120,7 @@ def mounted() # scroll walkon input field towards the center of the screen def updated() if RollCall.lockFocus and @guest.length >= 3 - walkon = document.getElementsByClassName("walkon")[0] + walkon = document.getElementsByClassName('walkon')[0] offset = walkon.offsetTop + walkon.offsetHeight/2 - window.innerHeight/2 jQuery('html, body').animate({scrollTop: offset}, :slow) end diff --git a/www/board/agenda/views/pages/select-actions.rb b/www/board/agenda/views/pages/select-actions.rb index 9c9e25904d..1eb667fceb 100644 --- a/www/board/agenda/views/pages/select-actions.rb +++ b/www/board/agenda/views/pages/select-actions.rb @@ -42,9 +42,9 @@ class CandidateAction < Vue def render _input type: 'checkbox', checked: !@@action.complete, onClick:-> {@@action.complete = !@@action.complete} - _span " " + _span ' ' _span @@action.owner - _span ": " + _span ': ' _span @@action.text _span "\n [ #{@@action.pmc} #{@@action.date} ]\n " if @@action.status diff --git a/www/board/agenda/views/sw.js.rb b/www/board/agenda/views/sw.js.rb index 415881dd35..ba67ac4c1b 100644 --- a/www/board/agenda/views/sw.js.rb +++ b/www/board/agenda/views/sw.js.rb @@ -117,7 +117,7 @@ def latest(event) match.clone().text().then do fulfill(match) - request = Request.new(match.url, cache: "no-store") + request = Request.new(match.url, cache: 'no-store') fetch(request).then do |response| if response.ok response.clone().text().then do |after| @@ -208,7 +208,7 @@ def bootstrap(event, request) # substitute bootstrap.html for html pages date = url.split('/')[0] bootstrap_url = "#{scope}#{date}/bootstrap.html" - request = Request.new(bootstrap_url, cache: "no-store") + request = Request.new(bootstrap_url, cache: 'no-store') # produce response event.respondWith(bootstrap(event, request)) @@ -230,7 +230,7 @@ def bootstrap(event, request) self.addEventListener :message do |event| if event.data.type == :preload caches.open('board/agenda').then do |cache| - request = Request.new(event.data.url, cache: "no-store") + request = Request.new(event.data.url, cache: 'no-store') cache.match(request).then do |response| unless response fetch(request).then do |response| diff --git a/www/board/agenda/views/touch.js.rb b/www/board/agenda/views/touch.js.rb index c717adaa49..f89a47a994 100644 --- a/www/board/agenda/views/touch.js.rb +++ b/www/board/agenda/views/touch.js.rb @@ -48,18 +48,18 @@ def self.initEventHandlers() # process swipe event case swipedir when 'left' - link = document.querySelector("a[rel=next]") + link = document.querySelector('a[rel=next]') link.click() if link when 'right' - link = document.querySelector("a[rel=prev]") + link = document.querySelector('a[rel=prev]') link.click() if link when 'up', 'down' path = history.state.path.sub(/[^\/]+\/?$/, '') || '.' path = "shepherd/#{Main.item.shepherd}" if path == 'shepherd/queue/' - path = "flagged" if path == 'flagged/' - path = "queue" if path == 'queue/' + path = 'flagged' if path == 'flagged/' + path = 'queue' if path == 'queue/' Main.navigate path end diff --git a/www/board/agenda/views/utils.js.rb b/www/board/agenda/views/utils.js.rb index c137d9236d..804986ef26 100644 --- a/www/board/agenda/views/utils.js.rb +++ b/www/board/agenda/views/utils.js.rb @@ -16,7 +16,7 @@ def htmlEscape(string) # escape a string so that it can be used as a regular expression def escapeRegExp(string) # https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions - return string.gsub(/([.*+?^=!:${}()|\[\]\/\\])/, "\\$1"); + return string.gsub(/([.*+?^=!:${}()|\[\]\/\\])/, '\\$1'); end # Replace http[s] links in text with anchor tags @@ -28,7 +28,7 @@ def hotlink(string) hotlink.regexp = Regexp.new(/(^|[\s.:;?\-\]<\(]) (https?:\/\/[-\w;\/?:@&=+$.!~*'()%,#]+[\w\/]) - (?=$|[\s.:;,?\-\[\]&\)])/x, "g") + (?=$|[\s.:;,?\-\[\]&\)])/x, 'g') # # Requests to the server @@ -129,7 +129,7 @@ def xhr.onreadystatechange() if target =~ /^https?:/ xhr.open('GET', target, true) - xhr.setRequestHeader("Accept", "application/json") if type == :json + xhr.setRequestHeader('Accept', 'application/json') if type == :json else xhr.open('GET', "../#{type}/#{target}", true) end diff --git a/www/board/agenda/views/vue-config.js.rb b/www/board/agenda/views/vue-config.js.rb index b2e9ae5746..a807c8e908 100644 --- a/www/board/agenda/views/vue-config.js.rb +++ b/www/board/agenda/views/vue-config.js.rb @@ -1,7 +1,7 @@ # Filter out "data property already declared as a prop" warnings Vue.config.warnHandler = proc do |msg, vm, trace| return if msg =~ /^The data property "\w+" is already declared as a prop\./ - console.error "[Vue warn]: " + msg + trace if defined? console + console.error '[Vue warn]: ' + msg + trace if defined? console end # reraise uncapturable errors asynchronously to enable easier debugging diff --git a/www/project/icla/Rakefile b/www/project/icla/Rakefile index 119a237864..2c386f4b79 100644 --- a/www/project/icla/Rakefile +++ b/www/project/icla/Rakefile @@ -5,7 +5,7 @@ task :server => 'views/pages.js.rb' do require 'wunderbar/listen' end -file "views/pages.js.rb" => FileList['views/pages/*.js.rb'] do +file 'views/pages.js.rb' => FileList['views/pages/*.js.rb'] do File.open('views/pages.js.rb', 'w') do |pages| # define a dummy superclass class React diff --git a/www/project/icla/main.rb b/www/project/icla/main.rb index 8d3d15a9ce..a3e6a93a24 100755 --- a/www/project/icla/main.rb +++ b/www/project/icla/main.rb @@ -77,15 +77,15 @@ def getMember(userId) get '/' do @token = params['token'] @mock = params['mock'] - @extra = @mock ? "&mock=" + @mock : '' + @extra = @mock ? '&mock=' + @mock : '' @progress = loadProgress(@token) if @token @phase = @progress['phase'] if @progress if @phase == 'discuss' - redirect to("/discuss?token=" + @token + @extra) + redirect to('/discuss?token=' + @token + @extra) elsif @phase == 'vote' - redirect to("/vote?token=" + @token + @extra) + redirect to('/vote?token=' + @token + @extra) else - redirect to("/invite") + redirect to('/invite') end end diff --git a/www/project/icla/views/actions/update.json.rb b/www/project/icla/views/actions/update.json.rb index 4cec32f03f..51379acdaf 100644 --- a/www/project/icla/views/actions/update.json.rb +++ b/www/project/icla/views/actions/update.json.rb @@ -39,7 +39,7 @@ def sendTally(contents) user_email = "#{@member}@apache.org" pmc = ASF::Committee.find(contents['project']) pmc_email = "#{pmc.mail_list}@apache.org" - subject = "[RESULT]" + contents['subject'] + subject = '[RESULT]' + contents['subject'] last_votes = Hash.new votes = contents['votes'] votes.each { |v| diff --git a/www/project/icla/views/actions/validate.json.rb b/www/project/icla/views/actions/validate.json.rb index 2692595a5b..7debd2111b 100644 --- a/www/project/icla/views/actions/validate.json.rb +++ b/www/project/icla/views/actions/validate.json.rb @@ -99,11 +99,11 @@ # verify that the link refers to lists.apache.org message on the project list if not @votelink=~ /.*lists\.apache\.org.*/ - _error "Please link to a message via lists.apache.org" + _error 'Please link to a message via lists.apache.org' return # no point in continuing end if not @votelink=~ /.*#{pmc.mail_list}(\.incubator)?\.apache\.org.*/ - _error "Please link to the [RESULT][VOTE] message sent to the private list." + _error 'Please link to the [RESULT][VOTE] message sent to the private list.' return # no point in continuing end @@ -135,15 +135,15 @@ # verify that the link refers to lists.apache.org message on the proper list if not @noticelink=~ /.*lists\.apache\.org.*/ - _error "Please link to a message via lists.apache.org" + _error 'Please link to a message via lists.apache.org' return # no point in continuing end if pmc_type == 'PMC' and not @noticelink=~ /.*board@apache\.org.*/ - _error "Please link to the NOTICE message sent to the board list." + _error 'Please link to the NOTICE message sent to the board list.' return # no point in continuing end if pmc_type == 'PPMC' and not @noticelink=~ /.*private@incubator\.apache\.org.*/ - _error "Please link to the NOTICE message sent to the incubator private list." + _error 'Please link to the NOTICE message sent to the incubator private list.' return # no point in continuing end diff --git a/www/project/icla/views/app.html.rb b/www/project/icla/views/app.html.rb index cbf73c99eb..7fff6342ac 100755 --- a/www/project/icla/views/app.html.rb +++ b/www/project/icla/views/app.html.rb @@ -48,9 +48,9 @@ _div_.collapse.navbar_collapse.mainnav_collapse! do _div_! style: 'line-height:20px; padding-top:5px; float:left' do _a 'Home', href: 'https://www.apache.org/' - _ " » " + _ ' » ' _a 'Legal', href: 'https://www.apache.org/legal/' - _ " » " + _ ' » ' _a 'ICLA', href: '/project/icla/' end @@ -355,7 +355,7 @@ _div_.col_lg_12 do _p_!.text_center do _ "Copyright © #{Date.today.year} The Apache Software Foundation, Licensed " + - "under the " + 'under the ' _a.white 'Apache License, Version 2.0', href: 'http://www.apache.org/licenses/LICENSE-2.0' _ '.' diff --git a/www/project/icla/views/pages.js.rb b/www/project/icla/views/pages.js.rb index 59ea3b389b..b1a78a6f7c 100644 --- a/www/project/icla/views/pages.js.rb +++ b/www/project/icla/views/pages.js.rb @@ -1,17 +1,17 @@ -require_relative "pages/discuss" -require_relative "pages/vote" -require_relative "pages/form" -require_relative "pages/invite" -require_relative "pages/complete" -require_relative "pages/interview" -require_relative "pages/preview" +require_relative 'pages/discuss' +require_relative 'pages/vote' +require_relative 'pages/form' +require_relative 'pages/invite' +require_relative 'pages/complete' +require_relative 'pages/interview' +require_relative 'pages/preview' Pages = [ - "Discuss", - "Vote", - "Preview", - "Form", - "Interview", - "Invite", - "Complete" + 'Discuss', + 'Vote', + 'Preview', + 'Form', + 'Interview', + 'Invite', + 'Complete' ] diff --git a/www/project/icla/views/pages/discuss.js.rb b/www/project/icla/views/pages/discuss.js.rb index b7c60a8932..142020271a 100644 --- a/www/project/icla/views/pages/discuss.js.rb +++ b/www/project/icla/views/pages/discuss.js.rb @@ -20,13 +20,13 @@ def initialize end console.log('phase: ' + @phase) if not @token - @alert = "Token is required for this page" + @alert = 'Token is required for this page' elsif @phase == 'unknown' - @alert = "Cannot determine phase: could not read token file" + @alert = 'Cannot determine phase: could not read token file' elsif @phase == 'error' @alert = @progress[:errorMessage] elsif @phase != 'discuss' - @alert = "Wrong phase: " + @phase + "; should be discuss" + @alert = 'Wrong phase: ' + @phase + '; should be discuss' else @pmc = @progress[:project] @proposer = @progress[:proposer] @@ -46,19 +46,19 @@ def render discuss contributors to achieve consensus. } if @phase == 'discuss' - _b "Project: " + @pmc + _b 'Project: ' + @pmc _p - _b "Contributor: " + @iclaname + " (" + @iclaemail + ")" + _b 'Contributor: ' + @iclaname + ' (' + @iclaemail + ')' _p - _b "Proposed by: " + @proposer + _b 'Proposed by: ' + @proposer _p - _p "Subject: " + @subject + _p 'Subject: ' + @subject _p # # Form fields # _div.form_group do - _label "Comment from " + @member + ' (required)', :for => 'discussBody' + _label 'Comment from ' + @member + ' (required)', :for => 'discussBody' _textarea.form_control rows: 4, required: true, placeholder: 'new comment', id: 'discussBody', value: @discussBody, @@ -187,9 +187,9 @@ def updateVoteFile(action, newPhase) expectedPhase: 'discuss', newPhase: newPhase, } - console.log(">update: "+ data.inspect) # debug + console.log('>update: '+ data.inspect) # debug post 'update', data do |response| - console.log(" 'pmc' + _label 'PMC/PPMC (required)', :for => 'pmc' _select.form_control.pmc! required: true, onChange: self.setPMC, value: @pmc do _option '' Server.data.allData.each_key do |pmc| @@ -132,13 +132,13 @@ def render end if @showPMCVoteLink or @showPPMCVoteLink _ 'Navigate to ' - _a "Ponymail", href: "https://lists.apache.org/list.html?private@#{@mail_list}.apache.org:lte=1M:[VOTE][RESULT]", target: _blank + _a 'Ponymail', href: "https://lists.apache.org/list.html?private@#{@mail_list}.apache.org:lte=1M:[VOTE][RESULT]", target: _blank _ ', select the appropriate message, right-click PermaLink, copy link' _ ' to the clip-board, and paste the link here.' _p _div.form_group do - _label "VOTE link", :for => 'votelink' + _label 'VOTE link', :for => 'votelink' _input.form_control.votelink! type: 'url', onChange: self.setVoteLink, value: @votelink end @@ -167,16 +167,16 @@ def render if @showPMCNoticeLink or @showPPMCNoticeLink _ 'Navigate to ' if @showPMCNoticeLink - _a "Ponymail", href: "https://lists.apache.org/list.html?board@apache.org:lte=1M:NOTICE%20for%20#{@display_name}", target: _blank + _a 'Ponymail', href: "https://lists.apache.org/list.html?board@apache.org:lte=1M:NOTICE%20for%20#{@display_name}", target: _blank else - _a "Ponymail", href: "https://lists.apache.org/list.html?private@incubator.apache.org:lte=1M:NOTICE%20for%20#{@display_name}", target: _blank + _a 'Ponymail', href: "https://lists.apache.org/list.html?private@incubator.apache.org:lte=1M:NOTICE%20for%20#{@display_name}", target: _blank end _ ', select the appropriate message, right-click PermaLink, copy link' _ ' to the clip-board, and paste the link here.' _p _div.form_group do - _label "NOTICE link", :for => 'noticelink' + _label 'NOTICE link', :for => 'noticelink' _input.form_control.noticelink! type: 'url', onChange: self.setNoticeLink, value: @noticelink end diff --git a/www/project/icla/views/pages/vote.js.rb b/www/project/icla/views/pages/vote.js.rb index 963e0c674d..8eec7ac9bb 100644 --- a/www/project/icla/views/pages/vote.js.rb +++ b/www/project/icla/views/pages/vote.js.rb @@ -19,13 +19,13 @@ def initialize end console.log('phase: ' + @phase) if not @token - @alert = "Token is required for this page" + @alert = 'Token is required for this page' elsif @phase == 'unknown' - @alert = "Cannot determine phase: could not read token file" + @alert = 'Cannot determine phase: could not read token file' elsif @phase == 'error' @alert = @progress[:errorMessage] elsif @phase != 'vote' - @alert = "Wrong phase: " + @phase + "; should be vote" + @alert = 'Wrong phase: ' + @phase + '; should be vote' else @pmc = @progress[:project] console.log('pmc: ' + @pmc) @@ -49,19 +49,19 @@ def render vote to invite a contributor to become a committer or a PMC/PPMC member. } if @phase == 'vote' - _b "Project: " + @pmc + _b 'Project: ' + @pmc _p - _b "Contributor: " + @iclaname + " (" + @iclaemail + ")" + _b 'Contributor: ' + @iclaname + ' (' + @iclaemail + ')' _p - _b "Proposed by: " + @proposer + _b 'Proposed by: ' + @proposer _p - _p "Subject: " + @subject + _p 'Subject: ' + @subject _p _div.form_group.vote do _label do _input type: 'radio', name: 'vote', value: '+1', onClick: lambda {@vote = '+1'; @showComment = false; checkValidity()} - _span " +1 approve " + _span ' +1 approve ' end _p _label do @@ -79,7 +79,7 @@ def render _label do _input type: 'radio', name: 'vote', value: '-1', onClick: lambda {@vote = '-1'; @showComment = true; checkValidity()} - _span " -1 disapprove, because... " + _span ' -1 disapprove, because... ' end _p end @@ -240,9 +240,9 @@ def updateVoteFile(action, newPhase) newPhase: newPhase, } data['comment']=@commentBody if @vote == '-1' - console.log(">update: "+ data.inspect) # debug + console.log('>update: '+ data.inspect) # debug post 'update', data do |response| - console.log("" to to - bcc "root@apache.org" + bcc 'root@apache.org' subject "#{person.public_name} #{action} #{list}" body "Current roster can be found at:\n\n" + " https://whimsy.apache.org/roster/group/#{group.id}\n\n" + diff --git a/www/roster/views/actions/committee.json.rb b/www/roster/views/actions/committee.json.rb index 9bd7c0ef84..c252a08957 100644 --- a/www/roster/views/actions/committee.json.rb +++ b/www/roster/views/actions/committee.json.rb @@ -70,7 +70,7 @@ from "#{from.public_name} <#{from.id}@apache.org>" to "private@#{pmc.mail_list}.apache.org" cc cc - bcc "root@apache.org" + bcc 'root@apache.org' subject "#{who} #{action} #{pmc.display_name} #{list}" body "Current roster can be found at:\n\n" + " https://whimsy.apache.org/roster/committee/#{pmc.id}\n\n" + diff --git a/www/roster/views/actions/email_forward.json.rb b/www/roster/views/actions/email_forward.json.rb index 6f4e740aba..a54b919aeb 100644 --- a/www/roster/views/actions/email_forward.json.rb +++ b/www/roster/views/actions/email_forward.json.rb @@ -24,7 +24,7 @@ end if @email_forward.empty? - _error "Forwarding email address must not be empty!" + _error 'Forwarding email address must not be empty!' return end diff --git a/www/roster/views/actions/memstat.json.rb b/www/roster/views/actions/memstat.json.rb index b8f9489e43..d375837c0f 100644 --- a/www/roster/views/actions/memstat.json.rb +++ b/www/roster/views/actions/memstat.json.rb @@ -6,7 +6,7 @@ USERID = user.id USERMAIL = "#{USERID}@apache.org" USERNAME = user.cn -TIMESTAMP = (Time.now.strftime "%Y-%m-%d %H:%M:%S %:z") +TIMESTAMP = (Time.now.strftime '%Y-%m-%d %H:%M:%S %:z') # identify file to be updated members_txt = ASF::SVN.svnpath!('foundation', 'members.txt') @@ -18,7 +18,7 @@ ASF::SVN.multiUpdate_ members_txt, message, env, _ do |text| # remove user's entry unless text.sub! entry, '' # e.g. if the workspace was out of date - raise Exception.new("Failed to remove existing entry -- try refreshing") + raise Exception.new('Failed to remove existing entry -- try refreshing') end extra = [] @@ -32,7 +32,7 @@ if pathname extra << ['mv', pathname, ASF::SVN.svnpath!('emeritus', basename)] else # there should be a request file - _warn "Emeritus request file not found" + _warn 'Emeritus request file not found' end elsif @action == 'active' index = text.index(/^\s\*\)\s/, text.index(/^Active/)) @@ -64,13 +64,13 @@ if pathname ASF::SVN.svn_!('mv', [pathname, ASF::SVN.svnpath!('emeritus-requests-rescinded', basename)], _, {env:env, msg:message}) else - _warn "Emeritus request file not found" + _warn 'Emeritus request file not found' end elsif @action == 'request_emeritus' # Create emeritus request and send acknowledgement mail from secretary # TODO URL should be a config constant ... code, template = ASF::Git.github('apache/www-site/main/content/forms/emeritus-request.txt') - raise "Failed to read emeritus-request.txt: " + code unless code == "200" + raise 'Failed to read emeritus-request.txt: ' + code unless code == '200' centered_id = USERID.center(55, '_') centered_name = USERNAME.center(55, '_') centered_date = TIMESTAMP.center(25, '_') @@ -85,7 +85,7 @@ if rc == 0 ASF::Mail.configure mail = Mail.new do - from "secretary@apache.org" + from 'secretary@apache.org' to "#{USERNAME}<#{USERMAIL}>" subject "Acknowledgement of emeritus request from #{USERNAME}" text_part do @@ -95,12 +95,12 @@ mail.attachments["#{USERID}.txt"] = signed_request mail.deliver! elsif rc == 1 - _warn "Request file already exists" + _warn 'Request file already exists' end elsif @action == 'request_reinstatement' ASF::Mail.configure mail = Mail.new do - to "secretary@apache.org" + to 'secretary@apache.org' cc "#{USERNAME}<#{USERMAIL}>" from USERMAIL subject "Emeritus reinstatement request from #{USERNAME}" diff --git a/www/roster/views/actions/memtext.json.rb b/www/roster/views/actions/memtext.json.rb index 629e5be37a..df1e63d6cf 100644 --- a/www/roster/views/actions/memtext.json.rb +++ b/www/roster/views/actions/memtext.json.rb @@ -20,7 +20,7 @@ _svn.update members_txt, message: message do |dir, text| # replace entry unless text.sub! old_entry, " *) #{new_entry}\n\n" # e.g. if the workspace was out of date - raise Exception.new("Failed to replace existing entry -- try refreshing") + raise Exception.new('Failed to replace existing entry -- try refreshing') end # save the updated text diff --git a/www/roster/views/actions/nonpmc.json.rb b/www/roster/views/actions/nonpmc.json.rb index 1900ec1b25..59b2e8aee0 100644 --- a/www/roster/views/actions/nonpmc.json.rb +++ b/www/roster/views/actions/nonpmc.json.rb @@ -72,7 +72,7 @@ # TODO the email address may need fixing to "private@#{pmc.mail_list}.apache.org" cc cc - bcc "root@apache.org" + bcc 'root@apache.org' subject "#{who} #{action} #{pmc.display_name} #{list}" body "Current roster can be found at:\n\n" + " https://whimsy.apache.org/roster/nonpmc/#{pmc.id}\n\n" + diff --git a/www/roster/views/actions/pgpkeys.json.rb b/www/roster/views/actions/pgpkeys.json.rb index 9ec5ba0eec..5b4f3c8776 100644 --- a/www/roster/views/actions/pgpkeys.json.rb +++ b/www/roster/views/actions/pgpkeys.json.rb @@ -24,7 +24,7 @@ end # convert to canonical format fprints = fprints.uniq.map do |n| # duplicates not allowed - "%s %s %s %s %s %s %s %s %s %s" % n.scan(/..../) + '%s %s %s %s %s %s %s %s %s %s' % n.scan(/..../) end # update LDAP unless @dryrun diff --git a/www/roster/views/actions/service.json.rb b/www/roster/views/actions/service.json.rb index c8ad50191a..ab43cd9eaf 100644 --- a/www/roster/views/actions/service.json.rb +++ b/www/roster/views/actions/service.json.rb @@ -39,7 +39,7 @@ mail = Mail.new do from "#{from.public_name} <#{from.id}@apache.org>" to to - bcc "root@apache.org" + bcc 'root@apache.org' subject "#{person.public_name} #{action} #{list}" body "Current roster can be found at:\n\n" + " https://whimsy.apache.org/roster/group/#{service.id}\n\n" + diff --git a/www/roster/views/committees.html.rb b/www/roster/views/committees.html.rb index b24708f21d..bad708395d 100644 --- a/www/roster/views/committees.html.rb +++ b/www/roster/views/committees.html.rb @@ -10,10 +10,10 @@ subtitle: 'List of all Top Level Projects', relatedtitle: 'More Useful Links', related: { - "/committers/tools" => "Whimsy All Tools Listing", + '/committers/tools' => 'Whimsy All Tools Listing', ASF::SVN.svnpath!('committers') => "Checkout the private 'committers' repo for Committers", - "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" => "See This Source Code", - "mailto:dev@whimsical.apache.org?subject=[FEEDBACK] members/index idea" => "Email Feedback To dev@whimsical" + "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" => 'See This Source Code', + 'mailto:dev@whimsical.apache.org?subject=[FEEDBACK] members/index idea' => 'Email Feedback To dev@whimsical' }, helpblock: -> { _p do @@ -32,7 +32,7 @@ _p do _ 'Chair names in BOLD below are also ASF Members. Click on column names in table to sort; jump to A-Z project listings here:' _br - "ABCDEFGHIJKLMNOPQRSTUVWXYZ".each_char do |c| + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.each_char do |c| _a c, href: "committee/##{c}" end _ '(note: the links only work properly if the page is sorted by project name ascending)' diff --git a/www/roster/views/committerSearch.js.rb b/www/roster/views/committerSearch.js.rb index e09c50a604..72b649963b 100644 --- a/www/roster/views/committerSearch.js.rb +++ b/www/roster/views/committerSearch.js.rb @@ -75,7 +75,7 @@ def render _input.form_control autofocus: true, value: @search, onInput: self.change _span.input_group_addon do - _span.glyphicon.glyphicon_user aria_label: "Committer ID or name" + _span.glyphicon.glyphicon_user aria_label: 'Committer ID or name' end end end diff --git a/www/roster/views/duties.html.rb b/www/roster/views/duties.html.rb index 74bcbaa018..3ef3d75197 100644 --- a/www/roster/views/duties.html.rb +++ b/www/roster/views/duties.html.rb @@ -55,7 +55,7 @@ value.split(/[, ]+/).each_with_index do |role, index| _span ', ' if index > 0 if role == 'members' - _a role, href: "roster/members" + _a role, href: 'roster/members' else _a role, href: "orgchart/#{role}" end diff --git a/www/roster/views/groups.html.rb b/www/roster/views/groups.html.rb index c8b7cb76bc..41c0740263 100644 --- a/www/roster/views/groups.html.rb +++ b/www/roster/views/groups.html.rb @@ -10,10 +10,10 @@ title: 'ASF Non-PMC Group list', relatedtitle: 'See Other Group Listings', related: { - "/roster/committee/" => "Active projects at the ASF", - "/roster/ppmc/" => "Active podlings at the ASF", - "/roster/nonpmc/" => "ASF Committees (non-PMC)", - "/roster/orgchart/" => "High level org chart", + '/roster/committee/' => 'Active projects at the ASF', + '/roster/ppmc/' => 'Active podlings at the ASF', + '/roster/nonpmc/' => 'ASF Committees (non-PMC)', + '/roster/orgchart/' => 'High level org chart', }, helpblock: -> { _div.row do diff --git a/www/roster/views/iclaSearch.js.rb b/www/roster/views/iclaSearch.js.rb index fcc39183da..4080b43be7 100644 --- a/www/roster/views/iclaSearch.js.rb +++ b/www/roster/views/iclaSearch.js.rb @@ -57,7 +57,7 @@ def render _input.form_control autofocus: true, value: @search, onInput: self.change _span.input_group_addon do - _span.glyphicon.glyphicon_user aria_label: "Committer ID or name" + _span.glyphicon.glyphicon_user aria_label: 'Committer ID or name' end end end diff --git a/www/roster/views/index.html.rb b/www/roster/views/index.html.rb index b091e00a97..00ef3acccc 100644 --- a/www/roster/views/index.html.rb +++ b/www/roster/views/index.html.rb @@ -1,14 +1,14 @@ # # Landing page # -PAGETITLE = "ASF Roster Tool" # Wvisible:projects +PAGETITLE = 'ASF Roster Tool' # Wvisible:projects _html do _link rel: 'stylesheet', href: "stylesheets/app.css?#{cssmtime}" _body? do if @stamps - _.comment! "TIMES %s TIMES" % @stamps.join(',') + _.comment! 'TIMES %s TIMES' % @stamps.join(',') end _whimsy_body( title: PAGETITLE, @@ -170,13 +170,13 @@ _hr _p do _a 'Search pending ICLAs', href: 'icla/' - _span.glyphicon.glyphicon_lock :aria_hidden, class: "text-primary", aria_label: "ASF Members and Officers", - title: "ASF Members and Officers" + _span.glyphicon.glyphicon_lock :aria_hidden, class: 'text-primary', aria_label: 'ASF Members and Officers', + title: 'ASF Members and Officers' end _p do _a 'Organization Chart ', href: 'orgchart/' - _span.glyphicon.glyphicon_lock :aria_hidden, class: "text-primary", aria_label: "ASF Members and Officers", - title: "ASF Members and Officers" + _span.glyphicon.glyphicon_lock :aria_hidden, class: 'text-primary', aria_label: 'ASF Members and Officers', + title: 'ASF Members and Officers' end end end diff --git a/www/roster/views/members.html.rb b/www/roster/views/members.html.rb index 67cdb9191a..328f996ba8 100644 --- a/www/roster/views/members.html.rb +++ b/www/roster/views/members.html.rb @@ -69,7 +69,7 @@ _' detail page.' } ) do - _table.table.table_hover id: "members" do + _table.table.table_hover id: 'members' do _thead do _tr do _th 'Id', data_sort: 'string' diff --git a/www/roster/views/nonpmc/add.js.rb b/www/roster/views/nonpmc/add.js.rb index 0d5b7ca697..0cc358f417 100644 --- a/www/roster/views/nonpmc/add.js.rb +++ b/www/roster/views/nonpmc/add.js.rb @@ -4,7 +4,7 @@ class NonPMCAdd < Vue mixin ProjectAdd - options add_tag: "pmcadd", add_action: 'actions/nonpmc' + options add_tag: 'pmcadd', add_action: 'actions/nonpmc' def initialize @people = [] diff --git a/www/roster/views/nonpmc/main.js.rb b/www/roster/views/nonpmc/main.js.rb index ccbca68cad..5aa8972247 100644 --- a/www/roster/views/nonpmc/main.js.rb +++ b/www/roster/views/nonpmc/main.js.rb @@ -14,13 +14,13 @@ def render # add jump links to main sections of page using Bootstrap nav element _ul.nav.nav_pills do - _li role: "presentation" do + _li role: 'presentation' do _a 'Committee', :href => "nonpmc/#{@nonpmc.id}#pmc" end - _li role: "presentation" do + _li role: 'presentation' do _a 'Committers', :href => "nonpmc/#{@nonpmc.id}#committers" end - _li role: "presentation" do + _li role: 'presentation' do if @nonpmc.moderators _a 'Mail List Info', :href => "nonpmc/#{@nonpmc.id}#mail" else diff --git a/www/roster/views/nonpmc/mod.js.rb b/www/roster/views/nonpmc/mod.js.rb index 9e1ab2437d..3f86aaf84b 100644 --- a/www/roster/views/nonpmc/mod.js.rb +++ b/www/roster/views/nonpmc/mod.js.rb @@ -4,7 +4,7 @@ class NonPMCMod < Vue mixin ProjectMod - options mod_tag: "pmcmod", mod_action: 'actions/nonpmc' + options mod_tag: 'pmcmod', mod_action: 'actions/nonpmc' def initialize @people = [] @@ -49,7 +49,7 @@ def render # show add to Committee button only if every person is not on the Committee if @people.all? {|person| !@@project.members.include? person.id} - _button.btn.btn_primary "Add to Committee", + _button.btn.btn_primary 'Add to Committee', data_action: 'add pmc info', onClick: self.post, disabled: @people.empty? end @@ -67,7 +67,7 @@ def render data_action: "remove #{remove_from.join(' ')}" if @people.all? {|person| @@project.members.include? person.id} - _button.btn.btn_warning "Remove from Committee only", + _button.btn.btn_warning 'Remove from Committee only', data_action: 'remove pmc info', onClick: self.post end diff --git a/www/roster/views/person/github.js.rb b/www/roster/views/person/github.js.rb index e99bcd713d..ce75256197 100644 --- a/www/roster/views/person/github.js.rb +++ b/www/roster/views/person/github.js.rb @@ -44,7 +44,7 @@ def render else _ul committer.githubUsername do |gh| _li do - _a gh, href: "https://github.com/" + gh +"/" # / catches trailing spaces + _a gh, href: 'https://github.com/' + gh +'/' # / catches trailing spaces unless gh =~ /^[-0-9a-zA-Z]+$/ # should agree with the validation in github.json.rb _ ' ' _span.bg_warning "Invalid: '#{gh}' expecting only alphanumeric and '-'" diff --git a/www/roster/views/person/main.js.rb b/www/roster/views/person/main.js.rb index c73cdb1927..b4936ce5bd 100644 --- a/www/roster/views/person/main.js.rb +++ b/www/roster/views/person/main.js.rb @@ -41,7 +41,7 @@ def render if @committer.privateNosub if @committer.privateNosub.include? pmc noPMCsub = true - _b " (*)" + _b ' (*)' end end if @committer.chairOf.include? pmc @@ -117,9 +117,9 @@ def render next if group == 'apldap' if group == 'committers' - _li {_a group, href: "committer/"} + _li {_a group, href: 'committer/'} elsif group == 'member' - _li {_a group, href: "members"} + _li {_a group, href: 'members'} else _li {_a group, href: "group/#{group}"} end @@ -194,7 +194,7 @@ def render _li do _a list_name, href: 'https://lists.apache.org/list.html?' + list_name - _span " as " + _span ' as ' _span @committer.moderates[list_name].join(', ') end end @@ -212,7 +212,7 @@ def render _li do _a list_email[0], href: 'https://lists.apache.org/list.html?' + list_email[0] - _span " as " + _span ' as ' _span list_email[1] end end @@ -230,7 +230,7 @@ def render _li do _a list_email[0], href: 'https://lists.apache.org/list.html?' + list_email[0] - _span " as " + _span ' as ' _span list_email[1] end end diff --git a/www/roster/views/pmc/add.js.rb b/www/roster/views/pmc/add.js.rb index 48ecbcef10..aa5dfe515e 100644 --- a/www/roster/views/pmc/add.js.rb +++ b/www/roster/views/pmc/add.js.rb @@ -4,7 +4,7 @@ class PMCAdd < Vue mixin ProjectAdd - options add_tag: "pmcadd", add_action: 'actions/committee' + options add_tag: 'pmcadd', add_action: 'actions/committee' def initialize @people = [] diff --git a/www/roster/views/pmc/main.js.rb b/www/roster/views/pmc/main.js.rb index 28a81404bb..dcf8062d18 100644 --- a/www/roster/views/pmc/main.js.rb +++ b/www/roster/views/pmc/main.js.rb @@ -13,23 +13,23 @@ def render # add jump links to main sections of page using Bootstrap nav element _ul.nav.nav_pills do - _li role: "presentation" do + _li role: 'presentation' do _a 'PMC', :href => "committee/#{@committee.id}#pmc" end - _li role: "presentation" do + _li role: 'presentation' do _a 'Committers', :href => "committee/#{@committee.id}#committers" end - _li role: "presentation" do + _li role: 'presentation' do if @committee.moderators _a 'Mail List Info', :href => "committee/#{@committee.id}#mail" else _a 'Mail Lists', :href => "committee/#{@committee.id}#mail" end end - _li role: "presentation" do + _li role: 'presentation' do _a 'Reporting Schedule', :href => "committee/#{@committee.id}#reporting" end - _li role: "presentation" do + _li role: 'presentation' do _a 'Links', :href => "committee/#{@committee.id}#links" end end diff --git a/www/roster/views/pmc/mod.js.rb b/www/roster/views/pmc/mod.js.rb index feae241171..01b9e23c94 100644 --- a/www/roster/views/pmc/mod.js.rb +++ b/www/roster/views/pmc/mod.js.rb @@ -4,7 +4,7 @@ class PMCMod < Vue mixin ProjectMod - options mod_tag: "pmcmod", mod_action: 'actions/committee' + options mod_tag: 'pmcmod', mod_action: 'actions/committee' def initialize @people = [] @@ -66,7 +66,7 @@ def render # show add to PMC button only if every person is not on the PMC if @people.all? {|person| !@@project.members.include? person.id} - _button.btn.btn_primary "Add to PMC", + _button.btn.btn_primary 'Add to PMC', data_action: 'add pmc info', onClick: self.post, disabled: (@people.empty? or not @notice_elapsed) end @@ -84,7 +84,7 @@ def render data_action: "remove #{remove_from.join(' ')}" if @people.all? {|person| @@project.members.include? person.id} - _button.btn.btn_warning "Remove from PMC only", + _button.btn.btn_warning 'Remove from PMC only', data_action: 'remove pmc info', onClick: self.post end diff --git a/www/roster/views/podlings.html.rb b/www/roster/views/podlings.html.rb index ac6faee091..09a632159c 100644 --- a/www/roster/views/podlings.html.rb +++ b/www/roster/views/podlings.html.rb @@ -66,9 +66,9 @@ def findName(podling, list) _ 'Click on a column heading to change the sort order (' color.each do |state, clazz| _span state, class: clazz - _ " " + _ ' ' end - _ ")" + _ ')' end _table.table.table_hover do diff --git a/www/roster/views/ppmc/add.js.rb b/www/roster/views/ppmc/add.js.rb index 6264631096..3669f3c1ba 100644 --- a/www/roster/views/ppmc/add.js.rb +++ b/www/roster/views/ppmc/add.js.rb @@ -4,7 +4,7 @@ class PPMCAdd < Vue mixin ProjectAdd - options add_tag: "ppmcadd", add_action: 'actions/ppmc' + options add_tag: 'ppmcadd', add_action: 'actions/ppmc' def initialize @people = [] diff --git a/www/roster/views/ppmc/committers.js.rb b/www/roster/views/ppmc/committers.js.rb index 5cc097010d..5c4c48b9c8 100644 --- a/www/roster/views/ppmc/committers.js.rb +++ b/www/roster/views/ppmc/committers.js.rb @@ -48,7 +48,7 @@ def render if pending.length == 2 list = "#{pending[0]} and #{pending[1]}" else - list = pending[0..-2].join(', ') + ", and " + pending[-1] + list = pending[0..-2].join(', ') + ', and ' + pending[-1] end _button.btn.btn_success 'Add all as committers', @@ -122,7 +122,7 @@ def render data_action: 'add icommit', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Add #{@@person.name} as a committer " + - "for the incubator PPMC?" + 'for the incubator PPMC?' end end elsif not @@person.icommit diff --git a/www/roster/views/ppmc/main.js.rb b/www/roster/views/ppmc/main.js.rb index 2dc0df68da..e9cb70b82f 100644 --- a/www/roster/views/ppmc/main.js.rb +++ b/www/roster/views/ppmc/main.js.rb @@ -34,23 +34,23 @@ def render # add jump links to main sections of page using Bootstrap nav element _ul.nav.nav_pills do - _li role: "presentation" do + _li role: 'presentation' do _a 'PPMC', :href => "ppmc/#{@ppmc.id}#ppmc" end - _li role: "presentation" do + _li role: 'presentation' do _a 'Committers', :href => "ppmc/#{@ppmc.id}#committers" end - _li role: "presentation" do + _li role: 'presentation' do if @ppmc.moderators _a 'Mail List Info', :href => "ppmc/#{@ppmc.id}#mail" else _a 'Mail Lists', :href => "ppmc/#{@ppmc.id}#mail" end end - _li role: "presentation" do + _li role: 'presentation' do _a 'Reporting Schedule', :href => "ppmc/#{@ppmc.id}#reporting" end - _li role: "presentation" do + _li role: 'presentation' do _a 'Status', :href => "ppmc/#{@ppmc.id}#podlingStatus" end end @@ -205,14 +205,14 @@ def render _li do _a 'Podling Proposal', href: @ppmc.podlingStatus.proposal end if @ppmc.podlingStatus.proposal - _li "Status: " + @ppmc.status + _li 'Status: ' + @ppmc.status _li do - _ "Established: " + @ppmc.established + _ 'Established: ' + @ppmc.established end if @ppmc.established _li do - _ "End date: " + @ppmc.enddate + _ 'End date: ' + @ppmc.enddate end if @ppmc.enddate - _li "Incubating for "+@ppmc.duration+" days" + _li 'Incubating for '+@ppmc.duration+' days' _li do _a 'Prior Board Reports', href: '/board/minutes/' + @ppmc.display_name.gsub(/\s+/, '_') @@ -222,10 +222,10 @@ def render _h3 'Resources' _ul do _li do - _a "GitHub", href: 'https://github.com/apache?q=incubator-' + @ppmc.id, target: '_new' + _a 'GitHub', href: 'https://github.com/apache?q=incubator-' + @ppmc.id, target: '_new' end if @ppmc.podlingStatus.sourceControl == 'github' _li do - _a "Git Repositories", href: 'https://gitbox.apache.org/repos/asf?s=incubator-' + @ppmc.id, target: '_new' + _a 'Git Repositories', href: 'https://gitbox.apache.org/repos/asf?s=incubator-' + @ppmc.id, target: '_new' end if !@ppmc.podlingStatus.sourceControl || @ppmc.podlingStatus.sourceControl == 'git' || @ppmc.podlingStatus.sourceControl == 'asfgit' _li do _a 'https://issues.apache.org/jira/browse/' + @ppmc.podlingStatus.jira,href: 'https://issues.apache.org/jira/browse/' + @ppmc.podlingStatus.jira, target: '_new' @@ -276,7 +276,7 @@ def render _a "Podling name search (#{resolution})", href: 'https://issues.apache.org/jira/browse/' + @ppmc.namesearch.issue end if @ppmc.namesearch _li.podlingWarning do - _a "No Podling Name Search on file", href: 'https://incubator.apache.org/guides/names.html#name-search' + _a 'No Podling Name Search on file', href: 'https://incubator.apache.org/guides/names.html#name-search' end unless @ppmc.namesearch _li do _a @ppmc.display_name + ' Website', href: @ppmc.podlingStatus.website @@ -333,7 +333,7 @@ def post() @disabled = true Polyfill.require(%w(Promise fetch)) do @create_disabled = true - fetch("actions/ppmc", args).then {|response| + fetch('actions/ppmc', args).then {|response| content_type = response.headers.get('content-type') || '' if response.status == 200 and content_type.include? 'json' response.json().then do |json| diff --git a/www/roster/views/ppmc/members.js.rb b/www/roster/views/ppmc/members.js.rb index ad669a3854..e7fcb53e8e 100644 --- a/www/roster/views/ppmc/members.js.rb +++ b/www/roster/views/ppmc/members.js.rb @@ -164,7 +164,7 @@ def render data_action: 'add icommit', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Add #{@@person.name} as a committer " + - "for the incubator PPMC?" + 'for the incubator PPMC?' end unless @@ppmc.committers.include? @@person.id diff --git a/www/roster/views/ppmc/mod.js.rb b/www/roster/views/ppmc/mod.js.rb index 5dff41f06b..3aaf25c3af 100644 --- a/www/roster/views/ppmc/mod.js.rb +++ b/www/roster/views/ppmc/mod.js.rb @@ -4,7 +4,7 @@ class PPMCMod < Vue mixin ProjectMod - options mod_tag: "ppmcmod", mod_action: 'actions/ppmc' + options mod_tag: 'ppmcmod', mod_action: 'actions/ppmc' def initialize @people = [] @@ -50,7 +50,7 @@ def render if @@auth.ppmc # show add to PPMC button only if every person is not on the PPMC if @people.all? {|person| !@@project.owners.include? person.id} - _button.btn.btn_primary "Add to PPMC", + _button.btn.btn_primary 'Add to PPMC', data_action: 'add ppmc', onClick: self.post, disabled: (@people.empty?) end diff --git a/www/roster/views/ppmc_new.html.rb b/www/roster/views/ppmc_new.html.rb index 452d63f34c..260202d589 100644 --- a/www/roster/views/ppmc_new.html.rb +++ b/www/roster/views/ppmc_new.html.rb @@ -12,7 +12,7 @@ breadcrumbs: { roster: '.', ppmc: 'ppmc/', - _new_: "ppmc/_new_" + _new_: 'ppmc/_new_' } ) do _div_.main! diff --git a/www/roster/views/ppmcs.html.rb b/www/roster/views/ppmcs.html.rb index 53e283e027..8c9fe64db8 100644 --- a/www/roster/views/ppmcs.html.rb +++ b/www/roster/views/ppmcs.html.rb @@ -17,8 +17,8 @@ _p do _ 'Click on column names to sort.' - _{"      "} - "ABCDEFGHIJKLMNOPQRSTUVWXYZ".each_char do |c| + _{'      '} + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.each_char do |c| _a c, href: "ppmc/##{c}" end end @@ -58,7 +58,7 @@ if project_names.include? ppmc.name _ ppmc.description else - _ ppmc.description + " (not in ldap)" + _ ppmc.description + ' (not in ldap)' end end end diff --git a/www/roster/views/utils.js.rb b/www/roster/views/utils.js.rb index 988325195f..82f179b13a 100644 --- a/www/roster/views/utils.js.rb +++ b/www/roster/views/utils.js.rb @@ -3,7 +3,7 @@ class Utils # escape a string so that it can be used as a regular expression def self.escapeRegExp(string) # https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions - return string.gsub(/([.*+?^=!:${}()|\[\]\/\\])/, "\\$1"); + return string.gsub(/([.*+?^=!:${}()|\[\]\/\\])/, '\\$1'); end # Common processing to handle a response that is expected to be JSON diff --git a/www/roster/views/vue-config.js.rb b/www/roster/views/vue-config.js.rb index b2e9ae5746..a807c8e908 100644 --- a/www/roster/views/vue-config.js.rb +++ b/www/roster/views/vue-config.js.rb @@ -1,7 +1,7 @@ # Filter out "data property already declared as a prop" warnings Vue.config.warnHandler = proc do |msg, vm, trace| return if msg =~ /^The data property "\w+" is already declared as a prop\./ - console.error "[Vue warn]: " + msg + trace if defined? console + console.error '[Vue warn]: ' + msg + trace if defined? console end # reraise uncapturable errors asynchronously to enable easier debugging diff --git a/www/secretary/iclaparser.rb b/www/secretary/iclaparser.rb index e1c0bacdb0..94fbaaa0c2 100644 --- a/www/secretary/iclaparser.rb +++ b/www/secretary/iclaparser.rb @@ -33,13 +33,13 @@ class Receiver 'Individual Contributor', 'License Agreement', '("Agreement") V2.0', - "as \"Not a Contribution.\"", - "inaccurate in any respect.", - "for your records.", - "1. Definitions.", - "Contributions and such derivative works.", - "litigation is filed.", - "Contributions." + 'as "Not a Contribution."', + 'inaccurate in any respect.', + 'for your records.', + '1. Definitions.', + 'Contributions and such derivative works.', + 'litigation is filed.', + 'Contributions.' ] def initialize(fontdict) @@ -164,9 +164,9 @@ def self.parse(path) # In particular info[:Producer] may have odd characters val = reader.public_send(i) if val.instance_of? String - metadata[i] = val.encode("utf-8", "utf-8", :invalid => :replace) + metadata[i] = val.encode('utf-8', 'utf-8', :invalid => :replace) elsif val.instance_of? Hash - metadata[i] = val.transform_values {|v| v.encode("utf-8", "utf-8", :invalid => :replace)} + metadata[i] = val.transform_values {|v| v.encode('utf-8', 'utf-8', :invalid => :replace)} else metadata[i] = val.class end @@ -240,7 +240,7 @@ def self.parse(path) each do |k| data[:text] << k. sort_by {|l| l[:x]}. # sort by X ascending - map {|v| v[:Contents]}.join(", ") + map {|v| v[:Contents]}.join(', ') end end if metadata[:dataSource].size == 0 or ((data[:text].size rescue 0) <= 1 and data.size < 3) # No annotations found or not useful diff --git a/www/secretary/workbench/tasks.rb b/www/secretary/workbench/tasks.rb index dc5172ac6d..324585920f 100644 --- a/www/secretary/workbench/tasks.rb +++ b/www/secretary/workbench/tasks.rb @@ -98,9 +98,9 @@ def svn_multi(index_dir, index_name, docdir, docname, docsig, outfilename, outfi dest.each do |name, file, content_type| if docdir == 'iclas' && outfileext # special processing for output name if name == docname - name = "icla%s" % outfileext + name = 'icla%s' % outfileext elsif name == docsig - name = "icla%s.asc" % outfileext + name = 'icla%s.asc' % outfileext else Wunderbar.warn "Cannot recognise #{name} as #{docname} or #{docsig}" end @@ -132,7 +132,7 @@ def svn_multi(index_dir, index_name, docdir, docname, docsig, outfilename, outfi end def template(name) - path = File.expand_path(File.join("..", "templates", name), __FILE__) + path = File.expand_path(File.join('..', 'templates', name), __FILE__) ERB.new(File.read(path)).result(binding) end end diff --git a/www/secretary/workbench/views/actions/ccla.json.rb b/www/secretary/workbench/views/actions/ccla.json.rb index 25599fe47d..6e256dbff8 100644 --- a/www/secretary/workbench/views/actions/ccla.json.rb +++ b/www/secretary/workbench/views/actions/ccla.json.rb @@ -40,7 +40,7 @@ task "svn commit documents/cclas/#@filename#{fileext} and update cclas.txt" do # construct line to be inserted in cclas.txt - @cclalines = "notinavail:" + @company.strip + @cclalines = 'notinavail:' + @company.strip unless @contact.empty? @cclalines += " - #{@contact.strip}" end diff --git a/www/secretary/workbench/views/actions/check-signature.json.rb b/www/secretary/workbench/views/actions/check-signature.json.rb index 0ada63cb21..8ca2110d13 100644 --- a/www/secretary/workbench/views/actions/check-signature.json.rb +++ b/www/secretary/workbench/views/actions/check-signature.json.rb @@ -48,7 +48,7 @@ def getURI(uri, file) # The pool needs a special CA cert Net::HTTP.start(uri.host, uri.port, opts ) do |https| https.request_get(uri.request_uri) do |res| - unless res.code == "200" + unless res.code == '200' raise Exception.new("Get #{uri} failed with #{res.code}: #{res.message}") end cl = res.content_length @@ -58,9 +58,9 @@ def getURI(uri, file) raise Exception.new("Content-Length: #{cl} > #{MAX_KEY_SIZE}") end else - Wunderbar.warn "Content-Length not provided, continuing" + Wunderbar.warn 'Content-Length not provided, continuing' end - File.open(file, "w") do |f| + File.open(file, 'w') do |f| # Save the data directly; don't store in memory res.read_body do |segment| f.write segment @@ -186,7 +186,7 @@ def process # Allow direct testing if $0 == __FILE__ - yyyymmid = ARGV.shift or fail "Need yyyymm/msgid" + yyyymmid = ARGV.shift or fail 'Need yyyymm/msgid' att = ARGV.shift || 'icla.pdf' sig = ARGV.shift || att + '.asc' @message = "/secretary/workbench/#{yyyymmid}/" diff --git a/www/secretary/workbench/views/actions/icla.json.rb b/www/secretary/workbench/views/actions/icla.json.rb index e55722f72a..ec3fc64e46 100644 --- a/www/secretary/workbench/views/actions/icla.json.rb +++ b/www/secretary/workbench/views/actions/icla.json.rb @@ -27,7 +27,7 @@ _icla = ASF::ICLA.find_matches(@realname.strip) if _icla.size > 0 lines = [] - lines << "Found possible duplicate ICLAs:" + lines << 'Found possible duplicate ICLAs:' _icla.each do |i| file = ASF::ICLAFiles.match_claRef(i.claRef) lines << [i.legal_name, ASF::SVN.svnpath!('iclas', file)] @@ -182,7 +182,7 @@ # acreq/new-account-reqs.txt # ###################################################################### - task "svn commit infra/acreq/new-account-reqs.txt" do + task 'svn commit infra/acreq/new-account-reqs.txt' do # construct account request line @acreq ||= [ @user, @@ -216,7 +216,7 @@ # email root@ # ###################################################################### - task "email root@apache.org" do + task 'email root@apache.org' do # build mail from template (already includes TO: root) mail = Mail.new(template('acreq.erb')) diff --git a/www/secretary/workbench/views/actions/icla2.json.rb b/www/secretary/workbench/views/actions/icla2.json.rb index 984c72d2b0..99fc1b2150 100644 --- a/www/secretary/workbench/views/actions/icla2.json.rb +++ b/www/secretary/workbench/views/actions/icla2.json.rb @@ -23,7 +23,7 @@ ######################################################################## unless @filename =~ /\A\w[-.\w]*\z/ - _warn "Unexpected characters in @{filename}" + _warn 'Unexpected characters in @{filename}' end if @email.strip.end_with? '@apache.org' @@ -118,7 +118,7 @@ ######################################################################## # insert line into iclas.txt -task "svn commit foundation/officers/iclas.txt" do +task 'svn commit foundation/officers/iclas.txt' do icla = ASF::ICLA.find_by_id(@id) || ASF::ICLA.find_by_email(@oldemail) unless icla and icla.id == @id and icla.email == @oldemail raise ArgumentError.new("ICLA not found for #@id:#@oldemail") @@ -152,7 +152,7 @@ ######################################################################## if person.public_name != @pubname and @id != 'notinavail' - task "change public name in LDAP" do + task 'change public name in LDAP' do form do _input value: @pubname, name: 'pubname' end @@ -199,7 +199,7 @@ ######################################################################## if @id != 'notinavail' - task "change email address in LDAP" do + task 'change email address in LDAP' do form do _input value: @email, name: 'email' end diff --git a/www/secretary/workbench/views/actions/memapp.json.rb b/www/secretary/workbench/views/actions/memapp.json.rb index 7600906f9c..f149939991 100644 --- a/www/secretary/workbench/views/actions/memapp.json.rb +++ b/www/secretary/workbench/views/actions/memapp.json.rb @@ -21,7 +21,7 @@ _warn "documents/member_apps/#{form} already exists" end else - _warn "Invalid filename or extension" + _warn 'Invalid filename or extension' end _warn "Invalid availid #{@availid}" unless @availid =~ /^\w[-.\w]+$/ @@ -69,7 +69,7 @@ members = data.split(/^\s+\*\)\s+/) members.shift members.push @entry - members_txt[pattern, 1] = " *) " + members.join("\n *) ") + members_txt[pattern, 1] = ' *) ' + members.join("\n *) ") members_txt[/We now number (\d+) active members\./, 1] = members.length.to_s ASF::Member.sort(members_txt) end @@ -81,7 +81,7 @@ # update cn=member,ou=groups,dc=apache,dc=org # ######################################################################## -task "update cn=member,ou=groups,dc=apache,dc=org in LDAP" do +task 'update cn=member,ou=groups,dc=apache,dc=org in LDAP' do form do _input value: @availid, name: 'availid' end @@ -102,7 +102,7 @@ # subscribe to members@apache.org # ######################################################################## -task "subscribe to members@apache.org" do +task 'subscribe to members@apache.org' do user = ASF::Person.find(@availid) vars = { version: 3, # This must match committers/subscribe.cgi#FORMAT_NUMBER @@ -131,7 +131,7 @@ # subscribe to members-notify@apache.org # ######################################################################## -task "subscribe to members-notify@apache.org" do +task 'subscribe to members-notify@apache.org' do user = ASF::Person.find(@availid) vars = { version: 3, # This must match committers/subscribe.cgi#FORMAT_NUMBER @@ -162,7 +162,7 @@ # TODO combine with other SVN updates -task "svn commit memapp-received.text" do +task 'svn commit memapp-received.text' do file = ASF::MeetingUtil.get_latest_file('memapp-received.txt') received = File.read(file) original = received[/.*\s#{@availid}\s.*/] diff --git a/www/secretary/workbench/views/actions/parse-icla.json.rb b/www/secretary/workbench/views/actions/parse-icla.json.rb index 831c8df2b5..78ca3cb092 100644 --- a/www/secretary/workbench/views/actions/parse-icla.json.rb +++ b/www/secretary/workbench/views/actions/parse-icla.json.rb @@ -9,7 +9,7 @@ # WHIMSY-322 ALIASES = { - "solr" => "lucene", + 'solr' => 'lucene', } if attachment.end_with? '.pdf' diff --git a/www/secretary/workbench/views/all.html.rb b/www/secretary/workbench/views/all.html.rb index a22e425e0f..20aa09787f 100644 --- a/www/secretary/workbench/views/all.html.rb +++ b/www/secretary/workbench/views/all.html.rb @@ -22,7 +22,7 @@ _tr do _td msg[:status].to_s _td do - _a time, href: "../%s" % msg[:href], title: time + _a time, href: '../%s' % msg[:href], title: time end _td msg[:from] _td msg[:subject] diff --git a/www/secretary/workbench/views/deleted.html.rb b/www/secretary/workbench/views/deleted.html.rb index 5a48698730..a8aca36893 100644 --- a/www/secretary/workbench/views/deleted.html.rb +++ b/www/secretary/workbench/views/deleted.html.rb @@ -20,7 +20,7 @@ time = Time.parse(msg[:time]).to_s _tr do _td do - _a time, href: "../%s" % msg[:href], title: time + _a time, href: '../%s' % msg[:href], title: time end _td msg[:from] _td msg[:subject] diff --git a/www/secretary/workbench/views/forms/ccla.js.rb b/www/secretary/workbench/views/forms/ccla.js.rb index 5c7935e034..30499ea89a 100644 --- a/www/secretary/workbench/views/forms/ccla.js.rb +++ b/www/secretary/workbench/views/forms/ccla.js.rb @@ -122,7 +122,7 @@ def updated() # Safari autocomplete workaround: trigger change on leaving field # https://github.com/facebook/react/issues/2125 - if navigator.userAgent.include? "Safari" + if navigator.userAgent.include? 'Safari' Array(document.getElementsByTagName('input')).each do |input| input.addEventListener('blur', self.onblur) end diff --git a/www/secretary/workbench/views/forms/forward.js.rb b/www/secretary/workbench/views/forms/forward.js.rb index 4c428e4205..8f44b37fa5 100644 --- a/www/secretary/workbench/views/forms/forward.js.rb +++ b/www/secretary/workbench/views/forms/forward.js.rb @@ -50,7 +50,7 @@ def render def forward(event) form = jQuery(event.target).closest('form') - form.attr('action', "../../tasklist/forward") + form.attr('action', '../../tasklist/forward') form.submit() end end diff --git a/www/secretary/workbench/views/forms/grant.js.rb b/www/secretary/workbench/views/forms/grant.js.rb index 30e69c8b8b..ba7397b86b 100644 --- a/www/secretary/workbench/views/forms/grant.js.rb +++ b/www/secretary/workbench/views/forms/grant.js.rb @@ -103,7 +103,7 @@ def updated() document.querySelector("input[name=#{name}]").validity.valid end - valid &= document.querySelector("textarea[name=description]").validity.valid + valid &= document.querySelector('textarea[name=description]').validity.valid $refs.file.disabled = !valid or @filed or @submitted @@ -114,7 +114,7 @@ def updated() # Safari autocomplete workaround: trigger change on leaving field # https://github.com/facebook/react/issues/2125 - if navigator.userAgent.include? "Safari" + if navigator.userAgent.include? 'Safari' Array(document.getElementsByTagName('input')).each do |input| input.addEventListener('blur', self.onblur) end diff --git a/www/secretary/workbench/views/forms/icla.js.rb b/www/secretary/workbench/views/forms/icla.js.rb index cac91d31dd..dd1eb638c5 100644 --- a/www/secretary/workbench/views/forms/icla.js.rb +++ b/www/secretary/workbench/views/forms/icla.js.rb @@ -221,9 +221,9 @@ def updated() end # new account request form - perform checks only if user is valid - user = document.querySelector("input[name=user]") - project = document.querySelector("select[name=project]") - votelink = document.querySelector("input[name=votelink]") + user = document.querySelector('input[name=user]') + project = document.querySelector('select[name=project]') + votelink = document.querySelector('input[name=votelink]') valid &&= project.validity.valid @@ -246,7 +246,7 @@ def updated() # Safari autocomplete workaround: trigger change on leaving field # https://github.com/facebook/react/issues/2125 - if navigator.userAgent.include? "Safari" + if navigator.userAgent.include? 'Safari' Array(document.getElementsByTagName('input')).each do |input| input.addEventListener('blur', self.onblur) end @@ -284,10 +284,10 @@ def genfilename(realname, familyfirst) return nominalname else # compute file name with family first; move first name to last - namearray = nominalname.split("-") + namearray = nominalname.split('-') namearray.push(namearray[0]) namearray.shift() - return namearray.join("-") + return namearray.join('-') end end diff --git a/www/secretary/workbench/views/forms/icla2.js.rb b/www/secretary/workbench/views/forms/icla2.js.rb index 1980ee255f..39a99c1854 100644 --- a/www/secretary/workbench/views/forms/icla2.js.rb +++ b/www/secretary/workbench/views/forms/icla2.js.rb @@ -164,7 +164,7 @@ def updated() # Safari autocomplete workaround: trigger change on leaving field # https://github.com/facebook/react/issues/2125 - if navigator.userAgent.include? "Safari" + if navigator.userAgent.include? 'Safari' Array(document.getElementsByTagName('input')).each do |input| input.addEventListener('blur', self.onblur) end diff --git a/www/secretary/workbench/views/forms/memapp.js.rb b/www/secretary/workbench/views/forms/memapp.js.rb index 7fb22fdbea..1b9348d85b 100644 --- a/www/secretary/workbench/views/forms/memapp.js.rb +++ b/www/secretary/workbench/views/forms/memapp.js.rb @@ -70,7 +70,7 @@ def mounted() jQuery.getJSON('../../memapp.json') do |result| @received = result.received if @received.length == 0 - alert "No entries found - has memapp-received.txt been set up yet? (It needs to be populated once the list of elected members is known: see Meetings/runbook.txt)" + alert 'No entries found - has memapp-received.txt been set up yet? (It needs to be populated once the list of elected members is known: see Meetings/runbook.txt)' end end diff --git a/www/secretary/workbench/views/http.js.rb b/www/secretary/workbench/views/http.js.rb index 1ec8dfa209..b75e49e32e 100644 --- a/www/secretary/workbench/views/http.js.rb +++ b/www/secretary/workbench/views/http.js.rb @@ -117,7 +117,7 @@ def xhr.onreadystatechange() if target =~ /^https?:/ xhr.open('GET', target, true) - xhr.setRequestHeader("Accept", "application/json") if type == :json + xhr.setRequestHeader('Accept', 'application/json') if type == :json else xhr.open('GET', target, true) end @@ -130,9 +130,9 @@ def xhr.onreadystatechange() # common rejection logic def self._reject(xhr, reject) if not xhr.status - reject "Server unavailable" + reject 'Server unavailable' elsif xhr.status == 404 - reject "Not found" + reject 'Not found' else console.log xhr.response if not xhr.response diff --git a/www/secretary/workbench/views/index.html.rb b/www/secretary/workbench/views/index.html.rb index c4bec1ea31..8e12860570 100644 --- a/www/secretary/workbench/views/index.html.rb +++ b/www/secretary/workbench/views/index.html.rb @@ -1,5 +1,5 @@ _html do - if ENV["RACK_BASE_URI"].to_s + '/' == _.env['REQUEST_URI'] + if ENV['RACK_BASE_URI'].to_s + '/' == _.env['REQUEST_URI'] # not sure why Passenger/rack is eating the trailing slash here. # add it back in. _base href: _.env['REQUEST_URI'] diff --git a/www/secretary/workbench/views/index.js.rb b/www/secretary/workbench/views/index.js.rb index 5f62e076da..4ccb8ad78f 100644 --- a/www/secretary/workbench/views/index.js.rb +++ b/www/secretary/workbench/views/index.js.rb @@ -54,7 +54,7 @@ def render() _tr row_options do _td do if %i[emeritusReady emeritusPending].include? message.status - _a message.date, href: message.href, title: message.time, target: "_blank" + _a message.date, href: message.href, title: message.time, target: '_blank' else _a message.date, href: message.href, title: message.time end @@ -62,7 +62,7 @@ def render() _td _crop(message.from, 40) if %i[emeritusReady emeritusPending].include? message.status _td do - _a message.subject, class: message.status, href: message.href2, target: "_blank" + _a message.subject, class: message.status, href: message.href2, target: '_blank' end elsif message.secmail _td do @@ -260,7 +260,7 @@ def undo(event) def refresh(event) log "refresh #{@@mbox}" @checking = true - HTTP.post("actions/check-mail", mbox: @@mbox).then {|response| + HTTP.post('actions/check-mail', mbox: @@mbox).then {|response| self.mergemsgs response.messages @checking = false }.catch {|error| diff --git a/www/secretary/workbench/views/index.json.rb b/www/secretary/workbench/views/index.json.rb index d6f1ddaeb5..3eb700c56c 100644 --- a/www/secretary/workbench/views/index.json.rb +++ b/www/secretary/workbench/views/index.json.rb @@ -1,6 +1,6 @@ # find indicated mailbox in the list of available mailboxes # This code is invoked by workbench/server.rb -available = Dir[File.join(ARCHIVE, "*.yml")].sort +available = Dir[File.join(ARCHIVE, '*.yml')].sort index = available.find_index File.join(ARCHIVE, "#{@mbox}.yml") # if found, process it diff --git a/www/secretary/workbench/views/parts.js.rb b/www/secretary/workbench/views/parts.js.rb index 76c99d017b..cf44349190 100644 --- a/www/secretary/workbench/views/parts.js.rb +++ b/www/secretary/workbench/views/parts.js.rb @@ -51,10 +51,10 @@ def render } _ul do - _li "undelete this email", onMousedown: self.undelete_message + _li 'undelete this email', onMousedown: self.undelete_message end - _p "(Use [ctrl|meta] + [delete|backspace] to delete this email)" + _p '(Use [ctrl|meta] + [delete|backspace] to delete this email)' # locate corresponding signature file (if any) signature = CheckSignature.find(decodeURIComponent(@selected), @attachments) @@ -107,7 +107,7 @@ def render _li "\u2716 delete", onMousedown: self.delete_attachment _li "\u2709 pdf-ize", onMousedown: self.pdfize _li.divider - _li "parse pdf", onMousedown: self.pdfparse + _li 'parse pdf', onMousedown: self.pdfparse end if @selected and not @menu and @selected !~ /\.(asc|sig)$/ @@ -389,7 +389,7 @@ def render _li "\u2716 delete", onMousedown: self.delete_attachment _li "\u2709 pdf-ize", onMousedown: self.pdfize _li.divider - _li "parse pdf", onMousedown: self.pdfparse + _li 'parse pdf', onMousedown: self.pdfparse end elsif @form == :mail @@ -685,8 +685,8 @@ def update_mail(event) event.target.disabled = true jQuery.ajax( - type: "POST", - url: "../../actions/update-mail", + type: 'POST', + url: '../../actions/update-mail', data: { message: window.parent.location.pathname, cc: @cc, @@ -711,7 +711,7 @@ def reject(event) # Note: the doctype value is passed across as @doctype def generic_reject(event) form = jQuery(event.target).closest('form') - form.attr('action', "../../tasklist/generic_reject") + form.attr('action', '../../tasklist/generic_reject') form.submit() end diff --git a/www/secretary/workbench/views/pending.html.rb b/www/secretary/workbench/views/pending.html.rb index 26e570b264..de1d4b87db 100644 --- a/www/secretary/workbench/views/pending.html.rb +++ b/www/secretary/workbench/views/pending.html.rb @@ -20,7 +20,7 @@ time = Time.parse(msg[:time]).to_s _tr do _td do - _a time, href: "../%s" % msg[:href], title: time + _a time, href: '../%s' % msg[:href], title: time end _td msg[:from] _td msg[:subject] diff --git a/www/secretary/workbench/views/vue-config.js.rb b/www/secretary/workbench/views/vue-config.js.rb index b2e9ae5746..a807c8e908 100644 --- a/www/secretary/workbench/views/vue-config.js.rb +++ b/www/secretary/workbench/views/vue-config.js.rb @@ -1,7 +1,7 @@ # Filter out "data property already declared as a prop" warnings Vue.config.warnHandler = proc do |msg, vm, trace| return if msg =~ /^The data property "\w+" is already declared as a prop\./ - console.error "[Vue warn]: " + msg + trace if defined? console + console.error '[Vue warn]: ' + msg + trace if defined? console end # reraise uncapturable errors asynchronously to enable easier debugging diff --git a/www/site_or_pod.rb b/www/site_or_pod.rb index 8a25f207cd..ce61025022 100644 --- a/www/site_or_pod.rb +++ b/www/site_or_pod.rb @@ -42,22 +42,22 @@ } end if cgi_for_tlps? - other = "/pods/" - other_text = "PPMC Podling Website Checker" + other = '/pods/' + other_text = 'PPMC Podling Website Checker' else - other = "/site/" - other_text = "TLP Website Checker" + other = '/site/' + other_text = 'TLP Website Checker' end _body? do _whimsy_body( title: PAGETITLE, subtitle: "Checking #{cgi_for_tlps? ? 'Project' : 'Podling'} Websites For required content", related: { - "/committers/tools" => "Whimsy Tool Listing", + '/committers/tools' => 'Whimsy Tool Listing', other => other_text, - "https://www.apache.org/foundation/marks/pmcs#navigation" => "Required PMC Links Policy", - "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" => "See This Source Code", - "mailto:dev@whimsical.apache.org?subject=[SITE] Website Checker Question" => "Questions? Email Whimsy PMC" + 'https://www.apache.org/foundation/marks/pmcs#navigation' => 'Required PMC Links Policy', + "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" => 'See This Source Code', + 'mailto:dev@whimsical.apache.org?subject=[SITE] Website Checker Question' => 'Questions? Email Whimsy PMC' }, helpblock: -> { unless cgi_for_tlps? @@ -76,7 +76,7 @@ _ ', ' _a 'website display code', href: "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" _ ', ' - _a 'validation checks details', href: "https://github.com/apache/whimsy/blob/master/lib/whimsy/sitewebsite.rb" + _a 'validation checks details', href: 'https://github.com/apache/whimsy/blob/master/lib/whimsy/sitewebsite.rb' _ ', and ' _a 'raw JSON data', href: "#{SiteStandards.get_url(false)}#{SiteStandards.get_filename(cgi_for_tlps?)}" _ '.' diff --git a/www/status/monitor.rb b/www/status/monitor.rb index a1c849c4d6..7fc3b972a4 100644 --- a/www/status/monitor.rb +++ b/www/status/monitor.rb @@ -100,7 +100,7 @@ def initialize(args = []) # normalize status @status = normalize(data: newstatus) - File.write(File.expand_path("../../logs/status.data", __FILE__), + File.write(File.expand_path('../../logs/status.data', __FILE__), @status.inspect) # update results diff --git a/www/status/monitors/git.rb b/www/status/monitors/git.rb index 856047dd68..b843f8b7c8 100644 --- a/www/status/monitors/git.rb +++ b/www/status/monitors/git.rb @@ -100,11 +100,11 @@ def StatusMonitor.git(previous_status) show 'lines', lines if lines.empty? if not data - title = "partial response" + title = 'partial response' level = 'warning' seen_level[level] = true elsif data.is_a? String - title = "No files updated" + title = 'No files updated' end data << revision if revision and data.instance_of? Array @@ -125,7 +125,7 @@ def StatusMonitor.git(previous_status) # Save a copy of the log; append the severity so can track more problems file = File.basename(log) if __FILE__ == $0 # unit test - puts "Would copy log to " + File.join(archive, file + '.' + lvl) + puts 'Would copy log to ' + File.join(archive, file + '.' + lvl) else FileUtils.copy log, File.join(archive, file + '.' + lvl), preserve: true end diff --git a/www/status/monitors/svn.rb b/www/status/monitors/svn.rb index 3f821a0d5e..dcd908b192 100644 --- a/www/status/monitors/svn.rb +++ b/www/status/monitors/svn.rb @@ -47,7 +47,7 @@ def StatusMonitor.svn(previous_status) lines.reject! do |line| line =~ %r{Updating '.+':} or - line == "Summary of updates:" or + line == 'Summary of updates:' or # must agree with Rakefile/PREFIX line.start_with?('#!: ') or line =~ REV_RE # this was processed above @@ -62,13 +62,13 @@ def StatusMonitor.svn(previous_status) if lines.empty? if not data - title = "partial response" + title = 'partial response' level = 'warning' seen_level[level] = true elsif data.is_a? String # only saw revision message - title = "No files updated" + title = 'No files updated' elsif data.length == 1 - title = "1 file updated" + title = '1 file updated' else title = "#{data.length} files updated" end diff --git a/www/status/monitors/unit_test.rb b/www/status/monitors/unit_test.rb index 6201c4985f..f79ae4433e 100644 --- a/www/status/monitors/unit_test.rb +++ b/www/status/monitors/unit_test.rb @@ -11,12 +11,12 @@ def runtest(method_name) previous = baseline[:data][method_name.to_sym] || {mtime: Time.at(0)} response = StatusMonitor.send(method_name, previous) if response == previous - puts "No change in response" + puts 'No change in response' elsif response[:data] and response[:data] == previous[:data] # main class adds a trailer after the data - puts "No change in response data" + puts 'No change in response data' else - puts "Response differs:" + puts 'Response differs:' puts previous puts response end From 1043781caf5e8aedf13aa33c37c2f20cb9cd2d57 Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 27 Aug 2024 15:40:52 +0100 Subject: [PATCH 48/56] Get current branch --- www/status/index.cgi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/www/status/index.cgi b/www/status/index.cgi index d279543450..f246c3514b 100755 --- a/www/status/index.cgi +++ b/www/status/index.cgi @@ -33,9 +33,9 @@ else end print "Status: #{summary_status}\r\n\r\n" +git_branch = `git branch --show-current`.strip git_info = `git show --format="%h %ci %cr" -s HEAD`.strip rescue "?" -# TODO better format; don't assume we use master -git_repo = `git ls-remote origin master`.strip rescue "?" +git_repo = `git ls-remote origin #{git_branch}`.strip rescue "?" hostname = `hostname` @@ -93,7 +93,7 @@ print <<-EOF (ASF member only)
  • Passenger (ASF committer only)
  • Subversion (ASF committer only)
  • -
  • Git code info: #{git_info}
  • +
  • Git code info: #{git_info} (#{git_branch})
  • Git repo info: #{git_repo}
  • From 1f103febce88fa8958faa9fb4061d6975748c441 Mon Sep 17 00:00:00 2001 From: Sebb Date: Tue, 27 Aug 2024 17:29:44 +0100 Subject: [PATCH 49/56] Link to roster --- www/members/subscriptions.cgi | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/www/members/subscriptions.cgi b/www/members/subscriptions.cgi index d8a1914740..aaa622c1ae 100755 --- a/www/members/subscriptions.cgi +++ b/www/members/subscriptions.cgi @@ -94,11 +94,11 @@ _html do elsif not person.asf_member? _td.text_danger id, title: 'Non Member', data_sort_value: '1' elsif person.asf_member? != true - _td(data_sort_value: '2') {_em id, title: 'Emeritus'} + _td(data_sort_value: '2') {_em {_a id, href: "/roster/committer/#{id}", title: 'Emeritus'}} elsif not ldap.include? person _td(data_sort_value: '3') {_strong.text_danger id, title: 'Not in LDAP'} else - _td id + _td {_a id, href: "/roster/committer/#{id}"} end _td email @@ -123,11 +123,12 @@ _html do _th 'name' end missing.sort_by(&:name).each do |person| + id = person.id _tr do if not ldap.include? person - _td {_strong.text_danger person.id, title: 'Not in LDAP'} + _td {_strong.text_danger {_a id, href: "/roster/committer/#{id}", title: 'Not in LDAP'}} else - _td person.id + _td {_a id, href: "/roster/committer/#{id}"} end if person.public_name _td person.public_name From 993292581fdaaaf7c66ed5f1ed0d44c56c7cebca Mon Sep 17 00:00:00 2001 From: Sebb Date: Wed, 28 Aug 2024 15:46:54 +0100 Subject: [PATCH 50/56] Fix LDAP name; see INFRA-26209 --- lib/whimsy/asf/committee.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb index d0f3f07ea5..5503c0b0ce 100644 --- a/lib/whimsy/asf/committee.rb +++ b/lib/whimsy/asf/committee.rb @@ -66,7 +66,7 @@ def initialize(*args) NAMEADDRLEN = 59 # length of name + email address fields (including separator) # mapping of committee names to canonical names (generally from ldap) - # See also www/roster/committee.cgi + # See also www/roster/committee.rb @@aliases = Hash.new { |_hash, name| name.downcase} @@aliases.merge! \ 'brand management' => 'brand', @@ -83,6 +83,7 @@ def initialize(*args) 'java community process' => 'jcp', 'legal affairs' => 'legal', 'logging services' => 'logging', + 'logo development' => 'logodev', 'lucene.net' => 'lucenenet', 'open climate workbench' => 'climate', 'ocw' => 'climate', # is OCW used? From 6f67f735f746ee43d1ad7ac0d8eda82f85b29aad Mon Sep 17 00:00:00 2001 From: Sebb Date: Wed, 28 Aug 2024 15:53:16 +0100 Subject: [PATCH 51/56] Fix LDAP name; see INFRA-26209 - bis --- lib/whimsy/asf/committee.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb index 5503c0b0ce..f54fbc38b5 100644 --- a/lib/whimsy/asf/committee.rb +++ b/lib/whimsy/asf/committee.rb @@ -144,7 +144,7 @@ def mail_list 'planners@apachecon.com' when 'publicaffairs' 'public-affairs-private@apache.org' - when 'logodevelopment' + when 'logodev' 'logo-dev@apache.org' # their only list as at 2024-08-25 else name.downcase From a6c1af18e66a446a0979302a281f015611934add Mon Sep 17 00:00:00 2001 From: Sebb Date: Thu, 29 Aug 2024 00:07:00 +0100 Subject: [PATCH 52/56] Allow for missing site --- tools/download_check.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/download_check.rb b/tools/download_check.rb index 258f88a7b7..d625542774 100755 --- a/tools/download_check.rb +++ b/tools/download_check.rb @@ -334,10 +334,14 @@ def get_links(path, body, checkSpaces=false) URL2TLP['xmlbeans'] = 'poi' # xmlbeans now being maintained by POI PMCS = Set.new # is this a TLP? ASF::Committee.pmcs.map do |p| - site = p.site[%r{//(.+?)\.apache\.org}, 1] name = p.name - URL2TLP[site] = name unless site == name PMCS << name + if p.site + site = p.site[%r{//(.+?)\.apache\.org}, 1] + URL2TLP[site] = name unless site == name + else + Wunderbar.warn "PMC has no site: #{name}" + end end # Convert text reference to extension From e983659f6bd05d0597280b150ca61fc44419ae62 Mon Sep 17 00:00:00 2001 From: Sebb Date: Thu, 29 Aug 2024 22:58:03 +0100 Subject: [PATCH 53/56] Start to centralise private mail list derivation --- lib/whimsy/asf/committee.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb index f54fbc38b5..a5026c0418 100644 --- a/lib/whimsy/asf/committee.rb +++ b/lib/whimsy/asf/committee.rb @@ -151,6 +151,13 @@ def mail_list end end + # Return the committee private list + def private_mail_list + ml = mail_list + return mail_list if mail_list.include? '@' + "private@#{mail_list}.apache.org" + end + # load committee info from committee-info.txt. Will not reparse # if the file has already been parsed and the underlying file has not # changed. From 4506d8f5b5bc3d0a630d89b28afd4b825513e7c6 Mon Sep 17 00:00:00 2001 From: Sebb Date: Thu, 29 Aug 2024 22:58:31 +0100 Subject: [PATCH 54/56] Replace broken mail address calculation --- tools/pubsub-ci-email.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pubsub-ci-email.rb b/tools/pubsub-ci-email.rb index f28e22c1c7..2437ef0aa4 100755 --- a/tools/pubsub-ci-email.rb +++ b/tools/pubsub-ci-email.rb @@ -189,7 +189,7 @@ def do_diff(initialhash, currenthash, triggerrev) userid = key username = args[:name] joindate = args[:date] - mail_list = "private@#{cttee.mail_list}.apache.org" + mail_list = cttee.private_mail_list change_text = TYPES[type] || type # 'added to|dropped from' # The email currently only goes to notifications@whimsical. # To enable actual reporting, change the following: From 1ebfeaff5d3ff7357a8cdcb5a1b8c4af8c4733b2 Mon Sep 17 00:00:00 2001 From: Sebb Date: Thu, 29 Aug 2024 23:37:32 +0100 Subject: [PATCH 55/56] Use library routines for getting private lists --- www/committers/tm-report.cgi | 4 ++-- www/officers/acreq.cgi | 5 ++--- www/project/icla/views/actions/discuss.json.rb | 2 +- www/project/icla/views/actions/validate.json.rb | 2 +- www/project/icla/views/actions/vote.json.rb | 2 +- www/roster/models/committee.rb | 2 +- www/roster/models/committer.rb | 2 +- www/roster/models/ppmc.rb | 2 +- www/roster/views/actions/authgroup.json.rb | 3 +-- www/roster/views/actions/committee.json.rb | 2 +- www/roster/views/actions/nonpmc.json.rb | 3 +-- www/secretary/workbench/views/actions/ccla.json.rb | 2 +- www/secretary/workbench/views/actions/grant.json.rb | 2 +- www/secretary/workbench/views/actions/icla.json.rb | 6 +++--- www/secretary/workbench/views/actions/incomplete.json.rb | 2 +- www/secretary/workbench/views/actions/pubkey.json.rb | 2 +- www/secretary/workbench/views/actions/resubmit.json.rb | 2 +- 17 files changed, 21 insertions(+), 24 deletions(-) diff --git a/www/committers/tm-report.cgi b/www/committers/tm-report.cgi index 1cd3790f19..61e8782176 100755 --- a/www/committers/tm-report.cgi +++ b/www/committers/tm-report.cgi @@ -193,8 +193,8 @@ def send_form(formdata: {}) # Build the mail to be sent frm = formdata['reporteremail'] subject = "[FORM] Misuse Report about #{formdata['project']}" - pmc_list = ASF::Committee.find(formdata['project']).mail_list - cc_list = ["private@#{pmc_list}.apache.org", frm] + pmc_list = ASF::Committee.find(formdata['project']).private_mail_list + cc_list = [private_mail_list, frm] to_list = BRANDLIST if true # TESTING mode diff --git a/www/officers/acreq.cgi b/www/officers/acreq.cgi index f6df1cb8af..1854b09da8 100755 --- a/www/officers/acreq.cgi +++ b/www/officers/acreq.cgi @@ -286,13 +286,12 @@ _html do cc_list = ["operations@apache.org"] requestor = user.id else - pmc_list = ASF::Committee.find(@pmc).mail_list - cc_list = ["private@#{pmc_list}.apache.org"] + cc_list = [ASF::Committee.find(@pmc).private_mail_list] requestor = @pmc[/([\w.-]+)/, 1] end if requestor == 'incubator' and not @podling.to_s.empty? - cc_list << "private@#{@podling}.#{pmc_list}.apache.org" + cc_list << ASF::Podling.find(@pmc).private_mail_list requestor = "#{@podling}@incubator" end diff --git a/www/project/icla/views/actions/discuss.json.rb b/www/project/icla/views/actions/discuss.json.rb index 53f79d104a..47a26b9dbc 100644 --- a/www/project/icla/views/actions/discuss.json.rb +++ b/www/project/icla/views/actions/discuss.json.rb @@ -90,7 +90,7 @@ # add user and pmc emails to the response _userEmail "#{user.public_name} <#{user.mail.first}>" if user -_pmcEmail "private@#{pmc.mail_list}.apache.org" if pmc +_pmcEmail pmc.private_mail_list if pmc path = Pathname.new(env['REQUEST_URI']) + "../../?token=#{token}" scheme = env['rack.url_scheme'] || 'https' diff --git a/www/project/icla/views/actions/validate.json.rb b/www/project/icla/views/actions/validate.json.rb index 7debd2111b..4e9e988087 100644 --- a/www/project/icla/views/actions/validate.json.rb +++ b/www/project/icla/views/actions/validate.json.rb @@ -172,7 +172,7 @@ # add user and pmc emails to the response _userEmail "#{user.public_name} <#{user.mail.first}>" if user -_pmcEmail "private@#{pmc.mail_list}.apache.org" if pmc +_pmcEmail pmc.private_mail_list if pmc # generate an invitation token token = Digest::MD5.hexdigest(@iclaemail)[0..15] diff --git a/www/project/icla/views/actions/vote.json.rb b/www/project/icla/views/actions/vote.json.rb index 51c9d8d81d..bc8f3f1565 100644 --- a/www/project/icla/views/actions/vote.json.rb +++ b/www/project/icla/views/actions/vote.json.rb @@ -90,7 +90,7 @@ # add user and pmc emails to the response _userEmail "#{user.public_name} <#{user.mail.first}>" if user -_pmcEmail "private@#{pmc.mail_list}.apache.org" if pmc +_pmcEmail pmc.private_mail_list if pmc path = Pathname.new(env['REQUEST_URI']) + "../../?token=#{token}" scheme = env['rack.url_scheme'] || 'https' diff --git a/www/roster/models/committee.rb b/www/roster/models/committee.rb index 4f12c6abdc..b78c17a66b 100644 --- a/www/roster/models/committee.rb +++ b/www/roster/models/committee.rb @@ -41,7 +41,7 @@ def self.serialize(id, env) unless analysePrivateSubs # not an ASF member - are we a moderator? # TODO match using canonical emails user_mail = currentUser.all_mail || [] - pMods = moderators["private@#{pmc.mail_list}.apache.org"] || [] + pMods = moderators[pmc.private_mail_list] || [] analysePrivateSubs = !(pMods & user_mail).empty? end diff --git a/www/roster/models/committer.rb b/www/roster/models/committer.rb index be7e6f3680..4c5ac245cf 100644 --- a/www/roster/models/committer.rb +++ b/www/roster/models/committer.rb @@ -223,7 +223,7 @@ def self.serialize(id, env) response[:chairOf] << cttee if chairs.include?(id) # mailing list info is not public ... if response[:subscriptions] # did we get access to the mail? - pmail = "private@#{pmc.mail_list}.apache.org" rescue '' + pmail = pmc.private_mail_list rescue '' subbed = false subs = response[:subscriptions] digs = response[:digests] diff --git a/www/roster/models/ppmc.rb b/www/roster/models/ppmc.rb index 0bf6840f40..b0334edcec 100644 --- a/www/roster/models/ppmc.rb +++ b/www/roster/models/ppmc.rb @@ -37,7 +37,7 @@ def self.serialize(id, env) unless analysePrivateSubs # not an ASF member - are we a moderator? # TODO match using canonical emails user_mail = currentUser.all_mail || [] - pMods = moderators["private@#{ppmc.mail_list}.apache.org"] || [] + pMods = moderators[ppmc.private_mail_list] || [] analysePrivateSubs = !(pMods & user_mail).empty? end diff --git a/www/roster/views/actions/authgroup.json.rb b/www/roster/views/actions/authgroup.json.rb index b64791532e..c5b12613ba 100644 --- a/www/roster/views/actions/authgroup.json.rb +++ b/www/roster/views/actions/authgroup.json.rb @@ -34,8 +34,7 @@ # replace with sending to the private@pmc list if this is a pmc owned group pmc = ASF::Committee.find(group.id.split('-').first) unless pmc.owners.empty? - to = pmc.mail_list - to = "private@#{to}.apache.org" unless to.include? '@' + to = pmc.private_mail_list end # other committees diff --git a/www/roster/views/actions/committee.json.rb b/www/roster/views/actions/committee.json.rb index c252a08957..32a9f0b2be 100644 --- a/www/roster/views/actions/committee.json.rb +++ b/www/roster/views/actions/committee.json.rb @@ -68,7 +68,7 @@ # draft email mail = Mail.new do from "#{from.public_name} <#{from.id}@apache.org>" - to "private@#{pmc.mail_list}.apache.org" + to pmc.private_mail_list cc cc bcc 'root@apache.org' subject "#{who} #{action} #{pmc.display_name} #{list}" diff --git a/www/roster/views/actions/nonpmc.json.rb b/www/roster/views/actions/nonpmc.json.rb index 59b2e8aee0..2eb761783b 100644 --- a/www/roster/views/actions/nonpmc.json.rb +++ b/www/roster/views/actions/nonpmc.json.rb @@ -69,8 +69,7 @@ # draft email mail = Mail.new do from "#{from.public_name} <#{from.id}@apache.org>" - # TODO the email address may need fixing - to "private@#{pmc.mail_list}.apache.org" + to pmc.private_mail_list cc cc bcc 'root@apache.org' subject "#{who} #{action} #{pmc.display_name} #{list}" diff --git a/www/secretary/workbench/views/actions/ccla.json.rb b/www/secretary/workbench/views/actions/ccla.json.rb index 6e256dbff8..0af1730cce 100644 --- a/www/secretary/workbench/views/actions/ccla.json.rb +++ b/www/secretary/workbench/views/actions/ccla.json.rb @@ -86,7 +86,7 @@ to: "#{@contact.inspect} <#{@email}>", cc: [ 'secretary@apache.org', - ("private@#{@pmc.mail_list}.apache.org" if @pmc), # copy pmc + (@pmc.private_mail_list if @pmc), # copy pmc (@podling.private_mail_list if @podling) # copy podling ], body: template('ccla.erb') diff --git a/www/secretary/workbench/views/actions/grant.json.rb b/www/secretary/workbench/views/actions/grant.json.rb index bc4173c042..5a945a65da 100644 --- a/www/secretary/workbench/views/actions/grant.json.rb +++ b/www/secretary/workbench/views/actions/grant.json.rb @@ -80,7 +80,7 @@ to: "#{@name.inspect} <#{@email}>", cc: [ 'secretary@apache.org', - ("private@#{@pmc.mail_list}.apache.org" if @pmc), # copy pmc + (@pmc.private_mail_list if @pmc), # copy pmc (@podling.private_mail_list if @podling) # copy podling ], body: template('grant.erb') diff --git a/www/secretary/workbench/views/actions/icla.json.rb b/www/secretary/workbench/views/actions/icla.json.rb index ec3fc64e46..27ec7fc00a 100644 --- a/www/secretary/workbench/views/actions/icla.json.rb +++ b/www/secretary/workbench/views/actions/icla.json.rb @@ -147,7 +147,7 @@ to: "#{@pubname.inspect} <#{@email}>", cc: [ ('secretary@apache.org' unless use_Bcc), - ("private@#{@pmc.mail_list}.apache.org" if @pmc), # copy pmc + (@pmc.private_mail_list if @pmc), # copy pmc (@podling.private_mail_list if @podling) # copy podling ], bcc: [ ('secretary@apache.org' if use_Bcc)], @@ -158,7 +158,7 @@ if @podling mail.header['Reply-To'] = @podling.private_mail_list elsif @pmc - mail.header['Reply-To'] = "private@#{@pmc.mail_list}.apache.org" + mail.header['Reply-To'] = @pmc.private_mail_list end # echo email @@ -222,7 +222,7 @@ # adjust copy lists cc = ["#{@pubname.inspect} <#{@email}>"] - cc << "private@#{@pmc.mail_list}.apache.org" if @pmc # copy pmc + cc << @pmc.private_mail_list if @pmc # copy pmc cc << @podling.private_mail_list if @podling # copy podling mail.cc = cc.uniq.map {|email| email} diff --git a/www/secretary/workbench/views/actions/incomplete.json.rb b/www/secretary/workbench/views/actions/incomplete.json.rb index ab3da094c5..8e29c2a80b 100644 --- a/www/secretary/workbench/views/actions/incomplete.json.rb +++ b/www/secretary/workbench/views/actions/incomplete.json.rb @@ -53,7 +53,7 @@ from: @from, cc: [ 'secretary@apache.org', - ("private@#{@pmc.mail_list}.apache.org" if @pmc), # copy pmc + (@pmc.private_mail_list if @pmc), # copy pmc (@podling.private_mail_list if @podling) # copy podling ], body: template('incomplete.erb') diff --git a/www/secretary/workbench/views/actions/pubkey.json.rb b/www/secretary/workbench/views/actions/pubkey.json.rb index 9312bb366d..7d0e0fbb70 100644 --- a/www/secretary/workbench/views/actions/pubkey.json.rb +++ b/www/secretary/workbench/views/actions/pubkey.json.rb @@ -19,7 +19,7 @@ from: @from, cc: [ 'secretary@apache.org', - ("private@#{@pmc.mail_list}.apache.org" if @pmc), # copy pmc + (@pmc.private_mail_list if @pmc), # copy pmc (@podling.private_mail_list if @podling) # copy podling ], body: template('pubkey.erb') diff --git a/www/secretary/workbench/views/actions/resubmit.json.rb b/www/secretary/workbench/views/actions/resubmit.json.rb index c5a206a93c..bd4d924e24 100644 --- a/www/secretary/workbench/views/actions/resubmit.json.rb +++ b/www/secretary/workbench/views/actions/resubmit.json.rb @@ -23,7 +23,7 @@ from: @from, cc: [ 'secretary@apache.org', - ("private@#{@pmc.mail_list}.apache.org" if @pmc), # copy pmc + (@pmc.private_mail_list if @pmc), # copy pmc (@podling.private_mail_list if @podling) # copy podling ], body: template('resubmit.erb') From f0526c29c6d27801cf0ea19529e4181ce11c45b1 Mon Sep 17 00:00:00 2001 From: Sebb Date: Thu, 29 Aug 2024 23:40:21 +0100 Subject: [PATCH 56/56] Use library routines for getting private lists --- www/secretary/workbench/views/actions/generic_reject.json.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/secretary/workbench/views/actions/generic_reject.json.rb b/www/secretary/workbench/views/actions/generic_reject.json.rb index 1cc96dafb7..f5afe45fc4 100644 --- a/www/secretary/workbench/views/actions/generic_reject.json.rb +++ b/www/secretary/workbench/views/actions/generic_reject.json.rb @@ -19,7 +19,7 @@ from: @from, cc: [ 'secretary@apache.org', - ("private@#{@pmc.mail_list}.apache.org" if @pmc), # copy pmc if selected + (@pmc.private_mail_list if @pmc), # copy pmc if selected @podling&.private_mail_list # copy podling if selected ], body: template("#{@doctype}.erb")