Skip to content

Instantly share code, notes, and snippets.

@mrkn
Created December 16, 2008 07:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrkn/36367 to your computer and use it in GitHub Desktop.
Save mrkn/36367 to your computer and use it in GitHub Desktop.
scheduling port installation
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