Class: AptControl::BuildArchive

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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.expand_path(dir)
  @logger = logger
  parse!
end

Instance Attribute Details

#dirObject (readonly)

Returns the value of attribute dir.



7
8
9
# File 'lib/apt_control/build_archive.rb', line 7

def dir
  @dir
end

#packagesObject (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.expand_path(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
59
# 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)
          nil
        end
      }.compact
      Package.new(name, versions)
    end
  end
end

#parse_changes_fname(fname) ⇒ Object



61
62
63
64
65
# File 'lib/apt_control/build_archive.rb', line 61

def parse_changes_fname(fname)
  name, version = fname.split('_')[0...2]
  raise "bad changes filename #{fname}" unless name and version
  [name, version]
end

#watch(fs_listener_factory, &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



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
# File 'lib/apt_control/build_archive.rb', line 70

def watch(fs_listener_factory, &block)
  @logger.info("Watching for new changes files in #{@dir}")
  fs_listener_factory.new(@dir, /\.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.start.join
end