Skip to content

Instantly share code, notes, and snippets.

@fujin
Forked from rottenbytes/graphdeps.rb
Created November 29, 2011 02:41
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save fujin/1403122 to your computer and use it in GitHub Desktop.
Graph your cookbooks deps
#!/usr/bin/env ruby
cbdir=ARGV[0]
output = "./deps.dot"
puts "Running on #{cbdir}..."
cb_meta = Dir.glob("#{cbdir}/*/metadata.rb")
fp=File.open(output,"w")
fp.write("digraph deps {\n")
cbs={}
cb_meta.each do |cb|
cb_name = cb.match(/#{cbdir}\/(.*)\/metadata.rb/)[1]
# puts "Looking for metadata from #{cb_name}"
infos = open(cb,"r")
infos.readlines.each do |line|
# get the version
if line =~ /^version/ then
version=line.match(/version.*"(.*)"/)[1]
puts "#{cb_name} : #{version}"
cbs[cb_name] = []
end
# get a dependency
if line =~ /^depends/ then
depend=line.match(/depends.*"(.*)", "(.*)"/)
# depends with no version constraints
if depend then
dep_name=depend[1]
dep_version=depend[2]
else
# we have the version
depend=line.match(/depends.*"(.*)".*/)
dep_name=depend[1]
dep_version=nil
end
puts " depends from #{dep_name} #{dep_version}"
cbs[cb_name].push dep_name
end
end
puts ""
end
cbs.each_pair do |cb_name, cb_deps|
if cb_deps.empty? then
fp.write(" #{cb_name};\n")
else
cb_deps.each do |dep|
fp.write(" #{cb_name} -> #{dep};\n")
end
end
end
fp.write("}\n")
fp.close
# you will need graphviz & imagemagick
%x[dot -Tps ./deps.dot -o ./deps.ps]
%x[convert ./deps.ps ./deps.png]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment