takeltau 0.34.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +674 -0
- data/README.md +235 -0
- data/bin/tau +6 -0
- data/lib/Thorfile +3 -0
- data/lib/takeltau.rb +257 -0
- data/lib/takeltau/bit/check/cli.rb +23 -0
- data/lib/takeltau/bit/check/workspace.rb +37 -0
- data/lib/takeltau/bit/cli.rb +18 -0
- data/lib/takeltau/bit/clipboard/cli.rb +73 -0
- data/lib/takeltau/bit/clipboard/copy.rb +142 -0
- data/lib/takeltau/bit/clipboard/lib.rb +143 -0
- data/lib/takeltau/bit/clipboard/paste.rb +60 -0
- data/lib/takeltau/bit/clipboard/pull.rb +37 -0
- data/lib/takeltau/bit/clipboard/push.rb +37 -0
- data/lib/takeltau/bit/require/cli.rb +57 -0
- data/lib/takeltau/bit/require/export.rb +34 -0
- data/lib/takeltau/bit/require/import.rb +133 -0
- data/lib/takeltau/bit/require/lib.rb +19 -0
- data/lib/takeltau/bit/scope/add.rb +55 -0
- data/lib/takeltau/bit/scope/cli.rb +74 -0
- data/lib/takeltau/bit/scope/list.rb +41 -0
- data/lib/takeltau/bit/scope/new.rb +44 -0
- data/lib/takeltau/bit/scope/ssh.rb +13 -0
- data/lib/takeltau/completion/cli.rb +24 -0
- data/lib/takeltau/default.yml +95 -0
- data/lib/takeltau/docker/check/cli.rb +23 -0
- data/lib/takeltau/docker/check/daemon.rb +27 -0
- data/lib/takeltau/docker/cli.rb +15 -0
- data/lib/takeltau/docker/container/check/cli.rb +57 -0
- data/lib/takeltau/docker/container/check/existing.rb +32 -0
- data/lib/takeltau/docker/container/check/network.rb +32 -0
- data/lib/takeltau/docker/container/check/orphaned.rb +32 -0
- data/lib/takeltau/docker/container/clean.rb +40 -0
- data/lib/takeltau/docker/container/cli.rb +118 -0
- data/lib/takeltau/docker/container/command.rb +38 -0
- data/lib/takeltau/docker/container/daemon.rb +17 -0
- data/lib/takeltau/docker/container/lib.rb +181 -0
- data/lib/takeltau/docker/container/login.rb +58 -0
- data/lib/takeltau/docker/container/prune.rb +31 -0
- data/lib/takeltau/docker/image/cli.rb +39 -0
- data/lib/takeltau/docker/image/tag/check.rb +42 -0
- data/lib/takeltau/docker/image/tag/cli.rb +68 -0
- data/lib/takeltau/docker/image/tag/latest.rb +24 -0
- data/lib/takeltau/docker/image/tag/list.rb +19 -0
- data/lib/takeltau/docker/image/update.rb +27 -0
- data/lib/takeltau/git/check/bit.rb +26 -0
- data/lib/takeltau/git/check/clean.rb +46 -0
- data/lib/takeltau/git/check/cli.rb +49 -0
- data/lib/takeltau/git/check/workspace.rb +34 -0
- data/lib/takeltau/git/cli.rb +9 -0
- data/lib/takeltau/info/cli.rb +12 -0
- data/lib/takeltau/info/project/cli.rb +69 -0
- data/lib/takeltau/info/status/bar.rb +112 -0
- data/lib/takeltau/info/status/cli.rb +107 -0
- data/lib/takeltau/info/status/git.rb +47 -0
- data/lib/takeltau/info/status/gopass.rb +37 -0
- data/lib/takeltau/info/status/gpg.rb +39 -0
- data/lib/takeltau/info/status/lib.rb +46 -0
- data/lib/takeltau/info/status/ssh.rb +46 -0
- data/lib/takeltau/init/cli.rb +12 -0
- data/lib/takeltau/init/lib.rb +86 -0
- data/lib/takeltau/init/packer/cli.rb +82 -0
- data/lib/takeltau/init/packer/docker.rb +64 -0
- data/lib/takeltau/init/packer/templates/ansiblelint.tt +3 -0
- data/lib/takeltau/init/packer/templates/bitrequireyml.tt +13 -0
- data/lib/takeltau/init/packer/templates/groupvarsprojectyml.tt +2 -0
- data/lib/takeltau/init/packer/templates/playbooksiteyml.tt +6 -0
- data/lib/takeltau/init/packer/templates/projectyml.tt +19 -0
- data/lib/takeltau/init/takelage/cli.rb +70 -0
- data/lib/takeltau/init/takelage/rake.rb +61 -0
- data/lib/takeltau/init/takelage/templates/bitrequireyml.tt +5 -0
- data/lib/takeltau/init/takelage/templates/projectyml.tt +3 -0
- data/lib/takeltau/init/templates/Rakefile.tt +3 -0
- data/lib/takeltau/init/templates/gitignore.tt +16 -0
- data/lib/takeltau/lib/config.rb +130 -0
- data/lib/takeltau/lib/logging.rb +49 -0
- data/lib/takeltau/lib/project.rb +72 -0
- data/lib/takeltau/lib/subcmd.rb +18 -0
- data/lib/takeltau/lib/system.rb +194 -0
- data/lib/takeltau/mutagen/check/cli.rb +40 -0
- data/lib/takeltau/mutagen/check/daemon.rb +76 -0
- data/lib/takeltau/mutagen/cli.rb +12 -0
- data/lib/takeltau/mutagen/socket/check.rb +33 -0
- data/lib/takeltau/mutagen/socket/cli.rb +103 -0
- data/lib/takeltau/mutagen/socket/create.rb +47 -0
- data/lib/takeltau/mutagen/socket/list.rb +33 -0
- data/lib/takeltau/mutagen/socket/terminate.rb +32 -0
- data/lib/takeltau/mutagen/socket/tidy.rb +21 -0
- data/lib/takeltau/self/cli.rb +43 -0
- data/lib/takeltau/self/config/cli.rb +82 -0
- data/lib/takeltau/self/list.rb +35 -0
- data/lib/takeltau/version +1 -0
- metadata +319 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Takeltau
|
4
|
+
# takeltau info project
|
5
|
+
class InfoProject < SubCommandBase
|
6
|
+
include LoggingModule
|
7
|
+
include SystemModule
|
8
|
+
include ConfigModule
|
9
|
+
include ProjectModule
|
10
|
+
|
11
|
+
#
|
12
|
+
# info project active
|
13
|
+
#
|
14
|
+
desc 'active', 'Print active project info'
|
15
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
16
|
+
Print active project info
|
17
|
+
LONGDESC
|
18
|
+
# Print active project info.
|
19
|
+
def active
|
20
|
+
project_active_yaml = hash_to_yaml(project.active)
|
21
|
+
exit false if project_active_yaml == false
|
22
|
+
say project_active_yaml
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# info project private
|
28
|
+
#
|
29
|
+
desc 'private', 'Print private project info'
|
30
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
31
|
+
Print private project info
|
32
|
+
LONGDESC
|
33
|
+
# Print private project info.
|
34
|
+
def private
|
35
|
+
project_private_yaml = hash_to_yaml(project.private)
|
36
|
+
exit false if project_private_yaml == false
|
37
|
+
say project_private_yaml
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# info project main
|
43
|
+
#
|
44
|
+
desc 'main', 'Print main project info'
|
45
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
46
|
+
Print main project info
|
47
|
+
LONGDESC
|
48
|
+
# Print main project info.
|
49
|
+
def main
|
50
|
+
project_main_yaml = hash_to_yaml(project.main)
|
51
|
+
exit false if project_main_yaml == false
|
52
|
+
say project_main_yaml
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# info project dir
|
58
|
+
#
|
59
|
+
desc 'dir', 'Print project root directory'
|
60
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
61
|
+
Print project root directory
|
62
|
+
LONGDESC
|
63
|
+
# Print project root directory.
|
64
|
+
def dir
|
65
|
+
say project.dir
|
66
|
+
true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# takeltau info status bar
|
4
|
+
module InfoStatusBar
|
5
|
+
# Backend method for info status bar.
|
6
|
+
# @return [String] status info bar
|
7
|
+
# rubocop:disable Metrics/MethodLength
|
8
|
+
def info_status_bar
|
9
|
+
log.debug 'Get status info bar'
|
10
|
+
|
11
|
+
@bar_list = []
|
12
|
+
|
13
|
+
_info_status_bar_takelage
|
14
|
+
_info_status_bar_tau
|
15
|
+
_info_status_bar_git
|
16
|
+
_info_status_bar_gopass
|
17
|
+
_info_status_bar_gpg
|
18
|
+
_info_status_bar_mutagen
|
19
|
+
_info_status_bar_ssh
|
20
|
+
|
21
|
+
bar = @bar_list.join(' | ')
|
22
|
+
log.debug "status info bar: #{bar}"
|
23
|
+
bar
|
24
|
+
end
|
25
|
+
# rubocop:enable Metrics/MethodLength
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# Add takelage version info to bar.
|
30
|
+
def _info_status_bar_takelage
|
31
|
+
takelage_version_file = '/etc/takelage_version'
|
32
|
+
return unless _file_exists? takelage_version_file
|
33
|
+
|
34
|
+
_file_read takelage_version_file
|
35
|
+
@bar_list << "#{config.active['docker_repo']}: #{@content_file.chomp.green}"
|
36
|
+
end
|
37
|
+
|
38
|
+
# Add tau version info to bar.
|
39
|
+
def _info_status_bar_tau
|
40
|
+
@bar_list << "tau: #{Takeltau::VERSION.green}"
|
41
|
+
end
|
42
|
+
|
43
|
+
# Add git status info to bar.
|
44
|
+
def _info_status_bar_git
|
45
|
+
@status_git = info_status_git
|
46
|
+
@bar_list << ("git: #{@status_git ? 'ok'.green : 'no'.red}")
|
47
|
+
end
|
48
|
+
|
49
|
+
# Add gopass status info to bar.
|
50
|
+
def _info_status_bar_gopass
|
51
|
+
@status_gopass = info_status_gopass
|
52
|
+
@bar_list << ("gopass: #{@status_gopass ? 'ok'.green : 'no'.red}")
|
53
|
+
end
|
54
|
+
|
55
|
+
# Add gpg status info to bar.
|
56
|
+
def _info_status_bar_gpg
|
57
|
+
if @status_git || @status_gopass
|
58
|
+
@bar_list << "gpg: #{'ok'.green}"
|
59
|
+
return
|
60
|
+
end
|
61
|
+
|
62
|
+
@bar_list << ("gpg: #{info_status_gpg ? 'ok'.green : 'no'.red}")
|
63
|
+
end
|
64
|
+
|
65
|
+
# Add mutagen status info to bar.
|
66
|
+
def _info_status_bar_mutagen
|
67
|
+
@bar_list << ("mutagen: #{mutagen_check_daemon ? 'ok'.green : 'no'.red}")
|
68
|
+
end
|
69
|
+
|
70
|
+
# Add ssh status info to bar.
|
71
|
+
def _info_status_bar_ssh
|
72
|
+
@bar_list << ("ssh: #{info_status_ssh ? 'ok'.green : 'no'.red}")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Amend String class with colorization.
|
77
|
+
class String
|
78
|
+
# Colorize strings
|
79
|
+
def colorize(color_code)
|
80
|
+
"\e[#{color_code}m#{self}\e[0m"
|
81
|
+
end
|
82
|
+
|
83
|
+
# String color red
|
84
|
+
def red
|
85
|
+
colorize(31)
|
86
|
+
end
|
87
|
+
|
88
|
+
# String color green
|
89
|
+
def green
|
90
|
+
colorize(32)
|
91
|
+
end
|
92
|
+
|
93
|
+
# String color yellow
|
94
|
+
def yellow
|
95
|
+
colorize(33)
|
96
|
+
end
|
97
|
+
|
98
|
+
# String color blue
|
99
|
+
def blue
|
100
|
+
colorize(34)
|
101
|
+
end
|
102
|
+
|
103
|
+
# String color pink
|
104
|
+
def pink
|
105
|
+
colorize(35)
|
106
|
+
end
|
107
|
+
|
108
|
+
# String color light_blue
|
109
|
+
def light_blue
|
110
|
+
colorize(36)
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Takeltau
|
4
|
+
# takeltau info status
|
5
|
+
class InfoStatus < SubCommandBase
|
6
|
+
include LoggingModule
|
7
|
+
include SystemModule
|
8
|
+
include ConfigModule
|
9
|
+
include DockerCheckDaemon
|
10
|
+
include DockerContainerCheckExisting
|
11
|
+
include DockerContainerCheckNetwork
|
12
|
+
include DockerContainerCommand
|
13
|
+
include DockerContainerLib
|
14
|
+
include GitCheckWorkspace
|
15
|
+
include InfoStatusLib
|
16
|
+
include InfoStatusGit
|
17
|
+
include InfoStatusGopass
|
18
|
+
include InfoStatusGPG
|
19
|
+
include InfoStatusSSH
|
20
|
+
include InfoStatusBar
|
21
|
+
include MutagenCheckDaemon
|
22
|
+
|
23
|
+
# Initialize info status
|
24
|
+
def initialize(args = [], local_options = {}, configuration = {})
|
25
|
+
# initialize thor parent class
|
26
|
+
super args, local_options, configuration
|
27
|
+
|
28
|
+
@workdir = Dir.getwd
|
29
|
+
|
30
|
+
inside = _docker_container_lib_check_matrjoschka
|
31
|
+
@hostname = inside ? ENV['HOSTNAME'] : _docker_container_lib_hostname
|
32
|
+
@hostlabel = "hostname=#{@hostname}"
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# info status bar
|
37
|
+
#
|
38
|
+
desc 'bar', 'Print status info bar'
|
39
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
40
|
+
Print status info bar
|
41
|
+
LONGDESC
|
42
|
+
# Print status info bar.
|
43
|
+
def bar
|
44
|
+
say info_status_bar
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# info status git
|
49
|
+
#
|
50
|
+
desc 'git', 'Check git status info'
|
51
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
52
|
+
Check git status info
|
53
|
+
LONGDESC
|
54
|
+
# Check git status info.
|
55
|
+
def git
|
56
|
+
exit info_status_git
|
57
|
+
end
|
58
|
+
|
59
|
+
#
|
60
|
+
# info status gopass
|
61
|
+
#
|
62
|
+
desc 'gopass', 'Check gopass status info'
|
63
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
64
|
+
Check gopass status info
|
65
|
+
LONGDESC
|
66
|
+
# Check gopass status info.
|
67
|
+
def gopass
|
68
|
+
exit info_status_gopass
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# info status gpg
|
73
|
+
#
|
74
|
+
desc 'gpg', 'Check gpg status info'
|
75
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
76
|
+
Check gpg status info
|
77
|
+
LONGDESC
|
78
|
+
# Check gpg status info.
|
79
|
+
def gpg
|
80
|
+
exit info_status_gpg
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
# info status mutagen
|
85
|
+
#
|
86
|
+
desc 'mutagen', 'Check mutagen status info'
|
87
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
88
|
+
Check mutagen status info
|
89
|
+
LONGDESC
|
90
|
+
# Check mutagen status info.
|
91
|
+
def mutagen
|
92
|
+
exit mutagen_check_daemon
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
# info status ssh
|
97
|
+
#
|
98
|
+
desc 'ssh', 'Check ssh status info'
|
99
|
+
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
100
|
+
Check ssh status info
|
101
|
+
LONGDESC
|
102
|
+
# Check ssh status info.
|
103
|
+
def ssh
|
104
|
+
exit info_status_ssh
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# takeltau info status git
|
4
|
+
module InfoStatusGit
|
5
|
+
# Backend method for info status git.
|
6
|
+
# @return [Boolean] is the git gpg signing key available?
|
7
|
+
# rubocop:disable Metrics/MethodLength
|
8
|
+
# rubocop:disable Metrics/AbcSize
|
9
|
+
def info_status_git
|
10
|
+
log.debug 'Check git status'
|
11
|
+
|
12
|
+
root = config.active['project_root_dir']
|
13
|
+
|
14
|
+
if root.chomp.empty?
|
15
|
+
log.error 'Cannot determine project root directory'
|
16
|
+
log.warn 'Is there a Rakefile in the project root directory?'
|
17
|
+
return false
|
18
|
+
end
|
19
|
+
|
20
|
+
unless git_check_workspace(root)
|
21
|
+
log.error 'Project root directory is not a git workspace'
|
22
|
+
return false
|
23
|
+
end
|
24
|
+
|
25
|
+
if _info_status_lib_git_name(root).chomp.empty?
|
26
|
+
log.error 'git config user.name is not available'
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
|
30
|
+
if _info_status_lib_git_email(root).chomp.empty?
|
31
|
+
log.error 'git config user.email is not available'
|
32
|
+
return false
|
33
|
+
end
|
34
|
+
|
35
|
+
key = _info_status_lib_git_signingkey(root)
|
36
|
+
|
37
|
+
unless _info_status_lib_git_key_available(key).exitstatus.zero?
|
38
|
+
log.error 'git config user.signingkey is not available'
|
39
|
+
return false
|
40
|
+
end
|
41
|
+
|
42
|
+
log.debug 'git config is available'
|
43
|
+
true
|
44
|
+
end
|
45
|
+
# rubocop:enable Metrics/AbcSize
|
46
|
+
# rubocop:enable Metrics/MethodLength
|
47
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# takeltau info status gopass
|
4
|
+
module InfoStatusGopass
|
5
|
+
# Backend method for info status gopass.
|
6
|
+
# @return [Boolean] is gopass available?
|
7
|
+
# rubocop:disable Metrics/MethodLength
|
8
|
+
def info_status_gopass
|
9
|
+
log.debug 'Check gopass status'
|
10
|
+
|
11
|
+
root = _info_status_gopass_root_store
|
12
|
+
|
13
|
+
if root.chomp.empty?
|
14
|
+
log.error 'gopass root store not found'
|
15
|
+
return false
|
16
|
+
end
|
17
|
+
|
18
|
+
key = _info_status_lib_git_signingkey(root)
|
19
|
+
|
20
|
+
unless _info_status_lib_git_key_available(key).exitstatus.zero?
|
21
|
+
log.error 'gopass root store gpg key is not available'
|
22
|
+
return false
|
23
|
+
end
|
24
|
+
|
25
|
+
log.debug 'gopass is available'
|
26
|
+
true
|
27
|
+
end
|
28
|
+
# rubocop:enable Metrics/MethodLength
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# Get gopass root store
|
33
|
+
def _info_status_gopass_root_store
|
34
|
+
cmd_gopass_root_store = config.active['cmd_info_status_gopass_root_store']
|
35
|
+
(run cmd_gopass_root_store).chomp
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# takeltau info status gpg
|
4
|
+
module InfoStatusGPG
|
5
|
+
# Backend method for info status gpg.
|
6
|
+
# @return [Boolean] is GPG available?
|
7
|
+
# rubocop:disable Metrics/MethodLength
|
8
|
+
def info_status_gpg
|
9
|
+
log.debug 'Check gpg status'
|
10
|
+
|
11
|
+
unless _info_status_gpg_keys
|
12
|
+
log.error 'gpg keys are not available'
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
|
16
|
+
unless _info_status_gpg_agent
|
17
|
+
log.error 'gpg agent is not available'
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
|
21
|
+
log.debug 'gpg is available'
|
22
|
+
true
|
23
|
+
end
|
24
|
+
# rubocop:enable Metrics/MethodLength
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# Check gpg keys
|
29
|
+
def _info_status_gpg_keys
|
30
|
+
status_keys = try config.active['cmd_info_status_gpg_keys']
|
31
|
+
status_keys.exitstatus.zero?
|
32
|
+
end
|
33
|
+
|
34
|
+
# Check gpg agent
|
35
|
+
def _info_status_gpg_agent
|
36
|
+
status_agent = try config.active['cmd_info_status_gpg_agent']
|
37
|
+
status_agent.exitstatus.zero?
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# takeltau info status lib
|
4
|
+
module InfoStatusLib
|
5
|
+
private
|
6
|
+
|
7
|
+
# Get git config user name
|
8
|
+
def _info_status_lib_git_name(root)
|
9
|
+
cmd_git_name =
|
10
|
+
format(
|
11
|
+
config.active['cmd_info_status_lib_git_name'],
|
12
|
+
root: root
|
13
|
+
)
|
14
|
+
run cmd_git_name
|
15
|
+
end
|
16
|
+
|
17
|
+
# Get git config user email
|
18
|
+
def _info_status_lib_git_email(root)
|
19
|
+
cmd_git_email =
|
20
|
+
format(
|
21
|
+
config.active['cmd_info_status_lib_git_email'],
|
22
|
+
root: root
|
23
|
+
)
|
24
|
+
run cmd_git_email
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get git config user signingkey
|
28
|
+
def _info_status_lib_git_signingkey(root)
|
29
|
+
cmd_git_signingkey =
|
30
|
+
format(
|
31
|
+
config.active['cmd_info_status_lib_git_signingkey'],
|
32
|
+
root: root
|
33
|
+
)
|
34
|
+
(run cmd_git_signingkey).chomp
|
35
|
+
end
|
36
|
+
|
37
|
+
# Check if git key is available
|
38
|
+
def _info_status_lib_git_key_available(key)
|
39
|
+
cmd_git_key_available =
|
40
|
+
format(
|
41
|
+
config.active['cmd_info_status_lib_git_key_available'],
|
42
|
+
key: key
|
43
|
+
)
|
44
|
+
try cmd_git_key_available
|
45
|
+
end
|
46
|
+
end
|