MuranoCLI 3.2.0.beta.1 → 3.2.0.beta.5
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/.rubocop.yml +4 -1
- data/.trustme.plugin +137 -0
- data/.trustme.sh +217 -117
- data/.trustme.vim +9 -3
- data/Gemfile +9 -3
- data/MuranoCLI.gemspec +8 -5
- data/Rakefile +1 -0
- data/dockers/Dockerfile.2.2.9 +6 -3
- data/dockers/Dockerfile.2.3.6 +6 -3
- data/dockers/Dockerfile.2.4.3 +6 -3
- data/dockers/Dockerfile.2.5.0 +6 -3
- data/dockers/Dockerfile.GemRelease +10 -8
- data/dockers/Dockerfile.m4 +23 -5
- data/dockers/docker-test.sh +65 -28
- data/docs/completions/murano_completion-bash +751 -57
- data/docs/develop.rst +10 -9
- data/lib/MrMurano/AccountBase.rb +95 -6
- data/lib/MrMurano/Commander-Entry.rb +9 -4
- data/lib/MrMurano/Config-Migrate.rb +2 -0
- data/lib/MrMurano/Config.rb +94 -26
- data/lib/MrMurano/Content.rb +1 -1
- data/lib/MrMurano/Exchange.rb +77 -42
- data/lib/MrMurano/Gateway.rb +1 -1
- data/lib/MrMurano/HttpAuthed.rb +20 -7
- data/lib/MrMurano/Logs.rb +10 -1
- data/lib/MrMurano/ProjectFile.rb +1 -1
- data/lib/MrMurano/ReCommander.rb +129 -73
- data/lib/MrMurano/Solution-ServiceConfig.rb +18 -11
- data/lib/MrMurano/Solution-Services.rb +78 -50
- data/lib/MrMurano/Solution-Users.rb +1 -1
- data/lib/MrMurano/Solution.rb +13 -63
- data/lib/MrMurano/SyncUpDown-Core.rb +185 -77
- data/lib/MrMurano/SyncUpDown-Item.rb +29 -4
- data/lib/MrMurano/SyncUpDown.rb +11 -11
- data/lib/MrMurano/Webservice-Cors.rb +1 -1
- data/lib/MrMurano/Webservice-Endpoint.rb +28 -17
- data/lib/MrMurano/Webservice-File.rb +103 -43
- data/lib/MrMurano/commands/domain.rb +1 -0
- data/lib/MrMurano/commands/element.rb +585 -0
- data/lib/MrMurano/commands/exchange.rb +211 -204
- data/lib/MrMurano/commands/gb.rb +1 -0
- data/lib/MrMurano/commands/globals.rb +17 -7
- data/lib/MrMurano/commands/init.rb +115 -101
- data/lib/MrMurano/commands/keystore.rb +1 -1
- data/lib/MrMurano/commands/logs.rb +2 -1
- data/lib/MrMurano/commands/postgresql.rb +17 -7
- data/lib/MrMurano/commands/service.rb +572 -0
- data/lib/MrMurano/commands/show.rb +7 -3
- data/lib/MrMurano/commands/solution.rb +2 -1
- data/lib/MrMurano/commands/solution_picker.rb +31 -15
- data/lib/MrMurano/commands/status.rb +205 -169
- data/lib/MrMurano/commands/sync.rb +70 -38
- data/lib/MrMurano/commands/token.rb +59 -14
- data/lib/MrMurano/commands/usage.rb +1 -0
- data/lib/MrMurano/commands.rb +2 -0
- data/lib/MrMurano/hash.rb +91 -0
- data/lib/MrMurano/http.rb +55 -6
- data/lib/MrMurano/makePretty.rb +47 -0
- data/lib/MrMurano/optparse.rb +60 -45
- data/lib/MrMurano/variegated/TruthyFalsey.rb +48 -0
- data/lib/MrMurano/variegated/ruby_dig.rb +64 -0
- data/lib/MrMurano/verbosing.rb +113 -3
- data/lib/MrMurano/version.rb +1 -1
- data/spec/Account_spec.rb +34 -20
- data/spec/Business_spec.rb +12 -9
- data/spec/Config_spec.rb +7 -1
- data/spec/Content_spec.rb +17 -1
- data/spec/GatewayBase_spec.rb +5 -2
- data/spec/GatewayDevice_spec.rb +4 -2
- data/spec/GatewayResource_spec.rb +4 -1
- data/spec/GatewaySettings_spec.rb +4 -1
- data/spec/HttpAuthed_spec.rb +73 -0
- data/spec/Http_spec.rb +32 -35
- data/spec/ProjectFile_spec.rb +1 -1
- data/spec/Solution-ServiceConfig_spec.rb +4 -1
- data/spec/Solution-ServiceEventHandler_spec.rb +6 -3
- data/spec/Solution-ServiceModules_spec.rb +4 -1
- data/spec/Solution-UsersRoles_spec.rb +4 -1
- data/spec/Solution_spec.rb +4 -1
- data/spec/SyncUpDown_spec.rb +1 -1
- data/spec/Webservice-Cors_spec.rb +4 -1
- data/spec/Webservice-Endpoint_spec.rb +9 -6
- data/spec/Webservice-File_spec.rb +17 -4
- data/spec/Webservice-Setting_spec.rb +6 -2
- data/spec/_workspace.rb +2 -0
- data/spec/cmd_common.rb +42 -13
- data/spec/cmd_content_spec.rb +17 -7
- data/spec/cmd_device_spec.rb +1 -1
- data/spec/cmd_domain_spec.rb +2 -2
- data/spec/cmd_element_spec.rb +400 -0
- data/spec/cmd_exchange_spec.rb +2 -2
- data/spec/cmd_init_spec.rb +59 -25
- data/spec/cmd_keystore_spec.rb +6 -3
- data/spec/cmd_link_spec.rb +10 -5
- data/spec/cmd_logs_spec.rb +1 -1
- data/spec/cmd_setting_application_spec.rb +18 -15
- data/spec/cmd_setting_product_spec.rb +7 -7
- data/spec/cmd_status_spec.rb +27 -17
- data/spec/cmd_syncdown_application_spec.rb +30 -3
- data/spec/cmd_syncdown_both_spec.rb +72 -18
- data/spec/cmd_syncup_spec.rb +71 -5
- data/spec/cmd_token_spec.rb +2 -2
- data/spec/cmd_usage_spec.rb +2 -2
- data/spec/dry_run_formatter.rb +27 -0
- data/spec/fixtures/dumped_config +8 -0
- data/spec/fixtures/exchange_element/element-show.json +1 -0
- data/spec/fixtures/exchange_element/swagger-mur-6407__10k.yaml +282 -0
- data/spec/fixtures/exchange_element/swagger-mur-6407__20k.yaml +588 -0
- data/spec/variegated_TruthyFalsey_spec.rb +29 -0
- metadata +51 -25
|
@@ -9,6 +9,7 @@ require 'inflecto'
|
|
|
9
9
|
require 'pathname'
|
|
10
10
|
require 'MrMurano/verbosing'
|
|
11
11
|
require 'MrMurano/SyncRoot'
|
|
12
|
+
require 'MrMurano/commands/solution_picker'
|
|
12
13
|
|
|
13
14
|
# Load options to control which things to sync
|
|
14
15
|
def cmd_option_syncable_pickers(cmd)
|
|
@@ -44,212 +45,247 @@ def cmd_defaults_syncable_pickers(options)
|
|
|
44
45
|
end
|
|
45
46
|
end
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
c.summary = %(Get the status of files)
|
|
50
|
-
c.description = %(
|
|
51
|
-
Get the status of files.
|
|
48
|
+
class StatusCmd
|
|
49
|
+
include MrMurano::Verbose
|
|
52
50
|
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
STATUS_CMD_DESCRIPTION = %(
|
|
52
|
+
The status command tells you the status of files
|
|
53
|
+
================================================
|
|
55
54
|
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
Compares the local project against what is up in Murano,
|
|
56
|
+
showing a summary of what things are new or changed.
|
|
58
57
|
|
|
59
|
-
|
|
58
|
+
With the --diff option, if an item has changes, the remote item and
|
|
59
|
+
local item are passed to a diff tool and that output is displayed.
|
|
60
|
+
|
|
61
|
+
- The diff tool and options to it can be set with the config key 'diff.cmd'.
|
|
60
62
|
|
|
61
63
|
Filters allow for selecting a subset of items to check based on patterns.
|
|
62
64
|
|
|
63
|
-
File glob filters can be used to select local files.
|
|
64
|
-
with the full file path.
|
|
65
|
+
- File glob filters can be used to select local files.
|
|
66
|
+
The glob is compared with the full file path.
|
|
65
67
|
|
|
66
68
|
Each item type also supports specific filters. These always start with #.
|
|
67
|
-
Endpoints can be selected with a "#<method>#<path glob>" pattern.
|
|
68
|
-
).gsub(/^ +/, '').strip
|
|
69
|
-
|
|
70
|
-
# Add flag: --type [application|product|all].
|
|
71
|
-
cmd_add_solntype_pickers(c)
|
|
72
|
-
|
|
73
|
-
c.option '--all', 'Check everything'
|
|
74
|
-
c.option '--[no-]asdown', %(Report as if syncdown instead of syncup)
|
|
75
|
-
c.option '--[no-]asup', %(Report as if syncup instead of syncdown (default: true))
|
|
76
|
-
c.option '--[no-]diff', %(For modified items, show a diff)
|
|
77
|
-
c.option '--[no-]grouped', %(Group all adds, deletes, and mods together)
|
|
78
|
-
c.option '--[no-]show-all', %(List unchanged as well)
|
|
79
|
-
c.option '--[no-]show-type', %(Include type of item)
|
|
80
|
-
cmd_option_syncable_pickers(c)
|
|
81
|
-
|
|
82
|
-
c.action do |args, options|
|
|
83
|
-
# SKIP: c.verify_arg_count!(args)
|
|
84
|
-
options.default(
|
|
85
|
-
all: nil,
|
|
86
|
-
asdown: nil,
|
|
87
|
-
asup: nil,
|
|
88
|
-
diff: false,
|
|
89
|
-
grouped: true,
|
|
90
|
-
show_all: false,
|
|
91
|
-
show_type: false,
|
|
92
|
-
# delete/create/update are not options the user can specify
|
|
93
|
-
# for status or diff commands; but the SyncUpDown class expects
|
|
94
|
-
# them.
|
|
95
|
-
delete: true,
|
|
96
|
-
create: true,
|
|
97
|
-
update: true,
|
|
98
|
-
)
|
|
99
|
-
cmd_defaults_solntype_pickers(options)
|
|
100
|
-
cmd_defaults_syncable_pickers(options)
|
|
101
|
-
|
|
102
|
-
def fmtr(item, options)
|
|
103
|
-
if item.key?(:local_path)
|
|
104
|
-
desc = item[:local_path].relative_path_from(Pathname.pwd).to_s
|
|
105
|
-
desc = "#{desc}:#{item[:line]}" if item.key?(:line) && item[:line] > 0
|
|
106
|
-
else
|
|
107
|
-
desc = item[:synckey]
|
|
108
|
-
end
|
|
109
|
-
return desc unless options.show_type
|
|
110
|
-
unless item[:pp_desc].to_s.empty? || item[:pp_desc] == item[:synckey]
|
|
111
|
-
desc += " (#{item[:pp_desc]})"
|
|
112
|
-
end
|
|
113
|
-
# NOTE: This path is the endpoint path.
|
|
114
|
-
desc += " [#{item[:method]} #{item[:path]}]" if item[:method] && item[:path]
|
|
115
|
-
desc
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def interject(msg)
|
|
119
|
-
MrMurano::Verbose.whirly_interject { say msg }
|
|
120
|
-
end
|
|
121
69
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
70
|
+
- E.g, Endpoints can be selected with a "#<method>#<path glob>" pattern.
|
|
71
|
+
).strip
|
|
72
|
+
|
|
73
|
+
def command_status(cmd)
|
|
74
|
+
cmd.syntax = %(murano status [--options] [filters])
|
|
75
|
+
cmd.summary = %(Get the status of files)
|
|
76
|
+
cmd.description = STATUS_CMD_DESCRIPTION
|
|
77
|
+
|
|
78
|
+
# Add flag: --type [application|product|all].
|
|
79
|
+
cmd_add_solntype_pickers(cmd)
|
|
80
|
+
|
|
81
|
+
cmd.option '--all', 'Check everything'
|
|
82
|
+
cmd.option '--[no-]asdown', %(Report as if syncdown instead of syncup)
|
|
83
|
+
cmd.option '--[no-]asup', %(Report as if syncup instead of syncdown (default: true))
|
|
84
|
+
cmd.option '--[no-]diff', %(For modified items, show a diff)
|
|
85
|
+
cmd.option '--[no-]grouped', %(Group all adds, deletes, and mods together)
|
|
86
|
+
cmd.option '--[no-]show-all', %(List unchanged as well)
|
|
87
|
+
cmd.option '--[no-]show-type', %(Include type of item)
|
|
88
|
+
cmd_option_syncable_pickers(cmd)
|
|
89
|
+
|
|
90
|
+
cmd.example %(Show item statuses for dirty items:
|
|
91
|
+
#
|
|
92
|
+
# - Items that exist locally by not on the remote;
|
|
93
|
+
# - Items that exist remotely by not on the local;
|
|
94
|
+
# - Items that have differences between the local and remote sources
|
|
95
|
+
), %(murano status)
|
|
96
|
+
|
|
97
|
+
cmd.example %(Show differences between local Services (event handlers)
|
|
98
|
+
# and those configured on the platform
|
|
99
|
+
), %(murano diff -S)
|
|
100
|
+
|
|
101
|
+
cmd.example %(Show differences between local Endpoints and those configured
|
|
102
|
+
# on the platform but only files starting with "example",
|
|
103
|
+
# e.g., "endpoints/example1.lua", "endpoints/example-foo.lua", etc.
|
|
104
|
+
#
|
|
105
|
+
# NOTE: Use single quotes to prevent shell interpolation of the '*'.
|
|
106
|
+
), %(murano diff -E 'endpoints/example*')
|
|
107
|
+
|
|
108
|
+
cmd.example %(Show status of specific files
|
|
109
|
+
), %(murano status services/user.lua endpoints/example.lua)
|
|
110
|
+
|
|
111
|
+
cmd.action do |args, options|
|
|
112
|
+
# SKIP: cmd.verify_arg_count!(args)
|
|
113
|
+
options.default(
|
|
114
|
+
all: nil,
|
|
115
|
+
asdown: nil,
|
|
116
|
+
asup: nil,
|
|
117
|
+
diff: false,
|
|
118
|
+
grouped: true,
|
|
119
|
+
show_all: false,
|
|
120
|
+
show_type: false,
|
|
121
|
+
# delete/create/update are not options the user can specify
|
|
122
|
+
# for status or diff commands; but the SyncUpDown class expects
|
|
123
|
+
# them.
|
|
124
|
+
delete: true,
|
|
125
|
+
create: true,
|
|
126
|
+
update: true,
|
|
125
127
|
)
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
pretty_group_header(
|
|
140
|
-
ret[:tomod], 'Items that differ', 'that differs', options.grouped
|
|
141
|
-
)
|
|
142
|
-
ret[:tomod].each do |item|
|
|
143
|
-
interject " M #{item[:pp_type]} #{highlight_chg(fmtr(item, options))}"
|
|
144
|
-
interject item[:diff] if options.diff
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
unless ret[:skipd].empty?
|
|
148
|
-
pretty_group_header(
|
|
149
|
-
ret[:skipd], 'Items without a solution', 'without a solution', options.grouped
|
|
150
|
-
)
|
|
151
|
-
ret[:skipd].each do |item|
|
|
152
|
-
interject " - #{item[:pp_type]} #{highlight_del(fmtr(item, options))}"
|
|
128
|
+
cmd_defaults_solntype_pickers(options)
|
|
129
|
+
cmd_defaults_syncable_pickers(options)
|
|
130
|
+
|
|
131
|
+
@grouped = { toadd: [], todel: [], tomod: [], unchg: [], skipd: [], clash: [] }
|
|
132
|
+
|
|
133
|
+
# Check that user doesn't try to asdown and asup, or no-asdown and no-asup.
|
|
134
|
+
if options.asdown.nil? && options.asup.nil?
|
|
135
|
+
options.asdown = false
|
|
136
|
+
options.asup = true
|
|
137
|
+
elsif !options.asdown.nil? && !options.asup.nil?
|
|
138
|
+
unless options.asdown ^ options.asup
|
|
139
|
+
error('Please specify either --asdown or --asup, but not both!')
|
|
140
|
+
exit 1
|
|
153
141
|
end
|
|
142
|
+
elsif options.asdown.nil?
|
|
143
|
+
options.asdown = !options.asup
|
|
144
|
+
elsif options.asup.nil?
|
|
145
|
+
options.asup = !options.asdown
|
|
146
|
+
else
|
|
147
|
+
raise('Unexpected code path.')
|
|
154
148
|
end
|
|
155
149
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
150
|
+
MrMurano::SyncRoot.instance.each_filtered(options.__hash__) do |_name, type, klass, desc|
|
|
151
|
+
MrMurano::Verbose.whirly_msg "Fetching #{Inflecto.pluralize(desc)}..."
|
|
152
|
+
begin
|
|
153
|
+
syncable = klass.new
|
|
154
|
+
rescue MrMurano::ConfigError => err
|
|
155
|
+
MrMurano::Verbose.error "Could not fetch status for #{desc}: #{err}"
|
|
156
|
+
rescue StandardError => _err
|
|
157
|
+
raise
|
|
158
|
+
else
|
|
159
|
+
ret = syncable.status(options, args)
|
|
160
|
+
gmerge(ret, type, desc, options)
|
|
163
161
|
end
|
|
164
162
|
end
|
|
163
|
+
MrMurano::Verbose.whirly_stop
|
|
165
164
|
|
|
166
|
-
|
|
167
|
-
interject 'Unchanged:' if options.grouped
|
|
168
|
-
ret[:unchg].each { |item| interject " #{item[:pp_type]} #{fmtr(item, options)}" }
|
|
165
|
+
pretty(@grouped, options) if options.grouped
|
|
169
166
|
end
|
|
167
|
+
end
|
|
170
168
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
interject "#{header_any}:"
|
|
175
|
-
else
|
|
176
|
-
interject "Nothing #{header_empty}"
|
|
177
|
-
end
|
|
178
|
-
end
|
|
169
|
+
def interject(msg)
|
|
170
|
+
MrMurano::Verbose.whirly_interject { say msg }
|
|
171
|
+
end
|
|
179
172
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
173
|
+
def pretty(ret, options)
|
|
174
|
+
pretty_group_header(
|
|
175
|
+
ret[:toadd], 'Only on local machine', 'new locally', options.grouped
|
|
176
|
+
)
|
|
177
|
+
ret[:toadd].each do |item|
|
|
178
|
+
interject " + #{item[:pp_type]} #{highlight_chg(item[:locus])}"
|
|
179
|
+
pretty_diff(item, options)
|
|
183
180
|
end
|
|
184
181
|
|
|
185
|
-
|
|
186
|
-
|
|
182
|
+
pretty_group_header(
|
|
183
|
+
ret[:todel], 'Only on remote server', 'new remotely', options.grouped
|
|
184
|
+
)
|
|
185
|
+
ret[:todel].each do |item|
|
|
186
|
+
interject " - #{item[:pp_type]} #{highlight_del(item[:locus])}"
|
|
187
|
+
pretty_diff(item, options)
|
|
187
188
|
end
|
|
188
189
|
|
|
189
|
-
|
|
190
|
-
|
|
190
|
+
pretty_group_header(
|
|
191
|
+
ret[:tomod], 'Items that differ', 'that differs', options.grouped
|
|
192
|
+
)
|
|
193
|
+
ret[:tomod].each do |item|
|
|
194
|
+
interject " M #{item[:pp_type]} #{highlight_chg(item[:locus])}"
|
|
195
|
+
interject item[:diff] if options.diff
|
|
191
196
|
end
|
|
192
197
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
198
|
+
# 2018-04-24: (lb): If one or the other solutions is not setup (app or prod)
|
|
199
|
+
# don't care, and don't indicate to user that missing soln's items are dirty.
|
|
200
|
+
# MAYBE: (lb): We can probably delete this comment. Keeping until more confident.
|
|
201
|
+
#unless ret[:skipd].empty?
|
|
202
|
+
# pretty_group_header(
|
|
203
|
+
# ret[:skipd], 'Items without a solution', 'without a solution', options.grouped
|
|
204
|
+
# )
|
|
205
|
+
# ret[:skipd].each do |item|
|
|
206
|
+
# interject " - #{item[:pp_type]} #{highlight_del(item[:locus])}"
|
|
207
|
+
# end
|
|
208
|
+
#end
|
|
209
|
+
|
|
210
|
+
unless ret[:clash].empty?
|
|
211
|
+
pretty_group_header(
|
|
212
|
+
ret[:clash], 'Conflicting items', 'in conflict', options.grouped
|
|
213
|
+
)
|
|
214
|
+
ret[:clash].each do |item|
|
|
215
|
+
abbrev = $cfg['tool.ascii'] && 'x' || '✗'
|
|
216
|
+
interject " #{abbrev} #{item[:pp_type]} #{highlight_del(item[:locus])}"
|
|
199
217
|
end
|
|
218
|
+
end
|
|
200
219
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
item[:pp_desc] = desc
|
|
206
|
-
out[kind] << item
|
|
207
|
-
end
|
|
208
|
-
end
|
|
220
|
+
return unless options.show_all
|
|
221
|
+
interject 'Unchanged:' if options.grouped
|
|
222
|
+
ret[:unchg].each { |item| interject " #{item[:pp_type]} #{item[:locus]}" }
|
|
223
|
+
end
|
|
209
224
|
|
|
210
|
-
|
|
225
|
+
def pretty_group_header(group, header_any, header_empty, grouped)
|
|
226
|
+
return unless grouped
|
|
227
|
+
if !group.empty?
|
|
228
|
+
interject "#{header_any}:"
|
|
229
|
+
else
|
|
230
|
+
interject "Nothing #{header_empty}"
|
|
211
231
|
end
|
|
232
|
+
end
|
|
212
233
|
|
|
213
|
-
|
|
234
|
+
def pretty_diff(item, options)
|
|
235
|
+
return unless options.diff && $cfg['tool.verbose']
|
|
236
|
+
return unless !item[:diff].nil? && !item[:diff].empty?
|
|
237
|
+
interject item[:diff]
|
|
238
|
+
end
|
|
214
239
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
elsif options.asup.nil?
|
|
227
|
-
options.asup = !options.asdown
|
|
240
|
+
def highlight_chg(msg)
|
|
241
|
+
Rainbow(msg).green.bright
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def highlight_del(msg)
|
|
245
|
+
Rainbow(msg).red.bright
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def gmerge(ret, type, desc, options)
|
|
249
|
+
if options.grouped
|
|
250
|
+
out = @grouped
|
|
228
251
|
else
|
|
229
|
-
|
|
252
|
+
out = { toadd: [], todel: [], tomod: [], unchg: [], skipd: [], clash: [] }
|
|
230
253
|
end
|
|
231
254
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
raise
|
|
240
|
-
else
|
|
241
|
-
ret = syncable.status(options, args)
|
|
242
|
-
gmerge(ret, type, desc, options)
|
|
255
|
+
%i[toadd todel tomod unchg skipd clash].each do |kind|
|
|
256
|
+
ret[kind].each do |item|
|
|
257
|
+
hitem = item.to_h
|
|
258
|
+
hitem[:pp_type] = type
|
|
259
|
+
hitem[:pp_desc] = desc
|
|
260
|
+
hitem[:locus] = item.location_friendly(show_type: options.show_type)
|
|
261
|
+
out[kind] << hitem
|
|
243
262
|
end
|
|
244
263
|
end
|
|
245
|
-
MrMurano::Verbose.whirly_stop
|
|
246
264
|
|
|
247
|
-
pretty(
|
|
265
|
+
pretty(out, options) unless options.grouped
|
|
248
266
|
end
|
|
267
|
+
end # StatusCmd
|
|
268
|
+
|
|
269
|
+
def wire_cmd_status
|
|
270
|
+
status_cmd = StatusCmd.new
|
|
271
|
+
|
|
272
|
+
command(:status) { |cmd| status_cmd.command_status(cmd) }
|
|
273
|
+
alias_command(
|
|
274
|
+
'diff', 'status', '--diff', '--no-grouped',
|
|
275
|
+
)
|
|
276
|
+
alias_command(
|
|
277
|
+
'diff application', 'status', '--diff', '--no-grouped', '--type', 'application',
|
|
278
|
+
)
|
|
279
|
+
alias_command(
|
|
280
|
+
'diff product', 'status', '--diff', '--no-grouped', '--type', 'product',
|
|
281
|
+
)
|
|
282
|
+
alias_command(
|
|
283
|
+
'application diff', 'status', '--diff', '--no-grouped', '--type', 'application',
|
|
284
|
+
)
|
|
285
|
+
alias_command(
|
|
286
|
+
'product diff', 'status', '--diff', '--no-grouped', '--type', 'product',
|
|
287
|
+
)
|
|
249
288
|
end
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
alias_command 'diff product', 'status', '--diff', '--no-grouped', '--type', 'product'
|
|
253
|
-
alias_command 'application diff', 'status', '--diff', '--no-grouped', '--type', 'application'
|
|
254
|
-
alias_command 'product diff', 'status', '--diff', '--no-grouped', '--type', 'product'
|
|
289
|
+
|
|
290
|
+
wire_cmd_status
|
|
255
291
|
|
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
|
|
8
8
|
require 'MrMurano/verbosing'
|
|
9
9
|
require 'MrMurano/SyncRoot'
|
|
10
|
+
require 'MrMurano/commands/solution_picker'
|
|
10
11
|
require 'MrMurano/commands/status'
|
|
11
12
|
|
|
12
|
-
def sync_add_options(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
def sync_add_options(cmd, locale)
|
|
14
|
+
cmd.option '--[no-]delete', %(Don't delete things from #{locale})
|
|
15
|
+
cmd.option '--[no-]create', %(Don't create things on #{locale})
|
|
16
|
+
cmd.option '--[no-]update', %(Don't update things on #{locale})
|
|
17
|
+
cmd.option '--ignore-errors', %(Don't die on sync errors)
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
def syncdown_files(options, args=nil)
|
|
@@ -28,26 +29,40 @@ def syncdown_files(options, args=nil)
|
|
|
28
29
|
num_synced
|
|
29
30
|
end
|
|
30
31
|
|
|
31
|
-
command :syncdown do |
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
command :syncdown do |cmd|
|
|
33
|
+
cmd.syntax = %(murano syncdown [--options] [filters])
|
|
34
|
+
cmd.summary = %(Sync project down from Murano)
|
|
35
|
+
cmd.description = %(
|
|
35
36
|
Sync project down from Murano.
|
|
36
37
|
).strip
|
|
37
38
|
|
|
38
39
|
# Add flag: --type [application|product|all].
|
|
39
|
-
cmd_add_solntype_pickers(
|
|
40
|
+
cmd_add_solntype_pickers(cmd)
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
cmd_option_syncable_pickers(
|
|
43
|
-
sync_add_options(
|
|
42
|
+
cmd.option '--all', 'Sync everything'
|
|
43
|
+
cmd_option_syncable_pickers(cmd)
|
|
44
|
+
sync_add_options(cmd, 'local machine')
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
c.example %(Only Pull new static files), %(murano syncdown --files --no-delete --no-update)
|
|
46
|
+
cmd.example %(Make local be like what is on the server
|
|
47
|
+
), %(murano syncdown --all)
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
cmd.example %(Pull down new things, but don't delete or modify anything
|
|
50
|
+
), %(murano syncdown --all --no-delete --no-update)
|
|
51
|
+
|
|
52
|
+
cmd.example %(Only pull down new static files
|
|
53
|
+
), %(murano syncdown --assets --no-delete --no-update)
|
|
54
|
+
|
|
55
|
+
cmd.example %(Only pull down Endpoints whose filename starts with "example",
|
|
56
|
+
# e.g., "endpoints/example1.lua", "endpoints/example-foo.lua", etc.
|
|
57
|
+
#
|
|
58
|
+
# NOTE: Use single quotes to prevent shell interpolation of the '*'.
|
|
59
|
+
), %(murano syncdown -E 'endpoints/example*')
|
|
60
|
+
|
|
61
|
+
cmd.example %(Only pull down specific files
|
|
62
|
+
), %(murano syncdown services/user.lua endpoints/example.lua)
|
|
63
|
+
|
|
64
|
+
cmd.action do |args, options|
|
|
65
|
+
# SKIP: cmd.verify_arg_count!(args)
|
|
51
66
|
options.default(delete: true, create: true, update: true)
|
|
52
67
|
cmd_defaults_solntype_pickers(options)
|
|
53
68
|
cmd_defaults_syncable_pickers(options)
|
|
@@ -60,36 +75,53 @@ alias_command 'pull product', 'syncdown', '--no-delete', '--type', 'product'
|
|
|
60
75
|
alias_command 'application pull', 'syncdown', '--no-delete', '--type', 'application'
|
|
61
76
|
alias_command 'product pull', 'syncdown', '--no-delete', '--type', 'product'
|
|
62
77
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
78
|
+
def syncup_files(options, args=nil)
|
|
79
|
+
MrMurano::SyncRoot.instance.each_filtered(options) do |_name, _type, klass, desc|
|
|
80
|
+
MrMurano::Verbose.whirly_msg "Syncing #{Inflecto.pluralize(desc)}..."
|
|
81
|
+
sol = klass.new
|
|
82
|
+
sol.syncup(options, args)
|
|
83
|
+
end
|
|
84
|
+
MrMurano::Verbose.whirly_stop
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
command :syncup do |cmd|
|
|
88
|
+
cmd.syntax = %(murano syncup [--options] [filters])
|
|
89
|
+
cmd.summary = %(Sync project up into Murano)
|
|
90
|
+
cmd.description = %(
|
|
67
91
|
Sync project up into Murano.
|
|
68
92
|
).strip
|
|
69
93
|
|
|
70
94
|
# Add flag: --type [application|product|all].
|
|
71
|
-
cmd_add_solntype_pickers(
|
|
95
|
+
cmd_add_solntype_pickers(cmd)
|
|
96
|
+
|
|
97
|
+
cmd.option '--all', 'Sync everything'
|
|
98
|
+
cmd_option_syncable_pickers(cmd)
|
|
99
|
+
sync_add_options(cmd, 'server')
|
|
100
|
+
|
|
101
|
+
cmd.example %(Deploy project to server
|
|
102
|
+
), %(murano syncup --all)
|
|
103
|
+
|
|
104
|
+
cmd.example %(Update static files
|
|
105
|
+
), %(murano syncup --assets)
|
|
106
|
+
|
|
107
|
+
cmd.example %(Only add or modify static files
|
|
108
|
+
), %(murano syncup --assets --no-delete)
|
|
72
109
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
110
|
+
cmd.example %(Only update Endpoints whose filename starts with "example",
|
|
111
|
+
# e.g., "endpoints/example1.lua", "endpoints/example-foo.lua", etc.
|
|
112
|
+
#
|
|
113
|
+
# NOTE: Use single quotes to prevent shell interpolation of the '*'.
|
|
114
|
+
), %(murano syncup -E 'endpoints/example*')
|
|
76
115
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
c.example %(Only add or modify static files), %(murano syncup --files --no-delete)
|
|
116
|
+
cmd.example %(Only update specific files
|
|
117
|
+
), %(murano syncup services/user.lua endpoints/example.lua)
|
|
80
118
|
|
|
81
|
-
|
|
82
|
-
# SKIP:
|
|
119
|
+
cmd.action do |args, options|
|
|
120
|
+
# SKIP: cmd.verify_arg_count!(args)
|
|
83
121
|
options.default(delete: true, create: true, update: true)
|
|
84
122
|
cmd_defaults_solntype_pickers(options)
|
|
85
123
|
cmd_defaults_syncable_pickers(options)
|
|
86
|
-
|
|
87
|
-
MrMurano::SyncRoot.instance.each_filtered(options.__hash__) do |_name, _type, klass, desc|
|
|
88
|
-
MrMurano::Verbose.whirly_msg "Syncing #{Inflecto.pluralize(desc)}..."
|
|
89
|
-
sol = klass.new
|
|
90
|
-
sol.syncup(options, args)
|
|
91
|
-
end
|
|
92
|
-
MrMurano::Verbose.whirly_stop
|
|
124
|
+
syncup_files(options.__hash__, args)
|
|
93
125
|
end
|
|
94
126
|
end
|
|
95
127
|
alias_command 'push', 'syncup', '--no-delete'
|