| Class | Commands::Discover |
| In: |
vendor/rails/railties/lib/commands/plugin.rb
|
| Parent: | Object |
# File vendor/rails/railties/lib/commands/plugin.rb, line 678
678: def initialize(base_command)
679: @base_command = base_command
680: @list = false
681: @prompt = true
682: end
# File vendor/rails/railties/lib/commands/plugin.rb, line 745
745: def extract_repository_uri(uri)
746: uri.match(/(svn|https?):.*\/plugins\//i)[0]
747: end
# File vendor/rails/railties/lib/commands/plugin.rb, line 684
684: def options
685: OptionParser.new do |o|
686: o.set_summary_indent(' ')
687: o.banner = "Usage: #{@base_command.script_name} discover URI [URI [URI]...]"
688: o.define_head "Discover repositories referenced on a page."
689: o.separator ""
690: o.separator "Options:"
691: o.separator ""
692: o.on( "-l", "--list",
693: "List but don't prompt or add discovered repositories.") { |list| @list, @prompt = list, !@list }
694: o.on( "-n", "--no-prompt",
695: "Add all new repositories without prompting.") { |v| @prompt = !v }
696: end
697: end
# File vendor/rails/railties/lib/commands/plugin.rb, line 699
699: def parse!(args)
700: options.parse!(args)
701: args = ['http://wiki.rubyonrails.org/rails/pages/Plugins'] if args.empty?
702: args.each do |uri|
703: scrape(uri) do |repo_uri|
704: catch(:next_uri) do
705: if @prompt
706: begin
707: $stdout.print "Add #{repo_uri}? [Y/n] "
708: throw :next_uri if $stdin.gets !~ /^y?$/i
709: rescue Interrupt
710: $stdout.puts
711: exit 1
712: end
713: elsif @list
714: puts repo_uri
715: throw :next_uri
716: end
717: Repositories.instance.add(repo_uri)
718: puts "discovered: #{repo_uri}" if $verbose or !@prompt
719: end
720: end
721: end
722: Repositories.instance.save
723: end
# File vendor/rails/railties/lib/commands/plugin.rb, line 725
725: def scrape(uri)
726: require 'open-uri'
727: puts "Scraping #{uri}" if $verbose
728: dupes = []
729: content = open(uri).each do |line|
730: begin
731: if line =~ /<a[^>]*href=['"]([^'"]*)['"]/ || line =~ /(svn:\/\/[^<|\n]*)/
732: uri = $1
733: if uri =~ /^\w+:\/\// && uri =~ /\/plugins\// && uri !~ /\/browser\// && uri !~ /^http:\/\/wiki\.rubyonrails/ && uri !~ /http:\/\/instiki/
734: uri = extract_repository_uri(uri)
735: yield uri unless dupes.include?(uri) || Repositories.instance.exist?(uri)
736: dupes << uri
737: end
738: end
739: rescue
740: puts "Problems scraping '#{uri}': #{$!.to_s}"
741: end
742: end
743: end