aboutsummaryrefslogtreecommitdiff
path: root/ruby/demos/latest_stable.rb
blob: 08d19d64ed98ae3dd4dba89c65a90fc7fa597238 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/env ruby
# vim: set sw=4 sts=4 et tw=80 :

require 'Paludis'
require 'getoptlong'

include Paludis

Log.instance.log_level = Paludis::LogLevel::Warning
Log.instance.program_name = $0

opts = GetoptLong.new(
    [ '--help',          '-h',  GetoptLong::NO_ARGUMENT ],
    [ '--version',       '-V',  GetoptLong::NO_ARGUMENT ],
    [ '--log-level',            GetoptLong::REQUIRED_ARGUMENT ],
    [ '--repository-dir','-r',  GetoptLong::REQUIRED_ARGUMENT ])

repository_dir = Dir.pwd

opts.each do | opt, arg |
    case opt
    when '--help'
        puts "Usage: " + $0 + " [options] keyword1 keyword2 ...."
        puts
        puts "Options:"
        puts "  --help                  Display a help message"
        puts "  --version               Display program version"
        puts
        puts "  --log-level level       Set log level (debug, qa, warning, silent)"
        puts "  --repository-dir dir    Repository directory to use (defaults to .)"
        exit 0

    when '--version'
        puts $0.to_s.split(/\//).last + " " + Paludis::Version
        exit 0

    when '--log-level'
        case arg
        when 'debug'
            Paludis::Log.instance.log_level = Paludis::LogLevel::Debug
        when 'qa'
            Paludis::Log.instance.log_level = Paludis::LogLevel::Qa
        when 'warning'
            Paludis::Log.instance.log_level = Paludis::LogLevel::Warning
        when 'silent'
            Paludis::Log.instance.log_level = Paludis::LogLevel::Silent
        else
            puts "Bad --log-level value " + arg
            exit 1
        end

    when '--repository-dir'
        repository_dir = arg

    end
end

if ARGV.empty?
    puts "No keywords supplied"
    exit 1
end
keywords = ARGV;

env = NoConfigEnvironment.new(repository_dir)

def check_one_package(env, search_keywords, repo, pkg)
    results = {}
    repo.version_specs(pkg).each do |ver|
        md = repo.version_metadata(pkg, ver)
        next if md.get_ebuild_interface.nil?
        keywords = md.keywords.split(/\s+/)
        search_keywords.each do |keyword|
            if keywords.include? keyword
                results[keyword] ||= {}
                results[keyword][md.slot] = ver
            end
        end
    end
    unless results.empty?
        seen_ver = []
        results.each_value do |slot|
            slot.each do |ver|
                unless seen_ver.include? ver
                    seen_ver << ver
                    puts "#{pkg}-#{ver}"
                end
            end
        end
    end
end

env.package_database.repositories.each do |repo|
    next if repo.name == 'virtuals'
    repo.category_names.each do |cat|
        repo.package_names(cat).each do |pkg|
            check_one_package(env, keywords, repo, pkg)
        end
    end
end