Merge "Ensure that we add in the missing paths."

This commit is contained in:
Jenkins 2013-07-01 00:46:21 +00:00 committed by Gerrit Code Review
commit 84068a9e57
4 changed files with 75 additions and 29 deletions

View File

@ -77,6 +77,7 @@ class DependencyHandler(object):
self.instances = instances
self.opts = opts or {}
self.deps_dir = sh.joinpths(self.root_dir, "deps")
self.downloaded_flag_file = sh.joinpths(self.deps_dir, "pip-downloaded")
self.download_dir = sh.joinpths(self.deps_dir, "download")
self.log_dir = sh.joinpths(self.deps_dir, "output")
self.gathered_requires_filename = sh.joinpths(
@ -302,18 +303,16 @@ class DependencyHandler(object):
"""
# NOTE(aababilov): do not drop download_dir - it can be reused
sh.mkdirslist(self.download_dir, tracewriter=self.tracewriter)
download_requires_filename = sh.joinpths(self.deps_dir,
"download-requires")
download_requires_filename = sh.joinpths(self.deps_dir, "download-requires")
raw_pips_to_download = self.filter_download_requires()
sh.write_file(download_requires_filename,
"\n".join(str(req) for req in raw_pips_to_download))
if not raw_pips_to_download:
return ([], [])
downloaded_flag_file = sh.joinpths(self.deps_dir, "pip-downloaded")
# NOTE(aababilov): user could have changed persona, so,
# check that all requirements are downloaded
if sh.isfile(downloaded_flag_file) and self._requirements_satisfied(
raw_pips_to_download, self.download_dir):
if (sh.isfile(self.downloaded_flag_file) and
self._requirements_satisfied(raw_pips_to_download, self.download_dir)):
LOG.info("All python dependencies have been already downloaded")
else:
pip_dir = sh.joinpths(self.deps_dir, "pip")
@ -325,7 +324,7 @@ class DependencyHandler(object):
for attempt in xrange(self.MAX_PIP_DOWNLOAD_ATTEMPTS):
# NOTE(aababilov): pip has issues with already downloaded files
sh.deldir(pip_dir)
sh.mkdir(pip_download_dir, recurse=True)
sh.mkdirslist(pip_download_dir, tracewriter=self.tracewriter)
header = "Downloading %s python dependencies (attempt %s)"
header = header % (len(raw_pips_to_download), attempt)
utils.log_iterable(sorted(raw_pips_to_download),
@ -348,8 +347,8 @@ class DependencyHandler(object):
sh.deldir(pip_dir)
if pip_failures:
raise pip_failures[-1]
with open(downloaded_flag_file, "w"):
pass
sh.touch_file(self.downloaded_flag_file, die_if_there=False,
quiet=True, tracewriter=self.tracewriter)
pips_downloaded = [pip_helper.extract_requirement(p)
for p in raw_pips_to_download]
self._examine_download_dir(pips_downloaded, self.download_dir)

View File

@ -15,11 +15,14 @@
# under the License.
import collections
import contextlib
import os
import pkg_resources
import sys
import pkg_resources
import gzip
import rpm
import tarfile
from anvil import colorizer
from anvil import env
@ -34,6 +37,19 @@ from anvil import utils
LOG = logging.getLogger(__name__)
# Certain versions of pbr seem to miss these files, which causes the rpmbuild
# phases to not complete correctly. Ensure that we don't miss them.
ENSURE_NOT_MISSING = [
'doc', # Without this one our rpm doc build won't work
'README.rst', # Without this one pbr won't work (thus killing setup.py)
'babel.cfg',
'HACKING',
'AUTHORS',
'ChangeLog',
'CONTRIBUTING.rst',
'LICENSE',
]
class YumInstallHelper(base.InstallHelper):
def pre_install(self, pkg, params=None):
@ -139,7 +155,7 @@ class YumDependencyHandler(base.DependencyHandler):
def _create_rpmbuild_subdirs(self):
for dirname in (sh.joinpths(self.rpmbuild_dir, "SPECS"),
sh.joinpths(self.rpmbuild_dir, "SOURCES")):
sh.mkdirslist(dirname)
sh.mkdirslist(dirname, tracewriter=self.tracewriter)
def package_instance(self, instance):
with sh.remove_before_after(self.rpmbuild_dir):
@ -189,13 +205,11 @@ class YumDependencyHandler(base.DependencyHandler):
if not src_repo_files:
continue
src_repo_base_files = [sh.basename(f) for f in src_repo_files]
header = 'Building %s RPM packages from their SRPMs for repo %s using %s jobs'
header = header % (len(src_repo_files), self.SRC_REPOS[repo_name], self.jobs)
utils.log_iterable(src_repo_base_files, header=header, logger=LOG)
LOG.info('Building %s RPM packages from their SRPMs for repo %s using %s jobs',
len(src_repo_files), self.SRC_REPOS[repo_name], self.jobs)
makefile_name = sh.joinpths(self.deps_dir, "binary-%s.mk" % repo_name)
marks_dir = sh.joinpths(self.deps_dir, "marks-binary")
sh.mkdirslist(marks_dir)
sh.mkdirslist(marks_dir, tracewriter=self.tracewriter)
(_fn, content) = utils.load_template("packaging/makefiles", "binary.mk")
rpmbuild_flags = ("--rebuild --define '_topdir %s'" % self.rpmbuild_dir)
if self.opts.get("usr_only", False):
@ -347,13 +361,17 @@ class YumDependencyHandler(base.DependencyHandler):
return filtered_files
LOG.info("Filtering %s downloaded files.", len(package_files))
package_files = _filter_package_files(package_files)
if not package_files:
filtered_package_files = _filter_package_files(package_files)
if not filtered_package_files:
LOG.info("No SRPM package dependencies to build.")
return
for filename in package_files:
if filename not in filtered_package_files:
sh.unlink(filename)
package_files = filtered_package_files
makefile_name = sh.joinpths(self.deps_dir, "deps.mk")
marks_dir = sh.joinpths(self.deps_dir, "marks-deps")
sh.mkdirslist(marks_dir)
sh.mkdirslist(marks_dir, tracewriter=self.tracewriter)
(_fn, content) = utils.load_template("packaging/makefiles", "source.mk")
scripts_dir = sh.abspth(sh.joinpths(settings.TEMPLATE_DIR, "packaging", "scripts"))
py2rpm_options = self.py2rpm_start_cmdline()[1:] + [
@ -370,11 +388,7 @@ class YumDependencyHandler(base.DependencyHandler):
sh.write_file(makefile_name,
utils.expand_template(content, params),
tracewriter=self.tracewriter)
base_package_files = [sh.basename(f) for f in package_files]
utils.log_iterable(base_package_files,
header="Building %s SRPM packages using %s jobs" %
(len(package_files), self.jobs),
logger=LOG)
LOG.info("Building %s SRPM packages using %s jobs", len(package_files), self.jobs)
self._execute_make(makefile_name, marks_dir)
def _write_spec_file(self, instance, rpm_name, template_name, params):
@ -440,7 +454,7 @@ class YumDependencyHandler(base.DependencyHandler):
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)
self._write_python_tarball(instance, pkg_dir, ENSURE_NOT_MISSING)
else:
self._write_git_tarball(pkg_dir, spec_filename)
self._copy_sources(instance)
@ -479,15 +493,48 @@ class YumDependencyHandler(base.DependencyHandler):
cmdline = ["gzip", output_filename]
sh.execute(cmdline)
def _write_python_tarball(self, pkg_dir):
def _write_python_tarball(self, instance, pkg_dir, ensure_exists=None):
def prefix_exists(text, in_what):
for t in in_what:
if t.startswith(text):
return True
return False
pkg_name = instance.egg_info['name']
version = instance.egg_info['version']
base_name = "%s-%s" % (pkg_name, version)
cmdline = [
sys.executable,
"setup.py",
"sdist",
"--formats", "gztar",
"--formats=tar",
"--dist-dir", self.rpm_sources_dir,
]
sh.execute(cmdline, cwd=pkg_dir)
out_filename = sh.joinpths(self.log_dir, "sdist-%s.log" % (instance.name))
sh.execute_save_output(cmdline, cwd=pkg_dir, out_filename=out_filename, quiet=True)
archive_name = sh.joinpths(self.rpm_sources_dir, "%s.tar" % (base_name))
if ensure_exists:
with contextlib.closing(tarfile.open(archive_name, 'r')) as tfh:
tar_entries = [t.path for t in tfh.getmembers()]
missing_paths = {}
for path in ensure_exists:
tar_path = sh.joinpths(base_name, path)
source_path = sh.joinpths(pkg_dir, path)
if not prefix_exists(tar_path, tar_entries) and sh.exists(source_path):
missing_paths[tar_path] = source_path
if missing_paths:
utils.log_iterable(sorted(missing_paths.keys()),
logger=LOG,
header='%s paths were not archived and will now be' % (len(missing_paths)))
with contextlib.closing(tarfile.open(archive_name, 'a')) as tfh:
for (tar_path, source_path) in missing_paths.items():
tfh.add(source_path, tar_path)
gz_archive_name = "%s.gz" % (archive_name)
with contextlib.closing(gzip.open(gz_archive_name, 'wb')) as tz:
with open(archive_name, 'rb') as fh:
tz.write(fh.read())
sh.unlink(archive_name)
@staticmethod
def _is_client(instance_name, egg_name):

View File

@ -29,5 +29,5 @@ $(BUILDDEP_MARK):
%.mark: $(SRC_REPO_DIR)/% $(BUILDDEP_MARK)
@$(RPMBUILD) $(RPMBUILD_FLAGS) -- $< &> $(LOGS_DIR)/rpmbuild-$*.log
@touch "$@"
@echo "$* is processed"
@echo "$* has been processed."
#end raw

View File

@ -13,5 +13,5 @@ all: $(MARKS)
%.mark: $(DOWNLOADS_DIR)/%
@$(PY2RPM) $(PY2RPM_FLAGS) -- $^ &> $(LOGS_DIR)/py2rpm-$*.log
@touch "$@"
@echo "$* is processed"
@echo "$* has been processed."
#end raw