From 97a28fb7b18a32659546a0380dfea682b960e26b Mon Sep 17 00:00:00 2001 From: Rohan McGovern Date: Fri, 12 Jan 2024 08:30:21 +1000 Subject: [PATCH] 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. --- repo_autoindex/_impl/base.py | 17 +++++++++++++++++ repo_autoindex/_impl/tree.py | 2 ++ tests/test_kickstart_render_typical.py | 25 +++++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/repo_autoindex/_impl/base.py b/repo_autoindex/_impl/base.py index 55a8121..26b67c6 100644 --- a/repo_autoindex/_impl/base.py +++ b/repo_autoindex/_impl/base.py @@ -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__( diff --git a/repo_autoindex/_impl/tree.py b/repo_autoindex/_impl/tree.py index 168bda4..3fa466b 100644 --- a/repo_autoindex/_impl/tree.py +++ b/repo_autoindex/_impl/tree.py @@ -70,4 +70,6 @@ def treeify( ] ) + out.entries.sort(key=lambda entry: entry.sort_key) + return out diff --git a/tests/test_kickstart_render_typical.py b/tests/test_kickstart_render_typical.py index 6dcac1c..851fdf3 100644 --- a/tests/test_kickstart_render_typical.py +++ b/tests/test_kickstart_render_typical.py @@ -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 '' 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'