Created
December 16, 2008 07:46
-
-
Save mrkn/36367 to your computer and use it in GitHub Desktop.
scheduling port installation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'readline' | |
require 'tsort' | |
class Hash | |
include TSort | |
alias tsort_each_node each_key | |
def tsort_each_child(node, &block) | |
fetch(node).each(&block) | |
end | |
end | |
$deps = {} | |
$variants = {} | |
def analyse_deps(name, history=[]) | |
return if history.include? name | |
lines = `port deps #{name} #{$variants[name]}` | |
return unless $? == 0 | |
$stderr.puts "analyses dependencies of #{name}..." | |
deps = lines.inject([]) {|acc, line| | |
case line | |
when /\A#{name} has/ | |
# TODO: dependency category handling | |
else | |
acc.push line.strip | |
end | |
next acc | |
} | |
$deps[name] = deps | |
history.push name | |
deps.map {|dname| analyse_deps dname, history } | |
end | |
def add_deps(name) | |
deps = analyse_deps(name) | |
end | |
def add_port(name, variants) | |
$variants[name] = variants | |
add_deps name | |
end | |
while line = Readline.readline('> ', true) | |
case line | |
when /\A(?:add port|ap)\s+(\S+)(?:\s+(\+\S+))?\b/ | |
name = $1 | |
variants = $2 | |
add_port name, variants || '' | |
when /\A(?:show deps|sd)\s+(\S+)(?:\s+(\+\S+))?\b/ | |
name = $1 | |
variants = $2 | |
if variants | |
system('port', 'deps', name, variants) | |
else | |
system('port', 'deps', name) | |
end | |
when /\A(?:show variants|sv)\s+(\S+)\b/ | |
name = $1 | |
system('port', 'variants', name) | |
when /\As(?:earch)?\s+(\S+)\b/ | |
pattern = $1 | |
system('port', 'search', pattern) | |
when /\Ar(?:esult)?\b/ | |
$deps.tsort.map {|name| | |
puts "#{name} #{$variants[name]}" | |
} | |
when /\Ac(?:lear)?\b/ | |
$deps = {} | |
$variants = {} | |
when /\Ah(?:elp)?\b/ | |
print <<HELP | |
ap,add port NAME [VARIANTS] | |
sd,show deps NAME [VARIANTS] | |
sv,show variants NAME | |
s,search PATTERN | |
r,result | |
c,clear | |
h,help | |
q,quit,exit | |
HELP | |
when /\Aq(?:uit)?\b/, /\Aexit\b/ | |
break | |
else | |
$stderr.puts "unknown command: #{line}" | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment