Guest User

Untitled

a guest
Feb 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. require 'readline'
  2. require 'tsort'
  3.  
  4. class Hash
  5. include TSort
  6. alias tsort_each_node each_key
  7. def tsort_each_child(node, &block)
  8. fetch(node).each(&block)
  9. end
  10. end
  11.  
  12. $deps = {}
  13. $variants = {}
  14.  
  15. def analyse_deps(name, history=[])
  16. return if history.include? name
  17. lines = `port deps #{name} #{$variants[name]}`
  18. return unless $? == 0
  19. $stderr.puts "analyses dependencies of #{name}..."
  20. deps = lines.inject([]) {|acc, line|
  21. case line
  22. when /\A#{name} has/
  23. # TODO: dependency category handling
  24. else
  25. acc.push line.strip
  26. end
  27. next acc
  28. }
  29. $deps[name] = deps
  30. history.push name
  31. deps.map {|dname| analyse_deps dname, history }
  32. end
  33.  
  34. def add_deps(name)
  35. deps = analyse_deps(name)
  36. end
  37.  
  38. def add_port(name, variants)
  39. $variants[name] = variants
  40. add_deps name
  41. end
  42.  
  43. while line = Readline.readline('> ', true)
  44. case line
  45. when /\A(?:add port|ap)\s+(\S+)(?:\s+(\+\S+))?\b/
  46. name = $1
  47. variants = $2
  48. add_port name, variants || ''
  49. when /\A(?:show deps|sd)\s+(\S+)(?:\s+(\+\S+))?\b/
  50. name = $1
  51. variants = $2
  52. if variants
  53. system('port', 'deps', name, variants)
  54. else
  55. system('port', 'deps', name)
  56. end
  57. when /\A(?:show variants|sv)\s+(\S+)\b/
  58. name = $1
  59. system('port', 'variants', name)
  60. when /\As(?:earch)?\s+(\S+)\b/
  61. pattern = $1
  62. system('port', 'search', pattern)
  63. when /\Ar(?:esult)?\b/
  64. $deps.tsort.map {|name|
  65. puts "#{name} #{$variants[name]}"
  66. }
  67. when /\Ac(?:lear)?\b/
  68. $deps = {}
  69. $variants = {}
  70. when /\Ah(?:elp)?\b/
  71. print <<HELP
  72. ap,add port NAME [VARIANTS]
  73. sd,show deps NAME [VARIANTS]
  74. sv,show variants NAME
  75. s,search PATTERN
  76. r,result
  77. c,clear
  78. h,help
  79. q,quit,exit
  80. HELP
  81. when /\Aq(?:uit)?\b/, /\Aexit\b/
  82. break
  83. else
  84. $stderr.puts "unknown command: #{line}"
  85. end
  86. end
Add Comment
Please, Sign In to add comment