2010-08-05 14:41:35 +00:00
|
|
|
#!/usr/bin/env ruby
|
|
|
|
require 'optparse'
|
|
|
|
|
2010-08-06 00:49:12 +00:00
|
|
|
# Informal Spec:
|
|
|
|
#
|
|
|
|
# A User may have multiple Repositories
|
|
|
|
# A Repositories contains Packages
|
|
|
|
#
|
|
|
|
# A User will search for a repository giving a name and optional version
|
|
|
|
# Each Repository will be scanned for matching Packages
|
|
|
|
# If only one Package matches, that Package will be opened
|
|
|
|
# If more than one Package matches, then the user will be prompted to pick one
|
|
|
|
# While any two Packages share the same name their parent dir is appended
|
|
|
|
# If no Repository matches, then qwandry will exit with a -404 (repo not found)
|
|
|
|
#
|
|
|
|
module Qwandry
|
2010-08-05 14:41:35 +00:00
|
|
|
|
2010-08-06 00:49:12 +00:00
|
|
|
class Repository
|
2010-08-09 04:15:20 +00:00
|
|
|
attr_reader :name
|
|
|
|
|
|
|
|
def initialize(name, path)
|
|
|
|
@name = name
|
2010-08-06 00:49:12 +00:00
|
|
|
@path = path.chomp('/')
|
|
|
|
end
|
|
|
|
|
|
|
|
def scan(name)
|
|
|
|
[]
|
|
|
|
end
|
2010-08-06 16:48:52 +00:00
|
|
|
|
|
|
|
def package(name, paths)
|
|
|
|
Package.new(name, paths, self)
|
|
|
|
end
|
2010-08-06 00:49:12 +00:00
|
|
|
end
|
2010-08-05 14:41:35 +00:00
|
|
|
|
2010-08-06 00:49:12 +00:00
|
|
|
# Directories look like:
|
|
|
|
# Repository
|
|
|
|
# lib-0.1
|
|
|
|
# lib-0.2
|
|
|
|
class FlatRepository < Repository
|
|
|
|
def scan(name)
|
2010-08-06 16:48:52 +00:00
|
|
|
results = []
|
|
|
|
Dir["#{@path}/*"].select do |path|
|
|
|
|
if File.basename(path).start_with?(name)
|
|
|
|
results << package(File.basename(path), [path])
|
|
|
|
end
|
|
|
|
end
|
2010-08-09 04:15:20 +00:00
|
|
|
|
2010-08-06 16:48:52 +00:00
|
|
|
results
|
2010-08-06 00:49:12 +00:00
|
|
|
end
|
|
|
|
end
|
2010-08-06 16:48:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Package
|
|
|
|
attr_reader :name
|
|
|
|
attr_reader :repository
|
|
|
|
attr_reader :paths
|
|
|
|
|
|
|
|
def initialize(name, paths, repository)
|
|
|
|
@name = name
|
|
|
|
@repository = repository
|
|
|
|
@paths = paths
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-08-17 04:04:29 +00:00
|
|
|
def launch(package)
|
|
|
|
`mate #{package.paths.join(' ')}`
|
|
|
|
end
|
|
|
|
module_function :launch
|
|
|
|
|
2010-08-05 14:41:35 +00:00
|
|
|
end
|
|
|
|
|
2010-08-06 00:49:12 +00:00
|
|
|
if __FILE__ == $0
|
2010-08-09 04:15:20 +00:00
|
|
|
load('repositories.rb')
|
2010-08-17 04:04:29 +00:00
|
|
|
load('~/.qwandry/repositories.rb') if File.exists?('~/.qwandry/repositories.rb')
|
2010-08-09 04:15:20 +00:00
|
|
|
|
2010-08-06 00:49:12 +00:00
|
|
|
opts = OptionParser.new do |opts|
|
|
|
|
opts.banner = "Usage: qwandry [options] name [version]"
|
2010-08-05 15:09:58 +00:00
|
|
|
|
2010-08-06 00:49:12 +00:00
|
|
|
opts.separator ""
|
|
|
|
opts.separator "Known Repositories:"
|
2010-08-09 04:15:20 +00:00
|
|
|
@repositories.keys.each do |repo_label|
|
|
|
|
opts.separator " #{repo_label}"
|
|
|
|
end
|
|
|
|
|
2010-08-05 15:09:58 +00:00
|
|
|
end
|
|
|
|
|
2010-08-06 00:49:12 +00:00
|
|
|
opts.parse! ARGV
|
|
|
|
|
|
|
|
if ARGV.length != 1
|
|
|
|
puts opts
|
|
|
|
exit(-1)
|
|
|
|
end
|
|
|
|
|
|
|
|
name = ARGV.pop
|
2010-08-06 16:48:52 +00:00
|
|
|
packages = []
|
2010-08-05 14:41:35 +00:00
|
|
|
|
2010-08-06 00:49:12 +00:00
|
|
|
@repositories.each do |set, repos|
|
|
|
|
repos.each do |repo|
|
2010-08-06 16:48:52 +00:00
|
|
|
packages.concat(repo.scan(name))
|
2010-08-06 00:49:12 +00:00
|
|
|
end
|
2010-08-05 14:41:35 +00:00
|
|
|
end
|
2010-08-17 04:04:29 +00:00
|
|
|
|
|
|
|
package = nil
|
|
|
|
if packages.length == 1
|
|
|
|
package = packages.first
|
|
|
|
else
|
|
|
|
packages.each_with_index do |package, index|
|
|
|
|
puts "%3d. %s" % [index+1, package.name]
|
|
|
|
end
|
2010-08-05 14:41:35 +00:00
|
|
|
|
2010-08-17 04:04:29 +00:00
|
|
|
print ">> "
|
|
|
|
index = gets.to_i-1
|
|
|
|
package = packages[index]
|
2010-08-06 00:49:12 +00:00
|
|
|
end
|
2010-08-17 04:04:29 +00:00
|
|
|
|
|
|
|
Qwandry.launch package if package
|
2010-08-06 00:49:12 +00:00
|
|
|
end
|