lib/big_keeper/util/bigkeeper_parser.rb
require 'big_keeper/util/logger'
require 'big_keeper/util/file_operator'
# Bigkeeper module
module BigKeeper
def self.version(name)
BigkeeperParser.parse_version(name)
end
def self.user(name)
BigkeeperParser.parse_user(name)
yield if block_given?
end
def self.home(name, params)
BigkeeperParser.parse_home(name, params)
end
def self.mod(name, params)
BigkeeperParser.parse_mod(name, params)
end
def self.modules
BigkeeperParser.parse_modules
yield if block_given?
end
def self.source(name)
BigkeeperParser.parse_source(name)
yield if block_given?
end
def self.configs
BigkeeperParser.parse_configs
yield if block_given?
end
def self.param(key, value)
BigkeeperParser.parse_param(key, value)
yield if block_given?
end
# Bigkeeper file parser
class BigkeeperParser
@@config = {}
@@current_user = ''
def self.parse(bigkeeper)
if @@config.empty?
Logger.error("Can't find a Bigkeeper file in current directory.") if !FileOperator.definitely_exists?(bigkeeper)
content = File.read(bigkeeper, :encoding => 'UTF-8')
content.gsub!(/version\s/, 'BigKeeper::version ')
content.gsub!(/user\s/, 'BigKeeper::user ')
content.gsub!(/home\s/, 'BigKeeper::home ')
content.gsub!(/source\s/, 'BigKeeper::source ')
content.gsub!(/mod\s/, 'BigKeeper::mod ')
content.gsub!(/modules\s/, 'BigKeeper::modules ')
content.gsub!(/configs\s/, 'BigKeeper::configs ')
content.gsub!(/param\s/, 'BigKeeper::param ')
eval content
end
end
def self.parse_source(name)
@@config.delete("tmp_spec")
source_split = name.split(",") unless name.split(",").length != 2
if source_split != nil
sources = Hash["#{source_split[1].lstrip}" => "#{source_split[0]}"]
@@config[:source] = sources
@@config[:tmp_spec] = source_split[1].lstrip
end
end
def self.parse_version(name)
@@config[:version] = name
end
def self.parse_user(name)
@@current_user = name
users = @@config[:users]
users = {} if users.nil?
users[name] = {}
@@config[:users] = users
end
def self.parse_home(name, params)
@@config[:home] = params
@@config[:name] = name
end
def self.parse_mod(name, params)
if params[:path]
parse_user_mod(name, params)
elsif params[:git]
parse_modules_mod(name, params)
else
Logger.error(%(There should be ':path =>' or ':git =>' ':alias =>' for mod #{name}))
end
end
def self.parse_user_mod(name, params)
users = @@config[:users]
user = users[@@current_user]
mods = user[:mods]
mods = {} if mods.nil?
mods[name] = params
user[:mods] = mods
@@config[:users] = users
end
def self.parse_modules_mod(name, params)
if @@config[:source] != nil
params[:spec] = "#{@@config[:tmp_spec]}"
end
modules = @@config[:modules]
modules[name] = params
@@config[:modules] = modules
end
def self.parse_modules
modules = @@config[:modules]
modules = {} if modules.nil?
@@config[:modules] = modules
end
def self.parse_configs
@@config[:configs] = {}
end
def self.parse_param(key, value)
@@config[:configs] = @@config[:configs].merge(key => value)
end
def self.version
@@config[:version]
end
def self.home_name
@@config[:name]
end
def self.home_git()
@@config[:home][:git]
end
def self.home_modules_workspace()
if @@config[:home][:modules_workspace]
home_modules_workspace = @@config[:home][:modules_workspace]
if home_modules_workspace.rindex('/') != home_modules_workspace.length - 1
home_modules_workspace = home_modules_workspace + '/'
end
home_modules_workspace
else
'../'
end
end
def self.home_pulls()
@@config[:home][:pulls]
end
def self.source_spec_path(module_name)
spec = @@config[:modules][module_name][:spec]
@@config[:source][spec]
end
def self.source_spec_name(module_name)
spec = @@config[:modules][module_name][:spec]
end
def self.sources
@@config[:source].keys
end
def self.global_configs(key)
if @@config[:configs] == nil
return
end
@@config[:configs][key]
end
def self.module_full_path(home_path, user_name, module_name)
if @@config[:users] \
&& @@config[:users][user_name] \
&& @@config[:users][user_name][:mods] \
&& @@config[:users][user_name][:mods][module_name] \
&& @@config[:users][user_name][:mods][module_name][:path]
File.expand_path(@@config[:users][user_name][:mods][module_name][:path])
else
if @@config[:modules][module_name][:alias]
File.expand_path("#{home_path}/#{home_modules_workspace}/#{@@config[:modules][module_name][:alias]}")
else
File.expand_path("#{home_path}/#{home_modules_workspace}/#{module_name}")
end
end
end
def self.module_path(user_name, module_name)
if @@config[:users] \
&& @@config[:users][user_name] \
&& @@config[:users][user_name][:mods] \
&& @@config[:users][user_name][:mods][module_name] \
&& @@config[:users][user_name][:mods][module_name][:path]
File.expand_path(@@config[:users][user_name][:mods][module_name][:path])
else
p @@config[:modules][module_name]
if @@config[:modules][module_name][:alias]
"#{home_modules_workspace}#{@@config[:modules][module_name][:alias]}"
else
"#{home_modules_workspace}#{module_name}"
end
end
end
def self.module_git(module_name)
@@config[:modules][module_name][:git]
end
def self.module_source(module_name)
@@config[:modules][module_name][:mod_path]
end
def self.module_maven(module_name)
@@config[:modules][module_name][:maven_group] + ':' + @@config[:modules][module_name][:maven_artifact]
end
def self.module_maven_artifact(module_name)
@@config[:modules][module_name][:maven_artifact]
end
def self.module_version_alias(module_name)
@@config[:modules][module_name][:version_alias]
end
def self.module_pulls(module_name)
@@config[:modules][module_name][:pulls]
end
def self.verify_modules(modules)
modules = [] unless modules
modules = modules.uniq
modules.each do |item|
Logger.error("Can not find module #{item} in Bigkeeper file") unless @@config[:modules][item]
end
modules
end
def self.module_names
@@config[:modules].keys
end
def self.config
@@config
end
end
end