| Class | Commands::Discover |
| In: |
vendor/rails/railties/lib/commands/plugin.rb
|
| Parent: | Object |
# File vendor/rails/railties/lib/commands/plugin.rb, line 637
637: def initialize(base_command)
638: @base_command = base_command
639: @list = false
640: @prompt = true
641: end
# File vendor/rails/railties/lib/commands/plugin.rb, line 704
704: def extract_repository_uri(uri)
705: uri.match(/(svn|https?):.*\/plugins\//i)[0]
706: end
# File vendor/rails/railties/lib/commands/plugin.rb, line 643
643: def options
644: OptionParser.new do |o|
645: o.set_summary_indent(' ')
646: o.banner = "Usage: #{@base_command.script_name} discover URI [URI [URI]...]"
647: o.define_head "Discover repositories referenced on a page."
648: o.separator ""
649: o.separator "Options:"
650: o.separator ""
651: o.on( "-l", "--list",
652: "List but don't prompt or add discovered repositories.") { |@list| @prompt = !@list }
653: o.on( "-n", "--no-prompt",
654: "Add all new repositories without prompting.") { |v| @prompt = !v }
655: end
656: end
# File vendor/rails/railties/lib/commands/plugin.rb, line 658
658: def parse!(args)
659: options.parse!(args)
660: args = ['http://wiki.rubyonrails.org/rails/pages/Plugins'] if args.empty?
661: args.each do |uri|
662: scrape(uri) do |repo_uri|
663: catch(:next_uri) do
664: if @prompt
665: begin
666: $stdout.print "Add #{repo_uri}? [Y/n] "
667: throw :next_uri if $stdin.gets !~ /^y?$/i
668: rescue Interrupt
669: $stdout.puts
670: exit 1
671: end
672: elsif @list
673: puts repo_uri
674: throw :next_uri
675: end
676: Repositories.instance.add(repo_uri)
677: puts "discovered: #{repo_uri}" if $verbose or !@prompt
678: end
679: end
680: end
681: Repositories.instance.save
682: end
# File vendor/rails/railties/lib/commands/plugin.rb, line 684
684: def scrape(uri)
685: require 'open-uri'
686: puts "Scraping #{uri}" if $verbose
687: dupes = []
688: content = open(uri).each do |line|
689: begin
690: if line =~ /<a[^>]*href=['"]([^'"]*)['"]/ || line =~ /(svn:\/\/[^<|\n]*)/
691: uri = $1
692: if uri =~ /^\w+:\/\// && uri =~ /\/plugins\// && uri !~ /\/browser\// && uri !~ /^http:\/\/wiki\.rubyonrails/ && uri !~ /http:\/\/instiki/
693: uri = extract_repository_uri(uri)
694: yield uri unless dupes.include?(uri) || Repositories.instance.exist?(uri)
695: dupes << uri
696: end
697: end
698: rescue
699: puts "Problems scraping '#{uri}': #{$!.to_s}"
700: end
701: end
702: end