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