#!/usr/bin/env ruby ### Generate a valid seeds.rb for use in seeding the database with ### valid ports and categories # Note - this file must be executed from inside RAILS_ROOT # otherwise it won't be able to connect to the database require 'rubygems' require 'active_record' require 'fileutils' TIME_FILE = "/var/tmp/gsoc11-mpwa-sync" ROOT = File.expand_path(File.dirname(__FILE__) + "/../") NEW_PORTS = "#{ROOT}/bin/new_ports" PORT_INDEX = "/opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports" RAILS_ROOT = "#{ROOT}" MODE = "production" require File.expand_path(RAILS_ROOT + '/app/models/category.rb', __FILE__) require File.expand_path(RAILS_ROOT + '/app/models/port.rb', __FILE__) if File.exists?(TIME_FILE) $mtime = File.stat(TIME_FILE).mtime.to_i else $mtime = 0 end FileUtils.touch(TIME_FILE) # Output encoding magic comment puts "# coding: UTF-8" $ports = Array.new $hashed_data = Hash.new db_info = YAML.load_file(File.expand_path(RAILS_ROOT + '/config/database.yml', __FILE__)) ActiveRecord::Base.establish_connection(db_info[MODE]) fp = IO.popen("#{NEW_PORTS} -m #{$mtime} #{PORT_INDEX}") new_ports = fp.read.split("\n") if new_ports.count > 0 new_ports << "" #add last blank line end class String # Escape single quotes def escape_single_quotes self.gsub(/'/, "\\\\'") end end def esc(str) if not str.nil? str.escape_single_quotes else str end end new_ports.each do |line| unless (line == "") data = line.match(/(\S+):\s+\{?(.+)\}?$/) unless data.nil? #field missing, should record this if it happens $hashed_data[data[1].to_sym] = data[2] end else category_name = $hashed_data[:categories].try(:split, " ").try(:[], 0) $category = Category.find_by_name(category_name) if $category.nil? $category = Category.new({:name => category_name}) puts "category = Category.new({:name => \'#{category_name}\'})" puts "category.save" $category.save end port = Port.find_by_name($hashed_data[:name]) if port.nil? port = Port.new end port[:name] = $hashed_data[:name] port[:path] = $hashed_data[:portdir] port[:version] = $hashed_data[:version] port[:description] = $hashed_data[:description] port[:licenses] = $hashed_data[:license] port[:category_id] = $category.id port[:variants] = $hashed_data[:variants] port[:maintainers] = $hashed_data[:maintainers] port[:platforms] = $hashed_data[:platforms] port[:categories] = $hashed_data[:categories] $ports << [$hashed_data, port] puts "port = Port.new" puts "port[:name] = \'#{esc($hashed_data[:name])}\'" puts "port[:path] = \'#{esc($hashed_data[:portdir])}\'" puts "port[:version] = \'#{esc($hashed_data[:version])}\'" puts "port[:description] = \'#{esc($hashed_data[:description])}\'" puts "port[:licenses] = \'#{esc($hashed_data[:license])}\'" puts "port[:category_id] = #{$category.id}" puts "port[:variants] = \'#{esc($hashed_data[:variants])}\'" puts "port[:maintainers] = \'#{esc($hashed_data[:maintainers])}\'" puts "port[:platforms] = \'#{esc($hashed_data[:platforms])}\'" puts "port[:categories] = \'#{esc($hashed_data[:categories])}\'" puts "port.save" port.save $hashed_data = {} end end