Class: AptControl::BuildArchive
- Inherits:
-
Object
- Object
- AptControl::BuildArchive
- Defined in:
- lib/apt_control/build_archive.rb
Overview
represents a directory containing output from lots of dpkg builds
Defined Under Namespace
Classes: Package
Instance Attribute Summary collapse
-
#dir ⇒ Object
readonly
Returns the value of attribute dir.
-
#packages ⇒ Object
readonly
Returns the value of attribute packages.
Instance Method Summary collapse
-
#[](name) ⇒ Object
get a list of all versions for a particular package.
-
#changes_fname(package_name, version) ⇒ Object
return absolute path to a changes file for a particular package and version.
-
#initialize(dir, logger) ⇒ BuildArchive
constructor
A new instance of BuildArchive.
- #parse! ⇒ Object
- #parse_changes_fname(fname) ⇒ Object
-
#watch(&block) ⇒ Object
watch the build directory, adding new packages and versions to the in-memory list as it sees them.
Constructor Details
#initialize(dir, logger) ⇒ BuildArchive
Returns a new instance of BuildArchive.
9 10 11 12 13 |
# File 'lib/apt_control/build_archive.rb', line 9 def initialize(dir, logger) @dir = File.(dir) @logger = logger parse! end |
Instance Attribute Details
#dir ⇒ Object (readonly)
Returns the value of attribute dir.
7 8 9 |
# File 'lib/apt_control/build_archive.rb', line 7 def dir @dir end |
#packages ⇒ Object (readonly)
Returns the value of attribute packages.
6 7 8 |
# File 'lib/apt_control/build_archive.rb', line 6 def packages @packages end |
Instance Method Details
#[](name) ⇒ Object
get a list of all versions for a particular package
16 17 18 19 |
# File 'lib/apt_control/build_archive.rb', line 16 def [](name) package = packages.find {|p| p.name == name } package && package.versions end |
#changes_fname(package_name, version) ⇒ Object
return absolute path to a changes file for a particular package and version
22 23 24 25 26 27 28 29 30 |
# File 'lib/apt_control/build_archive.rb', line 22 def changes_fname(package_name, version) fname = Dir.chdir(@dir) do parsed_changes = Dir["#{package_name}_#{version}_*.changes"].find { |fname| parse_changes_fname(fname) } end fname && File.(File.join(@dir, fname)) end |
#parse! ⇒ Object
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 |
# File 'lib/apt_control/build_archive.rb', line 32 def parse! Dir.chdir(@dir) do parsed_changes = Dir['*.changes'].map { |fname| begin parse_changes_fname(fname) rescue => e @logger.error("Unable to parse changes filename: #{fname}") @logger.error(e) end }.compact package_names = parsed_changes.map(&:first).sort.uniq @packages = package_names.map do |name| versions = parsed_changes.select {|n, v | name == n }. map(&:last). map {|s| begin Version.parse(s) rescue => e @logger.error("Couldn't parse version string: #{s}") @logger.error(e) end }.compact Package.new(name, versions) end end end |
#parse_changes_fname(fname) ⇒ Object
60 61 62 63 64 |
# File 'lib/apt_control/build_archive.rb', line 60 def parse_changes_fname(fname) name, version = fname.split('_')[0...2] raise "bad changes filename #{fname}" unless name and version [name, version] end |
#watch(&block) ⇒ Object
watch the build directory, adding new packages and versions to the in-memory list as it sees them. Yields to the given block with the package and the new version
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 |
# File 'lib/apt_control/build_archive.rb', line 69 def watch(&block) @logger.info("Watching for new changes files in #{@dir}") Listen.to(@dir, :filter => /\.changes$/) do |modified, added, removed| added.each do |fname| begin fname = File.basename(fname) name, version_string = parse_changes_fname(fname) version = Version.parse(version_string) package = @packages.find {|p| p.name == name } if package.nil? @packages << package = Package.new(name, [version]) else package.add_version(version) end yield(package, version) rescue => e @logger.error("Could not parse changes filename #{fname}: #{e}") @logger.error(e) next end end end end |