guard 2.8.2 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +0 -7
- data/lib/guard.rb +220 -152
- data/lib/guard.rb.orig +213 -155
- data/lib/guard/aruba_adapter.rb +2 -2
- data/lib/guard/cli.rb +8 -13
- data/lib/guard/cli.rb.orig +12 -10
- data/lib/guard/commander.rb +15 -7
- data/lib/guard/commands/all.rb +3 -0
- data/lib/guard/commands/change.rb +3 -0
- data/lib/guard/commands/pause.rb +2 -0
- data/lib/guard/commands/reload.rb +4 -0
- data/lib/guard/commands/scope.rb +3 -0
- data/lib/guard/config.rb +24 -0
- data/lib/guard/deprecated/dsl.rb +45 -0
- data/lib/guard/deprecated/guard.rb +166 -0
- data/lib/guard/deprecated/guardfile.rb +84 -0
- data/lib/guard/dsl.rb +24 -13
- data/lib/guard/dsl.rb.orig +378 -0
- data/lib/guard/dsl_describer.rb +8 -2
- data/lib/guard/dsl_describer.rb.orig +11 -3
- data/lib/guard/guardfile.rb +32 -44
- data/lib/guard/guardfile/evaluator.rb +13 -6
- data/lib/guard/guardfile/generator.rb +4 -3
- data/lib/guard/interactor.rb +7 -3
- data/lib/guard/internals/debugging.rb +1 -0
- data/lib/guard/internals/environment.rb +93 -0
- data/lib/guard/internals/helpers.rb +13 -0
- data/lib/guard/internals/traps.rb +10 -0
- data/lib/guard/jobs/pry_wrapper.rb +4 -3
- data/lib/guard/jobs/sleep.rb +2 -0
- data/lib/guard/metadata.rb +190 -0
- data/lib/guard/notifier.rb +124 -99
- data/lib/guard/notifier.rb.orig +124 -99
- data/lib/guard/notifier/detected.rb +83 -0
- data/lib/guard/notifiers/emacs.rb +2 -1
- data/lib/guard/notifiers/tmux.rb +173 -177
- data/lib/guard/plugin/base.rb +2 -0
- data/lib/guard/plugin_util.rb +26 -32
- data/lib/guard/reevaluator.rb +3 -3
- data/lib/guard/reevaluator.rb.orig +22 -0
- data/lib/guard/runner.rb +1 -0
- data/lib/guard/session.rb +5 -0
- data/lib/guard/sheller.rb +2 -2
- data/lib/guard/templates/Guardfile +4 -0
- data/lib/guard/templates/Guardfile.orig +2 -0
- data/lib/guard/terminal.rb +1 -0
- data/lib/guard/ui.rb +4 -1
- data/lib/guard/version.rb +1 -1
- data/lib/guard/version.rb.orig +1 -1
- data/lib/guard/watcher.rb +3 -1
- data/lib/guard/watcher.rb.orig +122 -0
- data/man/guard.1 +1 -4
- data/man/guard.1.html +1 -4
- metadata +17 -25
- data/lib/guard/commander.rb.orig +0 -103
- data/lib/guard/commands/all.rb.orig +0 -36
- data/lib/guard/commands/reload.rb.orig +0 -34
- data/lib/guard/commands/scope.rb.orig +0 -36
- data/lib/guard/deprecated_methods.rb +0 -72
- data/lib/guard/deprecated_methods.rb.orig +0 -71
- data/lib/guard/deprecator.rb +0 -133
- data/lib/guard/deprecator.rb.orig +0 -206
- data/lib/guard/guard.rb +0 -100
- data/lib/guard/guard.rb.orig +0 -42
- data/lib/guard/guardfile.rb.orig +0 -43
- data/lib/guard/guardfile/evaluator.rb.orig +0 -275
- data/lib/guard/internals/debugging.rb.orig +0 -0
- data/lib/guard/internals/environment.rb.orig +0 -0
- data/lib/guard/internals/tracing.rb.orig +0 -0
- data/lib/guard/notifiers/base.rb.orig +0 -221
- data/lib/guard/notifiers/tmux.rb.orig +0 -339
- data/lib/guard/plugin_util.rb.orig +0 -186
- data/lib/guard/runner.rb.orig +0 -210
- data/lib/guard/setuper.rb +0 -359
- data/lib/guard/setuper.rb.orig +0 -395
- data/lib/guard/ui.rb.orig +0 -278
File without changes
|
File without changes
|
File without changes
|
@@ -1,221 +0,0 @@
|
|
1
|
-
require "rbconfig"
|
2
|
-
require "guard/ui"
|
3
|
-
|
4
|
-
module Guard
|
5
|
-
module Notifier
|
6
|
-
# Base class for all notifiers.
|
7
|
-
#
|
8
|
-
class Base
|
9
|
-
HOSTS = {
|
10
|
-
darwin: "Mac OS X",
|
11
|
-
linux: "Linux",
|
12
|
-
freebsd: "FreeBSD",
|
13
|
-
openbsd: "OpenBSD",
|
14
|
-
sunos: "SunOS",
|
15
|
-
solaris: "Solaris",
|
16
|
-
mswin: "Windows",
|
17
|
-
mingw: "Windows",
|
18
|
-
cygwin: "Windows"
|
19
|
-
}
|
20
|
-
|
21
|
-
ERROR_ADD_GEM_AND_RUN_BUNDLE = "Please add \"gem '%s'\" to your Gemfile "\
|
22
|
-
"and run Guard with \"bundle exec\"."
|
23
|
-
|
24
|
-
attr_reader :options
|
25
|
-
|
26
|
-
def initialize(opts = {})
|
27
|
-
@options = opts
|
28
|
-
end
|
29
|
-
|
30
|
-
# This method should be overriden by subclasses and return an array of
|
31
|
-
# OSes the notifier supports. By default, it returns :all which mean
|
32
|
-
# there's no check against the current OS.
|
33
|
-
#
|
34
|
-
# @see HOSTS for the list of possible OSes
|
35
|
-
#
|
36
|
-
def self.supported_hosts
|
37
|
-
:all
|
38
|
-
end
|
39
|
-
|
40
|
-
# Test if the notifier can be used.
|
41
|
-
#
|
42
|
-
# @param [Hash] opts notifier options
|
43
|
-
# @option opts [Boolean] silent true if no error messages should be shown
|
44
|
-
# @return [Boolean] the availability status
|
45
|
-
#
|
46
|
-
def self.available?(opts = {})
|
47
|
-
if _supported_host?
|
48
|
-
true
|
49
|
-
else
|
50
|
-
hosts = supported_hosts.map { |host| HOSTS[host.to_sym] }.join(", ")
|
51
|
-
unless opts.fetch(:silent) { false }
|
52
|
-
::Guard::UI.error "The :#{name} notifier runs only on #{hosts}."
|
53
|
-
end
|
54
|
-
false
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# This method must be overriden.
|
59
|
-
#
|
60
|
-
def notify(_message, opts = {})
|
61
|
-
options.delete(:silent)
|
62
|
-
opts.replace(options.merge(opts))
|
63
|
-
normalize_standard_options!(opts)
|
64
|
-
end
|
65
|
-
|
66
|
-
# Returns the title of the notifier.
|
67
|
-
#
|
68
|
-
# @example Un-modulize the class name
|
69
|
-
# Guard::Notifier::FileNotifier.title
|
70
|
-
# #=> 'FileNotifier'
|
71
|
-
#
|
72
|
-
# @return [String] the title of the notifier
|
73
|
-
#
|
74
|
-
def self.title
|
75
|
-
to_s.sub(/.+::(\w+)$/, '\1')
|
76
|
-
end
|
77
|
-
|
78
|
-
# Returns the name of the notifier.
|
79
|
-
#
|
80
|
-
# @example Un-modulize, underscorize and downcase the class name
|
81
|
-
# Guard::Notifier::FileNotifier.name
|
82
|
-
# #=> 'file_notifier'
|
83
|
-
#
|
84
|
-
# @return [String] the name of the notifier
|
85
|
-
#
|
86
|
-
def self.name
|
87
|
-
title.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
|
88
|
-
end
|
89
|
-
|
90
|
-
# Returns the name of the notifier's gem. By default it returns the
|
91
|
-
# notifier name. This method can be overriden by subclasses.
|
92
|
-
#
|
93
|
-
# @example Un-modulize, underscorize and downcase the class name
|
94
|
-
# Guard::Notifier::FileNotifier.gem_name
|
95
|
-
# #=> 'file_notifier'
|
96
|
-
#
|
97
|
-
# @return [String] the name of the notifier's gem
|
98
|
-
#
|
99
|
-
def self.gem_name
|
100
|
-
name
|
101
|
-
end
|
102
|
-
|
103
|
-
# This method tries to require the gem whose name is returned by
|
104
|
-
# `.gem_name`. If a LoadError or NameError occurs, it displays an error
|
105
|
-
# message (unless opts[:silent] is true) and returns false.
|
106
|
-
#
|
107
|
-
# @param [Hash] opts some options
|
108
|
-
# @option opts [Boolean] silent true if no error messages should be shown
|
109
|
-
#
|
110
|
-
# @return [Boolean] whether or not the gem is loaded
|
111
|
-
#
|
112
|
-
def self.require_gem_safely(opts = {})
|
113
|
-
require gem_name
|
114
|
-
true
|
115
|
-
rescue LoadError, NameError
|
116
|
-
unless opts[:silent]
|
117
|
-
UI.error ERROR_ADD_GEM_AND_RUN_BUNDLE % [gem_name]
|
118
|
-
end
|
119
|
-
false
|
120
|
-
end
|
121
|
-
|
122
|
-
# Returns the title of the notifier.
|
123
|
-
#
|
124
|
-
# @example Un-modulize the class name
|
125
|
-
# Guard::Notifier::FileNotifier.new.title
|
126
|
-
# #=> 'FileNotifier'
|
127
|
-
#
|
128
|
-
# @return [String] the title of the notifier
|
129
|
-
#
|
130
|
-
def title
|
131
|
-
self.class.title
|
132
|
-
end
|
133
|
-
|
134
|
-
# Returns the name of the notifier.
|
135
|
-
#
|
136
|
-
# @example Un-modulize, underscorize and downcase the class name
|
137
|
-
# Guard::Notifier::FileNotifier.new.name
|
138
|
-
# #=> 'file_notifier'
|
139
|
-
#
|
140
|
-
# @return [String] the name of the notifier
|
141
|
-
#
|
142
|
-
def name
|
143
|
-
self.class.name
|
144
|
-
end
|
145
|
-
|
146
|
-
# Paths where all Guard images are located
|
147
|
-
#
|
148
|
-
# @return [Pathname] the path to the images directory
|
149
|
-
#
|
150
|
-
def images_path
|
151
|
-
@images_path ||= Pathname.new(__FILE__).dirname + "../../../images"
|
152
|
-
end
|
153
|
-
|
154
|
-
# @private
|
155
|
-
#
|
156
|
-
# Checks if the current OS is supported by the notifier.
|
157
|
-
#
|
158
|
-
# @see .supported_hosts
|
159
|
-
#
|
160
|
-
def self._supported_host?
|
161
|
-
supported_hosts == :all ||
|
162
|
-
RbConfig::CONFIG["host_os"] =~ /#{supported_hosts.join('|')}/
|
163
|
-
end
|
164
|
-
|
165
|
-
# Set or modify the `:title`, `:type` and `:image` options for a
|
166
|
-
# notification. Should be used in `#notify`.
|
167
|
-
#
|
168
|
-
# @param [Hash] opts additional notification library options
|
169
|
-
# @option opts [String] type the notification type. Either 'success',
|
170
|
-
# 'pending', 'failed' or 'notify'
|
171
|
-
# @option opts [String] title the notification title
|
172
|
-
# @option opts [String] image the path to the notification image
|
173
|
-
#
|
174
|
-
def normalize_standard_options!(opts)
|
175
|
-
opts[:title] ||= "Guard"
|
176
|
-
opts[:type] ||= _notification_type(opts.fetch(:image, :success))
|
177
|
-
opts[:image] = _image_path(opts.delete(:image) { :success })
|
178
|
-
end
|
179
|
-
|
180
|
-
private
|
181
|
-
|
182
|
-
# Get the image path for an image symbol for the following
|
183
|
-
# known image types:
|
184
|
-
#
|
185
|
-
# - failed
|
186
|
-
# - pending
|
187
|
-
# - success
|
188
|
-
#
|
189
|
-
# If the image is not a known symbol, it will be returned unmodified.
|
190
|
-
#
|
191
|
-
# @param [Symbol, String] image the image symbol or path to an image
|
192
|
-
#
|
193
|
-
# @return [String] the image path
|
194
|
-
#
|
195
|
-
def _image_path(image)
|
196
|
-
case image
|
197
|
-
when :failed, :pending, :success
|
198
|
-
images_path.join("#{image}.png").to_s
|
199
|
-
else
|
200
|
-
image
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
# Get the notification type depending on the
|
205
|
-
# image that has been selected for the notification.
|
206
|
-
#
|
207
|
-
# @param [Symbol, String] image the image symbol or path to an image
|
208
|
-
#
|
209
|
-
# @return [String] the notification type
|
210
|
-
#
|
211
|
-
def _notification_type(image)
|
212
|
-
case image
|
213
|
-
when :failed, :pending, :success
|
214
|
-
image
|
215
|
-
else
|
216
|
-
:notify
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
@@ -1,339 +0,0 @@
|
|
1
|
-
require "guard/notifiers/base"
|
2
|
-
|
3
|
-
module Guard
|
4
|
-
module Notifier
|
5
|
-
# Changes the color of the Tmux status bar and optionally
|
6
|
-
# shows messages in the status bar.
|
7
|
-
#
|
8
|
-
# @example Add the `:tmux` notifier to your `Guardfile`
|
9
|
-
# notification :tmux
|
10
|
-
#
|
11
|
-
# @example Enable text messages
|
12
|
-
# notification :tmux, display_message: true
|
13
|
-
#
|
14
|
-
# @example Customize the tmux status colored for notifications
|
15
|
-
# notification :tmux, color_location: 'status-right-bg'
|
16
|
-
#
|
17
|
-
class Tmux < Base
|
18
|
-
# Default options for the tmux notifications.
|
19
|
-
DEFAULTS = {
|
20
|
-
client: "tmux",
|
21
|
-
tmux_environment: "TMUX",
|
22
|
-
success: "green",
|
23
|
-
failed: "red",
|
24
|
-
pending: "yellow",
|
25
|
-
default: "green",
|
26
|
-
timeout: 5,
|
27
|
-
display_message: false,
|
28
|
-
default_message_format: "%s - %s",
|
29
|
-
default_message_color: "white",
|
30
|
-
display_on_all_clients: false,
|
31
|
-
display_title: false,
|
32
|
-
default_title_format: "%s - %s",
|
33
|
-
line_separator: " - ",
|
34
|
-
change_color: true,
|
35
|
-
color_location: "status-left-bg"
|
36
|
-
}
|
37
|
-
|
38
|
-
ERROR_NOT_INSIDE_SESSION = "The :tmux notifier runs only on when Guard"\
|
39
|
-
" is executed inside of a tmux session."
|
40
|
-
|
41
|
-
def self.available?(opts = {})
|
42
|
-
super && _register!(opts)
|
43
|
-
end
|
44
|
-
|
45
|
-
# @private
|
46
|
-
#
|
47
|
-
# @return [Boolean] whether or not a TMUX environment is available
|
48
|
-
#
|
49
|
-
def self._tmux_environment_available?(opts)
|
50
|
-
!ENV[opts.fetch(:tmux_environment, DEFAULTS[:tmux_environment])].nil?
|
51
|
-
end
|
52
|
-
|
53
|
-
# @private
|
54
|
-
#
|
55
|
-
# Detects if a TMUX environment is available and if not,
|
56
|
-
# displays an error message unless `opts[:silent]` is true.
|
57
|
-
#
|
58
|
-
# @return [Boolean] whether or not a TMUX environment is available
|
59
|
-
#
|
60
|
-
def self._register!(opts)
|
61
|
-
@options_stored = false
|
62
|
-
if _tmux_environment_available?(opts)
|
63
|
-
true
|
64
|
-
else
|
65
|
-
unless opts[:silent]
|
66
|
-
::Guard::UI.error ERROR_NOT_INSIDE_SESSION
|
67
|
-
end
|
68
|
-
false
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
# Shows a system notification.
|
73
|
-
#
|
74
|
-
# By default, the Tmux notifier only makes
|
75
|
-
# use of a color based notification, changing the background color of the
|
76
|
-
# `color_location` to the color defined in either the `success`,
|
77
|
-
# `failed`, `pending` or `default`, depending on the notification type.
|
78
|
-
#
|
79
|
-
# You may enable an extra explicit message by setting `display_message`
|
80
|
-
# to true, and may further disable the colorization by setting
|
81
|
-
# `change_color` to false.
|
82
|
-
#
|
83
|
-
# @param [String] title the notification title
|
84
|
-
# @param [Hash] opts additional notification library options
|
85
|
-
# @option opts [String] type the notification type. Either 'success',
|
86
|
-
# 'pending', 'failed' or 'notify'
|
87
|
-
# @option opts [String] message the notification message body
|
88
|
-
# @option opts [String] image the path to the notification image
|
89
|
-
# @option opts [Boolean] change_color whether to show a color
|
90
|
-
# notification
|
91
|
-
# @option opts [String,Array] color_location the location where to draw
|
92
|
-
# the color notification
|
93
|
-
# @option opts [Boolean] display_message whether to display a message
|
94
|
-
# or not
|
95
|
-
# @option opts [Boolean] display_on_all_clients whether to display a
|
96
|
-
# message on all tmux clients or not
|
97
|
-
#
|
98
|
-
def notify(message, opts = {})
|
99
|
-
super
|
100
|
-
opts.delete(:image)
|
101
|
-
|
102
|
-
if opts.fetch(:change_color, DEFAULTS[:change_color])
|
103
|
-
options = opts.fetch(:color_location, DEFAULTS[:color_location])
|
104
|
-
color_locations = Array(options)
|
105
|
-
color = tmux_color(opts[:type], opts)
|
106
|
-
|
107
|
-
color_locations.each do |color_location|
|
108
|
-
_run_client "set", "#{self.class._quiet_option}"\
|
109
|
-
"#{color_location} #{color}"
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
type = opts.delete(:type).to_s
|
114
|
-
title = opts.delete(:title)
|
115
|
-
|
116
|
-
if opts.fetch(:display_title, DEFAULTS[:display_title])
|
117
|
-
display_title(type, title, message, opts)
|
118
|
-
end
|
119
|
-
|
120
|
-
return unless opts.fetch(:display_message, DEFAULTS[:display_message])
|
121
|
-
display_message(type, title, message, opts)
|
122
|
-
end
|
123
|
-
|
124
|
-
# Displays a message in the title bar of the terminal.
|
125
|
-
#
|
126
|
-
# @param [String] title the notification title
|
127
|
-
# @param [String] message the notification message body
|
128
|
-
# @param [Hash] options additional notification library options
|
129
|
-
# @option options [String] success_message_format a string to use as
|
130
|
-
# formatter for the success message.
|
131
|
-
# @option options [String] failed_message_format a string to use as
|
132
|
-
# formatter for the failed message.
|
133
|
-
# @option options [String] pending_message_format a string to use as
|
134
|
-
# formatter for the pending message.
|
135
|
-
# @option options [String] default_message_format a string to use as
|
136
|
-
# formatter when no format per type is defined.
|
137
|
-
#
|
138
|
-
def display_title(type, title, message, opts = {})
|
139
|
-
format = "#{type}_title_format".to_sym
|
140
|
-
defaults = DEFAULTS[:default_title_format]
|
141
|
-
options = opts.fetch(:default_title_format, defaults)
|
142
|
-
title_format = opts.fetch(format, options)
|
143
|
-
teaser_message = message.split("\n").first
|
144
|
-
display_title = title_format % [title, teaser_message]
|
145
|
-
|
146
|
-
_run_client "set-option", "#{self.class._quiet_option}"\
|
147
|
-
"set-titles-string '#{display_title}'"
|
148
|
-
end
|
149
|
-
|
150
|
-
# Displays a message in the status bar of tmux.
|
151
|
-
#
|
152
|
-
# @param [String] type the notification type. Either 'success',
|
153
|
-
# 'pending', 'failed' or 'notify'
|
154
|
-
# @param [String] title the notification title
|
155
|
-
# @param [String] message the notification message body
|
156
|
-
# @param [Hash] options additional notification library options
|
157
|
-
# @option options [Integer] timeout the amount of seconds to show the
|
158
|
-
# message in the status bar
|
159
|
-
# @option options [String] success_message_format a string to use as
|
160
|
-
# formatter for the success message.
|
161
|
-
# @option options [String] failed_message_format a string to use as
|
162
|
-
# formatter for the failed message.
|
163
|
-
# @option options [String] pending_message_format a string to use as
|
164
|
-
# formatter for the pending message.
|
165
|
-
# @option options [String] default_message_format a string to use as
|
166
|
-
# formatter when no format per type is defined.
|
167
|
-
# @option options [String] success_message_color the success notification
|
168
|
-
# foreground color name.
|
169
|
-
# @option options [String] failed_message_color the failed notification
|
170
|
-
# foreground color name.
|
171
|
-
# @option options [String] pending_message_color the pending notification
|
172
|
-
# foreground color name.
|
173
|
-
# @option options [String] default_message_color a notification
|
174
|
-
# foreground color to use when no color per type is defined.
|
175
|
-
# @option options [String] line_separator a string to use instead of a
|
176
|
-
# line-break.
|
177
|
-
#
|
178
|
-
def display_message(type, title, message, opts = {})
|
179
|
-
default_format = DEFAULTS[:default_message_format]
|
180
|
-
default_format = opts.fetch(:default_message_format, default_format)
|
181
|
-
format = "#{type}_message_format".to_sym
|
182
|
-
message_format = opts.fetch(format, default_format)
|
183
|
-
|
184
|
-
default_color = DEFAULTS[:default_message_color]
|
185
|
-
default_color = opts.fetch(:default_message_color, default_color)
|
186
|
-
color = "#{type}_message_color".to_sym
|
187
|
-
message_color = opts.fetch(color, default_color)
|
188
|
-
|
189
|
-
display_time = opts.fetch(:timeout, DEFAULTS[:timeout])
|
190
|
-
separator = opts.fetch(:line_separator, DEFAULTS[:line_separator])
|
191
|
-
|
192
|
-
color = tmux_color type, opts
|
193
|
-
formatted_message = message.split("\n").join(separator)
|
194
|
-
display_message = message_format % [title, formatted_message]
|
195
|
-
|
196
|
-
_run_client(
|
197
|
-
"set",
|
198
|
-
"#{self.class._quiet_option}display-time #{display_time * 1000}")
|
199
|
-
|
200
|
-
_run_client "set", "#{self.class._quiet_option}"\
|
201
|
-
"message-fg #{message_color}"
|
202
|
-
_run_client "set", "#{self.class._quiet_option}"\
|
203
|
-
"message-bg #{color}"
|
204
|
-
_run_client "display-message", "'#{display_message}'"
|
205
|
-
end
|
206
|
-
|
207
|
-
# Get the Tmux color for the notification type.
|
208
|
-
# You can configure your own color by overwriting the defaults.
|
209
|
-
#
|
210
|
-
# @param [String] type the notification type
|
211
|
-
# @return [String] the name of the emacs color
|
212
|
-
#
|
213
|
-
def tmux_color(type, opts = {})
|
214
|
-
type = type.to_sym
|
215
|
-
|
216
|
-
opts[type] || DEFAULTS[type] || opts[:default] || DEFAULTS[:default]
|
217
|
-
end
|
218
|
-
|
219
|
-
# Notification starting, save the current Tmux settings
|
220
|
-
# and quiet the Tmux output.
|
221
|
-
#
|
222
|
-
def self.turn_on
|
223
|
-
unless @options_stored
|
224
|
-
_reset_options_store
|
225
|
-
|
226
|
-
_clients.each do |client|
|
227
|
-
@options_store[client].merge!(_options_for_client(client))
|
228
|
-
end
|
229
|
-
|
230
|
-
@options_stored = true
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
# Notification stopping. Restore the previous Tmux state
|
235
|
-
# if available (existing options are restored, new options
|
236
|
-
# are unset) and unquiet the Tmux output.
|
237
|
-
#
|
238
|
-
def self.turn_off
|
239
|
-
if @options_stored
|
240
|
-
@options_store.each do |client, options|
|
241
|
-
options.each do |key, value|
|
242
|
-
args = [
|
243
|
-
DEFAULTS[:client], "set", "-t",
|
244
|
-
client, _quiet_option.strip
|
245
|
-
]
|
246
|
-
args << "-u" unless value
|
247
|
-
args << key
|
248
|
-
args << value if value
|
249
|
-
Sheller.run(args.join(" "))
|
250
|
-
end
|
251
|
-
end
|
252
|
-
_reset_options_store
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
def self.options_store
|
257
|
-
@options_store ||= {}
|
258
|
-
end
|
259
|
-
|
260
|
-
private
|
261
|
-
|
262
|
-
def self._clients
|
263
|
-
args = [DEFAULTS[:client], "list-clients", "-F", "'\#{client_tty}'"]
|
264
|
-
ttys = Sheller.stdout(args.join(" "))
|
265
|
-
ttys = ttys.split(/\n/)
|
266
|
-
|
267
|
-
# if user is running 'tmux -C' remove this client from list
|
268
|
-
ttys.delete("(null)")
|
269
|
-
|
270
|
-
ttys
|
271
|
-
end
|
272
|
-
|
273
|
-
def self._options_for_client(client)
|
274
|
-
options = {}
|
275
|
-
|
276
|
-
lines = Sheller.stdout("#{DEFAULTS[:client]} show -t #{client}")
|
277
|
-
|
278
|
-
lines.each_line do |line|
|
279
|
-
option, _, setting = line.chomp.partition(" ")
|
280
|
-
options[option] = setting
|
281
|
-
end
|
282
|
-
|
283
|
-
options
|
284
|
-
end
|
285
|
-
|
286
|
-
def _clients
|
287
|
-
self.class._clients
|
288
|
-
end
|
289
|
-
|
290
|
-
def _run_client(cmd, args)
|
291
|
-
default = DEFAULTS[:display_on_all_clients]
|
292
|
-
all_clients = @options.fetch(:display_on_all_clients, default)
|
293
|
-
clients = all_clients ? _clients : [nil]
|
294
|
-
clients.each do |client|
|
295
|
-
cmd_args = if client
|
296
|
-
"#{_client_cmd_flag(cmd)} #{client.strip} #{args}"
|
297
|
-
else
|
298
|
-
args
|
299
|
-
end
|
300
|
-
Sheller.run("#{DEFAULTS[:client]} #{cmd} #{cmd_args}")
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
|
-
def _client_cmd_flag(cmd)
|
305
|
-
case cmd
|
306
|
-
when "set", "set-option" then "-t"
|
307
|
-
when "display-message" then "-c"
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
# Reset the internal Tmux options store defaults.
|
312
|
-
#
|
313
|
-
def self._reset_options_store
|
314
|
-
@options_stored = false
|
315
|
-
@options_store = {}
|
316
|
-
|
317
|
-
_clients.each do |client|
|
318
|
-
@options_store[client] = {
|
319
|
-
"status-left-bg" => nil,
|
320
|
-
"status-right-bg" => nil,
|
321
|
-
"status-left-fg" => nil,
|
322
|
-
"status-right-fg" => nil,
|
323
|
-
"message-bg" => nil,
|
324
|
-
"message-fg" => nil,
|
325
|
-
"display-time" => nil
|
326
|
-
}
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
def self._tmux_version
|
331
|
-
@@tmux_version ||= Float(Sheller.stdout("tmux -V")[/\d+\.\d+/])
|
332
|
-
end
|
333
|
-
|
334
|
-
def self._quiet_option
|
335
|
-
"-q " if _tmux_version >= 1.7
|
336
|
-
end
|
337
|
-
end
|
338
|
-
end
|
339
|
-
end
|