diff options
-rw-r--r--source/ui-blob.c1
-rwxr-xr-xtests/t0303-robustness.sh14
2 files changed, 15 insertions, 0 deletions
diff --git a/source/ui-blob.c b/source/ui-blob.c
index 1d22483..1a759a7 100644
--- a/source/ui-blob.c
+++ b/source/ui-blob.c
@@ -104,6 +104,7 @@ int cgit_ref_path_exists(const char *path, const char *ref, int file_only)
if (repo_get_oid(the_repository, ref, &oid))
goto done;
+ peel_to_commit(&oid);
if (odb_read_object_info(the_repository->objects, &oid, &size) != OBJ_COMMIT)
goto done;
found = find_path_oid(&oid, path_copy, file_only);
diff --git a/tests/t0303-robustness.sh b/tests/t0303-robustness.sh
index 2e0e849..da5e209 100755
--- a/tests/t0303-robustness.sh
+++ b/tests/t0303-robustness.sh
@@ -639,6 +639,20 @@ test_expect_success 'the about redirect keeps the query string' '
grep "^Status: 200" tmp
'
+# A readme named without a branch is read from the head being browsed, and an
+# annotated tag reaches its commit only through the tag object.
+test_expect_success 'the readme follows an annotated tag as the head' '
+ git -C repos/rob tag -a -m release v1 HEAD &&
+ {
+ cat robrc &&
+ echo "repo.readme=:file-1"
+ } >tagreadmerc &&
+ CGIT_CONFIG="$PWD/tagreadmerc" QUERY_STRING="url=rob/about/&h=v1" cgit >tmp &&
+ grep "^Status: 200" tmp &&
+ CGIT_CONFIG="$PWD/tagreadmerc" QUERY_STRING="url=rob/tree/&h=v1" cgit >tmp &&
+ grep ">about<" tmp
+'
+
test_expect_success 'the about redirect encodes the repository url once' '
cgit_url "foo%2Bbar/about/" >tmp &&
grep "^Status: 302" tmp &&