takelage 0.13.2 → 0.13.3

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/bin/tau +1 -0
  4. data/lib/Thorfile +2 -0
  5. data/lib/takelage/bit/check/cli.rb +2 -2
  6. data/lib/takelage/bit/check/module.rb +21 -12
  7. data/lib/takelage/bit/cli.rb +1 -3
  8. data/lib/takelage/bit/clipboard/cli.rb +2 -4
  9. data/lib/takelage/bit/clipboard/module.rb +264 -194
  10. data/lib/takelage/bit/scope/cli.rb +2 -2
  11. data/lib/takelage/bit/scope/module.rb +64 -59
  12. data/lib/takelage/completion/cli.rb +2 -2
  13. data/lib/takelage/docker/check/cli.rb +2 -2
  14. data/lib/takelage/docker/check/module.rb +6 -8
  15. data/lib/takelage/docker/cli.rb +2 -3
  16. data/lib/takelage/docker/container/check/cli.rb +2 -2
  17. data/lib/takelage/docker/container/check/module.rb +28 -19
  18. data/lib/takelage/docker/container/cli.rb +13 -10
  19. data/lib/takelage/docker/container/module.rb +143 -110
  20. data/lib/takelage/docker/image/check/cli.rb +2 -3
  21. data/lib/takelage/docker/image/check/module.rb +26 -12
  22. data/lib/takelage/docker/image/cli.rb +3 -4
  23. data/lib/takelage/docker/image/module.rb +19 -14
  24. data/lib/takelage/docker/image/tag/check/cli.rb +2 -3
  25. data/lib/takelage/docker/image/tag/check/module.rb +33 -17
  26. data/lib/takelage/docker/image/tag/cli.rb +2 -3
  27. data/lib/takelage/docker/image/tag/latest/cli.rb +2 -3
  28. data/lib/takelage/docker/image/tag/latest/module.rb +6 -5
  29. data/lib/takelage/docker/image/tag/list/cli.rb +2 -3
  30. data/lib/takelage/docker/image/tag/list/module.rb +19 -16
  31. data/lib/takelage/docker/socket/cli.rb +2 -3
  32. data/lib/takelage/docker/socket/module.rb +137 -107
  33. data/lib/takelage/git/check/cli.rb +2 -2
  34. data/lib/takelage/git/check/module.rb +53 -35
  35. data/lib/takelage/git/cli.rb +2 -3
  36. data/lib/takelage/info/cli.rb +2 -3
  37. data/lib/takelage/info/project/cli.rb +2 -2
  38. data/lib/takelage/lib/config.rb +62 -45
  39. data/lib/takelage/lib/logging.rb +33 -16
  40. data/lib/takelage/lib/project.rb +43 -28
  41. data/lib/takelage/lib/subcmd.rb +2 -0
  42. data/lib/takelage/lib/system.rb +43 -27
  43. data/lib/takelage/self/cli.rb +2 -0
  44. data/lib/takelage/self/config/cli.rb +2 -0
  45. data/lib/takelage/self/module.rb +2 -0
  46. data/lib/takelage/version +1 -1
  47. data/lib/takelage.rb +6 -7
  48. metadata +1 -1
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # takelage docker image tag latest module
2
4
  module DockerImageTagLatestModule
3
-
4
5
  # Backend method for docker image tag latest local.
5
6
  # @return [String] latest local docker image tag
6
7
  def docker_image_tag_latest_local
7
- log.debug "Getting latest local docker image tag"
8
+ log.debug 'Getting latest local docker image tag'
8
9
 
9
10
  return false unless docker_check_running
10
11
 
@@ -20,14 +21,14 @@ module DockerImageTagLatestModule
20
21
  # Backend method for docker image tag latest remote.
21
22
  # @return [String] latest remote docker image tag
22
23
  def docker_image_tag_latest_remote
23
- log.debug "Getting latest remote docker image tag"
24
+ log.debug 'Getting latest remote docker image tag'
24
25
 
25
26
  return false unless docker_check_running
26
27
 
27
28
  tags = docker_image_tag_list_remote
28
29
 
29
- if tags == false or tags.nil?
30
- log.warn "No latest docker remote tag"
30
+ if tags == false || tags.nil?
31
+ log.warn 'No latest docker remote tag'
31
32
  return ''
32
33
  end
33
34
 
@@ -1,8 +1,8 @@
1
- module Takelage
1
+ # frozen_string_literal: true
2
2
 
3
+ module Takelage
3
4
  # takelage docker image tag list
4
5
  class DockerImageTagList < SubCommandBase
5
-
6
6
  include LoggingModule
7
7
  include SystemModule
8
8
  include ConfigModule
@@ -11,7 +11,6 @@ module Takelage
11
11
 
12
12
  # Initialize takelage docker image tag list
13
13
  def initialize(args = [], local_options = {}, configuration = {})
14
-
15
14
  # initialize thor parent class
16
15
  super args, local_options, configuration
17
16
 
@@ -1,20 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # takelage docker image tag list module
2
4
  module DockerImageTagListModule
3
-
4
5
  # Backend method for docker image tag list local.
5
6
  # @return [Array] local docker image tags
6
7
  def docker_image_tag_list_local
7
- tags = []
8
-
9
8
  cmd_docker_tags =
10
- config.active['cmd_docker_image_tag_list_local_docker_images'] % {
11
- docker_user: @docker_user,
12
- docker_repo: @docker_repo
13
- }
14
-
15
- stdout_str = run cmd_docker_tags
9
+ format(
10
+ config.active['cmd_docker_image_tag_list_local_docker_images'],
11
+ docker_user: @docker_user,
12
+ docker_repo: @docker_repo
13
+ )
16
14
 
17
- tags = stdout_str.split("\n")
15
+ tags = (run cmd_docker_tags).split("\n")
18
16
 
19
17
  VersionSorter.sort(tags)
20
18
  end
@@ -22,19 +20,24 @@ module DockerImageTagListModule
22
20
  # Backend method for docker image tag list remote.
23
21
  # @return [Array] remote docker image tags
24
22
  def docker_image_tag_list_remote
25
- log.debug "Getting docker remote tags " +
26
- "of \"#{@docker_user}/#{@docker_repo}\" " +
27
- "from \"#{@docker_registry}\""
23
+ log.debug 'Getting docker remote tags ' \
24
+ "of \"#{@docker_user}/#{@docker_repo}\" " \
25
+ "from \"#{@docker_registry}\""
26
+ _docker_image_tag_list_remote_tags
27
+ end
28
+
29
+ private
28
30
 
31
+ # Get docker remote tags.
32
+ def _docker_image_tag_list_remote_tags
29
33
  user = File.basename @docker_user
30
34
  begin
31
35
  registry = DockerRegistry2.connect(@docker_registry)
32
36
  tags = registry.tags("#{user}/#{@docker_repo}")
37
+ VersionSorter.sort(tags['tags'])
33
38
  rescue RestClient::Exceptions::OpenTimeout
34
39
  log.error "Timeout while connecting to \"#{@docker_registry}\""
35
- return false
40
+ false
36
41
  end
37
-
38
- VersionSorter.sort(tags['tags'])
39
42
  end
40
43
  end
@@ -1,8 +1,8 @@
1
- module Takelage
1
+ # frozen_string_literal: true
2
2
 
3
+ module Takelage
3
4
  # takelage docker socket
4
5
  class DockerSocket < SubCommandBase
5
-
6
6
  include LoggingModule
7
7
  include SystemModule
8
8
  include ConfigModule
@@ -11,7 +11,6 @@ module Takelage
11
11
 
12
12
  # Initialize docker socket
13
13
  def initialize(args = [], local_options = {}, configuration = {})
14
-
15
14
  # initialize thor parent class
16
15
  super args, local_options, configuration
17
16
 
@@ -1,42 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # takelage docker socket module
2
4
  module DockerSocketModule
3
-
4
5
  # Backend method for docker socket scheme.
5
6
  def docker_socket_scheme
6
7
  log.debug 'Getting docker socket scheme'
7
8
 
8
- cmd_agent_socket_path =
9
- config.active['cmd_docker_socket_config_agent_socket_path']
10
-
11
- agent_socket_path = run cmd_agent_socket_path
12
- agent_socket_path.chomp!
13
-
14
- agent_socket_port =
15
- config.active['docker_socket_gpg_agent_port']
16
-
17
- cmd_agent_ssh_socket_path =
18
- config.active['cmd_docker_socket_config_agent_ssh_socket_path']
19
-
20
- agent_ssh_socket_path = run cmd_agent_ssh_socket_path
21
- agent_ssh_socket_path.chomp!
22
-
23
- agent_ssh_socket_port =
24
- config.active['docker_socket_gpg_ssh_agent_port']
9
+ gpg_path = _socket_get_agent_socket_path
10
+ gpg_port = config.active['docker_socket_gpg_agent_port']
11
+ ssh_path = _socket_get_agent_ssh_socket_path
12
+ ssh_port = config.active['docker_socket_gpg_ssh_agent_port']
25
13
 
26
- socket_scheme = {
27
- 'agent-socket' => {
28
- 'path' => agent_socket_path,
29
- 'host' => @socket_host,
30
- 'port' => agent_socket_port
31
- },
32
- 'agent-ssh-socket' => {
33
- 'path' => agent_ssh_socket_path,
34
- 'host' => @socket_host,
35
- 'port' => agent_ssh_socket_port
36
- }
37
- }
38
-
39
- log.debug "Docker socket scheme is \n\"\"\"\n#{hash_to_yaml socket_scheme}\"\"\""
14
+ socket_scheme = _socket_get_scheme gpg_path, gpg_port, ssh_path, ssh_port
15
+ log.debug 'Docker socket scheme is ' \
16
+ "\n\"\"\"\n#{hash_to_yaml socket_scheme}\"\"\""
40
17
 
41
18
  socket_scheme
42
19
  end
@@ -68,16 +45,11 @@ module DockerSocketModule
68
45
 
69
46
  return false unless docker_check_running
70
47
 
71
- cmds_start_socket = _get_socket_start_commands sockets_up = false
72
-
73
- unless cmds_start_socket.empty?
74
- log.debug 'Request sudo so that subsequent background tasks run without delay'
48
+ cmds_start_socket = _get_socket_start_commands 'start'
75
49
 
76
- cmd_sudo_true =
77
- config.active['cmd_docker_socket_start_sudo_true']
50
+ return true if cmds_start_socket.empty?
78
51
 
79
- run cmd_sudo_true
80
- end
52
+ _socket_get_sudo
81
53
 
82
54
  cmds_start_socket.each do |cmd_start_socket|
83
55
  run_and_fork cmd_start_socket
@@ -95,103 +67,161 @@ module DockerSocketModule
95
67
  # get process list
96
68
  # assuming format: "pid command"
97
69
  cmd_ps =
98
- config.active['cmd_docker_socket_stop_docker_socket_ps']
70
+ config.active['cmd_docker_socket_stop_docker_socket_ps']
99
71
 
100
72
  stdout_str = run cmd_ps
101
73
 
102
- cmds_start_socket = _get_socket_start_commands sockets_up = true
74
+ cmds_start_socket = _get_socket_start_commands 'stop'
103
75
 
104
76
  # loop over process list
105
77
  stdout_str.split(/\n+/).each do |process|
78
+ _socket_stop_process process, cmds_start_socket
79
+ end
106
80
 
107
- # split processes in process id and process command
108
- pid_command = process.strip.split(/ /, 2)
109
- pid = pid_command[0]
110
- command = pid_command[1]
111
-
112
- # loop over socket start commands
113
- cmds_start_socket.each do |cmd_start_socket|
81
+ true
82
+ end
114
83
 
115
- if command == cmd_start_socket
116
- log.debug "Killing PID #{pid}"
84
+ private
117
85
 
118
- cmd_kill =
119
- config.active['cmd_docker_socket_stop_docker_socket_kill'] % {
120
- pid: pid
121
- }
86
+ # Get gpg agent socket path.
87
+ def _socket_get_agent_socket_path
88
+ cmd_agent_socket_path =
89
+ config.active['cmd_docker_socket_config_agent_socket_path']
90
+ (run cmd_agent_socket_path).chomp
91
+ end
122
92
 
123
- run cmd_kill
124
- end
125
- end
126
- end
93
+ # Get gpg ssh agent socket path.
94
+ def _socket_get_agent_ssh_socket_path
95
+ cmd_agent_ssh_socket_path =
96
+ config.active['cmd_docker_socket_config_agent_ssh_socket_path']
97
+ (run cmd_agent_ssh_socket_path).chomp
98
+ end
127
99
 
128
- true
100
+ # Create socket scheme.
101
+ def _socket_get_scheme(gpg_path, gpg_port, ssh_path, ssh_port)
102
+ { 'agent-socket' => { 'path' => gpg_path,
103
+ 'host' => @socket_host,
104
+ 'port' => gpg_port },
105
+ 'agent-ssh-socket' => { 'path' => ssh_path,
106
+ 'host' => @socket_host,
107
+ 'port' => ssh_port } }
129
108
  end
130
109
 
131
- # get socket start commands
110
+ # Get socket start commands.
132
111
  # sockets_up is a boolean which defines if the sockets need to be up
133
112
  # to be included in the resulting array of socket start commands
134
- def _get_socket_start_commands sockets_up
113
+ def _get_socket_start_commands(mode)
135
114
  cmds_start_socket = []
136
115
 
137
116
  # loop over sockets
138
117
  @sockets.each do |socket, socket_config|
139
- cmd_start_socket =
140
- config.active['cmd_docker_socket_get_start'] % {
141
- port: socket_config['port'],
142
- host: socket_config['host'],
143
- path: socket_config['path'],
144
- }
145
-
146
- if sockets_up
147
- if _socket_up? socket, socket_config
148
- cmds_start_socket << cmd_start_socket
149
- end
150
- else
151
- unless _socket_up? socket, socket_config
152
- cmds_start_socket << cmd_start_socket
153
- end
154
- end
118
+ host = socket_config['host']
119
+ port = socket_config['port']
120
+ path = socket_config['path']
121
+
122
+ cmd = _get_socket_start_command mode, socket, host, port, path
123
+ cmds_start_socket.push cmd if cmd
155
124
  end
156
125
 
157
126
  cmds_start_socket
158
127
  end
159
128
 
160
- # check if a socket is available
161
- # but trying to connect to it via TCP
162
- def _socket_up? socket, socket_config
163
- host = socket_config['host']
164
- port = socket_config['port']
165
- path = socket_config['path']
129
+ # Get socket start command
130
+ def _get_socket_start_command(mode, socket, host, port, path)
131
+ if mode == 'start'
132
+ unless _socket_up? socket, host, port, path
133
+ return _socket_get_cmd_start_socket(host, port, path)
134
+ end
135
+ elsif _socket_up? socket, host, port, path
136
+ return _socket_get_cmd_start_socket(host, port, path)
137
+ end
138
+ nil
139
+ end
166
140
 
167
- error_message = "failed to connect to " +
168
- "socket \"#{socket}\" " +
169
- "using host \"#{host}\", " +
170
- "port \"#{port}\", " +
171
- "path \"#{path}\""
141
+ # Get socket start command.
142
+ def _socket_get_cmd_start_socket(host, port, path)
143
+ format(
144
+ config.active['cmd_docker_socket_get_start'],
145
+ host: host,
146
+ port: port,
147
+ path: path
148
+ )
149
+ end
172
150
 
173
- # check if socket is available
151
+ # Check if a socket is available by trying to connect to it via TCP
152
+ def _socket_up?(socket, host, port, path)
153
+ error_message = _socket_get_error_message socket, host, port, path
174
154
  begin
175
- Timeout::timeout(1) do
176
- begin
177
- s = TCPSocket.new host, port
178
- s.close
179
- log.debug "Socket \"#{socket}\" available"
180
- return true
181
- rescue Errno::ECONNREFUSED
182
- log.debug "Connection refused: #{error_message}"
183
- return false
184
- rescue Errno::EHOSTUNREACH
185
- log.debug "Host unreachable: #{error_message}"
186
- return false
187
- rescue SocketError
188
- log.debug "Socket error: #{error_message}"
189
- return false
190
- end
155
+ Timeout.timeout(1) do
156
+ _socket_reachable? socket, host, port, error_message
191
157
  end
192
158
  rescue Timeout::Error
193
159
  log.debug "Timeout: #{error_message}"
194
- return false
160
+ false
161
+ end
162
+ end
163
+
164
+ # Create error message.
165
+ def _socket_get_error_message(socket, host, port, path)
166
+ 'failed to connect to ' \
167
+ "socket \"#{socket}\" " \
168
+ "using host \"#{host}\", " \
169
+ "port \"#{port}\", " \
170
+ "path \"#{path}\""
171
+ end
172
+
173
+ # Test socket.
174
+ # rubocop:disable Metrics/MethodLength
175
+ def _socket_reachable?(socket, host, port, error_message)
176
+ begin
177
+ s = TCPSocket.new host, port
178
+ s.close
179
+ log.debug "Socket \"#{socket}\" up"
180
+ return true
181
+ rescue Errno::ECONNREFUSED
182
+ log.debug "Connection refused: #{error_message}"
183
+ rescue Errno::EHOSTUNREACH
184
+ log.debug "Host unreachable: #{error_message}"
185
+ rescue SocketError
186
+ log.debug "Socket error: #{error_message}"
187
+ end
188
+ false
189
+ end
190
+
191
+ # rubocop:enable Metrics/MethodLength
192
+
193
+ # Kill process.
194
+ def _socket_kill_pid(pid)
195
+ log.debug "Killing PID #{pid}"
196
+ cmd_kill =
197
+ format(
198
+ config.active['cmd_docker_socket_stop_docker_socket_kill'],
199
+ pid: pid
200
+ )
201
+ run cmd_kill
202
+ end
203
+
204
+ # Get sudo.
205
+ def _socket_get_sudo
206
+ log.debug 'Request sudo so that ' \
207
+ 'subsequent background tasks run without delay'
208
+ cmd_sudo_true =
209
+ config.active['cmd_docker_socket_start_sudo_true']
210
+ run cmd_sudo_true
211
+ end
212
+
213
+ # Stop process.
214
+ def _socket_stop_process(process, cmds_start_socket)
215
+ # split processes in process id and process command
216
+ pid_command = process.strip.split(/ /, 2)
217
+ pid = pid_command[0]
218
+ command = pid_command[1]
219
+
220
+ # loop over socket start commands
221
+ cmds_start_socket.each do |cmd_start_socket|
222
+ next unless command == cmd_start_socket
223
+
224
+ _socket_kill_pid pid
195
225
  end
196
226
  end
197
227
  end
@@ -1,8 +1,8 @@
1
- module Takelage
1
+ # frozen_string_literal: true
2
2
 
3
+ module Takelage
3
4
  # takelage git check
4
5
  class GitCheck < SubCommandBase
5
-
6
6
  include LoggingModule
7
7
  include SystemModule
8
8
  include ConfigModule
@@ -1,30 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # takelage git check module
2
4
  module GitCheckModule
3
-
4
5
  # Backend method for git check clean.
5
6
  # @return [Boolean] is git workspace clean?
6
7
  def git_check_clean
7
- log.debug "Checking if git workspace is clean"
8
+ log.debug 'Checking if git workspace is clean'
8
9
 
9
10
  return false unless git_check_workspace
10
11
 
11
- cmd_git_unstaged =
12
- config.active['cmd_git_check_clean_git_unstaged']
13
-
14
- cmd_git_uncommitted =
15
- config.active['cmd_git_check_clean_git_uncommitted']
16
-
17
- cmd_git_status =
18
- config.active['cmd_git_check_clean_git_status']
19
-
20
- status_unstaged = try cmd_git_unstaged
21
- status_uncommitted = try cmd_git_uncommitted
22
- stdout_str_status = run cmd_git_status
12
+ status_unstaged = _git_get_status_unstaged
13
+ status_uncommitted = _git_get_status_uncommitted
14
+ stdout_str_status = _git_get_str_status
23
15
 
24
16
  # only return true if neither unstaged nor uncommitted nor empty files
25
17
  sum = status_unstaged.exitstatus +
26
- status_uncommitted.exitstatus +
27
- stdout_str_status.length
18
+ status_uncommitted.exitstatus +
19
+ stdout_str_status.length
28
20
 
29
21
  sum.zero?
30
22
  end
@@ -36,13 +28,7 @@ module GitCheckModule
36
28
 
37
29
  return false unless git_check_workspace
38
30
 
39
- cmd_get_branch =
40
- config.active['cmd_git_check_master_git_branch']
41
-
42
- stdout_str = run cmd_get_branch
43
-
44
- branch = stdout_str.strip.split('/')[-1]
45
-
31
+ branch = _git_get_branch
46
32
  log.debug "We are on git branch \"#{branch}\""
47
33
 
48
34
  branch == 'master'
@@ -52,24 +38,56 @@ module GitCheckModule
52
38
  # @return [Boolean] is this a git workspace?
53
39
  def git_check_workspace
54
40
  log.debug 'Check if this is a git workspace'
41
+ status_repo = _git_get_status_repo
42
+ dir = _git_get_dir
43
+ unless status_repo.exitstatus.zero?
44
+ log.debug "No git workspace found in \"#{dir}\""
45
+ return false
46
+ end
47
+ true
48
+ end
55
49
 
56
- cmd_git_repo =
57
- config.active['cmd_git_check_workspace_git_repo']
50
+ private
58
51
 
59
- status_repo = try cmd_git_repo
52
+ # Get git status of unstaged changes.
53
+ def _git_get_status_unstaged
54
+ cmd_git_unstaged =
55
+ config.active['cmd_git_check_clean_git_unstaged']
56
+ try cmd_git_unstaged
57
+ end
60
58
 
61
- cmd_pwd =
62
- config.active['cmd_git_check_workspace_pwd']
59
+ # Get git status of uncommitted changes.
60
+ def _git_get_status_uncommitted
61
+ cmd_git_uncommitted =
62
+ config.active['cmd_git_check_clean_git_uncommitted']
63
+ try cmd_git_uncommitted
64
+ end
63
65
 
64
- stdout_str_dir = run cmd_pwd
66
+ # Get git status result.
67
+ def _git_get_str_status
68
+ cmd_git_status =
69
+ config.active['cmd_git_check_clean_git_status']
70
+ run cmd_git_status
71
+ end
65
72
 
66
- dir = stdout_str_dir.strip
73
+ # Get git branch.
74
+ def _git_get_branch
75
+ cmd_get_branch =
76
+ config.active['cmd_git_check_master_git_branch']
77
+ (run cmd_get_branch).strip.split('/')[-1]
78
+ end
67
79
 
68
- unless status_repo.exitstatus.zero?
69
- log.debug "No git workspace found in \"#{dir}\""
70
- return false
71
- end
80
+ # Get git repository status.
81
+ def _git_get_status_repo
82
+ cmd_git_repo =
83
+ config.active['cmd_git_check_workspace_git_repo']
84
+ try cmd_git_repo
85
+ end
72
86
 
73
- true
87
+ # Get current working directory.
88
+ def _git_get_dir
89
+ cmd_pwd =
90
+ config.active['cmd_git_check_workspace_pwd']
91
+ (run cmd_pwd).strip
74
92
  end
75
93
  end
@@ -1,10 +1,9 @@
1
- module Takelage
1
+ # frozen_string_literal: true
2
2
 
3
+ module Takelage
3
4
  # takelage git
4
5
  class Git < SubCommandBase
5
-
6
6
  desc 'check [COMMAND]', 'Check git state'
7
7
  subcommand 'check', GitCheck
8
-
9
8
  end
10
9
  end
@@ -1,10 +1,9 @@
1
- module Takelage
1
+ # frozen_string_literal: true
2
2
 
3
+ module Takelage
3
4
  # takelage info
4
5
  class Info < SubCommandBase
5
-
6
6
  desc 'project [COMMAND]', 'Get project info'
7
7
  subcommand 'project', InfoProject
8
-
9
8
  end
10
9
  end
@@ -1,8 +1,8 @@
1
- module Takelage
1
+ # frozen_string_literal: true
2
2
 
3
+ module Takelage
3
4
  # takelage info project
4
5
  class InfoProject < SubCommandBase
5
-
6
6
  include LoggingModule
7
7
  include SystemModule
8
8
  include ConfigModule