diff --git a/.files b/.files
index d5ab437..3b7927c 100644
Binary files a/.files and b/.files differ
diff --git a/.rev b/.rev
index afa6f4e..3902efb 100644
--- a/.rev
+++ b/.rev
@@ -771,4 +771,12 @@ numbers for further reference.
821649
+
+ 5b9876aa19f32cb1f6ec86c9e54a28d5
+ 2.9.11
+
+ dimstar_suse
+
+ 822847
+
diff --git a/ansible-2.9.10.tar.gz b/ansible-2.9.10.tar.gz
deleted file mode 120000
index b2b9ef3..0000000
--- a/ansible-2.9.10.tar.gz
+++ /dev/null
@@ -1 +0,0 @@
-/ipfs/bafybeidqhdkpp4lhc43sem4bp6646yul375uaguytiao52xxkl3be3spym
\ No newline at end of file
diff --git a/ansible-2.9.10.tar.gz.sha b/ansible-2.9.10.tar.gz.sha
deleted file mode 100644
index 09f0949..0000000
--- a/ansible-2.9.10.tar.gz.sha
+++ /dev/null
@@ -1 +0,0 @@
-0866f1432db1698758ca5753f2c1c2a8048823cc6f9ab4b7d03162c44febcacd ansible-2.9.10.tar.gz
diff --git a/ansible-2.9.11.tar.gz b/ansible-2.9.11.tar.gz
new file mode 120000
index 0000000..80c10a0
--- /dev/null
+++ b/ansible-2.9.11.tar.gz
@@ -0,0 +1 @@
+/ipfs/bafybeiemga4tyw2dmwwjta456riq67apyjbefo7m62yj6rr2ifw2ocboeu
\ No newline at end of file
diff --git a/ansible-2.9.11.tar.gz.sha b/ansible-2.9.11.tar.gz.sha
new file mode 100644
index 0000000..ea5862f
--- /dev/null
+++ b/ansible-2.9.11.tar.gz.sha
@@ -0,0 +1 @@
+88f9d033ece7fd51eca3abb4f02e13b63c924b97f9705a997d5a711c0cf42ab1 ansible-2.9.11.tar.gz
diff --git a/ansible.changes b/ansible.changes
index ac1136b..bd363de 100644
--- a/ansible.changes
+++ b/ansible.changes
@@ -1,4 +1,10 @@
-------------------------------------------------------------------
+Tue Jul 21 04:48:11 UTC 2020 - Michael Ströder
+
+- update to version 2.9.11 with many bug fixes
+- removed ansible_bugfix_640.diff obsoleted by upstream update
+
+-------------------------------------------------------------------
Mon Jul 13 17:53:58 UTC 2020 - Andrey Karepin
- added ansible_bugfix_640.diff to fix gh#ansible-collections/community.general#640
diff --git a/ansible.spec b/ansible.spec
index 0104d51..42a9061 100644
--- a/ansible.spec
+++ b/ansible.spec
@@ -220,7 +220,7 @@ Recommends: %{python}-six
Recommends: sshpass
%endif
Name: ansible
-Version: 2.9.10
+Version: 2.9.11
Release: 0
Summary: SSH-based configuration management, deployment, and task execution system
License: GPL-3.0-or-later
@@ -229,8 +229,6 @@ URL: https://ansible.com/
Source: https://releases.ansible.com/ansible/ansible-%{version}.tar.gz
Source1: https://releases.ansible.com/ansible/ansible-%{version}.tar.gz.sha
Source99: ansible-rpmlintrc
-# PATCH-FEATURE-UPSTREAM ansible_bugfix_640.diff gh#ansible-collections/community.general#640
-Patch: ansible_bugfix_640.diff
BuildArch: noarch
# extented documentation
%if 0%{?with_docs}
@@ -290,9 +288,6 @@ automatically.
%prep
%setup -q -n ansible-%{version}
-pushd lib/ansible
-%patch -p2
-popd
for file in .git_keep .travis.yml ; do
find . -name "$file" -delete
diff --git a/ansible_bugfix_640.diff b/ansible_bugfix_640.diff
deleted file mode 100644
index 88eea20..0000000
--- a/ansible_bugfix_640.diff
+++ /dev/null
@@ -1,278 +0,0 @@
---- a/plugins/modules/cloud/docker/docker_container.py
-+++ b/plugins/modules/cloud/docker/docker_container.py
-@@ -1067,6 +1067,9 @@ from distutils.version import LooseVersi
- from time import sleep
-
- from ansible.module_utils.common.text.formatters import human_to_bytes
-+from ansible.module_utils.six import string_types
-+from ansible.module_utils._text import to_native, to_text
-+
- from ansible.module_utils.docker.common import (
- AnsibleDockerClient,
- DifferenceTracker,
-@@ -1080,7 +1083,6 @@ from ansible.module_utils.docker.common
- DOCKER_COMMON_ARGS,
- RequestException,
- )
--from ansible.module_utils.six import string_types
-
- try:
- from docker import utils
-@@ -1269,7 +1271,7 @@ class TaskParameters(DockerBaseClass):
- if self.groups:
- # In case integers are passed as groups, we need to convert them to
- # strings as docker internally treats them as strings.
-- self.groups = [str(g) for g in self.groups]
-+ self.groups = [to_text(g, errors='surrogate_or_strict') for g in self.groups]
-
- for param_name in REQUIRES_CONVERSION_TO_BYTES:
- if client.module.params.get(param_name):
-@@ -1301,7 +1303,7 @@ class TaskParameters(DockerBaseClass):
- try:
- self.healthcheck, self.disable_healthcheck = parse_healthcheck(self.healthcheck)
- except ValueError as e:
-- self.fail(str(e))
-+ self.fail(to_native(e))
-
- self.exp_links = None
- self.volume_binds = self._get_volume_binds(self.volumes)
-@@ -1328,12 +1330,12 @@ class TaskParameters(DockerBaseClass):
-
- if self.entrypoint:
- # convert from list to str.
-- self.entrypoint = ' '.join([str(x) for x in self.entrypoint])
-+ self.entrypoint = ' '.join([to_text(x, errors='surrogate_or_strict') for x in self.entrypoint])
-
- if self.command:
- # convert from list to str
- if isinstance(self.command, list):
-- self.command = ' '.join([str(x) for x in self.command])
-+ self.command = ' '.join([to_text(x, errors='surrogate_or_strict') for x in self.command])
-
- self.mounts_opt, self.expected_mounts = self._process_mounts()
-
-@@ -1587,7 +1589,7 @@ class TaskParameters(DockerBaseClass):
-
- binds = {}
- for port in self.published_ports:
-- parts = split_colon_ipv6(str(port), self.client)
-+ parts = split_colon_ipv6(to_text(port, errors='surrogate_or_strict'), self.client)
- container_port = parts[-1]
- protocol = ''
- if '/' in container_port:
-@@ -1657,7 +1659,7 @@ class TaskParameters(DockerBaseClass):
- exposed = []
- if self.exposed_ports:
- for port in self.exposed_ports:
-- port = str(port).strip()
-+ port = to_text(port, errors='surrogate_or_strict').strip()
- protocol = 'tcp'
- match = re.search(r'(/.+$)', port)
- if match:
-@@ -1751,9 +1753,10 @@ class TaskParameters(DockerBaseClass):
- if not isinstance(v, string_types):
- self.client.module.warn(
- "Non-string value found for log_options option '%s'. The value is automatically converted to '%s'. "
-- "If this is not correct, or you want to avoid such warnings, please quote the value." % (k, str(v))
-+ "If this is not correct, or you want to avoid such warnings, please quote the value." % (
-+ k, to_text(v, errors='surrogate_or_strict'))
- )
-- v = str(v)
-+ v = to_text(v, errors='surrogate_or_strict')
- self.log_options[k] = v
- options['Config'][k] = v
-
-@@ -1787,13 +1790,13 @@ class TaskParameters(DockerBaseClass):
- if self.env_file:
- parsed_env_file = utils.parse_env_file(self.env_file)
- for name, value in parsed_env_file.items():
-- final_env[name] = str(value)
-+ final_env[name] = to_text(value, errors='surrogate_or_strict')
- if self.env:
- for name, value in self.env.items():
- if not isinstance(value, string_types):
- self.fail("Non-string value found for env option. Ambiguous env options must be "
- "wrapped in quotes to avoid them being interpreted. Key: %s" % (name, ))
-- final_env[name] = str(value)
-+ final_env[name] = to_text(value, errors='surrogate_or_strict')
- return final_env
-
- def _get_network_id(self, network_name):
-@@ -1804,7 +1807,7 @@ class TaskParameters(DockerBaseClass):
- network_id = network['Id']
- break
- except Exception as exc:
-- self.fail("Error getting network id for %s - %s" % (network_name, str(exc)))
-+ self.fail("Error getting network id for %s - %s" % (network_name, to_native(exc)))
- return network_id
-
- def _process_mounts(self):
-@@ -2160,7 +2163,7 @@ class Container(DockerBaseClass):
- if not minimal_version.get('supported', True):
- continue
- compare = self.parameters.client.comparisons[self.parameters_map.get(key, key)]
-- self.log('check differences %s %s vs %s (%s)' % (key, getattr(self.parameters, key), str(value), compare))
-+ self.log('check differences %s %s vs %s (%s)' % (key, getattr(self.parameters, key), to_text(value, errors='surrogate_or_strict'), compare))
- if getattr(self.parameters, key, None) is not None:
- match = self._compare(getattr(self.parameters, key), value, compare)
-
-@@ -2183,7 +2186,7 @@ class Container(DockerBaseClass):
- else:
- # We sort the list of dictionaries by using the sorted items of a dict as its key.
- def sort_key_fn(x):
-- return sorted((a, str(b)) for a, b in x.items())
-+ return sorted((a, to_text(b, errors='surrogate_or_strict')) for a, b in x.items())
- if p is not None:
- p = sorted(p, key=sort_key_fn)
- if c is not None:
-@@ -2363,9 +2366,9 @@ class Container(DockerBaseClass):
- elif isinstance(config[0], tuple):
- expected_bound_ports[container_port] = []
- for host_ip, host_port in config:
-- expected_bound_ports[container_port].append({'HostIp': host_ip, 'HostPort': str(host_port)})
-+ expected_bound_ports[container_port].append({'HostIp': host_ip, 'HostPort': to_text(host_port, errors='surrogate_or_strict')})
- else:
-- expected_bound_ports[container_port] = [{'HostIp': config[0], 'HostPort': str(config[1])}]
-+ expected_bound_ports[container_port] = [{'HostIp': config[0], 'HostPort': to_text(config[1], errors='surrogate_or_strict')}]
- return expected_bound_ports
-
- def _get_expected_links(self):
-@@ -2482,7 +2485,7 @@ class Container(DockerBaseClass):
- image_ports = [self._normalize_port(p) for p in image_exposed_ports.keys()]
- param_ports = []
- if self.parameters.ports:
-- param_ports = [str(p[0]) + '/' + p[1] for p in self.parameters.ports]
-+ param_ports = [to_text(p[0], errors='surrogate_or_strict') + '/' + p[1] for p in self.parameters.ports]
- result = list(set(image_ports + param_ports))
- self.log(result, pretty_print=True)
- return result
-@@ -2506,7 +2509,7 @@ class Container(DockerBaseClass):
- return None
- result = dict()
- for key, value in config_sysctls.items():
-- result[key] = str(value)
-+ result[key] = to_text(value, errors='surrogate_or_strict')
- return result
-
- def _get_expected_cmd(self):
-@@ -2688,7 +2691,7 @@ class ContainerManager(DockerBaseClass):
- self.client.unpause(container=container.Id)
- except Exception as exc:
- self.fail("Error %s container %s: %s" % (
-- "pausing" if self.parameters.paused else "unpausing", container.Id, str(exc)
-+ "pausing" if self.parameters.paused else "unpausing", container.Id, to_native(exc)
- ))
- container = self._get_container(container.Id)
- self.results['changed'] = True
-@@ -2810,7 +2813,7 @@ class ContainerManager(DockerBaseClass):
- self.client.disconnect_container_from_network(container.Id, diff['parameter']['id'])
- except Exception as exc:
- self.fail("Error disconnecting container from network %s - %s" % (diff['parameter']['name'],
-- str(exc)))
-+ to_native(exc)))
- # connect to the network
- params = dict()
- for para in ('ipv4_address', 'ipv6_address', 'links', 'aliases'):
-@@ -2823,7 +2826,7 @@ class ContainerManager(DockerBaseClass):
- self.log(params, pretty_print=True)
- self.client.connect_container_to_network(container.Id, diff['parameter']['id'], **params)
- except Exception as exc:
-- self.fail("Error connecting container to network %s - %s" % (diff['parameter']['name'], str(exc)))
-+ self.fail("Error connecting container to network %s - %s" % (diff['parameter']['name'], to_native(exc)))
- return self._get_container(container.Id)
-
- def _purge_networks(self, container, networks):
-@@ -2834,7 +2837,7 @@ class ContainerManager(DockerBaseClass):
- self.client.disconnect_container_from_network(container.Id, network['name'])
- except Exception as exc:
- self.fail("Error disconnecting container from network %s - %s" % (network['name'],
-- str(exc)))
-+ to_native(exc)))
- return self._get_container(container.Id)
-
- def container_create(self, image, create_parameters):
-@@ -2849,7 +2852,7 @@ class ContainerManager(DockerBaseClass):
- new_container = self.client.create_container(image, **create_parameters)
- self.client.report_warnings(new_container)
- except Exception as exc:
-- self.fail("Error creating container: %s" % str(exc))
-+ self.fail("Error creating container: %s" % to_native(exc))
- return self._get_container(new_container['Id'])
- return new_container
-
-@@ -2861,7 +2864,7 @@ class ContainerManager(DockerBaseClass):
- try:
- self.client.start(container=container_id)
- except Exception as exc:
-- self.fail("Error starting container %s: %s" % (container_id, str(exc)))
-+ self.fail("Error starting container %s: %s" % (container_id, to_native(exc)))
-
- if not self.parameters.detach:
- if self.client.docker_py_version >= LooseVersion('3.0'):
-@@ -2913,21 +2916,21 @@ class ContainerManager(DockerBaseClass):
- # New docker daemon versions do not allow containers to be removed
- # if they are paused. Make sure we don't end up in an infinite loop.
- if count == 3:
-- self.fail("Error removing container %s (tried to unpause three times): %s" % (container_id, str(exc)))
-+ self.fail("Error removing container %s (tried to unpause three times): %s" % (container_id, to_native(exc)))
- count += 1
- # Unpause
- try:
- self.client.unpause(container=container_id)
- except Exception as exc2:
-- self.fail("Error unpausing container %s for removal: %s" % (container_id, str(exc2)))
-+ self.fail("Error unpausing container %s for removal: %s" % (container_id, to_native(exc2)))
- # Now try again
- continue
- if 'removal of container ' in exc.explanation and ' is already in progress' in exc.explanation:
- pass
- else:
-- self.fail("Error removing container %s: %s" % (container_id, str(exc)))
-+ self.fail("Error removing container %s: %s" % (container_id, to_native(exc)))
- except Exception as exc:
-- self.fail("Error removing container %s: %s" % (container_id, str(exc)))
-+ self.fail("Error removing container %s: %s" % (container_id, to_native(exc)))
- # We only loop when explicitly requested by 'continue'
- break
- return response
-@@ -2943,7 +2946,7 @@ class ContainerManager(DockerBaseClass):
- result = self.client.update_container(container_id, **update_parameters)
- self.client.report_warnings(result)
- except Exception as exc:
-- self.fail("Error updating container %s: %s" % (container_id, str(exc)))
-+ self.fail("Error updating container %s: %s" % (container_id, to_native(exc)))
- return self._get_container(container_id)
-
- def container_kill(self, container_id):
-@@ -2970,7 +2973,7 @@ class ContainerManager(DockerBaseClass):
- else:
- dummy = self.client.restart(container_id)
- except Exception as exc:
-- self.fail("Error restarting container %s: %s" % (container_id, str(exc)))
-+ self.fail("Error restarting container %s: %s" % (container_id, to_native(exc)))
- return self._get_container(container_id)
-
- def container_stop(self, container_id):
-@@ -2993,18 +2996,18 @@ class ContainerManager(DockerBaseClass):
- # New docker daemon versions do not allow containers to be removed
- # if they are paused. Make sure we don't end up in an infinite loop.
- if count == 3:
-- self.fail("Error removing container %s (tried to unpause three times): %s" % (container_id, str(exc)))
-+ self.fail("Error removing container %s (tried to unpause three times): %s" % (container_id, to_native(exc)))
- count += 1
- # Unpause
- try:
- self.client.unpause(container=container_id)
- except Exception as exc2:
-- self.fail("Error unpausing container %s for removal: %s" % (container_id, str(exc2)))
-+ self.fail("Error unpausing container %s for removal: %s" % (container_id, to_native(exc2)))
- # Now try again
- continue
-- self.fail("Error stopping container %s: %s" % (container_id, str(exc)))
-+ self.fail("Error stopping container %s: %s" % (container_id, to_native(exc)))
- except Exception as exc:
-- self.fail("Error stopping container %s: %s" % (container_id, str(exc)))
-+ self.fail("Error stopping container %s: %s" % (container_id, to_native(exc)))
- # We only loop when explicitly requested by 'continue'
- break
- return response