Skip to content

Instantly share code, notes, and snippets.

@dieb
Created September 14, 2016 14:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dieb/b7046e124ec1bde1121bad98490f0dd0 to your computer and use it in GitHub Desktop.
Save dieb/b7046e124ec1bde1121bad98490f0dd0 to your computer and use it in GitHub Desktop.
Script that lists all dependencies of a list of dpkg packages (recursively)
#!/usr/bin/env ruby
class DpkgDep
attr_reader :package_name
def initialize(package_name)
@package_name = package_name
end
def dependencies_recursive
deps = dependencies.map { |dep| dep.dependencies_recursive }
(deps + dependencies).flatten.compact
end
def dependencies
dependencies_raw.map { |package_name| DpkgDep.new(package_name) }
end
def size
`dpkg -s #{@package_name} | grep Installed`.split(' ').last.to_i
end
def to_s
"#{@package_name} #{size}"
end
private
def dependencies_raw
deps = `dpkg -s #{@package_name} | grep Depends`
deps = deps.gsub('Depends: ', '')
deps.scan(/([\d\w\-\.]+)\s+\(/).flatten
end
end
if $0 == __FILE__
dependencies = ARGV.collect do |package_name|
me = DpkgDep.new(package_name)
[me] + me.dependencies_recursive
end.flatten
# Ruby 1.8.7 does not have Array#uniq with block param
uniq = dependencies.inject(Array.new) do |uniq_deps, item|
uniq_deps << item unless uniq_deps.any? { |it| it.package_name == item.package_name }
uniq_deps
end
total = uniq.inject(0) do |sum, dependency|
puts dependency
sum += dependency.size
end
puts "Total: #{total}"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment