aboutsummaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/.rubocop.yml2
-rw-r--r--web/Rakefile41
-rw-r--r--web/app.rb84
-rw-r--r--web/db/migrations/018_new_targets.rb22
-rw-r--r--web/lib/ci.rb85
-rw-r--r--web/lib/models.rb4
-rw-r--r--web/lib/packages.rb13
-rw-r--r--web/lib/repoman.rb99
-rw-r--r--web/repo-logs/.gitignore2
-rw-r--r--web/views/build/build_history.erb20
-rw-r--r--web/views/build/build_logs.erb (renamed from web/views/build_logs.erb)4
-rw-r--r--web/views/build/build_status.erb (renamed from web/views/build_status.erb)18
-rw-r--r--web/views/build_history.erb24
-rw-r--r--web/views/bumps/new_targets.erb48
-rw-r--r--web/views/layout.erb24
-rw-r--r--web/views/overview/visualizations.erb (renamed from web/views/visualizations.erb)0
-rw-r--r--web/views/package/outdated_gems.erb (renamed from web/views/outdated_gems.erb)0
-rw-r--r--web/views/package/ruby_targets.erb (renamed from web/views/ruby_targets.erb)1
-rw-r--r--web/views/repoman/repoman_checks.erb (renamed from web/views/repoman_checks.erb)19
-rw-r--r--web/views/repoman/repoman_history.erb20
-rw-r--r--web/views/repoman/repoman_logs.erb16
-rw-r--r--web/views/repoman_history.erb25
-rw-r--r--web/views/repoman_logs.erb31
23 files changed, 326 insertions, 276 deletions
diff --git a/web/.rubocop.yml b/web/.rubocop.yml
index fee096c..49ef5a1 100644
--- a/web/.rubocop.yml
+++ b/web/.rubocop.yml
@@ -16,5 +16,7 @@ Style/IndentHash:
Enabled: false
Style/IndentationWidth:
Enabled: false
+Style/MultilineOperationIndentation:
+ EnforcedStyle: indented
Style/Tab:
Enabled: false
diff --git a/web/Rakefile b/web/Rakefile
index 7f52636..27525e0 100644
--- a/web/Rakefile
+++ b/web/Rakefile
@@ -7,17 +7,6 @@ task :test do
Dir.glob('./test/test_*.rb') { |f| require f }
end
-desc 'Run : update_packages => run_ci_untested => update_ci => run_repoman => update_repoman'
-task :nightly do
- Rake::Task['db:update_packages'].invoke
- Rake::Task['docker:setup'].invoke
- Rake::Task['docker:run_ci_untested'].invoke
- Rake::Task['db:update_ci'].invoke
- Rake::Task['docker:run_repoman_all'].invoke
- Rake::Task['db:update_repoman'].invoke
- Rake::Task['docker:teardown'].invoke
-end
-
namespace :db do
DB.loggers << Logger.new($stdout)
@@ -53,8 +42,11 @@ namespace :db do
end
namespace :docker do
- num_of_packages = ENV['NUM_OF_PACKAGES'].to_i
- num_of_packages = 5 if num_of_packages == 0
+ num_of_packages = ENV['NUM_OF_PACKAGES']
+ begin
+ num_of_packages = Integer(num_of_packages)
+ rescue
+ end
desc 'Build a docker image to use with subsequent tasks'
task :setup do
@@ -84,28 +76,13 @@ namespace :docker do
@volume_image.delete
end
- desc 'Build and test all packages'
- task :run_ci_all do
- run_ci(@volume_container, @ci_image, :all)
- end
-
- desc 'Build and test a fixed number of packages (NUM_OF_PACKAGES=5)'
- task :run_ci_some do
+ desc 'Build test packages ( NUM_OF_PACKAGES={5,all,untested} )'
+ task :run_build do
run_ci(@volume_container, @ci_image, num_of_packages)
end
- desc 'Build and test all untested packages and their reverse dependencies'
- task :run_ci_untested do
- run_ci(@volume_container, @ci_image, :untested)
- end
-
- desc 'QA test all packages'
- task :run_repoman_all do
- run_repoman(@ci_image, :all)
- end
-
- desc 'QA test a fixed number of packages (NUM_OF_PACKAGES=5)'
- task :run_repoman_some do
+ desc 'QA test packages ( NUM_OF_PACKAGES={5,all} )'
+ task :run_repoman do
run_repoman(@ci_image, num_of_packages)
end
end
diff --git a/web/app.rb b/web/app.rb
index 3164863..661d0dd 100644
--- a/web/app.rb
+++ b/web/app.rb
@@ -22,49 +22,83 @@ class RubyTinderbox < Sinatra::Base
get '/ruby_targets' do
update_timestamp = Package.first[:update_timestamp]
portage_timestamp = Package.first[:portage_timestamp]
- packages = Package.order { [category, lower(name), version, revision] }.to_hash_groups(:identifier)
- erb :ruby_targets, locals: { packages: packages, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
+ packages = Package.distinct(:sha1, :identifier).order(:identifier)
+ erb :'package/ruby_targets', locals: { packages: packages, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
end
get '/outdated_gems' do
update_timestamp = Package.first[:update_timestamp]
portage_timestamp = Package.first[:portage_timestamp]
packages = Package.distinct(:category, :name).order(:category, :name, Sequel.desc(:version), Sequel.desc(:revision)).exclude(gem_version: 'nil')
- erb :outdated_gems, locals: { packages: packages, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
+ erb :'package/outdated_gems', locals: { packages: packages, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
end
get '/build_status' do
- update_timestamp = Build.order(:time).last[:time]
+ update_timestamp = Build.order(:timestamp).last[:timestamp]
portage_timestamp = Package.first[:portage_timestamp]
- builds = Build.distinct(:package_id).order(:package_id, Sequel.desc(:time))
- erb :build_status, locals: { builds: builds, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
+ builds = []
+ Package.each do |package|
+ builds << package.build_dataset.where(target: 'current').reverse_order(:timestamp).first
+ end
+ builds = builds.compact.sort_by { |build| build.package[:identifier] }
+ erb :'build/build_status', locals: { builds: builds, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
end
- get '/build_history/:category/:package' do
- builds = Build.where(package_id: params[:category] + '/' + params[:package]).reverse_order(:time)
- erb :build_history, locals: { builds: builds }
+ get '/build_logs/:sha1/:timestamp' do
+ package = Package.where(sha1: params[:sha1]).first
+ build = package.build_dataset.where(timestamp: params[:timestamp]).first
+ erb :'build/build_logs', locals: { package: package, build: build }
end
- get '/build_logs/:category/:package/:time' do
- build = Build.where(package_id: params[:category] + '/' + params[:package], time: params[:time]).first
- erb :build_logs, locals: { build: build }
+ get '/build_history/:sha1' do
+ package = Package.where(sha1: params[:sha1]).first
+ builds = package.build_dataset.where(target: 'current').reverse_order(:timestamp)
+ erb :'build/build_history', locals: { builds: builds }
end
get '/repoman_checks' do
- update_timestamp = Repoman.order(:time).last[:time]
+ update_timestamp = Build.order(:timestamp).last[:timestamp]
portage_timestamp = Package.first[:portage_timestamp]
- repomans = Repoman.distinct(:package_id).order(:package_id, Sequel.desc(:time))
- erb :repoman_checks, locals: { repomans: repomans, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
+ repomans = []
+ Package.each do |package|
+ repomans << package.repoman_dataset.where(target: 'current').reverse_order(:timestamp).first
+ end
+ repomans = repomans.compact.sort_by { |repoman| repoman.package[:identifier] }
+ erb :'repoman/repoman_checks', locals: { repomans: repomans, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
end
- get '/repoman_logs/:category/:package/:time' do
- repomans = Repoman.where(package_id: params[:category] + '/' + params[:package], time: params[:time]).first
- erb :repoman_logs, locals: { repomans: repomans }
+ get '/repoman_logs/:sha1/:timestamp' do
+ package = Package.where(sha1: params[:sha1]).first
+ repoman = package.repoman_dataset.where(timestamp: params[:timestamp]).first
+ erb :'repoman/repoman_logs', locals: { package: package, repoman: repoman }
end
- get '/repoman_history/:category/:package' do
- repomans = Repoman.where(package_id: params[:category] + '/' + params[:package]).reverse_order(:time)
- erb :repoman_history, locals: { repomans: repomans }
+ get '/repoman_history/:sha1' do
+ package = Package.where(sha1: params[:sha1]).first
+ repomans = package.repoman_dataset.where(target: 'current').reverse_order(:timestamp)
+ erb :'repoman/repoman_history', locals: { repomans: repomans }
+ end
+
+ get '/new_targets' do
+ update_timestamp = Package.first[:update_timestamp]
+ portage_timestamp = Package.first[:portage_timestamp]
+ packages = []
+ Package.each do |package|
+ build_current = package.build_dataset.where(target: 'current').reverse_order(:timestamp).first
+ next if build_current.nil?
+
+ repoman_current = package.repoman_dataset.where(target: 'current').reverse_order(:timestamp).first
+ next if repoman_current.nil?
+
+ repoman_next = package.repoman_dataset.where(target: 'next').reverse_order(:timestamp).first
+ next if repoman_next.nil?
+
+ if repoman_current[:result] == 'passed' and repoman_next[:result] == 'passed'
+ packages << [package, build_current, nil, repoman_current, repoman_next]
+ end
+ end
+ packages = packages.compact.sort_by { |package| package[0][:identifier] }
+ erb :'bumps/new_targets', locals: { packages: packages, update_timestamp: update_timestamp, portage_timestamp: portage_timestamp }
end
get '/visualizations' do
@@ -89,11 +123,11 @@ class RubyTinderbox < Sinatra::Base
Package.distinct(:category, :name).reverse_order(:category, :name, :version).exclude(gem_version: 'nil').each { |p| outdated << p if p[:version] < p[:gem_version] }
# Build Status
- succeeded = Build.distinct(:package_id).order(:package_id, Sequel.desc(:time)).where(result: 'succeeded').count
- failed = Build.distinct(:package_id).order(:package_id, Sequel.desc(:time)).where(result: 'failed').count
- timed_out = Build.distinct(:package_id).order(:package_id, Sequel.desc(:time)).where(result: 'timed out').count
+ succeeded = Build.distinct(:package_id).order(:package_id, Sequel.desc(:timestamp)).where(result: "succeeded\n").count
+ failed = Build.distinct(:package_id).order(:package_id, Sequel.desc(:timestamp)).where(result: "failed\n").count
+ timed_out = Build.distinct(:package_id).order(:package_id, Sequel.desc(:timestamp)).where(result: "timed out\n").count
- erb :visualizations, locals: {
+ erb :'overview/visualizations', locals: {
portage_timestamp: portage_timestamp,
update_timestamp: update_timestamp,
ruby_1_9_amd64: ruby_1_9_amd64,
diff --git a/web/db/migrations/018_new_targets.rb b/web/db/migrations/018_new_targets.rb
new file mode 100644
index 0000000..b04ccac
--- /dev/null
+++ b/web/db/migrations/018_new_targets.rb
@@ -0,0 +1,22 @@
+Sequel.migration do
+ change do
+ add_column :packages, :sha1, String
+ add_column :builds, :target, String
+ add_column :repomans, :target, String
+ rename_column :builds, :time, :timestamp
+ rename_column :repomans, :time, :timestamp
+ rename_column :repomans, :current_result, :result
+ rename_column :repomans, :current_log, :log
+ drop_column :repomans, :next_result
+ drop_column :repomans, :next_log
+ drop_column :builds, :package_id
+ drop_column :repomans, :package_id
+ alter_table(:builds) do
+ add_foreign_key :package_id, :packages
+ end
+ alter_table(:repomans) do
+ add_foreign_key :package_id, :packages
+ end
+ end
+
+end
diff --git a/web/lib/ci.rb b/web/lib/ci.rb
index 3805b90..13e7ac0 100644
--- a/web/lib/ci.rb
+++ b/web/lib/ci.rb
@@ -1,22 +1,22 @@
def run_ci(volume_container, ci_image, num_of_packages)
packages = []
- Package.order { [category, lower(name), version] }.each do |package|
+ Package.each do |package|
packages << package[:identifier]
end
- if num_of_packages == :all
+ if num_of_packages == 'all'
packages = packages
- elsif num_of_packages == :untested
+ elsif num_of_packages == 'untested'
packages = []
- Package.exclude(tested: true).order { [category, lower(name), version] }.each do |package|
+ Package.each do |package|
+ next if package.build.count > 0
+ next if "#{package[:category]}/#{package[:name]}" == 'virtual/rubygems'
+ next if "#{package[:category]}/#{package[:name]}" == 'dev-ruby/rake'
+ next if "#{package[:category]}/#{package[:name]}" == 'dev-ruby/rspec'
+ next if "#{package[:category]}/#{package[:name]}" == 'dev-ruby/rspec-core'
+ next if "#{package[:category]}/#{package[:name]}" == 'dev-ruby/rdoc'
+
packages << package[:identifier]
- next if [
- 'virtual/rubygems',
- 'dev-ruby/rake',
- 'dev-ruby/rspec',
- 'dev-ruby/rspec-core',
- 'dev-ruby/rdoc'
- ].include?("#{package[:category]}/#{package[:name]}")
Package.where(Sequel.like(
:dependencies,
"#{package[:category]}/#{package[:name]} %",
@@ -26,8 +26,11 @@ def run_ci(volume_container, ci_image, num_of_packages)
packages << rdep[:identifier]
end
end
- else
+ elsif num_of_packages.is_a?(Integer)
packages = packages.sample(num_of_packages)
+ else
+ puts 'ERROR: Invalid value for NUM_OF_PACKAGES'
+ exit
end
packages = packages.uniq
@@ -54,37 +57,37 @@ def run_ci(volume_container, ci_image, num_of_packages)
end
def update_ci
- Dir.glob('ci-logs/*/*/*') do |build|
- build_array = build.split('/')
- package_id = "#{build_array[1]}/#{build_array[2]}"
- time = build_array[3]
-
- if File.exist?("#{build}/succeeded")
- result = 'succeeded'
- elsif File.exist?("#{build}/failed")
- result = 'failed'
- elsif File.exist?("#{build}/timedout")
- result = 'timed out'
- end
+ Dir.glob('ci-logs/*/*/builds/*') do |build|
+ begin
+ build_array = build.split('/')
+ sha1 = build_array[1]
+ timestamp = build_array[4]
+ target = build_array[2].sub('_target', '')
- emerge_info = File.read("#{build}/emerge-info") if File.exist?("#{build}/emerge-info")
- emerge_pqv = File.read("#{build}/emerge-pqv") if File.exist?("#{build}/emerge-pqv")
- build_log = File.read("#{build}/build.log") if File.exist?("#{build}/build.log")
- gem_list = File.read("#{build}/gem-list") if File.exist?("#{build}/gem-list")
+ result = File.read("#{build}/result")
+ emerge_info = File.read("#{build}/emerge-info") if File.exist?("#{build}/emerge-info")
+ emerge_pqv = File.read("#{build}/emerge-pqv") if File.exist?("#{build}/emerge-pqv")
+ build_log = File.read("#{build}/build.log") if File.exist?("#{build}/build.log")
+ gem_list = File.read("#{build}/gem-list") if File.exist?("#{build}/gem-list")
- Build.find_or_create(
- package_id: package_id,
- time: time,
- result: result,
- emerge_info: emerge_info,
- emerge_pqv: emerge_pqv,
- build_log: build_log,
- gem_list: gem_list
- )
- end
-
- Build.each do |build|
- Package.where(identifier: build[:package_id]).update(tested: true)
+ package = Package.where(sha1: sha1).first
+ unless package.nil?
+ package.add_build(
+ Build.find_or_create(
+ timestamp: timestamp,
+ target: target,
+ result: result,
+ emerge_info: emerge_info,
+ emerge_pqv: emerge_pqv,
+ build_log: build_log,
+ gem_list: gem_list
+ )
+ )
+ end
+ rescue => e
+ puts "ERROR: #{e}"
+ next
+ end
end
end
diff --git a/web/lib/models.rb b/web/lib/models.rb
index 667e54f..68e0127 100644
--- a/web/lib/models.rb
+++ b/web/lib/models.rb
@@ -1,10 +1,14 @@
DB = Sequel.connect(ENV['DATABASE_URL'], max_connections: 12, pool_timeout: 60)
class Package < Sequel::Model
+ one_to_many :build
+ one_to_many :repoman
end
class Build < Sequel::Model
+ many_to_one :package
end
class Repoman < Sequel::Model(:repomans)
+ many_to_one :package
end
diff --git a/web/lib/packages.rb b/web/lib/packages.rb
index e703b26..eb62883 100644
--- a/web/lib/packages.rb
+++ b/web/lib/packages.rb
@@ -5,21 +5,22 @@ def update_packages
identifier = category + '/' + name + '-' + version + (revision == 'r0' ? '' : "-#{revision}")
gem_version = Gems.info(name)['version']
gem_version = 'nil' if gem_version.nil?
- # ebuild = "/usr/portage/#{category}/#{name}/#{identifier.split('/')[1]}.ebuild"
- # ebuild_hash = Digest::MD5.hexdigest(File.read(ebuild))
+ ebuild = "/usr/portage/#{category}/#{name}/#{identifier.split('/')[1]}.ebuild"
+ sha1 = Digest::SHA1.hexdigest(File.read(ebuild))
Package.find_or_create(
+ sha1: sha1,
category: category,
name: name,
version: version,
revision: revision,
slot: slot,
- amd64_keyword: amd64_keyword,
identifier: identifier,
- gem_version: gem_version,
+ amd64_keyword: amd64_keyword,
r19_target: r19_target,
r20_target: r20_target,
r21_target: r21_target,
- r22_target: r22_target
+ r22_target: r22_target,
+ gem_version: gem_version
)
end
@@ -27,6 +28,8 @@ def update_packages
if packages_txt.include?("#{package[:category]} #{package[:name]} #{package[:version]} #{package[:revision]} #{package[:slot]} #{package[:amd64_keyword]} #{package[:r19_target]} #{package[:r20_target]} #{package[:r21_target]} #{package[:r22_target]}")
package.update(dependencies: `python3 lib/deps.py #{package[:identifier]}`)
else
+ package.build.map(&:delete)
+ package.repoman.map(&:delete)
package.delete
end
end
diff --git a/web/lib/repoman.rb b/web/lib/repoman.rb
index 1185d2a..1a44177 100644
--- a/web/lib/repoman.rb
+++ b/web/lib/repoman.rb
@@ -1,6 +1,6 @@
def run_repoman(ci_image, num_of_packages)
packages = []
- Package.order { [category, lower(name), version] }.each do |package|
+ Package.each do |package|
target = ''
target = package[:r19_target] unless package[:r19_target] == 'nil'
target = package[:r20_target] unless package[:r20_target] == 'nil'
@@ -14,24 +14,26 @@ def run_repoman(ci_image, num_of_packages)
next_target = 'ruby22' if target == 'ruby21'
next if next_target.empty?
- category = package[:category]
- name = package[:name]
- version = package[:version]
- revision = package[:revision] == 'r0' ? '' : "-#{package[:revision]}"
-
- packages << "#{category} #{name} #{version}#{revision} #{target} #{next_target}"
+ packages << "#{package[:identifier]} #{target} #{next_target}"
end
- if num_of_packages == :all
+ if num_of_packages == 'all'
packages = packages
- else
+ elsif num_of_packages.is_a?(Integer)
packages = packages.sample(num_of_packages)
+ else
+ puts 'ERROR: Invalid value for NUM_OF_PACKAGES'
+ exit
end
packages = packages.uniq
packages.peach(8) do |package|
+ package = package.split(' ')
+ identifier = package[0]
+ current_target = package[1]
+ next_target = package[2]
ci_container = Docker::Container.create(
- Cmd: %W[/ruby-tinderbox/repoman.sh #{package}],
+ Cmd: %W[/ruby-tinderbox/repoman.sh #{identifier} #{current_target} #{next_target}],
Image: ci_image.id
)
ci_container.start
@@ -39,7 +41,7 @@ def run_repoman(ci_image, num_of_packages)
tar = Tempfile.new('tar')
File.open(tar, 'w') do |file|
- ci_container.copy('/ruby-tinderbox/repo-logs') do |chunk|
+ ci_container.copy('/ruby-tinderbox/ci-logs') do |chunk|
file.write(chunk)
end
end
@@ -52,59 +54,34 @@ def run_repoman(ci_image, num_of_packages)
end
def update_repoman
- Dir.glob('repo-logs/*/*/*') do |repoman|
- repoman_array = repoman.split('/')
- package_id = "#{repoman_array[1]}/#{repoman_array[2]}"
- time = repoman_array[3]
+ Dir.glob('ci-logs/*/*/repomans/*') do |repoman|
+ begin
+ repoman_array = repoman.split('/')
+ sha1 = repoman_array[1]
+ timestamp = repoman_array[4]
+ target = repoman_array[2].sub('_target', '')
- current_log = File.read("#{repoman}/current.txt") if File.exist?("#{repoman}/current.txt")
- next_log = File.read("#{repoman}/next.txt") if File.exist?("#{repoman}/next.txt")
+ log = File.read("#{repoman}/repoman_log")
- current_result = 'unknown'
- if current_log.include?('If everyone were like you, I\'d be out of business!')
- current_result = 'passed'
- elsif current_log.include?('You\'re only giving me a partial QA payment?')
- current_result = 'partial'
- elsif current_log.include?('Make your QA payment on time and you\'ll never see the likes of me.')
- current_result = 'failed'
- end
-
- next_result = 'unknown'
- if next_log.include?('If everyone were like you, I\'d be out of business!')
- next_result = 'passed'
- elsif next_log.include?('You\'re only giving me a partial QA payment?')
- next_result = 'partial'
- elsif next_log.include?('Make your QA payment on time and you\'ll never see the likes of me.')
- next_result = 'failed'
- end
-
- Repoman.find_or_create(
- package_id: package_id,
- time: time,
- current_result: current_result,
- current_log: current_log,
- next_result: next_result,
- next_log: next_log
- )
- end
-
- Package.order { [category, lower(name), version] }.each do |package|
- target = ''
- target = package[:r19_target] unless package[:r19_target] == 'nil'
- target = package[:r20_target] unless package[:r20_target] == 'nil'
- target = package[:r21_target] unless package[:r21_target] == 'nil'
- target = package[:r22_target] unless package[:r22_target] == 'nil'
- if target.empty?
- Repoman.where(package_id: package[:identifier]).delete
- next
- end
+ result = 'unknown'
+ if log.include?('If everyone were like you, I\'d be out of business!')
+ result = 'passed'
+ elsif log.include?('You\'re only giving me a partial QA payment?')
+ result = 'partial'
+ elsif log.include?('Make your QA payment on time and you\'ll never see the likes of me.')
+ result = 'failed'
+ end
- next_target = ''
- next_target = 'ruby20' if target == 'ruby19'
- next_target = 'ruby21' if target == 'ruby20'
- next_target = 'ruby22' if target == 'ruby21'
- if next_target.empty?
- Repoman.where(package_id: package[:identifier]).delete
+ Package.where(sha1: sha1).first.add_repoman(
+ Repoman.find_or_create(
+ timestamp: timestamp,
+ target: target,
+ result: result,
+ log: log
+ )
+ )
+ rescue => e
+ puts "ERROR: #{e}"
next
end
end
diff --git a/web/repo-logs/.gitignore b/web/repo-logs/.gitignore
deleted file mode 100644
index d6b7ef3..0000000
--- a/web/repo-logs/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/web/views/build/build_history.erb b/web/views/build/build_history.erb
new file mode 100644
index 0000000..f6af24a
--- /dev/null
+++ b/web/views/build/build_history.erb
@@ -0,0 +1,20 @@
+<h1 class="text-center"><%=builds.first.package[:identifier]%></h1>
+
+<table id="sortable" class="table table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th class="width-50">Build Date</th>
+ <th class="width-50">Build Result</th>
+ </tr>
+ </thead>
+ <%builds.each do |build|%>
+ <tr>
+ <td class="width-50">
+ <%=Time.at(build[:timestamp].to_i).strftime('%Y-%m-%d')%>
+ </td>
+ <td class="width-50 <%=build[:result]%>">
+ <a href="/build_logs/<%=build.package[:sha1]%>/<%=build[:timestamp]%>"><%=build[:result].camelcase%></a>
+ </td>
+ </tr>
+ <%end%>
+</table>
diff --git a/web/views/build_logs.erb b/web/views/build/build_logs.erb
index 547b205..fb5bf3d 100644
--- a/web/views/build_logs.erb
+++ b/web/views/build/build_logs.erb
@@ -1,6 +1,6 @@
<div class="text-center">
- <h1><%=build[:package_id]%></h1>
- <h3><%=Time.at(build[:time].to_i).strftime('%Y-%m-%d')%></h3>
+ <h1><%=package[:identifier]%></h1>
+ <h3><%=Time.at(build[:timestamp].to_i).strftime('%Y-%m-%d')%></h3>
<div class="btn-group btn-group-justified">
<a class="btn btn-default <%="disabled" if build[:emerge_info].nil?%>" href="#emerge_info">Emerge Info</a>
<a class="btn btn-default <%="disabled" if build[:emerge_pqv].nil?%>" href="#emerge_pqv">Emerge PQV</a>
diff --git a/web/views/build_status.erb b/web/views/build/build_status.erb
index 13d7434..04ab1d8 100644
--- a/web/views/build_status.erb
+++ b/web/views/build/build_status.erb
@@ -23,26 +23,22 @@
</tr>
</thead>
<%builds.each do |build|%>
- <%package = Package.where(identifier: build[:package_id]).first%>
- <%next if package.nil?%>
- <%result = 'success' if build[:result] == 'succeeded'%>
- <%result = 'info' if build[:result] == 'timed out'%>
- <%result = 'danger' if build[:result] == 'failed'%>
+ <%next if build.nil?%>
<tr>
<td class="width-52">
- <%=build[:package_id]%>
+ <%=build.package[:identifier]%>
</td>
<td class="width-14">
- <%=Time.at(build[:time].to_i).strftime('%Y-%m-%d')%>
+ <%=Time.at(build[:timestamp].to_i).strftime('%Y-%m-%d')%>
</td>
- <td class="width-17 <%=result%>">
- <a href="/build_logs/<%=build[:package_id]%>/<%=build[:time]%>"><%=build[:result].camelcase%></a>
+ <td class="width-17 <%=build[:result]%>">
+ <a href="/build_logs/<%=build.package[:sha1]%>/<%=build[:timestamp]%>"><%=build[:result].camelcase%></a>
</td>
<td class="width-17">
- <a href="/build_history/<%=build[:package_id]%>"><%=Build.where(package_id: build[:package_id]).count%> Build(s)</a>
+ <a href="/build_history/<%=build.package[:sha1]%>"><%=build.package.build_dataset.where(target: 'current').count%> Build(s)</a>
</td>
<td style="display:none;">
- +<%=package[:amd64_keyword]%>
+ +<%=build.package[:amd64_keyword]%>
</td>
</tr>
<%end%>
diff --git a/web/views/build_history.erb b/web/views/build_history.erb
deleted file mode 100644
index fde2445..0000000
--- a/web/views/build_history.erb
+++ /dev/null
@@ -1,24 +0,0 @@
-<h1 class="text-center"><%=builds.first[:package_id]%></h1>
-
-<table id="sortable" class="table table-bordered table-condensed">
- <thead>
- <tr>
- <th class="width-50">Build Date</th>
- <th class="width-50">Build Result</th>
- </tr>
- </thead>
- <%builds.each do |build|%>
- <%next if build.nil?%>
- <%result = 'success' if build[:result] == 'succeeded'%>
- <%result = 'info' if build[:result] == 'timed out'%>
- <%result = 'danger' if build[:result] == 'failed'%>
- <tr>
- <td class="width-50">
- <%=Time.at(build[:time].to_i).strftime('%Y-%m-%d')%>
- </td>
- <td class="width-50 <%=result%>">
- <a href="/build_logs/<%=build[:package_id]%>/<%=build[:time]%>"><%=build[:result].camelcase%></a>
- </td>
- </tr>
- <%end%>
-</table>
diff --git a/web/views/bumps/new_targets.erb b/web/views/bumps/new_targets.erb
new file mode 100644
index 0000000..4ecc565
--- /dev/null
+++ b/web/views/bumps/new_targets.erb
@@ -0,0 +1,48 @@
+<div id="ruby_targets">
+ <h1>New Targets</h1>
+ <small>
+ Last updated on
+ <%=Time.at(update_timestamp.to_i).strftime('%Y-%m-%d')%>
+ using a portage snapshot dated
+ <%=Time.at(portage_timestamp.to_i).strftime('%Y-%m-%d')%>
+ </small>
+</div>
+
+<form class="pull-right">
+ <input type="checkbox" onclick="$('td:contains(\'+amd64\')').parent().toggle();" checked> amd64
+ <input type="checkbox" onclick="$('td:contains(\'+~amd64\')').parent().toggle();" checked> ~amd64
+</form>
+
+<table id="sortable" class="table table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th class="width-52">Package</th>
+ <th class="width-12">CI Current</th>
+ <th class="width-12">CI Next</th>
+ <th class="width-12">QA Current</th>
+ <th class="width-12">QA Next</th>
+ </tr>
+ </thead>
+ <%packages.each do |package|%>
+ <tr>
+ <td class="width-52">
+ <%=package[0][:identifier]%>
+ </td>
+ <td class="width-12 <%=package[1][:result]%>">
+ <%=package[1][:result].camelcase%>
+ </td>
+ <td class="width-12">
+ ToDo
+ </td>
+ <td class="width-12 <%=package[3][:result]%>">
+ <%=package[3][:result].camelcase%>
+ </td>
+ <td class="width-12 <%=package[4][:result]%>">
+ <%=package[4][:result].camelcase%>
+ </td>
+ <td style="display:none;">
+ +<%=package[0][:amd64_keyword]%>
+ </td>
+ </tr>
+ <%end%>
+</table>
diff --git a/web/views/layout.erb b/web/views/layout.erb
index f424ee4..9d564b3 100644
--- a/web/views/layout.erb
+++ b/web/views/layout.erb
@@ -11,7 +11,7 @@
<script src="https://1b9a50f4f9de4348cd9f-e703bc50ba0aa66772a874f8c7698be7.ssl.cf5.rackcdn.com/jquery.min.js"></script>
<script src="https://1b9a50f4f9de4348cd9f-e703bc50ba0aa66772a874f8c7698be7.ssl.cf5.rackcdn.com/bootstrap.min.js"></script>
<script src="https://1b9a50f4f9de4348cd9f-e703bc50ba0aa66772a874f8c7698be7.ssl.cf5.rackcdn.com/retina.min.js"></script>
-<script src='/js/tablesort.min.js'></script>
+<script src="/js/tablesort.min.js"></script>
<link rel="icon" href="http://www.gentoo.org/favicon.ico" type="image/x-icon">
</head>
<body>
@@ -34,7 +34,7 @@
<li><a href="http://packages.gentoo.org/" title="Find software for your Gentoo"><span class="fa fa-hdd-o fa-fw"></span> Packages</a></li>
<li class="divider"></li>
<li><a href="http://overlays.gentoo.org/" title="Collaborate on maintaining packages"><span class="fa fa-code-fork fa-fw"></span> Overlays</a></li>
- <li><a href="http://planet.gentoo.org/" title="Find out what's going on in the developer community"><span class="fa fa-rss fa-fw"></span> Planet</a></li>
+ <li><a href="http://planet.gentoo.org/" title="Find out what"s going on in the developer community"><span class="fa fa-rss fa-fw"></span> Planet</a></li>
<li><a href="http://archives.gentoo.org/" title="Read up on past discussions"><span class="fa fa-archive fa-fw"></span> Archives</a></li>
<li><a href="http://sources.gentoo.org/" title="Browse our source code"><span class="fa fa-code fa-fw"></span> Sources</a></li>
<li class="divider"></li>
@@ -66,7 +66,13 @@
<li><a href="/ruby_targets">Ruby Targets</a></li>
<li><a href="/outdated_gems">Outdated Gems</a></li>
<li><a href="/build_status">Build Status (CI)</a></li>
- <li><a href="/repoman_checks">Repoman Checks</a></li>
+ <li><a href="/repoman_checks">Repoman Checks (QA)</a></li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Package Bumps <span class="caret"></span></a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="new_targets">New Targets</a></li>
+ </ul>
+ </li>
<li><a href="/visualizations">Visualizations</a></li>
</ul>
</div>
@@ -99,7 +105,17 @@
</div>
</footer>
<script>
-new Tablesort(document.getElementById("sortable"));
+$(document).ready(function() {
+ new Tablesort(document.getElementById("sortable"), {
+ descending: true
+ });
+});
+$(".succeeded").addClass("success");
+$(".passed").addClass("success");
+$(".timed").addClass("info");
+$(".partial").addClass("info");
+$(".unknown").addClass("warning");
+$(".failed").addClass("danger");
</script>
</body>
</html>
diff --git a/web/views/visualizations.erb b/web/views/overview/visualizations.erb
index 9b22e6e..9b22e6e 100644
--- a/web/views/visualizations.erb
+++ b/web/views/overview/visualizations.erb
diff --git a/web/views/outdated_gems.erb b/web/views/package/outdated_gems.erb
index fc298a9..fc298a9 100644
--- a/web/views/outdated_gems.erb
+++ b/web/views/package/outdated_gems.erb
diff --git a/web/views/ruby_targets.erb b/web/views/package/ruby_targets.erb
index 5db7a13..fcd54fc 100644
--- a/web/views/ruby_targets.erb
+++ b/web/views/package/ruby_targets.erb
@@ -24,7 +24,6 @@
</tr>
</thead>
<%packages.each do |package|%>
- <%package = package[1][0]%>
<tr>
<td class="width-52">
<%=package[:identifier]%>
diff --git a/web/views/repoman_checks.erb b/web/views/repoman/repoman_checks.erb
index 01de59d..a8ffc34 100644
--- a/web/views/repoman_checks.erb
+++ b/web/views/repoman/repoman_checks.erb
@@ -23,27 +23,22 @@
</tr>
</thead>
<%repomans.each do |repoman|%>
- <%package = Package.where(identifier: repoman[:package_id]).first%>
- <%next if package.nil?%>
- <%result = 'info'%>
- <%result = 'success' if repoman[:next_result] == 'passed'%>
- <%result = 'danger' if repoman[:current_result] == 'failed'%>
- <%result = 'danger' if repoman[:current_result] == 'partial'%>
+ <%next if repoman.nil?%>
<tr>
<td class="width-52">
- <%=repoman[:package_id]%>
+ <%=repoman.package[:identifier]%>
</td>
<td class="width-14">
- <%=Time.at(repoman[:time].to_i).strftime('%Y-%m-%d')%>
+ <%=Time.at(repoman[:timestamp].to_i).strftime('%Y-%m-%d')%>
</td>
- <td class="width-17 <%=result%>">
- <a href="/repoman_logs/<%=repoman[:package_id]%>/<%=repoman[:time]%>"><%=repoman[:current_result].camelcase%> / <%=repoman[:next_result].camelcase%></a>
+ <td class="width-17 <%=repoman[:result]%>">
+ <a href="/repoman_logs/<%=repoman.package[:sha1]%>/<%=repoman[:timestamp]%>"><%=repoman[:result].camelcase%></a>
</td>
<td class="width-17">
- <a href="/repoman_history/<%=repoman[:package_id]%>"><%=Repoman.where(package_id: repoman[:package_id]).count%> Check(s)</a>
+ <a href="/repoman_history/<%=repoman.package[:sha1]%>"><%=repoman.package.repoman_dataset.where(target: 'current').count%> Checks(s)</a>
</td>
<td style="display:none;">
- +<%=package[:amd64_keyword]%>
+ +<%=repoman.package[:amd64_keyword]%>
</td>
</tr>
<%end%>
diff --git a/web/views/repoman/repoman_history.erb b/web/views/repoman/repoman_history.erb
new file mode 100644
index 0000000..bc26cd8
--- /dev/null
+++ b/web/views/repoman/repoman_history.erb
@@ -0,0 +1,20 @@
+<h1 class="text-center"><%=repomans.first.package[:identifier]%></h1>
+
+<table id="sortable" class="table table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th class="width-50">Check Date</th>
+ <th class="width-5o">Check Result</th>
+ </tr>
+ </thead>
+ <%repomans.each do |repoman|%>
+ <tr>
+ <td class="width-50">
+ <%=Time.at(repoman[:timestamp].to_i).strftime('%Y-%m-%d')%>
+ </td>
+ <td class="width-50 <%=repoman[:result]%>">
+ <a href="/repoman_logs/<%=repoman.package[:sha1]%>/<%=repoman[:timestamp]%>"><%=repoman[:result].camelcase%></a>
+ </td>
+ </tr>
+ <%end%>
+</table>
diff --git a/web/views/repoman/repoman_logs.erb b/web/views/repoman/repoman_logs.erb
new file mode 100644
index 0000000..52faecc
--- /dev/null
+++ b/web/views/repoman/repoman_logs.erb
@@ -0,0 +1,16 @@
+<div class="text-center">
+ <h1><%=package[:identifier]%></h1>
+ <h3><%=Time.at(repoman[:timestamp].to_i).strftime('%Y-%m-%d')%></h3>
+</div>
+<br>
+
+<%unless repoman[:log].nil?%>
+<div class="panel panel-default">
+ <div class="panel-heading">
+ <h4><a name="current_log">Repoman Full</a></h4>
+ </div>
+ <div class="panel-body">
+ <pre><%=repoman[:log]%></pre>
+ </div>
+</div>
+<%end%>
diff --git a/web/views/repoman_history.erb b/web/views/repoman_history.erb
deleted file mode 100644
index 50c8a65..0000000
--- a/web/views/repoman_history.erb
+++ /dev/null
@@ -1,25 +0,0 @@
-<h1 class="text-center"><%=repomans.first[:package_id]%></h1>
-
-<table id="sortable" class="table table-bordered table-condensed">
- <thead>
- <tr>
- <th class="width-50">Check Date</th>
- <th class="width-5o">Check Result</th>
- </tr>
- </thead>
- <%repomans.each do |repoman|%>
- <%next if repoman.nil?%>
- <%result = 'info'%>
- <%result = 'success' if repoman[:next_result] == 'passed'%>
- <%result = 'danger' if repoman[:current_result] == 'failed'%>
- <%result = 'danger' if repoman[:current_result] == 'partial'%>
- <tr>
- <td class="width-50">
- <%=Time.at(repoman[:time].to_i).strftime('%Y-%m-%d')%>
- </td>
- <td class="width-50 <%=result%>">
- <a href="/repoman_logs/<%=repoman[:package_id]%>/<%=repoman[:time]%>"><%=repoman[:current_result].camelcase%> / <%=repoman[:next_result].camelcase%></a>
- </td>
- </tr>
- <%end%>
-</table>
diff --git a/web/views/repoman_logs.erb b/web/views/repoman_logs.erb
deleted file mode 100644
index 544db7a..0000000
--- a/web/views/repoman_logs.erb
+++ /dev/null
@@ -1,31 +0,0 @@
-<div class="text-center">
- <h1><%=repomans[:package_id]%></h1>
- <h3><%=Time.at(repomans[:time].to_i).strftime('%Y-%m-%d')%></h3>
- <div class="btn-group btn-group-justified">
- <a class="btn btn-default <%="disabled" if repomans[:current_log].nil?%>" href="#current_log">Current Ruby Target(s)</a>
- <a class="btn btn-default <%="disabled" if repomans[:next_log].nil?%>" href="#next_log">Next Ruby Target</a>
- </div>
-</div>
-<br>
-
-<%unless repomans[:current_log].nil?%>
-<div class="panel panel-default">
- <div class="panel-heading">
- <h4><a name="current_log">Current Ruby Target(s)</a></h4>
- </div>
- <div class="panel-body">
- <pre><%=repomans[:current_log]%></pre>
- </div>
-</div>
-<%end%>
-
-<%unless repomans[:next_log].nil?%>
-<div class="panel panel-default">
- <div class="panel-heading">
- <h4><a name="next_log">Next Ruby Target</a></h4>
- </div>
- <div class="panel-body">
- <pre><%=repomans[:next_log]%></pre>
- </div>
-</div>
-<%end%>