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"