brightpearl-cli 1.9.0 → 1.10.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/lib/brightpearl_cli.rb +28 -18
- data/lib/core/config.rb +4 -0
- data/lib/core/config_unique.rb +0 -26
- data/lib/core/ebay.rb +37 -1
- data/lib/core/ebay_factory.rb +31 -17
- data/lib/core/git.rb +34 -9
- data/lib/core/terminal.rb +6 -2
- data/lib/routes/git_checkout.rb +11 -7
- data/lib/routes/git_merge.rb +57 -17
- data/lib/routes/git_update.rb +6 -6
- data/lib/routes/production_logs.rb +11 -19
- data/lib/routes/scripts_branch_cleaner.rb +2 -2
- data/lib/routes/scripts_sonar.rb +6 -0
- data/lib/routes/ssh.rb +80 -0
- data/lib/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae4119f560e1d2c52826ff48b55b943f5a45b2e2
|
4
|
+
data.tar.gz: 36e6d9e050013d1ea168c3175e86b19579047d49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f46eee364d52415d3dac658306739d24632c6782e65537fdb3a3e7ce321dd997a2a1211fa5e1c1dd8ad14a0ad7b2e628417d876c98d06eab40d5ce3fa4c493db
|
7
|
+
data.tar.gz: b555efa6bdded5ba86e2151532985080483f8c38528979b5820ad034dbb02083f46e125ff9e06bacbc7e49a66d4a35207326a54e612841e633763fd4fa667967
|
data/lib/brightpearl_cli.rb
CHANGED
@@ -47,6 +47,7 @@ require 'core/utils_files'
|
|
47
47
|
require 'core/utils_routes'
|
48
48
|
require 'core/utils_strings'
|
49
49
|
require 'routes/setup'
|
50
|
+
require 'routes/ssh'
|
50
51
|
|
51
52
|
module App
|
52
53
|
|
@@ -58,17 +59,17 @@ module App
|
|
58
59
|
App::Config.initialize
|
59
60
|
end
|
60
61
|
|
61
|
-
Convoy::App.create do |
|
62
|
+
Convoy::App.create do |app|
|
62
63
|
|
63
64
|
# COLOR OF TITLE TEXT
|
64
65
|
title_color = 255
|
65
66
|
|
66
|
-
|
67
|
-
|
68
|
-
|
67
|
+
app.version VERSION
|
68
|
+
app.summary "\x1B[38;5;166mBRIGHTPEARL-CLI\x1B[0m \x1B[38;5;240m\xe2\x80\x94 BETA\x1B[0m"
|
69
|
+
app.description "\x1B[38;5;#{title_color}mA command line utility for Brightpearl developers and QAs.\nUsed for automating daily work flows & completing repetitive tasks quicker with less errors.\nDesigned to work from anywhere on your workstation.\n\nUse #{App::Terminal::format_command('app')}\x1B[38;5;#{title_color}m or #{App::Terminal::format_command('bp')}\x1B[38;5;#{title_color}m to run.\x1B[0m"
|
69
70
|
|
70
71
|
# BUILD
|
71
|
-
|
72
|
+
app.command :build, :aliases => [:b] do |build|
|
72
73
|
build.summary 'Build (and deploy) Java services'
|
73
74
|
build.options do |opts|
|
74
75
|
opts.opt :serviceOnly, 'Build service only (default)', :short => '-s', :long => '--service-only', :type => :boolean
|
@@ -82,7 +83,7 @@ module App
|
|
82
83
|
end
|
83
84
|
|
84
85
|
# DUMMY
|
85
|
-
|
86
|
+
app.command :dummy, :aliases => [:d] do |dummy|
|
86
87
|
|
87
88
|
dummy.summary 'Insert dummy data into the App'
|
88
89
|
|
@@ -109,7 +110,7 @@ module App
|
|
109
110
|
end
|
110
111
|
|
111
112
|
# FIX
|
112
|
-
|
113
|
+
app.command :fix, :aliases => [:f] do |fix|
|
113
114
|
fix.summary 'Quick fixes for common problems'
|
114
115
|
fix.options do |opts|
|
115
116
|
opts.opt :login_sessions, 'LOGIN - Clear sessions to fix login problem(s)', :short => '-l', :long => '--login-sessions', :type => :boolean
|
@@ -122,7 +123,7 @@ module App
|
|
122
123
|
|
123
124
|
# GIT
|
124
125
|
|
125
|
-
|
126
|
+
app.command :git, :aliases => [:g] do |git|
|
126
127
|
|
127
128
|
git.summary 'All git related functionality'
|
128
129
|
|
@@ -198,6 +199,7 @@ module App
|
|
198
199
|
opts.opt :from_file, 'Get branch names from file (1 branch per line)', :short => '-f', :long => '--from-file', :type => :boolean
|
199
200
|
opts.opt :delete_source_branches_local, "Delete all source branches (locally) in #{App::Terminal::format_directory(App::Enum::GIT_MERGE_DEFAULT_FILE)}", :short => '-d', :long => '--delete-local', :type => :boolean
|
200
201
|
opts.opt :delete_source_branches_remote, "Delete all source branches (remotely) in #{App::Terminal::format_directory(App::Enum::GIT_MERGE_DEFAULT_FILE)}", :short => '-D', :long => '--delete-remote', :type => :boolean
|
202
|
+
opts.opt :sanity_check, 'Run sanity check. Submit source/target branches same as you would during a merge.', :short => '-s', :long => '--sanity-check', :type => :boolean
|
201
203
|
end
|
202
204
|
git_merge.action do |opts, args|
|
203
205
|
AppCommand::GitMerge.new(opts, args).execute
|
@@ -247,7 +249,7 @@ module App
|
|
247
249
|
end
|
248
250
|
|
249
251
|
# JIRA
|
250
|
-
|
252
|
+
app.command :jira, :aliases => [:j] do |jira|
|
251
253
|
jira.summary 'Access the Jira API'
|
252
254
|
|
253
255
|
# JIRA CARD
|
@@ -265,7 +267,7 @@ module App
|
|
265
267
|
end
|
266
268
|
|
267
269
|
# RESET
|
268
|
-
|
270
|
+
app.command :reset, :aliases => [:R] do |reset|
|
269
271
|
reset.summary 'Reset various things within the App'
|
270
272
|
reset.options do |opts|
|
271
273
|
opts.opt :fitnesseDump, 'Reset the Fitnesse Dump on your VM', :short => '-f', :long => '--fitnesse-dump', :type => :boolean
|
@@ -276,7 +278,7 @@ module App
|
|
276
278
|
end
|
277
279
|
|
278
280
|
# PRODUCTION
|
279
|
-
|
281
|
+
app.command :production, :aliases => [:p] do |production|
|
280
282
|
|
281
283
|
production.summary 'Everything to do with production servers'
|
282
284
|
|
@@ -303,7 +305,7 @@ module App
|
|
303
305
|
end
|
304
306
|
|
305
307
|
# REVIEW
|
306
|
-
|
308
|
+
app.command :review, :aliases => [:r] do |review|
|
307
309
|
review.summary 'Perform a quick code review'
|
308
310
|
review.action do |opts, args|
|
309
311
|
AppCommand::Review.new(opts, args).execute
|
@@ -311,7 +313,7 @@ module App
|
|
311
313
|
end
|
312
314
|
|
313
315
|
# SCRIPTS
|
314
|
-
|
316
|
+
app.command :scripts, :aliases => [:s] do |scripts|
|
315
317
|
|
316
318
|
scripts.summary 'Quick & dirty scripts'
|
317
319
|
|
@@ -378,8 +380,16 @@ module App
|
|
378
380
|
|
379
381
|
end
|
380
382
|
|
383
|
+
# SSH - SSH
|
384
|
+
app.command :ssh, :aliases => [:s] do |ssh|
|
385
|
+
ssh.summary 'SSH into various stuff.'
|
386
|
+
ssh.action do |opts, args|
|
387
|
+
AppCommand::SSH.new(opts, args).execute
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
381
391
|
# TAIL
|
382
|
-
|
392
|
+
app.command :tail, :aliases => [:T] do |tail|
|
383
393
|
tail.summary 'Tail various logs (all catalina.out by default)'
|
384
394
|
tail.action do |opts, args|
|
385
395
|
AppCommand::Tail.new(opts, args).execute
|
@@ -387,7 +397,7 @@ module App
|
|
387
397
|
end
|
388
398
|
|
389
399
|
# TEST
|
390
|
-
|
400
|
+
app.command :test, :aliases => [:t] do |test|
|
391
401
|
test.summary 'Run various tests (PHPUnit by default)'
|
392
402
|
test.options do |opts|
|
393
403
|
opts.opt :cucumber, 'Run Cucumber tests', :short => '-c', :long => '--cucumber', :type => :boolean
|
@@ -402,7 +412,7 @@ module App
|
|
402
412
|
end
|
403
413
|
|
404
414
|
# UPDATE
|
405
|
-
|
415
|
+
app.command :update, :aliases => [:u] do |update|
|
406
416
|
update.summary 'Check for updates'
|
407
417
|
update.action do |opts, args|
|
408
418
|
AppCommand::Update.new(opts, args).execute
|
@@ -410,7 +420,7 @@ module App
|
|
410
420
|
end
|
411
421
|
|
412
422
|
# X - SETUP
|
413
|
-
|
423
|
+
app.command :setup, :aliases => [:x] do |setup|
|
414
424
|
setup.summary 'Setup your configuration file'
|
415
425
|
setup.action do |opts, args|
|
416
426
|
AppCommand::Setup.new(opts, args).execute
|
@@ -418,7 +428,7 @@ module App
|
|
418
428
|
end
|
419
429
|
|
420
430
|
# BRIGHTPEARL/BP (DEFAULT)
|
421
|
-
|
431
|
+
app.action do
|
422
432
|
system('bp -h')
|
423
433
|
end
|
424
434
|
|
data/lib/core/config.rb
CHANGED
data/lib/core/config_unique.rb
CHANGED
@@ -32,9 +32,6 @@ module ConfigUnique
|
|
32
32
|
EC2_PASS = 'ec2_pass'
|
33
33
|
|
34
34
|
def param(param_name)
|
35
|
-
unless all_available_config_keys.include?(param_name)
|
36
|
-
App::Terminal::error("#{App::Terminal::format_highlight(param_name)} is not a valid config parameter", true)
|
37
|
-
end
|
38
35
|
@params[param_name]
|
39
36
|
end
|
40
37
|
|
@@ -87,27 +84,4 @@ module ConfigUnique
|
|
87
84
|
]
|
88
85
|
end
|
89
86
|
|
90
|
-
def all_available_config_keys
|
91
|
-
[
|
92
|
-
WORKSTATION_IP,
|
93
|
-
WORKSTATION_OS,
|
94
|
-
WORKSTATION_PATH_TO_BP_CODE,
|
95
|
-
WORKSTATION_PATH_TO_BP_DB,
|
96
|
-
VM_IP,
|
97
|
-
VM_USER,
|
98
|
-
VM_USER_PASSWORD,
|
99
|
-
VM_ROOT,
|
100
|
-
VM_ROOT_PASSWORD,
|
101
|
-
VM_MYSQL_USER,
|
102
|
-
VM_MYSQL_PASSWORD,
|
103
|
-
PREFERRED_TEXT_EDITOR,
|
104
|
-
GIT_USERNAME,
|
105
|
-
CRYPT_KEY,
|
106
|
-
CRYPT_HEX,
|
107
|
-
EC2_HOST,
|
108
|
-
EC2_USER,
|
109
|
-
EC2_PASS
|
110
|
-
]
|
111
|
-
end
|
112
|
-
|
113
87
|
end
|
data/lib/core/ebay.rb
CHANGED
@@ -2,7 +2,43 @@ module App
|
|
2
2
|
|
3
3
|
class Ebay
|
4
4
|
|
5
|
-
|
5
|
+
SANDBOX = 'sandbox'
|
6
|
+
SANDBOX_URL = 'https://api.sandbox.ebay.com/ws/api.dll'
|
7
|
+
|
8
|
+
PRODUCTION = 'production'
|
9
|
+
PRODUCTION_URL = 'https://api.ebay.com/ws/api.dll'
|
10
|
+
|
11
|
+
def initialize(app_key, dev_key, cert_key, runame, api_url, api_token)
|
12
|
+
|
13
|
+
@app_key = app_key
|
14
|
+
@dev_key = dev_key
|
15
|
+
@cert_key = cert_key
|
16
|
+
@runame = runame
|
17
|
+
@api_url = api_url
|
18
|
+
@api_token = api_token
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
# findItemsByKeywordsRequest
|
23
|
+
def find(search_term = nil)
|
24
|
+
|
25
|
+
if search_term.nil?
|
26
|
+
raise RuntimeError, 'Search term cannot be nil.'
|
27
|
+
end
|
28
|
+
|
29
|
+
payload = "<?xml version=\"1.0\" encoding=\"utf-8\"?><findItemsByKeywordsRequest xmlns=\"http://www.ebay.com/marketplace/search/v1/services\"><keywords>#{search_term}</keywords></findItemsByKeywordsRequest>"
|
30
|
+
headers = {
|
31
|
+
'X-EBAY-SOA-SERVICE-NAME' => 'FindingService',
|
32
|
+
'X-EBAY-SOA-OPERATION-NAME' => 'findItemsByKeywords',
|
33
|
+
'X-EBAY-SOA-SERVICE-VERSION' => '1.13.0',
|
34
|
+
'X-EBAY-SOA-GLOBAL-ID' => 'EBAY-GB',
|
35
|
+
'X-EBAY-SOA-SECURITY-APPNAME' => @app_key,
|
36
|
+
'X-EBAY-SOA-REQUEST-DATA-FORMAT' => 'XML'
|
37
|
+
}
|
38
|
+
|
39
|
+
response = RestClient.post(@api_url, payload, headers)
|
40
|
+
|
41
|
+
puts response.inspect
|
6
42
|
|
7
43
|
end
|
8
44
|
|
data/lib/core/ebay_factory.rb
CHANGED
@@ -2,30 +2,44 @@ module App
|
|
2
2
|
|
3
3
|
class EbayFactory
|
4
4
|
|
5
|
-
|
5
|
+
CONFIGURATION_PREFIX = 'ebay_'
|
6
6
|
|
7
7
|
@credentials = {}
|
8
8
|
|
9
|
-
def self.get(
|
9
|
+
def self.get(sandbox_production = App::Ebay::SANDBOX, api_token = nil)
|
10
10
|
|
11
|
-
if
|
11
|
+
if api_token.nil?
|
12
|
+
raise RuntimeError, 'You must provide an API token.'
|
13
|
+
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# App::Terminal::error('EC2 access data not found', ["The command you're trying to run requires access to an EC2 database.", "In order for this to work you will need valid #{App::Terminal::format_highlight('access data')}.", "Please speak to #{App::Terminal::format_highlight('Albert')} (or team Raptor) for more info."], true)
|
19
|
-
# end
|
20
|
-
# @ec2_connection = Mysql2::Client.new(
|
21
|
-
# :host => encrypter.decrypt(host),
|
22
|
-
# :username => encrypter.decrypt(user),
|
23
|
-
# :password => encrypter.decrypt(pass),
|
24
|
-
# :database => schema
|
25
|
-
# )
|
15
|
+
if api_token =~ /\Aebay_\S+\z/i
|
16
|
+
api_token_final = api_token
|
17
|
+
else
|
18
|
+
api_token_final = "#{CONFIGURATION_PREFIX}#{api_token}"
|
19
|
+
end
|
26
20
|
|
21
|
+
if api_token.nil? || App::Config::param_exists(api_token_final) == false
|
22
|
+
App::Terminal::error('Invalid API Token', "The #{App::Terminal::format_highlight('config parameter')} #{App::Terminal::format_invalid(api_token_final)} doesn't exist in: #{App::Terminal::format_directory(ConfigUnique::CONFIG_FILE)}", true)
|
27
23
|
end
|
28
|
-
|
24
|
+
|
25
|
+
case sandbox_production
|
26
|
+
when App::Ebay::SANDBOX
|
27
|
+
app_key = App::Config.param(ConfigUnique::EBAY_SANDBOX_APP)
|
28
|
+
dev_key = App::Config.param(ConfigUnique::EBAY_SANDBOX_DEV)
|
29
|
+
cert_key = App::Config.param(ConfigUnique::EBAY_SANDBOX_CERT)
|
30
|
+
runame = App::Config.param(ConfigUnique::EBAY_SANDBOX_RUNAME)
|
31
|
+
api_url = App::Ebay::SANDBOX_URL
|
32
|
+
when App::Ebay::PRODUCTION
|
33
|
+
app_key = App::Config.param(ConfigUnique::EBAY_PRODUCTION_APP)
|
34
|
+
dev_key = App::Config.param(ConfigUnique::EBAY_PRODUCTION_DEV)
|
35
|
+
cert_key = App::Config.param(ConfigUnique::EBAY_PRODUCTION_CERT)
|
36
|
+
runame = App::Config.param(ConfigUnique::EBAY_PRODUCTION_RUNAME)
|
37
|
+
api_url = App::Ebay::PRODUCTION_URL
|
38
|
+
else
|
39
|
+
raise RuntimeError, "Must specify either '#{App::Ebay::SANDBOX}' or '#{App::Ebay::PRODUCTION}', you passed: #{sandbox_production}"
|
40
|
+
end
|
41
|
+
|
42
|
+
App::Ebay.new(app_key, dev_key, cert_key, runame, api_url, api_token)
|
29
43
|
|
30
44
|
end
|
31
45
|
|
data/lib/core/git.rb
CHANGED
@@ -597,16 +597,16 @@ module App
|
|
597
597
|
case display
|
598
598
|
when SAME_BRANCH_WARNING
|
599
599
|
App::Terminal::warning("You're on #{App::Terminal::format_highlight('2 different branches')}", [
|
600
|
-
|
601
|
-
|
602
|
-
|
600
|
+
"#{App::Terminal::format_directory(get_repo_shorthand(App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE)))} is on #{App::Terminal::format_branch(branch_code)}",
|
601
|
+
"#{App::Terminal::format_directory(get_repo_shorthand(App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_DB)))} is on #{App::Terminal::format_branch(branch_db)}"
|
602
|
+
])
|
603
603
|
when SAME_BRANCH_ERROR
|
604
604
|
App::Terminal::error("You're on #{App::Terminal::format_highlight('2 different branches')}", [
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
605
|
+
"#{App::Terminal::format_directory(get_repo_shorthand(App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE)))} is on #{App::Terminal::format_branch(branch_code)}",
|
606
|
+
"#{App::Terminal::format_directory(get_repo_shorthand(App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_DB)))} is on #{App::Terminal::format_branch(branch_db)}",
|
607
|
+
nil,
|
608
|
+
'You cannot run this command unless both of your repos are on the same branch.'
|
609
|
+
])
|
610
610
|
end
|
611
611
|
return false
|
612
612
|
end
|
@@ -792,7 +792,7 @@ module App
|
|
792
792
|
possible_branches = []
|
793
793
|
if jira_number =~ /\A\d{4,5}\z/
|
794
794
|
get_all_branches_as_array.each do |possible_branch|
|
795
|
-
if possible_branch =~
|
795
|
+
if possible_branch =~ /#{jira_number}/i
|
796
796
|
# If more than one possible branch exists, IE: bug-14145 & bp-14145
|
797
797
|
if possible_branches.any?
|
798
798
|
App::Terminal::error("More than one possible branch found for jira number: #{App::Terminal::format_highlight(jira_number)}", [App::Terminal::format_branch(possible_branches[0]), App::Terminal::format_branch(possible_branch), nil, "In this case, you must specify the branch name #{App::Terminal::format_highlight('explicitly')}."], true)
|
@@ -824,6 +824,31 @@ module App
|
|
824
824
|
changes_exist
|
825
825
|
end
|
826
826
|
|
827
|
+
# Pass the result of App::Terminal::command() and this should do the rest. Bombs out if you don't confirm.
|
828
|
+
# @return void
|
829
|
+
def check_for_conflicts(result, additional_info = nil)
|
830
|
+
final_info = []
|
831
|
+
unless additional_info.nil?
|
832
|
+
if additional_info.is_a? Array
|
833
|
+
additional_info.each do |info|
|
834
|
+
final_info << info
|
835
|
+
end
|
836
|
+
else
|
837
|
+
if additional_info.is_a? String
|
838
|
+
final_info << additional_info
|
839
|
+
else
|
840
|
+
raise RuntimeError, "Expected String, got: #{additional_info.class}"
|
841
|
+
end
|
842
|
+
end
|
843
|
+
end
|
844
|
+
final_info << "Please #{App::Terminal::format_action('open an IDE')} and resolve your conflicts before continuing."
|
845
|
+
if result == false
|
846
|
+
unless App::Terminal::prompt_yes_no('Merge conflict occurred', final_info, "Have you #{App::Terminal::format_highlight('resolved your conflicts', true)}\x1B[38;5;89m and #{App::Terminal::format_action('committed')}\x1B[38;5;89m the changes?")
|
847
|
+
App::Terminal::abort(nil, nil, true, false)
|
848
|
+
end
|
849
|
+
end
|
850
|
+
end
|
851
|
+
|
827
852
|
# Get list of files that have changed between 2 branches
|
828
853
|
# @return Array
|
829
854
|
def get_changed_files(repo_dir, branch_to_compare_to = "origin/#{App::Git::MASTER}")
|
data/lib/core/terminal.rb
CHANGED
@@ -199,8 +199,12 @@ module App
|
|
199
199
|
|
200
200
|
# Returns action text in consistent, uniform manner.
|
201
201
|
# @return String
|
202
|
-
def self.format_highlight(highlighted_text)
|
203
|
-
|
202
|
+
def self.format_highlight(highlighted_text, capitalize = false)
|
203
|
+
if capitalize
|
204
|
+
return "\x1B[38;5;117m#{highlighted_text.upcase}\x1B[0m"
|
205
|
+
else
|
206
|
+
return "\x1B[38;5;117m#{highlighted_text}\x1B[0m"
|
207
|
+
end
|
204
208
|
end
|
205
209
|
|
206
210
|
# Returns invalid data in consistent, uniform manner.
|
data/lib/routes/git_checkout.rb
CHANGED
@@ -16,15 +16,12 @@ module AppCommand
|
|
16
16
|
def opts_validate
|
17
17
|
|
18
18
|
unless @args.any?
|
19
|
-
|
20
19
|
if @opts[:branch] || @opts[:branch_origin]
|
21
20
|
App::Terminal::error('You must specify a branch name')
|
22
21
|
else
|
23
22
|
system('bp g co -h')
|
24
23
|
end
|
25
|
-
|
26
24
|
exit
|
27
|
-
|
28
25
|
end
|
29
26
|
|
30
27
|
end
|
@@ -145,14 +142,21 @@ module AppCommand
|
|
145
142
|
unless branch_data_inner[:"#{App::Git::BRANCH_IS_CURRENT}"]
|
146
143
|
commands << "git checkout #{branch_to_checkout}"
|
147
144
|
end
|
145
|
+
App::Terminal::command(commands, repo_dir)
|
148
146
|
if @opts[:update] || @opts[:updatePush]
|
149
|
-
commands
|
150
|
-
|
147
|
+
commands = [
|
148
|
+
'git pull',
|
149
|
+
"git merge #{App::Git::MASTER} --no-edit"
|
150
|
+
]
|
151
|
+
results = App::Terminal::command(commands, repo_dir, true, false)
|
152
|
+
@git.check_for_conflicts(results[1], "Unable to successfully merge #{App::Terminal::format_branch(App::Git::MASTER)} into #{App::Terminal::format_branch(branch_to_checkout)} on #{App::Terminal::format_directory(@git.get_repo_shorthand(repo_dir))}")
|
151
153
|
end
|
152
154
|
if @opts[:updatePush]
|
153
|
-
commands
|
155
|
+
commands =[
|
156
|
+
'git push'
|
157
|
+
]
|
158
|
+
App::Terminal::command(commands, repo_dir, true, false)
|
154
159
|
end
|
155
|
-
App::Terminal::command(commands, repo_dir)
|
156
160
|
count = count + 1
|
157
161
|
end
|
158
162
|
@git.check_for_same_branch
|
data/lib/routes/git_merge.rb
CHANGED
@@ -23,13 +23,13 @@ module AppCommand
|
|
23
23
|
end
|
24
24
|
|
25
25
|
unless @args.any?
|
26
|
-
unless @opts[:from_file] || @opts[:open_file] || @opts[:delete_source_branches_local] || @opts[:delete_source_branches_remote]
|
26
|
+
unless @opts[:from_file] || @opts[:open_file] || @opts[:delete_source_branches_local] || @opts[:delete_source_branches_remote] || @otps[:sanity_check]
|
27
27
|
system('bp g m -h')
|
28
28
|
exit
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
if @args[0] == App::Git::MASTER
|
32
|
+
if @args[0] == App::Git::MASTER && !@opts[:from_file]
|
33
33
|
App::Terminal::error('Not allowed', "You cannot merge #{App::Terminal::format_branch(App::Git::MASTER)}\x1B[38;5;240m to #{App::Terminal::format_branch(App::Git::MASTER)}", true)
|
34
34
|
end
|
35
35
|
|
@@ -38,9 +38,7 @@ module AppCommand
|
|
38
38
|
App::Terminal::error('Too many parameters', ["When using the #{App::Terminal::format_flag('f')}\x1B[38;5;240m the system only expects one #{App::Terminal::format_action('optional')}\x1B[38;5;240m parameter \xe2\x80\x94 the target branch.", "The amount of parameters you passed were: #{App::Terminal::format_highlight(@args.length)}"], true)
|
39
39
|
end
|
40
40
|
if @opts[:from_file] != '' && File.file?(App::Enum::GIT_MERGE_DEFAULT_FILE) == false
|
41
|
-
App::Terminal::error("File not found: #{App::Terminal::format_directory(App::Enum::GIT_MERGE_DEFAULT_FILE)}", [
|
42
|
-
"To specify multiple #{App::Terminal::format_branch('source-branches')} try running #{App::Terminal::format_command('bp g m -o')} first."
|
43
|
-
], true)
|
41
|
+
App::Terminal::error("File not found: #{App::Terminal::format_directory(App::Enum::GIT_MERGE_DEFAULT_FILE)}", ["To specify multiple #{App::Terminal::format_branch('source-branches')} try running #{App::Terminal::format_command('bp g m -o')} first."], true)
|
44
42
|
end
|
45
43
|
end
|
46
44
|
|
@@ -51,7 +49,10 @@ module AppCommand
|
|
51
49
|
retrieve_source_branches unless @opts[:open_file]
|
52
50
|
retrieve_target_branches unless @opts[:open_file]
|
53
51
|
|
54
|
-
if @opts[:
|
52
|
+
if @opts[:sanity_check]
|
53
|
+
sanity_check
|
54
|
+
exit
|
55
|
+
elsif @opts[:open_file]
|
55
56
|
system("#{App::Config.param(App::Config::PREFERRED_TEXT_EDITOR)} #{App::Enum::GIT_MERGE_DEFAULT_FILE}")
|
56
57
|
exit
|
57
58
|
elsif @opts[:delete_source_branches_local]
|
@@ -327,14 +328,7 @@ module AppCommand
|
|
327
328
|
|
328
329
|
App::Terminal::success('It seems as if everything ran smoothly', "#{@source_branches.count} #{(@source_branches.count) == 1 ? 'branch has' : 'branches have'} been successfully merged to #{App::Terminal::format_branch(@target_branch)}")
|
329
330
|
|
330
|
-
|
331
|
-
@source_branches.each do |x|
|
332
|
-
grep_string = x.split('-')
|
333
|
-
grep_string = "BP-#{grep_string[grep_string.count - 1]}"
|
334
|
-
puts "\x1B[38;5;39m#{x}\x1B[0m \xe2\x80\x94 (#{grep_string})"
|
335
|
-
system("cd #{App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE)} && git log | grep '#{grep_string}' --color=auto")
|
336
|
-
system("cd #{App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_DB)} && git log | grep '#{grep_string}' --color=auto")
|
337
|
-
end
|
331
|
+
sanity_check
|
338
332
|
puts
|
339
333
|
|
340
334
|
@git.check_for_stash(true)
|
@@ -367,6 +361,30 @@ module AppCommand
|
|
367
361
|
|
368
362
|
end
|
369
363
|
|
364
|
+
def sanity_check
|
365
|
+
|
366
|
+
App::Terminal::info("Running sanity check against: #{App::Terminal::format_branch(@target_branch)}")
|
367
|
+
|
368
|
+
@source_branches.each do |source_branch|
|
369
|
+
|
370
|
+
jira_numbers = source_branch.scan(/\d{4,5}/i)
|
371
|
+
if jira_numbers.any?
|
372
|
+
jira_numbers.each do |jira_number|
|
373
|
+
unless jira_number == ''
|
374
|
+
sanity_check_grep(jira_number, source_branch, @target_branch)
|
375
|
+
end
|
376
|
+
|
377
|
+
end
|
378
|
+
else
|
379
|
+
sanity_check_grep(source_branch, source_branch, @target_branch)
|
380
|
+
end
|
381
|
+
|
382
|
+
end
|
383
|
+
|
384
|
+
puts
|
385
|
+
|
386
|
+
end
|
387
|
+
|
370
388
|
private
|
371
389
|
|
372
390
|
def retrieve_source_branches
|
@@ -385,6 +403,8 @@ module AppCommand
|
|
385
403
|
|
386
404
|
@source_branches.uniq!
|
387
405
|
|
406
|
+
return if @opts[:sanity_check]
|
407
|
+
|
388
408
|
# If branch(es) was/were specified as '1234' or '12345', this code tries to resolve it automatically as bp-12345/bug-12345/feature-12345
|
389
409
|
branches_to_resolve = {}
|
390
410
|
@source_branches.each do |branch_name|
|
@@ -402,7 +422,7 @@ module AppCommand
|
|
402
422
|
end
|
403
423
|
@git.get_all_branches_as_array.each do |possible_branch|
|
404
424
|
branches_to_resolve.keys.each do |branch_to_resolve|
|
405
|
-
if possible_branch =~
|
425
|
+
if possible_branch =~ /#{branch_to_resolve}/i
|
406
426
|
|
407
427
|
# If more than one possible branch exists, IE: bug-14145 & bp-14145
|
408
428
|
unless branches_to_resolve[branch_to_resolve] == false
|
@@ -411,14 +431,16 @@ module AppCommand
|
|
411
431
|
|
412
432
|
branches_to_resolve[branch_to_resolve] = possible_branch
|
413
433
|
App::Terminal::output("Resolved branch #{App::Terminal::format_branch(possible_branch)} from jira number: #{App::Terminal::format_highlight(branch_to_resolve)}", App::Terminal::MSG_AUTOMATIC)
|
434
|
+
|
414
435
|
end
|
415
436
|
end
|
416
437
|
end
|
417
438
|
branches_to_resolve.each do |branch_to_resolve|
|
418
|
-
if branch_to_resolve[1] == false
|
439
|
+
if branch_to_resolve[1] == false && !@opts[:sanity_check]
|
419
440
|
App::Terminal::error("No branch found for jira number: #{App::Terminal::format_highlight(branch_to_resolve[0])}", ['Please check your input and try again.'], true)
|
441
|
+
elsif branch_to_resolve[1] != false
|
442
|
+
new_source_branches << branch_to_resolve[1] unless branch_to_resolve[1] == '' || branch_to_resolve[1].nil?
|
420
443
|
end
|
421
|
-
new_source_branches << branch_to_resolve[1] unless branch_to_resolve[1] == '' || branch_to_resolve[1].nil?
|
422
444
|
end
|
423
445
|
@source_branches = new_source_branches
|
424
446
|
end
|
@@ -464,6 +486,24 @@ module AppCommand
|
|
464
486
|
source_branch_text
|
465
487
|
end
|
466
488
|
|
489
|
+
def sanity_check_grep(grep_string, source_branch, target_branch)
|
490
|
+
|
491
|
+
puts " \x1B[38;5;39m#{source_branch}\x1B[0m \xe2\x80\x94 (#{grep_string})"
|
492
|
+
results_cd = App::Terminal::command_capture("git log #{target_branch} | grep '#{grep_string}' --color=auto", App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE), false, false)
|
493
|
+
results_db = App::Terminal::command_capture("git log #{target_branch} | grep '#{grep_string}' --color=auto", App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_DB), false, false)
|
494
|
+
|
495
|
+
results_cd.push(*results_db).each do |block|
|
496
|
+
block.split("\n").each do |line|
|
497
|
+
if line.strip != ''
|
498
|
+
if line =~ /\A\s*bp-\d{4,5}/i
|
499
|
+
puts " #{line.gsub(/#{grep_string}/i, "\x1B[38;5;196m#{grep_string}\x1B[0m")}"
|
500
|
+
end
|
501
|
+
end
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
end
|
506
|
+
|
467
507
|
end
|
468
508
|
|
469
509
|
end
|
data/lib/routes/git_update.rb
CHANGED
@@ -3,10 +3,14 @@ module AppCommand
|
|
3
3
|
class GitUpdate < ::Convoy::ActionCommand::Base
|
4
4
|
|
5
5
|
def execute
|
6
|
-
|
6
|
+
|
7
7
|
@opts = command_options
|
8
|
+
@args = arguments
|
9
|
+
@git = App::Git.new
|
10
|
+
|
8
11
|
opts_validate
|
9
12
|
opts_routing
|
13
|
+
|
10
14
|
end
|
11
15
|
|
12
16
|
def opts_validate
|
@@ -39,11 +43,7 @@ module AppCommand
|
|
39
43
|
if results[3] == false
|
40
44
|
@git.ask_to_setup_remote_tracking(current_branch, repo_dir)
|
41
45
|
end
|
42
|
-
|
43
|
-
unless App::Terminal::prompt_yes_no('Merge conflict occurred', ["Unable to successfully merge #{App::Terminal::format_branch(App::Git::MASTER)} into #{App::Terminal::format_branch(current_branch)} on #{App::Terminal::format_directory(@git.get_repo_shorthand(repo_dir))}", "Please #{App::Terminal::format_action('open an IDE')}\x1B[38;5;240m and resolve your conflicts as soon as this script has finished executing."])
|
44
|
-
App::Terminal::abort(nil, nil, true, false)
|
45
|
-
end
|
46
|
-
end
|
46
|
+
@git.check_for_conflicts(results[4], "Unable to successfully merge #{App::Terminal::format_branch(App::Git::MASTER)} into #{App::Terminal::format_branch(current_branch)} on #{App::Terminal::format_directory(@git.get_repo_shorthand(repo_dir))}")
|
47
47
|
end
|
48
48
|
if @opts[:push] && current_branch != App::Git::MASTER
|
49
49
|
App::Terminal::command("git push origin #{current_branch}", repo_dir)
|
@@ -7,15 +7,6 @@ module AppCommand
|
|
7
7
|
|
8
8
|
include Columnist
|
9
9
|
|
10
|
-
LOG_URI_EUW1 = 'http://ec2-54-73-66-114.eu-west-1.compute.amazonaws.com:7777/php/php.log'
|
11
|
-
LOG_URI_EUW2 = 'http://ec2-54-73-26-152.eu-west-1.compute.amazonaws.com:7777/php/php.log'
|
12
|
-
LOG_URI_USE1 = 'http://ec2-174-129-36-164.compute-1.amazonaws.com:7777/php/php.log'
|
13
|
-
LOG_URI_USE2 = 'http://54.235.155.6:7777/php/php.log'
|
14
|
-
LOG_URI_USW1 = 'http://ec2-184-72-46-73.us-west-1.compute.amazonaws.com:7777/php/php.log'
|
15
|
-
LOG_URI_USW2 = 'http://ec2-184-72-49-68.us-west-1.compute.amazonaws.com:7777/php/php.log'
|
16
|
-
LOG_URI_STG1 = 'http://ec2-54-185-160-108.us-west-2.compute.amazonaws.com:7777/php/php.log'
|
17
|
-
LOG_URI_STG2 = 'http://ec2-54-190-109-53.us-west-2.compute.amazonaws.com:7777/php/php.log'
|
18
|
-
|
19
10
|
def execute
|
20
11
|
|
21
12
|
@opts = command_options
|
@@ -200,16 +191,17 @@ module AppCommand
|
|
200
191
|
def php_log_data
|
201
192
|
|
202
193
|
raw_log_data = ''
|
203
|
-
raw_log_uris =
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
194
|
+
raw_log_uris = %w(
|
195
|
+
http://54.235.155.6:7777/php/php.log
|
196
|
+
http://ec2-174-129-36-164.compute-1.amazonaws.com:7777/php/php.log
|
197
|
+
http://ec2-54-185-160-108.us-west-2.compute.amazonaws.com:7777/php/php.log
|
198
|
+
http://ec2-54-190-109-53.us-west-2.compute.amazonaws.com:7777/php/php.log
|
199
|
+
http://ec2-54-73-66-114.eu-west-1.compute.amazonaws.com:7777/php/php.log
|
200
|
+
http://ec2-54-73-26-152.eu-west-1.compute.amazonaws.com:7777/php/php.log
|
201
|
+
http://ec2-54-217-40-80.eu-west-1.compute.amazonaws.com:7777/php/php.log
|
202
|
+
http://ec2-184-72-46-73.us-west-1.compute.amazonaws.com:7777/php/php.log
|
203
|
+
http://ec2-184-72-49-68.us-west-1.compute.amazonaws.com:7777/php/php.log
|
204
|
+
)
|
213
205
|
raw_log_uris.each do |log_uri|
|
214
206
|
App::Terminal::output("Retrieving data from: #{log_uri}")
|
215
207
|
raw_log_data << RestClient.get(log_uri)
|
@@ -46,14 +46,14 @@ module AppCommand
|
|
46
46
|
end
|
47
47
|
|
48
48
|
if atleast_one_error
|
49
|
-
unless App::Terminal::prompt_yes_no('
|
49
|
+
unless App::Terminal::prompt_yes_no('Continue by skipping these branches?', ["The above branch(es) have unmerged commits and will be #{App::Terminal::format_action('skipped')} in the removal process.", "You #{App::Terminal::format_invalid('cannot delete', true)} these branches using this script, this must be done manually #{App::Terminal::format_highlight('afterwards')}."])
|
50
50
|
App::Terminal::abort(nil, nil, true, false)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
@git.show_branches_draw_table(fnl_branches_cd, fnl_branches_db)
|
55
55
|
|
56
|
-
unless App::Terminal::prompt_yes_no('Remove these branches?', ["By continuing, the above branches will be #{App::Terminal::format_action('removed permanently')} both #{App::Terminal::format_highlight('locally & remotely')}
|
56
|
+
unless App::Terminal::prompt_yes_no('Remove these branches?', ["By continuing, the above branches will be #{App::Terminal::format_action('removed permanently')} both #{App::Terminal::format_highlight('locally & remotely')} (except release branches)."], 'Are you absolutely sure you want to continue?', false)
|
57
57
|
App::Terminal::abort(nil, nil, true, false)
|
58
58
|
end
|
59
59
|
|
data/lib/routes/scripts_sonar.rb
CHANGED
@@ -56,6 +56,7 @@ module AppCommand
|
|
56
56
|
end
|
57
57
|
|
58
58
|
found_results = false
|
59
|
+
found_warnings = false
|
59
60
|
results_output = []
|
60
61
|
|
61
62
|
results.each do |result|
|
@@ -65,6 +66,9 @@ module AppCommand
|
|
65
66
|
if line =~ /\AFILE:\s(.*).\w{3,5}/i
|
66
67
|
found_results = true
|
67
68
|
results_output << "\x1B[38;5;196m#{line}\x1B[0m"
|
69
|
+
elsif line =~ /fatal error: (.*) on line \d+/i || line =~ /warning: (.*) on line \d+/i
|
70
|
+
found_warnings = true
|
71
|
+
results_output << "\x1B[38;5;250m#{line}\x1B[0m"
|
68
72
|
else
|
69
73
|
results_output << "\x1B[38;5;250m#{line}\x1B[0m"
|
70
74
|
end
|
@@ -75,6 +79,8 @@ module AppCommand
|
|
75
79
|
|
76
80
|
if found_results
|
77
81
|
App::Terminal::error('Found errors!', results_output)
|
82
|
+
elsif found_warnings
|
83
|
+
App::Terminal::warning('Found warnings!', results_output)
|
78
84
|
else
|
79
85
|
App::Terminal::success('No errors found.', nil, file_found_to_scan ? true : false)
|
80
86
|
end
|
data/lib/routes/ssh.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
module AppCommand
|
2
|
+
|
3
|
+
class SSH < ::Convoy::ActionCommand::Base
|
4
|
+
|
5
|
+
CONFIGURATION_PREFIX = 'ssh_'
|
6
|
+
|
7
|
+
def execute
|
8
|
+
|
9
|
+
@opts = command_options
|
10
|
+
@args = arguments
|
11
|
+
|
12
|
+
opts_validate
|
13
|
+
opts_routing
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def opts_validate
|
18
|
+
|
19
|
+
if @args[0].nil?
|
20
|
+
App::Terminal::error('You must specify what server you want to SSH into', "This must be specified in: #{App::Terminal::format_directory(ConfigUnique::CONFIG_FILE)}", true)
|
21
|
+
end
|
22
|
+
|
23
|
+
if @args[0] =~ /\Assh_\S+\z/i
|
24
|
+
config_param = @args[0]
|
25
|
+
else
|
26
|
+
config_param = "#{CONFIGURATION_PREFIX}#{@args[0]}"
|
27
|
+
end
|
28
|
+
|
29
|
+
unless App::Config::param_exists(config_param)
|
30
|
+
App::Terminal::error('Invalid Config Parameter', "The #{App::Terminal::format_highlight('config parameter')} #{App::Terminal::format_invalid(config_param)} doesn't exist in: #{App::Terminal::format_directory(ConfigUnique::CONFIG_FILE)}", true)
|
31
|
+
end
|
32
|
+
|
33
|
+
ssh_parts = App::Config.param(config_param).split('|')
|
34
|
+
|
35
|
+
@ssh_user = ssh_parts[0]
|
36
|
+
@ssh_host = ssh_parts[1]
|
37
|
+
@ssh_cert = ssh_parts[2].to_s.strip.length == 0 ? nil : ssh_parts[2]
|
38
|
+
|
39
|
+
help_message = [
|
40
|
+
"The file: #{App::Terminal::format_directory(ConfigUnique::CONFIG_FILE)} must contain a line similar to the following:",
|
41
|
+
nil,
|
42
|
+
'ssh_ec2=ec2-user|ec2-XX-XX-XX-XX.eu-west-1.compute.amazonaws.com|~/.ssh/pem-key.pem',
|
43
|
+
'ssh_ec2=ec2-user|ec2-XX-XX-XX-XX.eu-west-1.compute.amazonaws.com',
|
44
|
+
]
|
45
|
+
|
46
|
+
if @ssh_user.nil? || @ssh_user == ''
|
47
|
+
App::Terminal::error("SSH #{App::Terminal::format_highlight('user')} required", help_message, true)
|
48
|
+
end
|
49
|
+
|
50
|
+
if @ssh_host.nil? || @ssh_host == ''
|
51
|
+
App::Terminal::error("SSH #{App::Terminal::format_highlight('host')} required", help_message, true)
|
52
|
+
end
|
53
|
+
|
54
|
+
unless @ssh_cert.nil?
|
55
|
+
unless App::UtilsFiles::file_exists(File.expand_path(@ssh_cert))
|
56
|
+
App::Terminal::error("PEM key not found: #{App::Terminal::format_directory(@ssh_cert)}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
def opts_routing
|
63
|
+
|
64
|
+
ssh_into_server
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
def ssh_into_server
|
69
|
+
|
70
|
+
if @ssh_cert.nil?
|
71
|
+
App::Terminal::command("ssh #{@ssh_user}@#{@ssh_host}", nil, false, false)
|
72
|
+
else
|
73
|
+
App::Terminal::command("ssh -i #{@ssh_cert} #{@ssh_user}@#{@ssh_host}", nil, false, false)
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
data/lib/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '1.
|
1
|
+
VERSION = '1.10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brightpearl-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Albert Rannetsperger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: columnist
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- lib/routes/scripts_sonar.rb
|
158
158
|
- lib/routes/scripts_sql_update.rb
|
159
159
|
- lib/routes/setup.rb
|
160
|
+
- lib/routes/ssh.rb
|
160
161
|
- lib/routes/tail.rb
|
161
162
|
- lib/routes/test.rb
|
162
163
|
- lib/routes/update.rb
|
@@ -174,9 +175,9 @@ require_paths:
|
|
174
175
|
- lib
|
175
176
|
required_ruby_version: !ruby/object:Gem::Requirement
|
176
177
|
requirements:
|
177
|
-
- -
|
178
|
+
- - ~>
|
178
179
|
- !ruby/object:Gem::Version
|
179
|
-
version: '0'
|
180
|
+
version: '2.0'
|
180
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
182
|
requirements:
|
182
183
|
- - '>='
|