diff options
Diffstat (limited to 'web')
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 @@ -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%> |