diff --git a/roles/generate-zuul-manifest/library/generate_manifest.py b/roles/generate-zuul-manifest/library/generate_manifest.py index dfb13d43a..5518e53ad 100644 --- a/roles/generate-zuul-manifest/library/generate_manifest.py +++ b/roles/generate-zuul-manifest/library/generate_manifest.py @@ -37,6 +37,15 @@ def path_in_tree(root, path): return True +def _get_file_info(path): + try: + st = os.stat(path) + except OSError: + return 0, 0 + + return st[stat.ST_MTIME], st[stat.ST_SIZE] + + def walk(root, original_root=None): if original_root is None: original_root = root @@ -67,19 +76,14 @@ def walk(root, original_root=None): mime_guess, encoding = mimetypes.guess_type(path) if not mime_guess: mime_guess = 'text/plain' - # This may fail e.g. for dangling symlinks, just ignore those - try: - st = os.stat(path) - last_modified = st[stat.ST_MTIME] - size = st[stat.ST_SIZE] - data.append(dict(name=f, - mimetype=mime_guess, - encoding=encoding, - last_modified=last_modified, - size=size)) - except FileNotFoundError: + last_modified, size = _get_file_info(path) + if not last_modified and not size: continue - + data.append(dict(name=f, + mimetype=mime_guess, + encoding=encoding, + last_modified=last_modified, + size=size)) return data diff --git a/roles/generate-zuul-manifest/library/test_generate_manifest.py b/roles/generate-zuul-manifest/library/test_generate_manifest.py index 99acdde32..a239523da 100644 --- a/roles/generate-zuul-manifest/library/test_generate_manifest.py +++ b/roles/generate-zuul-manifest/library/test_generate_manifest.py @@ -19,9 +19,11 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type import os +import stat import testtools import fixtures +from .generate_manifest import _get_file_info from .generate_manifest import walk @@ -126,3 +128,18 @@ class TestFileList(testtools.TestCase): ('controller/service_log.txt', 'text/plain', None), ('symlink_loop/placeholder', 'text/plain', None), ]) + + def test_get_file_info(self): + '''Test files info''' + path = os.path.join(FIXTURE_DIR, 'logs', 'job-output.json') + last_modified, size = _get_file_info(path) + + self.assertEqual(os.stat(path)[stat.ST_MTIME], last_modified) + self.assertEqual(16, size) + + def test_get_file_info_missing_file(self): + '''Test files that go missing during a walk''' + last_modified, size = _get_file_info('missing/file/that/we/cant/find') + + self.assertEqual(0, last_modified) + self.assertEqual(0, size)