diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index e43d4dcd..33ca0ae8 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -3143,6 +3143,23 @@ ostree_repo_import_object_from (OstreeRepo *self, checksum, TRUE, cancellable, error); } +static gboolean +import_via_hardlink_is_possible (OstreeRepo *src_repo, + OstreeRepo *dest_repo, + OstreeObjectType objtype) +{ + /* We need the ability to make hardlinks */ + if (src_repo->owner_uid != dest_repo->owner_uid) + return FALSE; + /* Equal modes are always compatible */ + if (src_repo->mode == dest_repo->mode) + return TRUE; + /* Metadata is identical between all modes */ + if (OSTREE_OBJECT_TYPE_IS_META (objtype)) + return TRUE; + return FALSE; +} + /** * ostree_repo_import_object_from_with_trust: * @self: Destination repo @@ -3174,9 +3191,7 @@ ostree_repo_import_object_from_with_trust (OstreeRepo *self, * repository modes to match, as well as the owner uid (since we need to be * able to make hardlinks). */ - if (trusted && - self->mode == source->mode && - self->owner_uid == source->owner_uid) + if (trusted && import_via_hardlink_is_possible (source, self, objtype)) { gboolean hardlink_was_supported = FALSE; diff --git a/tests/basic-test.sh b/tests/basic-test.sh index e3e442e9..f6aa72c2 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -254,9 +254,18 @@ echo "ok diff file changing type" cd ${test_tmpdir} mkdir repo2 -ostree_repo_init repo2 --mode=bare-user +# Use a different mode to test hardlinking metadata only +if grep -q 'mode=archive' repo/config || is_bare_user_only_repo repo; then + opposite_mode=bare-user +else + opposite_mode=archive +fi +ostree_repo_init repo2 --mode=$opposite_mode ${CMD_PREFIX} ostree --repo=repo2 pull-local repo -echo "ok pull-local" +test2_commitid=$(${CMD_PREFIX} ostree --repo=repo rev-parse test2) +test2_commit_relpath=/objects/${test2_commitid:0:2}/${test2_commitid:2}.commit +assert_files_hardlinked repo/${test2_commit_relpath} repo2/${test2_commit_relpath} +echo "ok pull-local (hardlinking metadata)" cd ${test_tmpdir} ${CMD_PREFIX} ostree --repo=repo2 checkout ${CHECKOUT_U_ARG} test2 test2-checkout-from-local-clone