class Autoproj::Ops::Stats

Computes per-package statistics

Attributes

sanitizer[R]

Public Class Methods

new(sanitizer: Autoproj::Stats::Sanitizer.new) click to toggle source
# File lib/autoproj/ops/stats.rb, line 9
def initialize(sanitizer: Autoproj::Stats::Sanitizer.new)
    @sanitizer = sanitizer
end

Public Instance Methods

compute_package_stats(pkg) click to toggle source
# File lib/autoproj/ops/stats.rb, line 36
def compute_package_stats(pkg)
    if pkg.importer
        if stats_generator = find_generator_for_importer(pkg.importer)
            stats_generator.(pkg)
        else
            Autoproj.warn "no stats generator for #{pkg.name} (#{pkg.importer.class})"
        end
    else
        Autoproj.warn "no importer for #{pkg.name}"
    end
end
find_generator_for_importer(importer) click to toggle source
# File lib/autoproj/ops/stats.rb, line 48
def find_generator_for_importer(importer)
    if importer.class == Autobuild::Git
        return Autoproj::Stats::Git.new(sanitizer: sanitizer)
    end
end
process(packages, parallel: 1) click to toggle source
# File lib/autoproj/ops/stats.rb, line 13
def process(packages, parallel: 1)
    executor = Concurrent::FixedThreadPool.new(parallel, max_length: 0)
    result = Hash.new

    futures = packages.map do |pkg|
        [pkg, Concurrent::Future.execute(executor: executor) { compute_package_stats(pkg) }]
    end
    futures.inject(Hash.new) do |h, (pkg, future)|
        if stats = future.value
            h[pkg] = stats
        elsif future.reason.kind_of?(Exception)
            raise future.reason
        else
            pkg.error "%s: failed, #{future.reason}"
        end
        h
    end

ensure
    executor.shutdown
    executor.wait_for_termination
end