diff --git a/anvil/components/base_install.py b/anvil/components/base_install.py index b709bb9d..6d0f5806 100644 --- a/anvil/components/base_install.py +++ b/anvil/components/base_install.py @@ -63,18 +63,24 @@ class PkgInstallComponent(base.Component): fetcher.download() return uris - def patch(self, section): + def list_patches(self, section): what_patches = self.get_option('patches', section) - (_from_uri, target_dir) = self._get_download_location() if not what_patches: what_patches = [] canon_what_patches = [] for path in what_patches: if sh.isdir(path): - canon_what_patches.extend(sorted(sh.listdir(path, files_only=True))) + patches = sorted(fn for fn in sh.listdir(path, files_only=True) + if fn.endswith('patch')) + canon_what_patches.extend(patches) elif sh.isfile(path): canon_what_patches.append(path) + return canon_what_patches + + def patch(self, section): + canon_what_patches = self.list_patches(section) if canon_what_patches: + (_from_uri, target_dir) = self._get_download_location() patcher.apply_patches(canon_what_patches, target_dir) def config_params(self, config_fn): diff --git a/anvil/packaging/yum.py b/anvil/packaging/yum.py index 915a7817..8740d1ab 100644 --- a/anvil/packaging/yum.py +++ b/anvil/packaging/yum.py @@ -287,8 +287,7 @@ class YumDependencyHandler(base.DependencyHandler): quiet=True) p_bar.update(i + 1) - def _write_spec_file(self, instance, app_dir, rpm_name, template_name, - params): + def _write_spec_file(self, instance, rpm_name, template_name, params): requires_what = [] try: requires_what.extend(instance.egg_info['dependencies']) @@ -337,13 +336,19 @@ class YumDependencyHandler(base.DependencyHandler): for filename in sh.listdir(other_sources_dir, files_only=True): sh.copy(filename, self.rpm_sources_dir) - def _build_from_spec(self, instance, spec_filename): - app_dir = instance.get_option('app_dir') - if sh.isfile(sh.joinpths(app_dir, "setup.py")): - self._write_python_tarball(app_dir) + def _copy_patches(self, patches): + for filename in patches: + sh.copy(filename, self.rpm_sources_dir) + + def _build_from_spec(self, instance, spec_filename, patches=None): + pkg_dir = instance.get_option('app_dir') + if sh.isfile(sh.joinpths(pkg_dir, "setup.py")): + self._write_python_tarball(pkg_dir) else: - self._write_git_tarball(app_dir, spec_filename) + self._write_git_tarball(pkg_dir, spec_filename) self._copy_sources(instance) + if patches: + self._copy_patches(patches) self._copy_startup_scripts(spec_filename) cmdline = [ self.rpmbuild_executable, @@ -415,6 +420,8 @@ class YumDependencyHandler(base.DependencyHandler): def _build_openstack_package(self, instance): params = self._package_parameters(instance) + patches = instance.list_patches("package") + params['patches'] = [sh.basename(fn) for fn in patches] (rpm_name, template_name) = self._get_template_and_rpm_name(instance) try: egg_name = instance.egg_info['name'] @@ -429,17 +436,21 @@ class YumDependencyHandler(base.DependencyHandler): params["apiname"] = self.API_NAMES.get(client_name, client_name.title()) except AttributeError: - spec_filename = sh.joinpths(settings.TEMPLATE_DIR, - self.SPEC_TEMPLATE_DIR, template_name) - if not sh.isfile(spec_filename): + spec_filename = None + if template_name: + spec_filename = sh.joinpths(settings.TEMPLATE_DIR, + self.SPEC_TEMPLATE_DIR, + template_name) + if not spec_filename or not sh.isfile(spec_filename): rpm_name = None - app_dir = instance.get_option('app_dir') if rpm_name: - template_name = template_name or "%s.spec" % rpm_name - spec_filename = self._write_spec_file(instance, app_dir, rpm_name, + if not template_name: + template_name = "%s.spec" % rpm_name + spec_filename = self._write_spec_file(instance, rpm_name, template_name, params) - self._build_from_spec(instance, spec_filename) + self._build_from_spec(instance, spec_filename, patches) else: + app_dir = instance.get_option('app_dir') cmdline = self.py2rpm_start_cmdline() + ["--", app_dir] sh.execute_save_output(cmdline, cwd=app_dir, diff --git a/conf/templates/packaging/specs/novnc.spec b/conf/templates/packaging/specs/novnc.spec index f619a8e3..d1e5c8ac 100644 --- a/conf/templates/packaging/specs/novnc.spec +++ b/conf/templates/packaging/specs/novnc.spec @@ -7,7 +7,6 @@ Epoch: $epoch Version: %{os_version}$version_suffix Release: $release%{?dist} -#raw License: GPLv3 URL: https://github.com/kanaka/noVNC Source0: novnc-%{os_version}.tar.gz @@ -15,6 +14,11 @@ Source1: openstack-nova-novncproxy.init Source2: nova-novncproxy.1 Source3: novnc_server.1 +#for $idx, $fn in enumerate($patches) +Patch$idx: $fn +#end for + +#raw BuildArch: noarch BuildRequires: python2-devel @@ -39,6 +43,11 @@ OpenStack Nova noVNC server that proxies VNC traffic over Websockets. %prep %setup -q -n %{name}-%{os_version} +#end raw +#for $idx, $fn in enumerate($patches) +%patch$idx -p1 +#end for +#raw # call the websockify executable sed -i 's/wsproxy\.py/websockify/' utils/launch.sh diff --git a/conf/templates/packaging/specs/openstack-cinder.spec b/conf/templates/packaging/specs/openstack-cinder.spec index 3cb0c276..57eee97e 100644 --- a/conf/templates/packaging/specs/openstack-cinder.spec +++ b/conf/templates/packaging/specs/openstack-cinder.spec @@ -31,6 +31,9 @@ Source11: openstack-cinder-scheduler.init Source12: openstack-cinder-volume.init Source13: openstack-cinder-all.init +#for $idx, $fn in enumerate($patches) +Patch$idx: $fn +#end for BuildArch: noarch BuildRequires: python-setuptools @@ -94,9 +97,12 @@ access block storage volumes for use by Virtual Machine instances. This package contains documentation files for cinder. %endif -#raw %prep %setup -q -n cinder-%{os_version} +#for $idx, $fn in enumerate($patches) +%patch$idx -p1 +#end for +#raw # Ensure we don't access the net when building docs sed -i "/'sphinx.ext.intersphinx',/d" doc/source/conf.py diff --git a/conf/templates/packaging/specs/openstack-glance.spec b/conf/templates/packaging/specs/openstack-glance.spec index a2d6cddf..4b6cfe5d 100644 --- a/conf/templates/packaging/specs/openstack-glance.spec +++ b/conf/templates/packaging/specs/openstack-glance.spec @@ -27,6 +27,10 @@ Source2: openstack-glance-registry.init Source3: openstack-glance-scrubber.init Source4: openstack-glance.logrotate +#for $idx, $fn in enumerate($patches) +Patch$idx: $fn +#end for + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release} BuildArch: noarch @@ -88,6 +92,12 @@ This package contains documentation files for glance. %prep %setup -q -n %{python_name}-%{os_version} +#end raw +#for $idx, $fn in enumerate($patches) +%patch$idx -p1 +#end for + +#raw sed '/pysendfile/d' tools/pip-requires diff --git a/conf/templates/packaging/specs/openstack-keystone.spec b/conf/templates/packaging/specs/openstack-keystone.spec index 5b4db6a6..cae48e9d 100644 --- a/conf/templates/packaging/specs/openstack-keystone.spec +++ b/conf/templates/packaging/specs/openstack-keystone.spec @@ -24,6 +24,10 @@ Group: Applications/System Source0: %{python_name}-%{os_version}.tar.gz Source1: openstack-keystone-all.init +#for $idx, $fn in enumerate($patches) +Patch$idx: $fn +#end for + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release} BuildArch: noarch @@ -73,10 +77,12 @@ Keystone is a Python implementation of the OpenStack This package contains the Keystone Python library. -#raw %prep %setup -q -n %{python_name}-%{os_version} - +#for $idx, $fn in enumerate($patches) +%patch$idx -p1 +#end for +#raw %build python setup.py build diff --git a/conf/templates/packaging/specs/openstack-nova.spec b/conf/templates/packaging/specs/openstack-nova.spec index 62e8fc0f..9424f6c4 100644 --- a/conf/templates/packaging/specs/openstack-nova.spec +++ b/conf/templates/packaging/specs/openstack-nova.spec @@ -45,6 +45,10 @@ Source51: nova.logrotate Source52: nova-polkit.pkla Source53: nova-sudoers +#for $idx, $fn in enumerate($patches) +Patch$idx: $fn +#end for + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release} BuildArch: noarch @@ -324,9 +328,12 @@ protocol, and the Redis KVS. This package contains documentation files for %{name}. %endif -#raw %prep %setup0 -q -n %{python_name}-%{os_version} +#for $idx, $fn in enumerate($patches) +%patch$idx -p1 +#end for +#raw %build %{__python} setup.py build diff --git a/conf/templates/packaging/specs/openstack-quantum.spec b/conf/templates/packaging/specs/openstack-quantum.spec index 9a4d94a6..eb32897f 100644 --- a/conf/templates/packaging/specs/openstack-quantum.spec +++ b/conf/templates/packaging/specs/openstack-quantum.spec @@ -41,6 +41,10 @@ Source17: quantum-ovs-cleanup.init Source18: quantum-hyperv-agent.init Source19: quantum-rpc-zmq-receiver.init +#for $idx, $fn in enumerate($patches) +Patch$idx: $fn +#end for + BuildArch: noarch BuildRequires: python-devel @@ -275,9 +279,12 @@ networks. This package contains the quantum plugin that implements virtual networks using multiple other quantum plugins. -#raw %prep %setup -q -n quantum-%{os_version} +#for $idx, $fn in enumerate($patches) +%patch$idx -p1 +#end for +#raw find quantum -name \*.py -exec sed -i '/\/usr\/bin\/env python/d' {} \; diff --git a/conf/templates/packaging/specs/python-commonclient.spec b/conf/templates/packaging/specs/python-commonclient.spec index bf6db67b..92b6e3e1 100644 --- a/conf/templates/packaging/specs/python-commonclient.spec +++ b/conf/templates/packaging/specs/python-commonclient.spec @@ -26,6 +26,10 @@ Vendor: OpenStack Foundation URL: http://www.openstack.org Source0: %{name}-%{os_version}.tar.gz +#for $idx, $fn in enumerate($patches) +Patch$idx: $fn +#end for + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release} BuildArch: noarch @@ -44,7 +48,6 @@ Requires: ${i} This is a client for the OpenStack $apiname API. There is a Python API (the ${clientname}client module), and a command-line script (${clientname}). -#raw %if 0%{?enable_doc} %package doc Summary: Documentation for %{name} @@ -59,6 +62,10 @@ Documentation for %{name}. %prep %setup -q +#for $idx, $fn in enumerate($patches) +%patch$idx -p1 +#end for +#raw if [ ! -f HACKING* ]; then touch HACKING fi diff --git a/conf/templates/packaging/specs/python-django-horizon.spec b/conf/templates/packaging/specs/python-django-horizon.spec index c007b3d5..35ac15a5 100644 --- a/conf/templates/packaging/specs/python-django-horizon.spec +++ b/conf/templates/packaging/specs/python-django-horizon.spec @@ -22,6 +22,10 @@ Source0: horizon-%{os_version}.tar.gz Source1: openstack-dashboard.conf Source2: openstack-dashboard-httpd-2.4.conf +#for $idx, $fn in enumerate($patches) +Patch$idx: $fn +#end for + # additional provides to be consistent with other django packages Provides: django-horizon = %{epoch}:%{version}-%{release} @@ -77,9 +81,12 @@ BuildRequires: python-swiftclient Documentation for the Django Horizon application for talking with Openstack %endif -#raw %prep %setup -q -n horizon-%{os_version} +#for $idx, $fn in enumerate($patches) +%patch$idx -p1 +#end for +#raw # Don't access the net while building docs sed -i '/sphinx.ext.intersphinx/d' doc/source/conf.py