From 16afb5e2d09df43b827c52916657ee5848c71710 Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Fri, 6 Feb 2026 16:54:20 +1100 Subject: [PATCH] optimized getting reading directories, started work on dir tree in file view --- screens/repo_view_screen.py | 42 ++++++++----------------------------- widgets/__init__.py | 3 ++- widgets/repo_dir_tree.py | 22 +++++++++++++++++++ 3 files changed, 33 insertions(+), 34 deletions(-) create mode 100644 widgets/repo_dir_tree.py diff --git a/screens/repo_view_screen.py b/screens/repo_view_screen.py index acef69f..8fae660 100644 --- a/screens/repo_view_screen.py +++ b/screens/repo_view_screen.py @@ -4,7 +4,7 @@ from textual.widgets import Input, Select, TextArea, LoadingIndicator, Static, D from textual.containers import VerticalGroup, Vertical, HorizontalGroup, Right from textual import work -from widgets import Navbar +from widgets import Navbar, RepoDirectoryTree from datetime import datetime from human_readable import time_delta @@ -180,7 +180,10 @@ class RepoViewScreen(Screen): # get files in dir files_response = requests.get( - self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/contents/{path}" + self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/contents-ext/{path}", + params={ + "includes": "commit_metadata,commit_message" + } ) if not files_response.ok: @@ -212,32 +215,6 @@ class RepoViewScreen(Screen): print("Getting root commits...") rows = [] - commit_page_number = 1 - page_size = 50 - commit_data = {} - - # loop over all the root commits until we get em' all - while True: - commits = requests.get( - self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/commits", - params={ - "path": path, - "verification": False, - "files": False, - "stat": False, - "page": commit_page_number, - "limit": page_size, - } - ).json() - - - commit_data.update({commit["sha"]: commit for commit in commits}) - - if len(commits) == page_size: # we reached end of the page - commit_page_number += 1 - print("Next page...") - else: - break found_readme = False @@ -251,14 +228,12 @@ class RepoViewScreen(Screen): "" )) - for file in files_response.json(): - commit = commit_data[file["last_commit_sha"]] - - commit_created_at = datetime.fromisoformat(commit["created"]).replace(tzinfo=None) + for file in files_response.json()["dir_contents"]: + commit_created_at = datetime.fromisoformat(file["last_committer_date"]).replace(tzinfo=None) rows.append(( f"[cyan]{self.get_icon_from_name_and_type(file["name"], file["type"] != "file")}[/] [@click=screen.view_file('{self.current_dir}/{file["name"]}','{file["type"]}')]{file["name"]}[/]", - f"[d]{commit["commit"]["message"]}[/]", + f"[d]{file["last_commit_message"]}[/]", f"[d]Updated {time_delta(datetime.now() - commit_created_at)} ago[/]" )) @@ -342,6 +317,7 @@ class RepoViewScreen(Screen): yield table with Vertical(id="file-screen"): + yield RepoDirectoryTree(self.owner_name, self.repo_name, ".") with HorizontalGroup(id="file-commit"): yield Static("[b]Person[/] [r]aaaaabbbbb[/] [d]some commit message[/d]") with Right(): diff --git a/widgets/__init__.py b/widgets/__init__.py index 0316a46..fbe8dad 100644 --- a/widgets/__init__.py +++ b/widgets/__init__.py @@ -1 +1,2 @@ -from .navbar import Navbar \ No newline at end of file +from .navbar import Navbar +from .repo_dir_tree import RepoDirectoryTree \ No newline at end of file diff --git a/widgets/repo_dir_tree.py b/widgets/repo_dir_tree.py new file mode 100644 index 0000000..9a15fb3 --- /dev/null +++ b/widgets/repo_dir_tree.py @@ -0,0 +1,22 @@ +from textual.widgets import Tree, DirectoryTree +from textual.widgets.directory_tree import DirEntry +from textual import work + +import requests + + +class RepoDirectoryTree(DirectoryTree): + ICON_NODE_EXPANDED = "\uf07c " + ICON_NODE = "\ue5ff " + ICON_FILE = "\uf15b " + + def __init__(self, repo_owner: str, repo_name: str, path: str, name: str | None = None, id: str | None = None, classes: str | None = None, disabled: bool = False): + super().__init__(path=path, name=name, id=id, classes=classes, disabled=disabled) + + self.repo_owner = repo_owner + self.repo_name = repo_name + + def _directory_content(self, location: Path, worker: Worker) -> Iterator[Path]: + contents = requests.get( + self.app.GITEA_HOST + f"api/v1/repos/{self.repo_owner}/{self.repo_name}/contents/{location}" + ).json() \ No newline at end of file