summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Szumski <will@stackhpc.com>2019-01-07 15:34:45 +0000
committerWill Szumski <will@stackhpc.com>2019-01-11 13:56:52 +0000
commita9b31113b76bde3debc696c1ce71aa7dd594faa3 (patch)
treea9fa6acfad07626f2667e75cbf9f2f4bab181943
parent11cf070f9412363ba3cec9e746b34d06c6f73a0b (diff)
downloadpbr-a9b31113b76bde3debc696c1ce71aa7dd594faa3.tar.gz
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
-rw-r--r--pbr/hooks/files.py8
-rw-r--r--pbr/tests/test_files.py21
-rw-r--r--releasenotes/notes/fix-global-replace-of-src-prefix-in-glob-eb850b94ca96993e.yaml9
3 files changed, 36 insertions, 2 deletions
diff --git a/pbr/hooks/files.py b/pbr/hooks/files.py
index 48bf9e3..750ac32 100644
--- a/pbr/hooks/files.py
+++ b/pbr/hooks/files.py
@@ -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:
diff --git a/pbr/tests/test_files.py b/pbr/tests/test_files.py
index e60b6ca..ed67f7b 100644
--- a/pbr/tests/test_files.py
+++ b/pbr/tests/test_files.py
@@ -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'])
diff --git a/releasenotes/notes/fix-global-replace-of-src-prefix-in-glob-eb850b94ca96993e.yaml b/releasenotes/notes/fix-global-replace-of-src-prefix-in-glob-eb850b94ca96993e.yaml
new file mode 100644
index 0000000..b2895aa
--- /dev/null
+++ b/releasenotes/notes/fix-global-replace-of-src-prefix-in-glob-eb850b94ca96993e.yaml
@@ -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>`_.