MuranoCLI 2.0.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 +7 -0
- data/.gitignore +28 -0
- data/.rspec +2 -0
- data/.travis.yml +21 -0
- data/Gemfile +27 -0
- data/LICENSE.txt +19 -0
- data/MuranoCLI.gemspec +50 -0
- data/MuranoCLI.iss +50 -0
- data/README.markdown +208 -0
- data/Rakefile +188 -0
- data/TODO.taskpaper +122 -0
- data/bin/mr +8 -0
- data/bin/murano +84 -0
- data/docs/demo.md +109 -0
- data/lib/MrMurano/Account.rb +211 -0
- data/lib/MrMurano/Config-Migrate.rb +47 -0
- data/lib/MrMurano/Config.rb +286 -0
- data/lib/MrMurano/Mock.rb +63 -0
- data/lib/MrMurano/Product-1P-Device.rb +145 -0
- data/lib/MrMurano/Product-Resources.rb +195 -0
- data/lib/MrMurano/Product.rb +358 -0
- data/lib/MrMurano/ProjectFile.rb +349 -0
- data/lib/MrMurano/Solution-Cors.rb +46 -0
- data/lib/MrMurano/Solution-Endpoint.rb +177 -0
- data/lib/MrMurano/Solution-File.rb +150 -0
- data/lib/MrMurano/Solution-ServiceConfig.rb +140 -0
- data/lib/MrMurano/Solution-Services.rb +326 -0
- data/lib/MrMurano/Solution-Users.rb +129 -0
- data/lib/MrMurano/Solution.rb +59 -0
- data/lib/MrMurano/SubCmdGroupContext.rb +49 -0
- data/lib/MrMurano/SyncUpDown.rb +565 -0
- data/lib/MrMurano/commands/assign.rb +57 -0
- data/lib/MrMurano/commands/businessList.rb +45 -0
- data/lib/MrMurano/commands/completion.rb +152 -0
- data/lib/MrMurano/commands/config.rb +67 -0
- data/lib/MrMurano/commands/content.rb +130 -0
- data/lib/MrMurano/commands/cors.rb +30 -0
- data/lib/MrMurano/commands/domain.rb +17 -0
- data/lib/MrMurano/commands/gb.rb +33 -0
- data/lib/MrMurano/commands/init.rb +138 -0
- data/lib/MrMurano/commands/keystore.rb +157 -0
- data/lib/MrMurano/commands/logs.rb +78 -0
- data/lib/MrMurano/commands/mock.rb +63 -0
- data/lib/MrMurano/commands/password.rb +88 -0
- data/lib/MrMurano/commands/postgresql.rb +41 -0
- data/lib/MrMurano/commands/product.rb +14 -0
- data/lib/MrMurano/commands/productCreate.rb +39 -0
- data/lib/MrMurano/commands/productDelete.rb +33 -0
- data/lib/MrMurano/commands/productDevice.rb +84 -0
- data/lib/MrMurano/commands/productDeviceIdCmds.rb +86 -0
- data/lib/MrMurano/commands/productList.rb +45 -0
- data/lib/MrMurano/commands/productWrite.rb +27 -0
- data/lib/MrMurano/commands/show.rb +80 -0
- data/lib/MrMurano/commands/solution.rb +14 -0
- data/lib/MrMurano/commands/solutionCreate.rb +39 -0
- data/lib/MrMurano/commands/solutionDelete.rb +34 -0
- data/lib/MrMurano/commands/solutionList.rb +45 -0
- data/lib/MrMurano/commands/status.rb +92 -0
- data/lib/MrMurano/commands/sync.rb +60 -0
- data/lib/MrMurano/commands/timeseries.rb +115 -0
- data/lib/MrMurano/commands/tsdb.rb +271 -0
- data/lib/MrMurano/commands/usage.rb +23 -0
- data/lib/MrMurano/commands/zshcomplete.erb +112 -0
- data/lib/MrMurano/commands.rb +32 -0
- data/lib/MrMurano/hash.rb +20 -0
- data/lib/MrMurano/http.rb +153 -0
- data/lib/MrMurano/makePretty.rb +75 -0
- data/lib/MrMurano/schema/pf-v1.0.0.yaml +114 -0
- data/lib/MrMurano/schema/sf-v0.2.0.yaml +77 -0
- data/lib/MrMurano/schema/sf-v0.3.0.yaml +78 -0
- data/lib/MrMurano/template/mock.erb +9 -0
- data/lib/MrMurano/template/projectFile.murano.erb +81 -0
- data/lib/MrMurano/verbosing.rb +99 -0
- data/lib/MrMurano/version.rb +4 -0
- data/lib/MrMurano.rb +20 -0
- data/spec/Account-Passwords_spec.rb +242 -0
- data/spec/Account_spec.rb +272 -0
- data/spec/ConfigFile_spec.rb +50 -0
- data/spec/ConfigMigrate_spec.rb +89 -0
- data/spec/Config_spec.rb +409 -0
- data/spec/Http_spec.rb +204 -0
- data/spec/MakePretties_spec.rb +118 -0
- data/spec/Mock_spec.rb +53 -0
- data/spec/ProductBase_spec.rb +113 -0
- data/spec/ProductContent_spec.rb +162 -0
- data/spec/ProductResources_spec.rb +329 -0
- data/spec/Product_1P_Device_spec.rb +202 -0
- data/spec/Product_1P_RPC_spec.rb +175 -0
- data/spec/Product_spec.rb +153 -0
- data/spec/ProjectFile_spec.rb +324 -0
- data/spec/Solution-Cors_spec.rb +164 -0
- data/spec/Solution-Endpoint_spec.rb +581 -0
- data/spec/Solution-File_spec.rb +212 -0
- data/spec/Solution-ServiceConfig_spec.rb +202 -0
- data/spec/Solution-ServiceDevice_spec.rb +176 -0
- data/spec/Solution-ServiceEventHandler_spec.rb +385 -0
- data/spec/Solution-ServiceModules_spec.rb +465 -0
- data/spec/Solution-UsersRoles_spec.rb +207 -0
- data/spec/Solution_spec.rb +92 -0
- data/spec/SyncRoot_spec.rb +83 -0
- data/spec/SyncUpDown_spec.rb +495 -0
- data/spec/Verbosing_spec.rb +279 -0
- data/spec/_workspace.rb +27 -0
- data/spec/cmd_assign_spec.rb +51 -0
- data/spec/cmd_business_spec.rb +59 -0
- data/spec/cmd_common.rb +72 -0
- data/spec/cmd_config_spec.rb +68 -0
- data/spec/cmd_content_spec.rb +71 -0
- data/spec/cmd_cors_spec.rb +50 -0
- data/spec/cmd_device_spec.rb +96 -0
- data/spec/cmd_domain_spec.rb +32 -0
- data/spec/cmd_init_spec.rb +30 -0
- data/spec/cmd_keystore_spec.rb +97 -0
- data/spec/cmd_password_spec.rb +62 -0
- data/spec/cmd_status_spec.rb +239 -0
- data/spec/cmd_syncdown_spec.rb +86 -0
- data/spec/cmd_syncup_spec.rb +62 -0
- data/spec/cmd_usage_spec.rb +36 -0
- data/spec/fixtures/.mrmuranorc +9 -0
- data/spec/fixtures/ProjectFiles/invalid.yaml +9 -0
- data/spec/fixtures/ProjectFiles/only_meta.yaml +24 -0
- data/spec/fixtures/ProjectFiles/with_routes.yaml +27 -0
- data/spec/fixtures/SolutionFiles/0.2.0.json +20 -0
- data/spec/fixtures/SolutionFiles/0.2.0_invalid.json +18 -0
- data/spec/fixtures/SolutionFiles/0.2.json +21 -0
- data/spec/fixtures/SolutionFiles/0.3.0.json +20 -0
- data/spec/fixtures/SolutionFiles/0.3.0_invalid.json +19 -0
- data/spec/fixtures/SolutionFiles/0.3.json +20 -0
- data/spec/fixtures/SolutionFiles/basic.json +20 -0
- data/spec/fixtures/SolutionFiles/secret.json +6 -0
- data/spec/fixtures/configfile +9 -0
- data/spec/fixtures/dumped_config +42 -0
- data/spec/fixtures/mrmuranorc_deleted_bob +8 -0
- data/spec/fixtures/mrmuranorc_tool_bob +3 -0
- data/spec/fixtures/product_spec_files/example.exoline.spec.yaml +116 -0
- data/spec/fixtures/product_spec_files/example.murano.spec.yaml +14 -0
- data/spec/fixtures/product_spec_files/gwe.exoline.spec.yaml +21 -0
- data/spec/fixtures/product_spec_files/gwe.murano.spec.yaml +16 -0
- data/spec/fixtures/product_spec_files/lightbulb-no-state.yaml +11 -0
- data/spec/fixtures/product_spec_files/lightbulb.yaml +14 -0
- data/spec/fixtures/roles-three.yaml +11 -0
- data/spec/fixtures/syncable_content/assets/icon.png +0 -0
- data/spec/fixtures/syncable_content/assets/index.html +0 -0
- data/spec/fixtures/syncable_content/assets/js/script.js +0 -0
- data/spec/fixtures/syncable_content/modules/table_util.lua +58 -0
- data/spec/fixtures/syncable_content/routes/manyRoutes.lua +11 -0
- data/spec/fixtures/syncable_content/routes/singleRoute.lua +5 -0
- data/spec/fixtures/syncable_content/services/devdata.lua +18 -0
- data/spec/fixtures/syncable_content/services/timers.lua +4 -0
- data/spec/spec_helper.rb +119 -0
- metadata +498 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'MrMurano/Account'
|
|
2
|
+
|
|
3
|
+
command 'product list' do |c|
|
|
4
|
+
c.syntax = %{murano product list [options]}
|
|
5
|
+
c.description = %{List products}
|
|
6
|
+
c.option '--idonly', 'Only return the ids'
|
|
7
|
+
c.option '--[no-]all', 'Show all fields'
|
|
8
|
+
c.option '-o', '--output FILE', %{Download to file instead of STDOUT}
|
|
9
|
+
|
|
10
|
+
c.action do |args, options|
|
|
11
|
+
acc = MrMurano::Account.new
|
|
12
|
+
data = acc.products
|
|
13
|
+
|
|
14
|
+
io=nil
|
|
15
|
+
if options.output then
|
|
16
|
+
io = File.open(options.output, 'w')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if options.idonly then
|
|
20
|
+
headers = [:modelId]
|
|
21
|
+
data = data.map{|row| [row[:modelId]]}
|
|
22
|
+
elsif not options.all then
|
|
23
|
+
headers = [:label, :modelId]
|
|
24
|
+
data = data.map{|r| [r[:label], r[:modelId]]}
|
|
25
|
+
else
|
|
26
|
+
headers = data[0].keys
|
|
27
|
+
data = data.map{|r| headers.map{|h| r[h]}}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
acc.outf(data, io) do |dd, ios|
|
|
31
|
+
if options.idonly then
|
|
32
|
+
ios.puts dd.join(' ')
|
|
33
|
+
else
|
|
34
|
+
acc.tabularize({
|
|
35
|
+
:headers=>headers.map{|h| h.to_s},
|
|
36
|
+
:rows=>dd
|
|
37
|
+
}, ios)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
io.close unless io.nil?
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# vim: set ai et sw=2 ts=2 :
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'MrMurano/Product'
|
|
2
|
+
|
|
3
|
+
command 'product device write' do |c|
|
|
4
|
+
c.syntax = %{murano product device write <identifier> <alias> <value> ([<alias> <value>]…)}
|
|
5
|
+
c.summary = %{Write values into a device}
|
|
6
|
+
|
|
7
|
+
c.action do |args,options|
|
|
8
|
+
sn = args.shift
|
|
9
|
+
prd = MrMurano::Product.new
|
|
10
|
+
if (args.count % 2) != 0 then
|
|
11
|
+
prd.error "Last alias is missing a value to write."
|
|
12
|
+
else
|
|
13
|
+
data = Hash[*args]
|
|
14
|
+
ret = prd.write(sn, data)
|
|
15
|
+
prd.outf(ret) do |dd|
|
|
16
|
+
ret.each_pair do |k,v|
|
|
17
|
+
if v == 'ok' then
|
|
18
|
+
say "#{k.to_s}: #{v}"
|
|
19
|
+
else
|
|
20
|
+
prd.error "#{k.to_s}: #{v}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
# vim: set ai et sw=2 ts=2 :
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
|
|
2
|
+
command 'show' do |c|
|
|
3
|
+
c.syntax = %(murano show)
|
|
4
|
+
c.summary = %(Show readable information about the current configuration)
|
|
5
|
+
c.description = %(Show readable information about the current configuration)
|
|
6
|
+
|
|
7
|
+
c.action do |args, options|
|
|
8
|
+
|
|
9
|
+
if args.include?('help') then
|
|
10
|
+
::Commander::UI.enable_paging
|
|
11
|
+
say MrMurano::SubCmdGroupHelp.new(c).get_help
|
|
12
|
+
else
|
|
13
|
+
acc = MrMurano::Account.new
|
|
14
|
+
|
|
15
|
+
selectedBusinessId = $cfg['business.id']
|
|
16
|
+
selectedBusiness = nil
|
|
17
|
+
acc.businesses.each do |row|
|
|
18
|
+
selectedBusiness = row if row[:bizid] == selectedBusinessId
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
selectedProductId = $cfg['product.id']
|
|
22
|
+
selectedProduct = nil
|
|
23
|
+
acc.products.each do |row|
|
|
24
|
+
selectedProduct = row if row[:modelId] == selectedProductId
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
selectedSolutionId = $cfg['solution.id']
|
|
28
|
+
selectedSolution = nil
|
|
29
|
+
acc.solutions.each do |row|
|
|
30
|
+
selectedSolution = row if row[:apiId] == selectedSolutionId
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
if $cfg['user.name'] then
|
|
34
|
+
puts %(user: #{$cfg['user.name']})
|
|
35
|
+
else
|
|
36
|
+
puts 'no user selected'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
if selectedBusiness then
|
|
40
|
+
puts %(business: #{selectedBusiness[:name]})
|
|
41
|
+
else
|
|
42
|
+
puts 'no business selected'
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
if selectedProduct then
|
|
46
|
+
puts %(product: #{selectedProduct[:label]})
|
|
47
|
+
else
|
|
48
|
+
if selectedProductId then
|
|
49
|
+
puts 'selected product not in business'
|
|
50
|
+
else
|
|
51
|
+
puts 'no product selected'
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
if selectedSolution then
|
|
56
|
+
puts %(solution: https://#{selectedSolution[:domain]})
|
|
57
|
+
else
|
|
58
|
+
if selectedSolutionId then
|
|
59
|
+
puts 'selected solution not in business'
|
|
60
|
+
else
|
|
61
|
+
puts 'no solution selected'
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
command 'show location' do |c|
|
|
70
|
+
c.syntax = %(murano show location)
|
|
71
|
+
c.summary = %(Show readable location information)
|
|
72
|
+
c.description = %(Show readable information about the current configuration)
|
|
73
|
+
|
|
74
|
+
c.action do |args, options|
|
|
75
|
+
puts %(base: #{$cfg['location.base']})
|
|
76
|
+
$cfg['location'].each { |key, value| puts %(#{key}: #{$cfg['location.base']}/#{value}) }
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# vim: set ai et sw=2 ts=2 :
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'MrMurano/SubCmdGroupContext'
|
|
2
|
+
|
|
3
|
+
command :solution do |c|
|
|
4
|
+
c.syntax = %{murano solution}
|
|
5
|
+
c.summary = %{About Solution}
|
|
6
|
+
c.description = %{Sub-commands for working with solutions}
|
|
7
|
+
|
|
8
|
+
c.action do |args, options|
|
|
9
|
+
::Commander::UI.enable_paging
|
|
10
|
+
say MrMurano::SubCmdGroupHelp.new(c).get_help
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# vim: set ai et sw=2 ts=2 :
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
command 'solution create' do |c|
|
|
3
|
+
c.syntax = %{murano solution create <name>}
|
|
4
|
+
c.summary = %{Create a new solution}
|
|
5
|
+
c.option '--save', %{Save new solution id to config}
|
|
6
|
+
|
|
7
|
+
c.action do |args, options|
|
|
8
|
+
acc = MrMurano::Account.new
|
|
9
|
+
if args.count < 1 then
|
|
10
|
+
acc.error "Name of solution missing"
|
|
11
|
+
exit 1
|
|
12
|
+
end
|
|
13
|
+
name = args[0]
|
|
14
|
+
|
|
15
|
+
ret = acc.new_solution(name)
|
|
16
|
+
if ret.nil? then
|
|
17
|
+
acc.error "Create failed"
|
|
18
|
+
exit 5
|
|
19
|
+
end
|
|
20
|
+
if not ret.kind_of?(Hash) and not ret.empty? then
|
|
21
|
+
acc.error "Create failed: #{ret.to_s}"
|
|
22
|
+
exit 2
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# create doesn't return anything, so we need to go look for it.
|
|
26
|
+
ret = acc.solutions.select{|i| i[:domain] =~ /#{name}\./}
|
|
27
|
+
sid = ret.first[:apiId]
|
|
28
|
+
if sid.nil? or sid.empty? then
|
|
29
|
+
acc.error "Didn't find an apiId!!!! #{ret}"
|
|
30
|
+
exit 3
|
|
31
|
+
end
|
|
32
|
+
if options.save then
|
|
33
|
+
$cfg.set('solution.id', sid)
|
|
34
|
+
end
|
|
35
|
+
acc.outf sid
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
# vim: set ai et sw=2 ts=2 :
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'MrMurano/Account'
|
|
2
|
+
|
|
3
|
+
command 'solution delete' do |c|
|
|
4
|
+
c.syntax = %{murano solution delete <solution id>}
|
|
5
|
+
c.description = %{Delete a solution}
|
|
6
|
+
|
|
7
|
+
c.action do |args, options|
|
|
8
|
+
acc = MrMurano::Account.new
|
|
9
|
+
if args.count < 1 then
|
|
10
|
+
acc.error "Solution id or name missing"
|
|
11
|
+
return
|
|
12
|
+
end
|
|
13
|
+
name = args[0]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Need to convert what we got into the internal PID.
|
|
17
|
+
ret = (acc.solutions or []).select{|i| i.has_value?(name) or i[:domain] =~ /#{name}\./ }
|
|
18
|
+
|
|
19
|
+
if $cfg['tool.debug'] then
|
|
20
|
+
say "Matches found:"
|
|
21
|
+
acc.outf ret
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
if ret.empty? then
|
|
25
|
+
acc.error "No solution matching '#{name}' found. Nothing to delete."
|
|
26
|
+
else
|
|
27
|
+
ret = acc.delete_solution(ret.first[:sid])
|
|
28
|
+
if not ret.kind_of?(Hash) and not ret.empty? then
|
|
29
|
+
acc.error "Delete failed: #{ret.to_s}"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
# vim: set ai et sw=2 ts=2 :
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'MrMurano/Account'
|
|
2
|
+
require 'terminal-table'
|
|
3
|
+
|
|
4
|
+
command 'solution list' do |c|
|
|
5
|
+
c.syntax = %{murano solution list [options]}
|
|
6
|
+
c.description = %{List solutions}
|
|
7
|
+
c.option '--idonly', 'Only return the ids'
|
|
8
|
+
c.option '--[no-]all', 'Show all fields'
|
|
9
|
+
c.option '-o', '--output FILE', %{Download to file instead of STDOUT}
|
|
10
|
+
|
|
11
|
+
c.action do |args, options|
|
|
12
|
+
acc = MrMurano::Account.new
|
|
13
|
+
data = acc.solutions
|
|
14
|
+
|
|
15
|
+
io=nil
|
|
16
|
+
if options.output then
|
|
17
|
+
io = File.open(options.output, 'w')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
if options.idonly then
|
|
21
|
+
headers = [:apiId]
|
|
22
|
+
data = data.map{|row| [row[:apiId]]}
|
|
23
|
+
elsif not options.all then
|
|
24
|
+
headers = [:apiId, :domain]
|
|
25
|
+
data = data.map{|r| [r[:apiId], r[:domain]]}
|
|
26
|
+
else
|
|
27
|
+
headers = data[0].keys
|
|
28
|
+
data = data.map{|r| headers.map{|h| r[h]}}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
acc.outf(data, io) do |dd, ios|
|
|
32
|
+
if options.idonly then
|
|
33
|
+
ios.puts dd.join(' ')
|
|
34
|
+
else
|
|
35
|
+
acc.tabularize({
|
|
36
|
+
:headers=>headers.map{|h| h.to_s},
|
|
37
|
+
:rows=>dd
|
|
38
|
+
}, ios)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
io.close unless io.nil?
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# vim: set ai et sw=2 ts=2 :
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
|
|
2
|
+
command :status do |c|
|
|
3
|
+
c.syntax = %{murano status [options] [filters]}
|
|
4
|
+
c.summary = %{Get the status of files}
|
|
5
|
+
c.description = %{Get the status of files
|
|
6
|
+
|
|
7
|
+
Compares the local project against what is up in Murano, returning a summary of
|
|
8
|
+
what things are new or changed.
|
|
9
|
+
|
|
10
|
+
When --diff is passed, for items that have changes, the remote item and local
|
|
11
|
+
item are passed to a diff tool and that output is included.
|
|
12
|
+
|
|
13
|
+
The diff tool and options to it can be set with the config key 'diff.cmd'.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Filters allow for selecting a subset of items to check based on patterns.
|
|
17
|
+
|
|
18
|
+
File glob filters can be used to select local files. The glob is compared with
|
|
19
|
+
the full file path.
|
|
20
|
+
|
|
21
|
+
Each item type also supports specific filters. These always start with #.
|
|
22
|
+
Endpoints can be selected with a "#<method>#<path glob>" pattern.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
}.gsub(/^ +/,'')
|
|
26
|
+
c.option '--all', 'Check everything'
|
|
27
|
+
|
|
28
|
+
# Load options to control which things to status
|
|
29
|
+
MrMurano::SyncRoot.each_option do |s,l,d|
|
|
30
|
+
c.option s, l, d
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
c.option '--[no-]asdown', %{Report as if syncdown instead of syncup}
|
|
34
|
+
c.option '--[no-]diff', %{For modified items, show a diff}
|
|
35
|
+
c.option '--[no-]grouped', %{Group all adds, deletes, and mods together}
|
|
36
|
+
c.option '--[no-]showall', %{List unchanged as well}
|
|
37
|
+
|
|
38
|
+
c.action do |args,options|
|
|
39
|
+
options.default :delete=>true, :create=>true, :update=>true, :diff=>false,
|
|
40
|
+
:grouped => true
|
|
41
|
+
|
|
42
|
+
def fmtr(item)
|
|
43
|
+
if item.has_key? :local_path then
|
|
44
|
+
lp = item[:local_path].relative_path_from(Pathname.pwd()).to_s
|
|
45
|
+
if item.has_key?(:line) and item[:line] > 0 then
|
|
46
|
+
return "#{lp}:#{item[:line]}"
|
|
47
|
+
end
|
|
48
|
+
lp
|
|
49
|
+
else
|
|
50
|
+
item[:synckey]
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
def pretty(ret, options)
|
|
54
|
+
say "Adding:" if options.grouped
|
|
55
|
+
ret[:toadd].each{|item| say " + #{item[:pp_type]} #{fmtr(item)}"}
|
|
56
|
+
say "Deleteing:" if options.grouped
|
|
57
|
+
ret[:todel].each{|item| say " - #{item[:pp_type]} #{fmtr(item)}"}
|
|
58
|
+
say "Changing:" if options.grouped
|
|
59
|
+
ret[:tomod].each{|item|
|
|
60
|
+
say " M #{item[:pp_type]} #{fmtr(item)}"
|
|
61
|
+
say item[:diff] if options.diff
|
|
62
|
+
}
|
|
63
|
+
if options.showall then
|
|
64
|
+
say "Unchanged:" if options.grouped
|
|
65
|
+
ret[:unchg].each{|item| say " #{item[:pp_type]} #{fmtr(item)}"}
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
@grouped = {:toadd=>[],:todel=>[],:tomod=>[], :unchg=>[]}
|
|
70
|
+
def gmerge(ret, type, options)
|
|
71
|
+
if options.grouped then
|
|
72
|
+
[:toadd, :todel, :tomod, :unchg].each do |kind|
|
|
73
|
+
ret[kind].each{|item| item[:pp_type] = type; @grouped[kind] << item}
|
|
74
|
+
end
|
|
75
|
+
else
|
|
76
|
+
pretty(ret, options)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
MrMurano::SyncRoot.each_filtered(options.__hash__) do |name, type, klass|
|
|
81
|
+
sol = klass.new
|
|
82
|
+
ret = sol.status(options, args)
|
|
83
|
+
gmerge(ret, type, options)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
pretty(@grouped, options) if options.grouped
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
alias_command :diff, :status, '--diff', '--no-grouped'
|
|
91
|
+
|
|
92
|
+
# vim: set ai et sw=2 ts=2 :
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
|
|
2
|
+
command :syncdown do |c|
|
|
3
|
+
c.syntax = %{murano syncdown [options] [filters]}
|
|
4
|
+
c.description = %{Sync project down from Murano}
|
|
5
|
+
c.option '--all', 'Sync everything'
|
|
6
|
+
|
|
7
|
+
# Load options to control which things to sync
|
|
8
|
+
MrMurano::SyncRoot.each_option do |s,l,d|
|
|
9
|
+
c.option s, l, d
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
c.option '--[no-]delete', %{Don't delete things from server}
|
|
13
|
+
c.option '--[no-]create', %{Don't create things on server}
|
|
14
|
+
c.option '--[no-]update', %{Don't update things on server}
|
|
15
|
+
|
|
16
|
+
c.example %{Make local be like what is on the server}, %{murano syncdown --all}
|
|
17
|
+
c.example %{Pull down new things, but don't delete or modify anything}, %{murano syncdown --all --no-delete --no-update}
|
|
18
|
+
c.example %{Only Pull new static files}, %{murano syncdown --files --no-delete --no-update}
|
|
19
|
+
|
|
20
|
+
c.action do |args,options|
|
|
21
|
+
options.default :delete=>true, :create=>true, :update=>true
|
|
22
|
+
|
|
23
|
+
MrMurano::SyncRoot.each_filtered(options.__hash__) do |name, type, klass|
|
|
24
|
+
sol = klass.new
|
|
25
|
+
sol.syncdown(options, args)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
alias_command :pull, :syncdown, '--no-delete'
|
|
30
|
+
|
|
31
|
+
command :syncup do |c|
|
|
32
|
+
c.syntax = %{murano syncup [options] [filters]}
|
|
33
|
+
c.description = %{Sync project up into Murano}
|
|
34
|
+
c.option '--all', 'Sync everything'
|
|
35
|
+
|
|
36
|
+
# Load options to control which things to sync
|
|
37
|
+
MrMurano::SyncRoot.each_option do |s,l,d|
|
|
38
|
+
c.option s, l, d
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
c.option '--[no-]delete', %{Don't delete things from server}
|
|
42
|
+
c.option '--[no-]create', %{Don't create things on server}
|
|
43
|
+
c.option '--[no-]update', %{Don't update things on server}
|
|
44
|
+
|
|
45
|
+
c.example %{Deploy project to server}, %{murano syncup --all}
|
|
46
|
+
c.example %{Update static files}, %{murano syncup --files}
|
|
47
|
+
c.example %{Only add or modify static files}, %{murano syncup --files --no-delete}
|
|
48
|
+
|
|
49
|
+
c.action do |args,options|
|
|
50
|
+
options.default :delete=>true, :create=>true, :update=>true
|
|
51
|
+
|
|
52
|
+
MrMurano::SyncRoot.each_filtered(options.__hash__) do |name, type, klass|
|
|
53
|
+
sol = klass.new
|
|
54
|
+
sol.syncup(options, args)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
alias_command :push, :syncup, '--no-delete'
|
|
59
|
+
|
|
60
|
+
# vim: set ai et sw=2 ts=2 :
|