Do not globally replace path prefix
If a subdirectory contained the source prefix in it's name, this was replaced globally e.g using share/ansible = ansible/*, with the following directory structure: ansible/roles/kolla-ansible/test would result in the files being installed as follows: share/ansible/roles/kolla-share/test whereas we expected: share/ansible/roles/kolla-ansible/test This patch changes the behavior so that only the first occurance is replaced. Change-Id: I0aab845315dab0aaccd5f67725d2ebcf0fd08aef Fixes-Bug: 1810804
This commit is contained in:
parent
11cf070f94
commit
a9b31113b7
|
@ -58,8 +58,12 @@ class FilesConfig(base.BaseConfig):
|
|||
if not target.endswith(os.path.sep):
|
||||
target += os.path.sep
|
||||
for (dirpath, dirnames, fnames) in os.walk(source_prefix):
|
||||
finished.append(
|
||||
"%s = " % dirpath.replace(source_prefix, target))
|
||||
# As source_prefix is always matched, using replace with a
|
||||
# a limit of one is always going to replace the path prefix
|
||||
# and not accidentally replace some text in the middle of
|
||||
# the path
|
||||
new_prefix = dirpath.replace(source_prefix, target, 1)
|
||||
finished.append("%s = " % new_prefix)
|
||||
finished.extend(
|
||||
[" %s" % os.path.join(dirpath, f) for f in fnames])
|
||||
else:
|
||||
|
|
|
@ -35,15 +35,20 @@ class FilesConfigTest(base.BaseTestCase):
|
|||
])
|
||||
self.useFixture(pkg_fixture)
|
||||
pkg_etc = os.path.join(pkg_fixture.base, 'etc')
|
||||
pkg_ansible = os.path.join(pkg_fixture.base, 'ansible',
|
||||
'kolla-ansible', 'test')
|
||||
pkg_sub = os.path.join(pkg_etc, 'sub')
|
||||
subpackage = os.path.join(
|
||||
pkg_fixture.base, 'fake_package', 'subpackage')
|
||||
os.makedirs(pkg_sub)
|
||||
os.makedirs(subpackage)
|
||||
os.makedirs(pkg_ansible)
|
||||
with open(os.path.join(pkg_etc, "foo"), 'w') as foo_file:
|
||||
foo_file.write("Foo Data")
|
||||
with open(os.path.join(pkg_sub, "bar"), 'w') as foo_file:
|
||||
foo_file.write("Bar Data")
|
||||
with open(os.path.join(pkg_ansible, "baz"), 'w') as baz_file:
|
||||
baz_file.write("Baz Data")
|
||||
with open(os.path.join(subpackage, "__init__.py"), 'w') as foo_file:
|
||||
foo_file.write("# empty")
|
||||
|
||||
|
@ -76,3 +81,19 @@ class FilesConfigTest(base.BaseTestCase):
|
|||
self.assertIn(
|
||||
'\netc/pbr/ = \n etc/foo\netc/pbr/sub = \n etc/sub/bar',
|
||||
config['files']['data_files'])
|
||||
|
||||
def test_data_files_globbing_source_prefix_in_directory_name(self):
|
||||
# We want to test that the string, "docs", is not replaced in a
|
||||
# subdirectory name, "sub-docs"
|
||||
config = dict(
|
||||
files=dict(
|
||||
data_files="\n share/ansible = ansible/*"
|
||||
)
|
||||
)
|
||||
files.FilesConfig(config, 'fake_package').run()
|
||||
self.assertIn(
|
||||
'\nshare/ansible/ = '
|
||||
'\nshare/ansible/kolla-ansible = '
|
||||
'\nshare/ansible/kolla-ansible/test = '
|
||||
'\n ansible/kolla-ansible/test/baz',
|
||||
config['files']['data_files'])
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
fixes:
|
||||
- |
|
||||
Fixes a bug where the directory names of items specified in ``data_files``
|
||||
could be renamed if the source prefix glob was contained within the
|
||||
directory name. See `bug 1810804
|
||||
<https://bugs.launchpad.net/pbr/+bug/1810804>`_ for details. For more
|
||||
information on ``data_files``, see the `distutils documentation
|
||||
<https://docs.python.org/2/distutils/setupscript.html#installing-additional-files>`_.
|
Loading…
Reference in New Issue