@@ -138,6 +138,49 @@ def print_table(mods)
138138 end
139139 end
140140
141+ def define_task_print_git_conversion ( *_args )
142+ desc "Convert and print forge modules to git format"
143+ task :print_git_conversion do
144+ require 'ra10ke/git_repo'
145+ require 'r10k/puppetfile'
146+ require 'puppet_forge'
147+
148+ PuppetForge . user_agent = "ra10ke/#{ Ra10ke ::VERSION } "
149+ puppetfile = get_puppetfile
150+ puppetfile . load!
151+ PuppetForge . host = puppetfile . forge if puppetfile . forge =~ /^http/
152+
153+ # ignore file allows for "don't tell me about this"
154+ ignore_modules = [ ]
155+ if File . exist? ( '.r10kignore' )
156+ ignore_modules = File . readlines ( '.r10kignore' ) . each { |l | l . chomp! }
157+ end
158+ forge_mods = puppetfile . modules . find_all { |mod | mod . instance_of? ( R10K ::Module ::Forge ) && mod . v3_module . homepage_url? }
159+
160+ threads = forge_mods . map do |mod |
161+ Thread . new do
162+ source_url = mod . v3_module . attributes . dig ( :current_release , :metadata , :source ) || mod . v3_module . homepage_url
163+ # git:// does not work with ls-remote command, convert to https
164+ source_url = source_url . gsub ( 'git://' , 'https://' )
165+ source_url = source_url . gsub ( /\A git\@ (.*)\: (.*)/ ) do
166+ "https://#{ $1} /#{ $2} "
167+ end
168+ repo = ::Ra10ke ::GitRepo . new ( source_url )
169+ ref = repo . get_ref_like ( mod . expected_version )
170+ ref_name = ref ? ref [ :name ] : "bad url or tag #{ mod . expected_version } is missing"
171+ <<~EOF
172+ mod '#{ mod . name } ',
173+ :git => '#{ source_url } ',
174+ :ref => '#{ ref_name } '
175+
176+ EOF
177+ end
178+ end
179+ output = threads . map { |th | th . join . value }
180+ puts output
181+ end
182+ end
183+
141184 def define_task_dependencies ( *_args )
142185 desc "Print outdated forge modules"
143186 task :dependencies do
0 commit comments