123 lines
3.5 KiB
Ruby

#
# Cookbook Name:: composer
# Resource:: project
#
# Copyright (c) 2016, David Joos
#
use_inline_resources if defined?(use_inline_resources)
def whyrun_supported?
true
end
action :install do
make_execute 'install'
end
action :require do
make_require
end
action :update do
make_execute 'update'
end
action :dump_autoload do
make_execute 'dump-autoload'
end
action :remove do
remove_package 'remove'
end
def make_execute(cmd)
dev = new_resource.dev ? '--dev' : '--no-dev'
quiet = new_resource.quiet ? '--quiet' : ''
optimize = new_resource.optimize_autoloader ? optimize_flag(cmd) : ''
prefer_dist = new_resource.prefer_dist ? '--prefer-dist' : ''
prefer_source = new_resource.prefer_source ? '--prefer-source' : ''
environment = {
:COMPOSER_HOME => Composer.home_dir(node),
:COMPOSER_BIN_DIR => new_resource.bin_dir
}
execute "#{cmd}-composer-for-project" do
cwd new_resource.project_dir
command "#{node['composer']['bin']} #{cmd} --no-interaction --no-ansi #{quiet} #{dev} #{optimize} #{prefer_dist} #{prefer_source}"
environment(environment.merge(new_resource.environment))
action :run
user new_resource.user
group new_resource.group
umask new_resource.umask
end
end
def make_require
dev = new_resource.dev ? '--dev' : '--update-no-dev'
package = new_resource.package
version = new_resource.version ? new_resource.version : '*.*.*'
package, version = vendor_package_identity(new_resource.vendor, package, version)
raise 'package is needed for composer_project with action require' if package.nil?
prefer_dist = new_resource.prefer_dist ? '--prefer-dist' : ''
environment = {
:COMPOSER_HOME => Composer.home_dir(node),
:COMPOSER_BIN_DIR => new_resource.bin_dir
}
execute 'Install-composer-for-single-project' do
cwd new_resource.project_dir
command "#{node['composer']['bin']} require #{package}:#{version} #{dev} #{prefer_dist}"
environment(environment.merge(new_resource.environment))
action :run
not_if do
!version.include?('*') &&
shell_out("cd #{new_resource.project_dir} && #{node['composer']['bin']} show #{package} #{version}").exitstatus.zero?
end
user new_resource.user
group new_resource.group
umask new_resource.umask
end
end
def remove_package(cmd)
package = new_resource.package
version = new_resource.version ? new_resource.version : '*.*.*'
package, version = vendor_package_identity(new_resource.vendor, package, version)
raise 'package is needed for composer_project with action require' if package.nil?
environment = {
:COMPOSER_HOME => Composer.home_dir(node),
:COMPOSER_BIN_DIR => new_resource.bin_dir
}
execute "#{cmd}-composer-for-project" do
cwd new_resource.project_dir
command "#{node['composer']['bin']} remove #{package}"
environment(environment.merge(new_resource.environment))
action :run
only_if "#{node['composer']['bin']} show #{package} #{version}"
end
end
def optimize_flag(cmd)
%(install update).include?(cmd) ? '--optimize-autoloader' : '--optimize'
end
def vendor_package_identity(vendor, package, version)
unless vendor.nil?
# @todo take out deprecated vendor logic
Chef::Log.warn('The vendor attribute is deprecated, please use package and version instead.')
vendor_split = vendor.split(':')
package = vendor_split[0]
version = if vendor_split[1].nil?
version
else
vendor_split[1]
end
end
[package, version]
end