From 15b3cab65eb005574f84c9f1df2c8af14bf53129 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 19 Apr 2016 12:11:01 -0400 Subject: [PATCH] repo: Add OSTREE_REPO_TEST_ERROR=pre-commit env var Setting this causes commit to error out. There are other ways we could do this in a more sophisticated fashion, such as via SystemTap etc. But this has low-tech applicablity, works as non-root. The reason I'm adding this is so that we can add test cases for cleanup of the `tmp/staging-` directory. Closes: #170 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 7 +++++++ src/libostree/ostree-repo-private.h | 6 ++++++ src/libostree/ostree-repo.c | 6 ++++++ tests/basic-test.sh | 11 ++++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index cd365da9..8e00646c 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -1442,6 +1442,13 @@ ostree_repo_commit_transaction (OstreeRepo *self, g_return_val_if_fail (self->in_transaction == TRUE, FALSE); + if ((self->test_error_flags & OSTREE_REPO_TEST_ERROR_PRE_COMMIT) > 0) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "OSTREE_REPO_TEST_ERROR_PRE_COMMIT specified"); + goto out; + } + if (syncfs (self->tmp_dir_fd) < 0) { glnx_set_error_from_errno (error); diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h index 54127be0..70600f4e 100644 --- a/src/libostree/ostree-repo-private.h +++ b/src/libostree/ostree-repo-private.h @@ -36,6 +36,10 @@ G_BEGIN_DECLS #define _OSTREE_SUMMARY_CACHE_DIR "summaries" #define _OSTREE_CACHE_DIR "cache" +typedef enum { + OSTREE_REPO_TEST_ERROR_PRE_COMMIT = (1 << 0) +} OstreeRepoTestErrorFlags; + /** * OstreeRepo: * @@ -86,6 +90,8 @@ struct OstreeRepo { uid_t target_owner_uid; gid_t target_owner_gid; + guint test_error_flags; /* OstreeRepoTestErrorFlags */ + GKeyFile *config; GHashTable *remotes; GMutex remotes_lock; diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 420e2afb..d44aeabe 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -798,6 +798,9 @@ ostree_repo_init (OstreeRepo *self) { static gsize gpgme_initialized; GLnxLockFile empty_lockfile = GLNX_LOCK_FILE_INIT; + const GDebugKey test_error_keys[] = { + { "pre-commit", OSTREE_REPO_TEST_ERROR_PRE_COMMIT }, + }; if (g_once_init_enter (&gpgme_initialized)) { @@ -806,6 +809,9 @@ ostree_repo_init (OstreeRepo *self) g_once_init_leave (&gpgme_initialized, 1); } + self->test_error_flags = g_parse_debug_string (g_getenv ("OSTREE_REPO_TEST_ERROR"), + test_error_keys, G_N_ELEMENTS (test_error_keys)); + g_mutex_init (&self->cache_lock); g_mutex_init (&self->txn_stats_lock); diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 5519764a..2edb15d2 100755 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..53" +echo "1..54" $OSTREE checkout test2 checkout-test2 echo "ok checkout" @@ -397,6 +397,15 @@ assert_file_has_content test2-checkout/baz/cow moo assert_has_dir repo2/uncompressed-objects-cache echo "ok disable cache checkout" +cd ${test_tmpdir} +rm checkout-test2 -rf +$OSTREE checkout test2 checkout-test2 +if env OSTREE_REPO_TEST_ERROR=pre-commit $OSTREE commit -b test2 -s '' $test_tmpdir/checkout-test2 2>err.txt; then + assert_not_reached "Should have hit OSTREE_REPO_TEST_ERROR_PRE_COMMIT" +fi +assert_file_has_content err.txt OSTREE_REPO_TEST_ERROR_PRE_COMMIT +echo "ok test error pre commit" + # Whiteouts cd ${test_tmpdir} mkdir -p overlay/baz/