From 134283afbf27d00c51032e1856de8214532ed20c Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 15 Dec 2011 16:12:31 -0500 Subject: [PATCH] core: In user mode checkouts of archives, use hard links Now that we've done all the gyrations to separate content from metadata in archives, we can just hard link when doing user checkouts. --- src/libostree/ostree-repo.c | 13 ++++++++++++- tests/t0000-basic.sh | 5 ++++- tests/t0001-archive.sh | 5 ++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index b7f123e8..e6ca3895 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -2262,7 +2262,18 @@ checkout_tree (OstreeRepo *self, { const char *checksum = _ostree_repo_file_get_checksum ((OstreeRepoFile*)src_child); - if (priv->mode == OSTREE_REPO_MODE_ARCHIVE) + if (priv->mode == OSTREE_REPO_MODE_ARCHIVE && mode == OSTREE_REPO_CHECKOUT_MODE_USER) + { + g_clear_object (&object_path); + object_path = ostree_repo_get_object_path (self, checksum, OSTREE_OBJECT_TYPE_ARCHIVED_FILE_CONTENT); + + if (link (ot_gfile_get_path_cached (object_path), ot_gfile_get_path_cached (dest_path)) < 0) + { + ot_util_set_error_from_errno (error, errno); + goto out; + } + } + else if (priv->mode == OSTREE_REPO_MODE_ARCHIVE) { ot_clear_gvariant (&archive_metadata); if (!ostree_repo_load_variant (self, OSTREE_OBJECT_TYPE_ARCHIVED_FILE_META, checksum, &archive_metadata, error)) diff --git a/tests/t0000-basic.sh b/tests/t0000-basic.sh index 02a060ad..e73631b9 100755 --- a/tests/t0000-basic.sh +++ b/tests/t0000-basic.sh @@ -19,7 +19,7 @@ set -e -echo "1..17" +echo "1..18" . libtest.sh @@ -148,3 +148,6 @@ ostree --repo=repo2 checkout test2 test2-checkout-from-local-clone cd test2-checkout-from-local-clone assert_file_has_content yet/another/tree/green 'leaf' echo "ok local clone checkout" + +$OSTREE checkout -U test2 checkout-user-test2 +echo "ok user checkout" diff --git a/tests/t0001-archive.sh b/tests/t0001-archive.sh index dc7bfa11..30fbe80c 100755 --- a/tests/t0001-archive.sh +++ b/tests/t0001-archive.sh @@ -21,7 +21,7 @@ set -e . libtest.sh -echo '1..5' +echo '1..6' setup_test_repository "archive" echo "ok setup" @@ -47,3 +47,6 @@ ostree --repo=repo2 checkout test2 test2-checkout-from-local-clone cd test2-checkout-from-local-clone assert_file_has_content baz/cow moo echo "ok local clone checkout" + +$OSTREE checkout -U test2 checkout-user-test2 +echo "ok user checkout"