From efcdf4c3f86709172cb5e7f1d64ab7f9236bf2e5 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 13 May 2015 21:59:17 -0400 Subject: [PATCH] repo: Bump mtime any time we write a ref External daemons like rpm-ostree want push notification any time a change is made by an external entity. inotify provides notification, but a problem is there's no easy way to monitor all of the refs. In the past, there has been discussion of opt-in recursive timestamps: https://lkml.org/lkml/2013/4/5/307 But in today's world, let's just bump the mtime on the repo itself, as a central inotify point. Closes: https://github.com/GNOME/ostree/pull/111 --- src/libostree/ostree-repo-private.h | 4 ++++ src/libostree/ostree-repo-refs.c | 3 +++ src/libostree/ostree-repo.c | 12 ++++++++++++ tests/basic-test.sh | 13 +++++++++++++ 4 files changed, 32 insertions(+) diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h index 7b02b12c..5214bcac 100644 --- a/src/libostree/ostree-repo-private.h +++ b/src/libostree/ostree-repo-private.h @@ -255,5 +255,9 @@ _ostree_repo_read_bare_fd (OstreeRepo *self, int *out_fd, GCancellable *cancellable, GError **error); + +gboolean +_ostree_repo_update_mtime (OstreeRepo *self, + GError **error); G_END_DECLS diff --git a/src/libostree/ostree-repo-refs.c b/src/libostree/ostree-repo-refs.c index bd0b760b..970f5191 100644 --- a/src/libostree/ostree-repo-refs.c +++ b/src/libostree/ostree-repo-refs.c @@ -631,6 +631,9 @@ _ostree_repo_write_ref (OstreeRepo *self, goto out; } + if (!_ostree_repo_update_mtime (self, error)) + goto out; + ret = TRUE; out: return ret; diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 2f211494..baeb60be 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -620,6 +620,18 @@ ostree_repo_is_writable (OstreeRepo *self, return self->writable; } +gboolean +_ostree_repo_update_mtime (OstreeRepo *self, + GError **error) +{ + if (futimens (self->repo_dir_fd, NULL) != 0) + { + glnx_set_prefix_error_from_errno (error, "%s", "futimens"); + return FALSE; + } + return TRUE; +} + /** * ostree_repo_get_config: * @self: diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 3b57f66d..2fea4e03 100755 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -401,3 +401,16 @@ if test "$(id -u)" != "0"; then assert_file_has_content error-message "Permission denied" echo "ok unwritable repo was caught" fi + +cd ${test_tmpdir} +rm -rf test2-checkout +mkdir -p test2-checkout +cd test2-checkout +touch blah +stat --printf="%Z\n" ${test_tmpdir}/repo > ${test_tmpdir}/timestamp-orig.txt +$OSTREE commit -b test2 -s "Should bump the mtime" +stat --printf="%Z\n" ${test_tmpdir}/repo > ${test_tmpdir}/timestamp-new.txt +cd .. +if ! cmp timestamp-{orig,new}.txt; then + assert_not_reached "failed to update mtime on repo" +fi