Ensure directories appear first in listings [RHELDST-21890]

Directories are generally expected to be listed first in directory
indexes. That was already working for yum and file repos, but wasn't the
case for kickstart repos due to their combination of different types of
content.

This commit applies a consistent sorting so that directories will always
come first, and entries will otherwise be sorted by name, for all repo
types.
This commit is contained in:
Rohan McGovern 2024-01-12 08:30:21 +10:00
parent 137388d475
commit 97a28fb7b1
3 changed files with 44 additions and 0 deletions

View file

@ -56,6 +56,23 @@ class IndexEntry:
padding: str = ""
icon: str = ICON_OTHER
@property
def sort_key(self):
# Returns a suggested sort key for displaying entries in
# a UI.
priority = 0
# Folders should come first
if self.href.endswith("/"):
priority -= 1
# And special folders like ".." even earlier
if self.href.startswith("."):
priority -= 1
# Entries sort by the priority we calculated, and then by name
return (priority, self.href)
class Repo(ABC):
def __init__(

View file

@ -70,4 +70,6 @@ def treeify(
]
)
out.entries.sort(key=lambda entry: entry.sort_key)
return out

View file

@ -1,4 +1,5 @@
import io
import re
from typing import BinaryIO, Optional
import textwrap
@ -619,6 +620,30 @@ async def test_typical_index():
assert '<a href="vmlinuz">' in by_relative_dir["images/pxeboot"].content
# Sample the order of entries in some of the listings.
# Directories are expected to come first.
links = re.findall(r'<a href="([^"]+)"', by_relative_dir[""].content)
assert links == [
"images/",
"packages/",
"repodata/",
"EULA",
"GPL",
"RPM-GPG-KEY-redhat-beta",
"RPM-GPG-KEY-redhat-release",
"extra_files.json",
"treeinfo",
]
links = re.findall(r'<a href="([^"]+)"', by_relative_dir["images"].content)
assert links == [
"../",
"pxeboot/",
"boot.iso",
"efiboot.img",
"install.img",
]
async def test_typical_appstream_index():
fetcher = StaticFetcher()