X-Git-Url: https://git.openstreetmap.org/chef.git/blobdiff_plain/805ab61e66fe3adb45e57f50e49b168d84a6a8b1..7b9ec4b60ee39614d1d083d7220e76b07d2b275f:/cookbooks/nodejs/providers/package.rb diff --git a/cookbooks/nodejs/providers/package.rb b/cookbooks/nodejs/providers/package.rb new file mode 100644 index 000000000..f726df310 --- /dev/null +++ b/cookbooks/nodejs/providers/package.rb @@ -0,0 +1,67 @@ +# +# Cookbook Name:: nodejs +# Provider:: package +# +# Copyright 2013, OpenStreetMap Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require "chef/mixin/shell_out" +require "json" + +include Chef::Mixin::ShellOut + +def load_current_resource + @packages = JSON.parse(shell_out("npm list --global --json").stdout)["dependencies"] + + @current_resource = Chef::Resource::NodejsPackage.new(new_resource.name) + @current_resource.package_name(new_resource.package_name) + if package = @packages[@current_resource.package_name] + @current_resource.version(package["version"]) + end + @current_resource +end + +action :install do + if new_resource.version + package_name = "#{new_resource.package_name}@#{new_resource.version}" + else + package_name = new_resource.package_name + end + + unless @packages.include?(new_resource.package_name) + shell_out!("npm install --global #{package_name}") + new_resource.updated_by_last_action(true) + else + if new_resource.version && + new_resource.version != @current_resource.version + shell_out!("npm install --global #{package_name}") + new_resource.updated_by_last_action(true) + end + end +end + +action :upgrade do + if @packages.include?(new_resource.package_name) + shell_out!("npm update --global #{new_resource.package_name}") + new_resource.updated_by_last_action(true) + end +end + +action :remove do + if @packages.include?(new_resource.package_name) + shell_out!("npm remove --global #{new_resource.package_name}") + new_resource.updated_by_last_action(true) + end +end