require "json" def each_submodule(base_path) `cd #{base_path} && git submodule status`.lines do |line| hash, path = line[1..].split " " full_path = "#{base_path}/#{path}" url = `git config --file #{base_path}/.gitmodules --get 'submodule.#{path}.url'`.chomp.delete_suffix(".git") if url =~ /dev.danilafe.com/ file_url = "#{url}/src/commit/#{hash}" else raise "Submodule URL #{url.dump} not in a known format!" end yield ({ :path => full_path, :url => file_url }) each_submodule(full_path) { |m| yield m } end end hash = {} each_submodule(".") do |m| next unless m[:path].start_with? "./code/" hash[m[:path].delete_prefix("./code/")] = m[:url] end puts JSON.pretty_generate(hash)