lib/big_keeper/util/gradle_file_operator.rb
require 'big_keeper/util/logger'
require 'big_keeper/util/gradle_content_generator'
module BigKeeper
class GradleFileOperator
@path
@user
def initialize(path, user)
@path = path
@user = user
end
def get_module_depends(build_file, module_name)
Logger.highlight("get module #{module_name} depends ...")
depend_modules = []
modules = ModuleCacheOperator.new(@path).all_path_modules
File.open(build_file, 'r') do |file|
file.each_line do |line|
modules.each do |name|
if line.strip().index('//') != 0 && !line.include?(BigkeeperParser.module_maven(module_name)) && !depend_modules.include?(name) && line.include?(BigkeeperParser.module_maven(name))
depend_modules << name
end
end
end
end
print "module #{module_name} depends: "
p depend_modules
depend_modules
end
def update_module_settings(module_name, settings_file, depend_modules)
module_full_path = BigkeeperParser.module_full_path(@path, @user, module_name)
cache_path = File.expand_path("#{module_full_path}/.bigkeeper")
big_settings_file = "#{cache_path}/bigkeeper_settings.gradle"
if depend_modules.empty? && !File.exist?(big_settings_file)
return
end
result = ''
depend_modules.each do |name|
artifact_id = BigkeeperParser.module_maven_artifact(name)
source = BigkeeperParser.module_source(name)
result << "include \':module:#{artifact_id}\'\nproject(':module:#{artifact_id}').projectDir = new File(rootProject.projectDir, '../#{name}/#{source}')\n"
end
dest_path = File.dirname(big_settings_file)
FileUtils.mkdir_p(dest_path) unless File.exist?(dest_path)
file = File.new(big_settings_file, 'w', :encoding => 'UTF-8')
begin
file << result
file.close
ensure
file.close
end
if has_bigkeeper_config(settings_file)
return
end
temp_file = Tempfile.new('.settings.gradle.tmp', :encoding => 'UTF-8')
begin
File.open(settings_file, 'r', :encoding => 'UTF-8') do |file|
file.each_line do |line|
temp_file.puts(line)
end
end
temp_file.puts(GradleConentGenerator.generate_bigkeeper_settings_gradle_content())
temp_file.close
FileUtils.mv(temp_file.path, settings_file)
ensure
temp_file.close
temp_file.unlink
end
end
def update_module_build(build_file, module_name, depend_modules, version_name)
module_full_path = BigkeeperParser.module_full_path(@path, @user, module_name)
cache_path = File.expand_path("#{module_full_path}/.bigkeeper")
big_build_file = "#{cache_path}/bigkeeper_build.gradle"
if depend_modules.empty? && !File.exist?(big_build_file)
return
end
result = "configurations.all {\n\tresolutionStrategy {\n"
depend_modules.each do |name|
module_maven = BigkeeperParser.module_maven(name)
result << "\t\tforce \'#{module_maven}:#{version_name}-SNAPSHOT\'\n"
end
result << "\t}\n}\n"
dest_path = File.dirname(big_build_file)
FileUtils.mkdir_p(dest_path) unless File.exist?(dest_path)
file = File.new(big_build_file, 'w', :encoding => 'UTF-8')
begin
file << result
file.close
ensure
file.close
end
if has_bigkeeper_config(build_file)
return
end
temp_file = Tempfile.new('.build.gradle.tmp')
begin
File.open(build_file, 'r') do |file|
file.each_line do |line|
temp_file.puts(line)
end
end
temp_file.puts(GradleConentGenerator.generate_bigkeeper_build_gradle_content())
temp_file.close
FileUtils.mv(temp_file.path, build_file)
ensure
temp_file.close
temp_file.unlink
end
end
def get_home_depends()
path_modules = ModuleCacheOperator.new(@path).all_path_modules
git_modules = ModuleCacheOperator.new(@path).all_git_modules
path_modules | git_modules
end
def update_home_settings(settings_file, depend_modules)
cache_path = File.expand_path("#{@path}/.bigkeeper")
big_settings_file = "#{cache_path}/bigkeeper_settings.gradle"
if depend_modules.empty? && !File.exist?(big_settings_file)
return
end
result = ''
depend_modules.each do |name|
artifact_id = BigkeeperParser.module_maven(name).split(':')[1]
path = BigkeeperParser.module_full_path(@path, @user, name)
source = BigkeeperParser.module_source(name)
result << "include \':module:#{artifact_id}\'\nproject(':module:#{artifact_id}').projectDir = new File(rootProject.projectDir, '../#{name}/#{source}')\n"
end
dest_path = File.dirname(big_settings_file)
FileUtils.mkdir_p(dest_path) unless File.exist?(dest_path)
file = File.new(big_settings_file, 'w')
begin
file << result
file.close
ensure
file.close
end
if has_bigkeeper_config(settings_file)
return
end
temp_file = Tempfile.new('.settings.gradle.tmp')
begin
File.open(settings_file, 'r') do |file|
file.each_line do |line|
temp_file.puts(line)
end
end
temp_file.puts(GradleConentGenerator.generate_bigkeeper_settings_gradle_content())
temp_file.close
FileUtils.mv(temp_file.path, settings_file)
ensure
temp_file.close
temp_file.unlink
end
end
def update_home_build(build_file, depend_modules, version_name)
cache_path = File.expand_path("#{@path}/.bigkeeper")
big_build_file = "#{cache_path}/bigkeeper_build.gradle"
if depend_modules.empty? && !File.exist?(big_build_file)
return
end
result = "configurations.all {\n\tresolutionStrategy {\n"
depend_modules.each do |module_name|
module_maven = BigkeeperParser.module_maven(module_name)
result << "\t\tforce \'#{module_maven}:#{version_name}-SNAPSHOT\'\n"
end
result << "\t}\n}\n"
dest_path = File.dirname(big_build_file)
FileUtils.mkdir_p(dest_path) unless File.exist?(dest_path)
file = File.new(big_build_file, 'w')
begin
file << result
file.close
ensure
file.close
end
if has_bigkeeper_config(build_file)
return
end
temp_file = Tempfile.new('.build.gradle.tmp')
begin
File.open(build_file, 'r') do |file|
file.each_line do |line|
temp_file.puts(line)
end
end
temp_file.puts(GradleConentGenerator.generate_bigkeeper_build_gradle_content())
temp_file.close
FileUtils.mv(temp_file.path, build_file)
ensure
temp_file.close
temp_file.unlink
end
end
def update_module_version_name(build_file, version_name)
temp_file = Tempfile.new('.build.gradle.tmp')
isModifyPom = false
isBigkeeperScript = false
isBigkeeperBackupScript = false
hasBigkeeperBackup = false
begin
File.open(build_file, 'r') do |file|
file.each_line do |line|
if line.include?('modifyPom')
isModifyPom = true
elsif line.include?('bigkeeper config start')
isBigkeeperScript = true
elsif line.include?('bigkeeper config end')
isBigkeeperScript = false
elsif line.include?('bigkeeper config backup start')
isBigkeeperBackupScript = true
hasBigkeeperBackup = true
elsif line.include?('bigkeeper config backup end')
isBigkeeperBackupScript = false
end
if isModifyPom && !isBigkeeperBackupScript && line.match(/[\s\S]*version[\s\S]*/)
if !hasBigkeeperBackup
temp_file.puts("\t\t//bigkeeper config backup start")
temp_file.puts("\t\t//"+line.strip)
temp_file.puts("\t\t//bigkeeper config backup end")
end
if isBigkeeperScript
temp_file.puts("\t\tversion \'#{version_name}\'")
else
temp_file.puts("\t\t//bigkeeper config start")
temp_file.puts("\t\tversion \'#{version_name}\'")
temp_file.puts("\t\t//bigkeeper config end")
end
isModifyPom = false
else
temp_file.puts(line)
end
end
end
temp_file.close
FileUtils.mv(temp_file.path, build_file)
ensure
temp_file.close
temp_file.unlink
end
end
def update_module_depends(build_file, settings_file, module_name, version_name)
depend_modules = get_module_depends(build_file, module_name)
update_module_settings(module_name, settings_file, depend_modules)
update_module_build(build_file, module_name, depend_modules, version_name)
end
def update_home_depends(build_file, settings_file, type)
depend_modules = get_home_depends()
update_home_settings(settings_file, depend_modules)
update_home_build(build_file, depend_modules, generate_version_name(type))
end
def generate_version_name(type)
branch_name = GitOperator.new.current_branch(@path)
version_name = ''
if OperateType::FINISH == type
version_name = branch_name.sub(/([\s\S]*)\/(\d+.\d+.\d+)_([\s\S]*)/){ $2 }
else
version_name = branch_name.sub(/([\s\S]*)\/([\s\S]*)/){ $2 }
version_name = version_name.gsub('_', '-')
end
version_name
end
def recover_bigkeeper_config_file(bigkeeper_config_file)
if !File.exist?(bigkeeper_config_file)
return
end
temp_file = Tempfile.new('.bigkeeper_config.tmp', :encoding => 'UTF-8')
isBigkeeperScript = false
isBigkeeperBackupScript = false
begin
File.open(bigkeeper_config_file, 'r') do |file|
file.each_line do |line|
if line.include?('bigkeeper config start')
isBigkeeperScript = true
elsif line.include?('bigkeeper config end')
isBigkeeperScript = false
elsif line.include?('bigkeeper config backup start')
isBigkeeperBackupScript = true
elsif line.include?('bigkeeper config backup end')
isBigkeeperBackupScript = false
elsif isBigkeeperBackupScript
temp_file.puts(line.gsub('//',''))
elsif !isBigkeeperScript
temp_file.puts(line)
end
end
end
temp_file.close
FileUtils.mv(temp_file.path, bigkeeper_config_file)
ensure
temp_file.close
temp_file.unlink
end
end
def has_bigkeeper_config(file)
File.open(file, 'r') do |file|
file.each_line do |line|
if line.include?('bigkeeper config start')
return true
end
end
end
false
end
end
end