docker-api 2.1.0 → 2.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b16ead61448d8d11b0dd15fac8f02c197e14a82c8ddd0efd99014c11bcd5a5e5
4
- data.tar.gz: 5fc03ff9494334810cce174c2c03811895c17fc8e878cf249b072170cabe2207
3
+ metadata.gz: fc1628fd247f468eade6265726036edfe62cf330a3f0be35f24359af395dc4b4
4
+ data.tar.gz: 29a503b4ac556125534508256dbea71f6acc1a3612b24c1ae204cbd93a83ba04
5
5
  SHA512:
6
- metadata.gz: 7ad6f151a030805183a2caaa9bab7bc8aea830eb34b05b9a6b12c5912ab5beb7e076a952fe01ff967ab16ebe93ab16d7b6cfb7ef4f58ba6f6a89295e1cd54de0
7
- data.tar.gz: 6087ed904eb661a17cbbce783125b6d0f9874920faba071ff07552fc571567ded896772d4c41c9115b23a13e0bab5734d52cb5eb771cc057c638163f395866ee
6
+ metadata.gz: 0e0478393e9624e3b206c4578a1a2449843da15bcbceb70520a708ce4a9e8a493a13dd5c6d0e8d3b2b71e1256a4770eb3cb1568471985fd3f52fb703e03ac20e
7
+ data.tar.gz: 14022d379e3e2dade67ffcd6ce12e56f9e12b65eb00e1906e579561262963fde36181b955526bfbd24c47baba3b4dfee15475c980e7f5bda4bff64ecf8e36859
data/lib/docker/exec.rb CHANGED
@@ -21,7 +21,7 @@ class Docker::Exec
21
21
  container = options.delete('Container')
22
22
 
23
23
  # Podman does not attach these by default but does require them to be attached
24
- if ::Docker.podman?
24
+ if ::Docker.podman?(conn)
25
25
  options['AttachStderr'] = true if options['AttachStderr'].nil?
26
26
  options['AttachStdout'] = true if options['AttachStdout'].nil?
27
27
  end
data/lib/docker/util.rb CHANGED
@@ -1,8 +1,10 @@
1
+ require 'set'
2
+
1
3
  # This module holds shared logic that doesn't really belong anywhere else in the
2
4
  # gem.
3
5
  module Docker::Util
4
6
  # http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm#STANDARD-WILDCARDS
5
- GLOB_WILDCARDS = /[\?\*\[\{]/
7
+ GLOB_WILDCARDS = /[\?\*\[\{\]\}]/
6
8
 
7
9
  include Docker::Error
8
10
 
@@ -142,10 +144,35 @@ module Docker::Util
142
144
  File.new(tempfile.path, 'r')
143
145
  end
144
146
 
147
+
148
+ # return the set of files that form the docker context
149
+ # implement this logic https://docs.docker.com/engine/reference/builder/#dockerignore-file
150
+ def docker_context(directory)
151
+ all_files = glob_all_files(File.join(directory, "**/*"))
152
+ dockerignore = File.join(directory, '.dockerignore')
153
+ return all_files unless all_files.include?(dockerignore)
154
+
155
+ # Iterate over valid lines, starting with the initial glob as working set
156
+ File
157
+ .read(dockerignore) # https://docs.docker.com/engine/reference/builder/#dockerignore-file
158
+ .each_line # "a newline-separated list of patterns"
159
+ .map(&:strip) # "A preprocessing step removes leading and trailing whitespace"
160
+ .reject(&:empty?) # "Lines that are blank after preprocessing are ignored"
161
+ .reject { |p| p.start_with?('#') } # "if [a line starts with `#`], then this line is considered as a comment"
162
+ .each_with_object(Set.new(all_files)) do |p, working_set|
163
+ # determine the pattern (p) and whether it is to be added or removed from context
164
+ add = p.start_with?("!")
165
+ # strip leading "!" from pattern p, then prepend the base directory
166
+ matches = dockerignore_compatible_glob(File.join(directory, add ? p[1..-1] : p))
167
+ # add or remove the matched items as indicated in the ignore file
168
+ add ? working_set.merge(matches) : working_set.replace(working_set.difference(matches))
169
+ end
170
+ .to_a
171
+ end
172
+
145
173
  def create_relative_dir_tar(directory, output)
146
174
  Gem::Package::TarWriter.new(output) do |tar|
147
- files = glob_all_files(File.join(directory, "**/*"))
148
- remove_ignored_files!(directory, files)
175
+ files = docker_context(directory)
149
176
 
150
177
  files.each do |prefixed_file_name|
151
178
  stat = File.stat(prefixed_file_name)
@@ -259,21 +286,23 @@ module Docker::Util
259
286
  }
260
287
  end
261
288
 
262
- def glob_all_files(pattern)
263
- Dir.glob(pattern, File::FNM_DOTMATCH) - ['..', '.']
289
+ # do a directory glob that matches .dockerignore behavior
290
+ # specifically: matched directories are considered a recursive match
291
+ def dockerignore_compatible_glob(pattern)
292
+ begin
293
+ some_dirs, some_files = glob_all_files(pattern).partition { |f| File.directory?(f) }
294
+ # since all directories will be re-processed with a /**/* glob, we can preemptively
295
+ # eliminate any whose parent directory is already in this set. This saves significant time.
296
+ some_files + some_dirs.reject { |d| some_dirs.any? { |pd| d.start_with?(pd) && d != pd } }
297
+ end.each_with_object(Set.new) do |f, acc|
298
+ # expand any directories by globbing; flatten results
299
+ acc.merge(File.directory?(f) ? glob_all_files("#{f}/**/*") : [f])
300
+ end
264
301
  end
265
302
 
266
- def remove_ignored_files!(directory, files)
267
- ignore = File.join(directory, '.dockerignore')
268
- return unless files.include?(ignore)
269
- ignored_files(directory, ignore).each { |f| files.delete(f) }
303
+ def glob_all_files(pattern)
304
+ # globs of "a_dir/**/*" can return "a_dir/.", so explicitly reject those
305
+ (Dir.glob(pattern, File::FNM_DOTMATCH) - ['..', '.']).reject { |p| p.end_with?("/.") }
270
306
  end
271
307
 
272
- def ignored_files(directory, ignore_file)
273
- patterns = File.read(ignore_file).split("\n").each(&:strip!)
274
- patterns.reject! { |p| p.empty? || p.start_with?('#') }
275
- patterns.map! { |p| File.join(directory, p) }
276
- patterns.map! { |p| File.directory?(p) ? "#{p}/**/*" : p }
277
- patterns.flat_map { |p| p =~ GLOB_WILDCARDS ? glob_all_files(p) : p }
278
- end
279
308
  end
@@ -1,4 +1,4 @@
1
1
  module Docker
2
2
  # The version of the docker-api gem.
3
- VERSION = '2.1.0'
3
+ VERSION = '2.2.0'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Swipely, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-03 00:00:00.000000000 Z
11
+ date: 2021-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon