#!/usr/bin/env ruby FTP_URL = "ftp.jp.FreeBSD.org" BSD_VERSION = "5.2.1-RELEASE" # no use DIRECTORY = "/pub/FreeBSD/releases/i386/5.2.1-RELEASE/packages/All/" PKG_SUFFIX = "tbz" PACKAGE_LIST = "/home/aian/pkglist" PACKAGE_INDEX = "/home/aian/INDEX" def parse_index(file) list = [] File.foreach(file) do |i| entry = i.chomp.split("|") list.push(entry) end list end def parse_package_list(file) list = [] File.foreach(file) do |i| unless i =~ /^\s*#/ || i =~ /^\s/ entry = i.chomp.split(/\s+/) list.push(entry[0]) end end list end def url(file) "get #{DIRECTORY}#{file}.#{PKG_SUFFIX}" end def create_url_list(entry_list) url_list = [] entry_list.each do |e| url_list.push(url(e[0])) if e[7] # dependency e[7].split(/\s/).each do |d| url_list.push(url(d)) end end end url_list.uniq end def package_select(package_list, package_index) selected_list = [] # linear search package_list.each do |entry| found = 0 package_index.each do |package| if package[0] =~ /^#{entry}(-[^-]+)?$/i found = found + 1 if found == 1 selected_list.push(package) STDERR << "OK: #{entry} [#{selected_list.last[0]}]\n" elsif found > 1 selected_list.push(package) STDERR << "**: #{entry} [#{selected_list.last[0]}]\n" end end end STDERR << " #{entry}\n" if found == 0 end return selected_list end def main case ARGV.size when 0 package_list = parse_package_list(PACKAGE_LIST) package_index = parse_index(PACKAGE_INDEX) when 1 package_list = parse_package_list(ARGV[0]) package_index = parse_index(PACKAGE_INDEX) when 2 package_list = parse_package_list(ARGV[0]) package_index = parse_index(ARGV[1]) else STDERR << "Usage: pgl [pkglist [index]]\n" exit end selected_list = package_select(package_list, package_index) # for lftp, using like `lftp -f ...' url_list = create_url_list(selected_list) puts "open #{FTP_URL}" url_list.each do |url| puts "get #{url}" end end main