Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
Add Comment
Please, Sign In to add comment