summaryrefslogtreecommitdiff
path: root/lib/leap_cli
diff options
context:
space:
mode:
Diffstat (limited to 'lib/leap_cli')
-rw-r--r--lib/leap_cli/commands/deploy.rb4
-rw-r--r--lib/leap_cli/core_ext/boolean.rb14
-rw-r--r--lib/leap_cli/core_ext/hash.rb35
-rw-r--r--lib/leap_cli/core_ext/json.rb42
-rw-r--r--lib/leap_cli/core_ext/nil.rb5
-rw-r--r--lib/leap_cli/core_ext/string.rb14
-rw-r--r--lib/leap_cli/core_ext/yaml.rb29
-rw-r--r--lib/leap_cli/lib_ext/capistrano_connections.rb16
-rw-r--r--lib/leap_cli/lib_ext/gli.rb52
-rw-r--r--lib/leap_cli/override/json.rb11
-rw-r--r--lib/leap_cli/util/remote_command.rb2
11 files changed, 222 insertions, 2 deletions
diff --git a/lib/leap_cli/commands/deploy.rb b/lib/leap_cli/commands/deploy.rb
index 6589837..90807db 100644
--- a/lib/leap_cli/commands/deploy.rb
+++ b/lib/leap_cli/commands/deploy.rb
@@ -73,7 +73,9 @@ module LeapCli
end
end
end
-
+ if !Util.exit_status.nil? && Util.exit_status != 0
+ log :warning, "puppet did not finish successfully."
+ end
end
end
diff --git a/lib/leap_cli/core_ext/boolean.rb b/lib/leap_cli/core_ext/boolean.rb
new file mode 100644
index 0000000..9b617b2
--- /dev/null
+++ b/lib/leap_cli/core_ext/boolean.rb
@@ -0,0 +1,14 @@
+#
+# make is_a?(Boolean) possible.
+#
+
+module Boolean
+end
+
+class TrueClass
+ include Boolean
+end
+
+class FalseClass
+ include Boolean
+end \ No newline at end of file
diff --git a/lib/leap_cli/core_ext/hash.rb b/lib/leap_cli/core_ext/hash.rb
new file mode 100644
index 0000000..7df33b2
--- /dev/null
+++ b/lib/leap_cli/core_ext/hash.rb
@@ -0,0 +1,35 @@
+class Hash
+
+ ##
+ ## CONVERTING
+ ##
+
+ #
+ # convert self into a hash, but only include the specified keys
+ #
+ def pick(*keys)
+ keys.map(&:to_s).inject({}) do |hsh, key|
+ if has_key?(key)
+ hsh[key] = self[key]
+ end
+ hsh
+ end
+ end
+
+ #
+ # recursive merging (aka deep merge)
+ # taken from ActiveSupport::CoreExtensions::Hash::DeepMerge
+ #
+ def deep_merge(other_hash)
+ self.merge(other_hash) do |key, oldval, newval|
+ oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
+ newval = newval.to_hash if newval.respond_to?(:to_hash)
+ oldval.class.to_s == 'Hash' && newval.class.to_s == 'Hash' ? oldval.deep_merge(newval) : newval
+ end
+ end
+
+ def deep_merge!(other_hash)
+ replace(deep_merge(other_hash))
+ end
+
+end
diff --git a/lib/leap_cli/core_ext/json.rb b/lib/leap_cli/core_ext/json.rb
new file mode 100644
index 0000000..1a82bd9
--- /dev/null
+++ b/lib/leap_cli/core_ext/json.rb
@@ -0,0 +1,42 @@
+module JSON
+ #
+ # Output JSON from ruby objects in such a manner that all the hashes and arrays are output in alphanumeric sorted order.
+ # This is required so that our generated configs don't throw puppet or git for a tizzy fit.
+ #
+ # Beware: some hacky stuff ahead.
+ #
+ # This relies on the pure ruby implementation of JSON.generate (i.e. require 'json/pure')
+ # see https://github.com/flori/json/blob/master/lib/json/pure/generator.rb
+ #
+ # The Oj way that we are not using: Oj.dump(obj, :mode => :compat, :indent => 2)
+ #
+ def self.sorted_generate(obj)
+ # modify hash and array
+ Array.class_eval do
+ alias_method :each_without_sort, :each
+ def each(&block)
+ sorted = sort {|a,b| a.to_s <=> b.to_s }
+ for i in 0..(sorted.length-1) do
+ yield sorted[i]
+ end
+ end
+ end
+ Hash.class_eval do
+ alias_method :each_without_sort, :each
+ def each(&block)
+ self.keys.each do |key|
+ yield key, self.fetch(key) # fetch is used so we don't trigger Config::Object auto-eval
+ end
+ end
+ end
+
+ # generate json
+ json_str = JSON.pretty_generate(obj)
+
+ # restore hash and array
+ Hash.class_eval {alias_method :each, :each_without_sort}
+ Array.class_eval {alias_method :each, :each_without_sort}
+
+ return json_str
+ end
+end
diff --git a/lib/leap_cli/core_ext/nil.rb b/lib/leap_cli/core_ext/nil.rb
new file mode 100644
index 0000000..05ca98f
--- /dev/null
+++ b/lib/leap_cli/core_ext/nil.rb
@@ -0,0 +1,5 @@
+class NilClass
+ def any?
+ false
+ end
+end \ No newline at end of file
diff --git a/lib/leap_cli/core_ext/string.rb b/lib/leap_cli/core_ext/string.rb
new file mode 100644
index 0000000..07af8e5
--- /dev/null
+++ b/lib/leap_cli/core_ext/string.rb
@@ -0,0 +1,14 @@
+#
+# make ruby 1.9 act more like ruby 1.8
+#
+unless String.method_defined?(:to_a)
+ class String
+ def to_a; [self]; end
+ end
+end
+
+unless String.method_defined?(:any?)
+ class String
+ def any?; self.chars.any?; end
+ end
+end
diff --git a/lib/leap_cli/core_ext/yaml.rb b/lib/leap_cli/core_ext/yaml.rb
new file mode 100644
index 0000000..bb0b5c9
--- /dev/null
+++ b/lib/leap_cli/core_ext/yaml.rb
@@ -0,0 +1,29 @@
+class Object
+ #
+ # ya2yaml will output hash keys in sorted order, but it outputs arrays
+ # in natural order. This new method, sorted_ya2yaml(), is the same as
+ # ya2yaml but ensures that arrays are sorted.
+ #
+ # This is important so that the .yaml files don't change each time you recompile.
+ #
+ # see https://github.com/afunai/ya2yaml/blob/master/lib/ya2yaml.rb
+ #
+ def sorted_ya2yaml(options = {})
+ # modify array
+ Array.class_eval do
+ alias_method :collect_without_sort, :collect
+ def collect(&block)
+ sorted = sort {|a,b| a.to_s <=> b.to_s}
+ sorted.collect_without_sort(&block)
+ end
+ end
+
+ # generate yaml
+ yaml_str = self.ya2yaml(options)
+
+ # restore array
+ Array.class_eval {alias_method :collect, :collect_without_sort}
+
+ return yaml_str
+ end
+end
diff --git a/lib/leap_cli/lib_ext/capistrano_connections.rb b/lib/leap_cli/lib_ext/capistrano_connections.rb
new file mode 100644
index 0000000..c46455f
--- /dev/null
+++ b/lib/leap_cli/lib_ext/capistrano_connections.rb
@@ -0,0 +1,16 @@
+module Capistrano
+ class Configuration
+ module Connections
+ def failed!(server)
+ @failure_callback.call(server) if @failure_callback
+ Thread.current[:failed_sessions] << server
+ end
+
+ def call_on_failure(&block)
+ @failure_callback = block
+ end
+ end
+ end
+end
+
+
diff --git a/lib/leap_cli/lib_ext/gli.rb b/lib/leap_cli/lib_ext/gli.rb
new file mode 100644
index 0000000..f9b03be
--- /dev/null
+++ b/lib/leap_cli/lib_ext/gli.rb
@@ -0,0 +1,52 @@
+#
+# print subcommands indented in the main global help screen
+#
+
+module GLI
+ module Commands
+ module HelpModules
+ class GlobalHelpFormat
+ SUB_CMD_INDENT = " "
+ def format
+ program_desc = @app.program_desc
+ program_long_desc = @app.program_long_desc
+ if program_long_desc
+ wrapper = @wrapper_class.new(Terminal.instance.size[0],4)
+ program_long_desc = "\n #{wrapper.wrap(program_long_desc)}\n\n" if program_long_desc
+ else
+ program_long_desc = "\n"
+ end
+
+ # build a list of commands, sort them so the commands with subcommands are at the bottom
+ commands = @sorter.call(@app.commands_declaration_order.reject(&:nodoc)).sort do |a,b|
+ if a.commands.any? && b.commands.any?; a.name.to_s <=> b.name.to_s
+ elsif a.commands.any?; 1
+ elsif b.commands.any?; -1
+ else; a.name.to_s <=> b.name.to_s
+ end
+ end
+
+ # build a list of command info ([name, description]), including subcommands if appropriate
+ command_info_list = []
+ commands.each do |command|
+ name = [command.name, Array(command.aliases)].flatten.join(', ')
+ command_info_list << [name, command.description]
+ if command.commands.any?
+ @sorter.call(command.commands_declaration_order).each do |cmd|
+ command_info_list << [SUB_CMD_INDENT + command.name.to_s + " " + cmd.names, cmd.description + (command.get_default_command == cmd.name ? " (default)" : "")]
+ end
+ end
+ end
+
+ # display
+ command_formatter = ListFormatter.new(command_info_list, @wrapper_class)
+ stringio = StringIO.new
+ command_formatter.output(stringio)
+ commands = stringio.string
+ global_option_descriptions = OptionsFormatter.new(global_flags_and_switches, @sorter, @wrapper_class).format
+ GLOBAL_HELP.result(binding)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/leap_cli/override/json.rb b/lib/leap_cli/override/json.rb
new file mode 100644
index 0000000..a7ae328
--- /dev/null
+++ b/lib/leap_cli/override/json.rb
@@ -0,0 +1,11 @@
+#
+# This exists solely to prevent other gems we depend on from
+# importing json/ext (e.g. require 'json').
+#
+# If json/ext is imported, json/pure cannot work, and we heavily
+# rely on the specific behavior of json/pure.
+#
+# This trick only works if this directory is early in the
+# include path.
+#
+require 'json/pure' \ No newline at end of file
diff --git a/lib/leap_cli/util/remote_command.rb b/lib/leap_cli/util/remote_command.rb
index 16d2b22..10a5ca8 100644
--- a/lib/leap_cli/util/remote_command.rb
+++ b/lib/leap_cli/util/remote_command.rb
@@ -120,7 +120,7 @@ module LeapCli; module Util; module RemoteCommand
@capistrano_enabled ||= begin
require 'capistrano'
require 'capistrano/cli'
- require 'lib_ext/capistrano_connections'
+ require 'leap_cli/lib_ext/capistrano_connections'
require 'leap_cli/remote/leap_plugin'
require 'leap_cli/remote/puppet_plugin'
require 'leap_cli/remote/rsync_plugin'