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
* 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;
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