diff options
author | Angelos Evripiotis <jevripiotis@bloomberg.net> | 2019-02-14 10:19:51 +0000 |
---|---|---|
committer | Angelos Evripiotis <angelos.evripiotis@gmail.com> | 2019-02-15 11:10:51 +0000 |
commit | 39febfda560fdc0d4ab3a2440f173f5718752d5b (patch) | |
tree | eaa5287a27f3cc22c5b26bda3b584d39c24aa150 /tests/frontend/buildcheckout.py | |
parent | 14176e51ed6190521cd0cd9845ef02bcb46b77ef (diff) | |
download | buildstream-39febfda560fdc0d4ab3a2440f173f5718752d5b.tar.gz |
storage.Directory.export_to_tar: mtime=_magic...aevri/mtime1
Change the default value of mtime when doing export_to_tar() from `0` to
`_utils._magic_timestamp`. This avoids problems in other software, which
assume that an mtime of `0` means the file does not exist.
There is more than one example where files with an mtime of zero are
treated as non-existant by other software. e.g. [ninja][1] and [Template
Toolkit][2].
The OSTree project also [express an intention][3] to move from an mtime
of 0 to an mtime of 1:
> For this reason, OSTree acts as though all timestamps are set to
> time_t 0, so that comparisons will be considered up-to-date. Note that
> for a few releases, OSTree used 1 to fix warnings such as GNU Tar
> emitting "implausibly old time stamp" with 0; however, until we have a
> mechanism to transition cleanly to 1, for compatibilty OSTree is
> reverted to use zero again.
From the comments on export_to_tar(), the motivation for having an mtime
of 0 was to have reproducible results, rather than it specifically being
the value 0.
Additionally, the reproducible builds project has a [page on
archives][4]; it mentions the benefits of setting all the files to have
the same mtime, or clamping the mtime. It makes no mention of a
motivation for the mtime to be specifically 0.
Fixes #914
[1]: https://github.com/ninja-build/ninja/issues/1120
[2]: https://github.com/abw/Template2/blob/8d7d37200af436f1ad43628278d3caad257c8e27/lib/Template/Provider.pm#L635
[3]: https://ostree.readthedocs.io/en/latest/manual/repo/
[4]: https://reproducible-builds.org/docs/archives/
Diffstat (limited to 'tests/frontend/buildcheckout.py')
-rw-r--r-- | tests/frontend/buildcheckout.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/tests/frontend/buildcheckout.py b/tests/frontend/buildcheckout.py index 80d710f6f..598edbbbc 100644 --- a/tests/frontend/buildcheckout.py +++ b/tests/frontend/buildcheckout.py @@ -253,6 +253,26 @@ def test_build_checkout_tarball_stdout(datafiles, cli): @pytest.mark.datafiles(DATA_DIR) +def test_build_checkout_tarball_mtime_nonzero(datafiles, cli): + project = os.path.join(datafiles.dirname, datafiles.basename) + tarpath = os.path.join(cli.directory, 'mtime_tar.tar') + + result = cli.run(project=project, args=['build', 'target.bst']) + result.assert_success() + + checkout_args = ['artifact', 'checkout', '--tar', tarpath, 'target.bst'] + result = cli.run(project=project, args=checkout_args) + result.assert_success() + + tar = tarfile.TarFile(tarpath) + for tarinfo in tar.getmembers(): + # An mtime of zero can be confusing to other software, + # e.g. ninja build and template toolkit have both taken zero mtime to + # mean 'file does not exist'. + assert tarinfo.mtime > 0 + + +@pytest.mark.datafiles(DATA_DIR) def test_build_checkout_tarball_is_deterministic(datafiles, cli): project = os.path.join(datafiles.dirname, datafiles.basename) tarball1 = os.path.join(cli.directory, 'tarball1.tar') |