# File lib/cft/rpm.rb, line 130
    def self.genshadow(shadow_file, before_file, after_file, root=nil)
        before = readstate(before_file)
        after = readstate(after_file)
        diff = diff(before, after)
        lst = diff[:installed].merge(diff[:updated]) { |k, o, n| (o + n).uniq }
        pkgs = []
        withdb(root) do |db|
            lst.each do |na, versions|
                comps = na.split(".")
                arch = comps.pop
                name = comps.join(".")
                iter = db.init_iterator(RPM::TAG_NAME, name) || []
                pkgs += iter.select do |pkg|
                    arch == pkg.arch && versions.include?(pkg.version)
                end
            end
        end
        sh = {}
        shadow(pkgs).each do |k,v|
            sh[PackageHandle.new(k)] = v.collect { |p| PackageHandle.new(p) }
        end
        File::open(shadow_file, "w") do |out|
            # We have to dump as arrays, otherwise YAML chokes
            YAML.dump(sh.to_a, out)
        end
        return sh
    end