From 761b27fee6ed0d3082d043dff2a7c61436a7aab9 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Thu, 4 Jul 2013 22:30:22 -0400 Subject: Add support for globbing in data files Similar to the work in the packages argument, allow the specification of a directory to recursively include as part of the install. Change-Id: Ife0414af468e7fcd4fc419eafc3e19e29efcfc7b --- doc/source/index.rst | 8 ++++- pbr/hooks/files.py | 21 +++++++++++++ pbr/tests/__init__.py | 15 ++++++++++ pbr/tests/test_files.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ pbr/tests/test_setup.py | 36 +++++++--------------- 5 files changed, 133 insertions(+), 27 deletions(-) create mode 100644 pbr/tests/test_files.py diff --git a/doc/source/index.rst b/doc/source/index.rst index 018b800..d3761d7 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -104,6 +104,7 @@ A simple sample can be found in pbr s own setup.cfg packages = pbr data_files = + etc/pbr = etc/* etc/init = pbr.packaging.conf pbr.version.conf @@ -151,10 +152,12 @@ namespace packages. that contains key value pairs which specify target directory and source file to install there. More than one source file for a directory may be indicated with a further indented list. Source files are stripped of leading -directories, so:: +directories. Additionally, `pbr` supports a simple file globbing syntax +for installing entire directory structures, so:: [files] data_files = + etc/pbr = etc/pbr/* etc/neutron = etc/api-paste.ini etc/dhcp-agent.ini @@ -165,6 +168,9 @@ both of which pbr will expect to find in the `etc` directory in the root of the source tree. Additionally, `neutron.init` from that dir will be installed in `/etc/init.d`. +All of the files and directories located under `etc/pbr` in the source tree +will be installed into `/etc/pbr`. + entry_points ------------ diff --git a/pbr/hooks/files.py b/pbr/hooks/files.py index fb6a9bf..ba24aac 100644 --- a/pbr/hooks/files.py +++ b/pbr/hooks/files.py @@ -50,6 +50,25 @@ class FilesConfig(base.BaseConfig): self.config['data_files'] = self.data_files super(FilesConfig, self).save() + def expand_globs(self): + finished = [] + for line in self.data_files.split("\n"): + if line.rstrip().endswith('*') and '=' in line: + (target, source_glob) = line.split('=') + source_prefix = source_glob.strip()[:-1] + target = target.strip() + 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)) + finished.extend( + [" %s" % os.path.join(dirpath, f) for f in fnames]) + else: + finished.append(line) + + self.data_files = "\n".join(finished) + def add_man_path(self, man_path): self.data_files = "%s\n%s =" % (self.data_files, man_path) @@ -71,6 +90,8 @@ class FilesConfig(base.BaseConfig): if os.path.isdir(package): self.config['packages'] = find_package.smart_find_packages(package) + self.expand_globs() + if 'manpages' in self.pbr_config: man_sections = self.get_man_sections() for (section, pages) in man_sections.items(): diff --git a/pbr/tests/__init__.py b/pbr/tests/__init__.py index a4874c3..6c6fb59 100644 --- a/pbr/tests/__init__.py +++ b/pbr/tests/__init__.py @@ -53,6 +53,21 @@ import testtools from pbr import packaging +class DiveDir(fixtures.Fixture): + """Dive into given directory and return back on cleanup. + + :ivar path: The target directory. + """ + + def __init__(self, path): + self.path = path + + def setUp(self): + super(DiveDir, self).setUp() + self.addCleanup(os.chdir, os.getcwd()) + os.chdir(self.path) + + class BaseTestCase(testtools.TestCase, testresources.ResourcedTestCase): def setUp(self): diff --git a/pbr/tests/test_files.py b/pbr/tests/test_files.py new file mode 100644 index 0000000..3805339 --- /dev/null +++ b/pbr/tests/test_files.py @@ -0,0 +1,80 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from __future__ import print_function + +import os + +import fixtures + +from pbr.hooks import files +from pbr import tests + + +class FilesConfigTest(tests.BaseTestCase): + + def setUp(self): + super(FilesConfigTest, self).setUp() + + pkg_fixture = fixtures.PythonPackage( + "fake_package", [ + ("fake_module.py", b""), + ("other_fake_module.py", b""), + ]) + self.useFixture(pkg_fixture) + pkg_etc = os.path.join(pkg_fixture.base, 'etc') + 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) + 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(subpackage, "__init__.py"), 'w') as foo_file: + foo_file.write("# empty") + + self.useFixture(tests.DiveDir(pkg_fixture.base)) + + def test_implicit_auto_package(self): + config = dict( + files=dict( + ) + ) + files.FilesConfig(config, 'fake_package').run() + self.assertIn('subpackage', config['files']['packages']) + + def test_auto_package(self): + config = dict( + files=dict( + packages='fake_package', + ) + ) + files.FilesConfig(config, 'fake_package').run() + self.assertIn('subpackage', config['files']['packages']) + + def test_data_files_globbing(self): + config = dict( + files=dict( + data_files="\n etc/pbr = etc/*" + ) + ) + files.FilesConfig(config, 'fake_package').run() + self.assertIn( + '\netc/pbr/ = \n etc/foo\netc/pbr/sub = \n etc/sub/bar', + config['files']['data_files']) diff --git a/pbr/tests/test_setup.py b/pbr/tests/test_setup.py index 21c28f3..398c503 100644 --- a/pbr/tests/test_setup.py +++ b/pbr/tests/test_setup.py @@ -4,17 +4,17 @@ # Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # All Rights Reserved. # -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. from __future__ import print_function @@ -36,22 +36,6 @@ from pbr import packaging from pbr import tests -class DiveDir(fixtures.Fixture): - """Dive into given directory and return back on cleanup. - - :ivar path: The target directory. - """ - - def __init__(self, path): - self.path = path - - def setUp(self): - super(DiveDir, self).setUp() - self.old_path = os.getcwd() - os.chdir(self.path) - self.addCleanup(os.chdir, self.old_path) - - class EmailTestCase(tests.BaseTestCase): def test_str_dict_replace(self): @@ -256,7 +240,7 @@ class BuildSphinxTest(tests.BaseTestCase): pkg_fixture = fixtures.PythonPackage( "fake_package", [("fake_module.py", b"")]) self.useFixture(pkg_fixture) - self.useFixture(DiveDir(pkg_fixture.base)) + self.useFixture(tests.DiveDir(pkg_fixture.base)) def test_build_doc(self): if self.has_opt: -- cgit v1.2.1