diff --git a/src/libostree/ostree-repo-file.c b/src/libostree/ostree-repo-file.c index 2a90f6c7..fcc435a8 100644 --- a/src/libostree/ostree-repo-file.c +++ b/src/libostree/ostree-repo-file.c @@ -928,9 +928,23 @@ ostree_repo_file_read (GFile *file, checksum = ostree_repo_file_get_checksum (self); - if (!ostree_repo_load_file (self->repo, checksum, &ret_stream, - NULL, NULL, cancellable, error)) + g_autoptr(GFileInfo) finfo = NULL; + if (!ostree_repo_load_file (self->repo, checksum, NULL, + &finfo, NULL, cancellable, error)) return NULL; + if (g_file_info_get_file_type (finfo) == G_FILE_TYPE_REGULAR) + { + if (!ostree_repo_load_file (self->repo, checksum, &ret_stream, + NULL, NULL, cancellable, error)) + return NULL; + } + else + { + g_autoptr(GFile) parent = g_file_get_parent (file); + const char *target = g_file_info_get_symlink_target (finfo); + g_autoptr(GFile) dest = g_file_resolve_relative_path (parent, target); + return g_file_read (dest, cancellable, error); + } return g_steal_pointer (&ret_stream); } diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 82945244..f5af93b1 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -338,8 +338,30 @@ $OSTREE prune echo "ok prune didn't fail" cd ${test_tmpdir} +# Verify we can't cat dirs +for path in / /baz; do + if $OSTREE cat test2 $path 2>err.txt; then + assert_not_reached "cat directory" + fi + assert_file_has_content err.txt "open directory" +done +rm checkout-test2 -rf $OSTREE cat test2 /yet/another/tree/green > greenfile-contents assert_file_has_content greenfile-contents "leaf" +$OSTREE checkout test2 checkout-test2 +ls -alR checkout-test2 +ln -sr checkout-test2/{four,four-link} +ln -sr checkout-test2/{baz/cow,cow-link} +ln -sr checkout-test2/{cow-link,cow-link-link} +$OSTREE commit -b test2-withlink --tree=dir=checkout-test2 +if $OSTREE cat test2-withlink /four-link 2>err.txt; then + assert_not_reached "cat directory" +fi +assert_file_has_content err.txt "open directory" +for path in /cow-link /cow-link-link; do + $OSTREE cat test2-withlink $path >contents.txt + assert_file_has_content contents.txt moo +done echo "ok cat-file" cd ${test_tmpdir}