From e07bd7b3e5a1021550a00b2ff07be37416de6ba1 Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Thu, 5 Feb 2026 20:22:08 +1100 Subject: [PATCH] browsing directories works --- assets/repo_view_screen.tcss | 4 +++ screens/repo_view_screen.py | 68 ++++++++++++++++++++++++++++-------- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/assets/repo_view_screen.tcss b/assets/repo_view_screen.tcss index 5753f08..b84d90e 100644 --- a/assets/repo_view_screen.tcss +++ b/assets/repo_view_screen.tcss @@ -42,6 +42,10 @@ & > .datatable--header { background: $surface; } + + link-style-hover: underline; + link-color-hover: $primary; + link-background-hover: transparent; } diff --git a/screens/repo_view_screen.py b/screens/repo_view_screen.py index 91c5fda..6c3b6a5 100644 --- a/screens/repo_view_screen.py +++ b/screens/repo_view_screen.py @@ -19,6 +19,7 @@ class RepoViewScreen(Screen): super().__init__() self.owner_name = owner_name self.repo_name = repo_name + self.current_dir = "./src" def get_icon_from_name_and_type(self, file_name: str, is_folder: bool): @@ -85,21 +86,28 @@ class RepoViewScreen(Screen): return "\ue5ff" @work(thread=True, exclusive=True) - def on_mount(self): + def action_view_file(self, path: str, type: str): + self.notify(f"{path, type}") + + if type == "dir": + self.current_dir = path + self.show_directory(path) + + def show_directory(self, path: str): files: DataTable = self.query_one("#files") - loading = self.query_one(LoadingIndicator) + files.clear(columns=True) - files.display = False - - # get files in root dir + # get files in dir files_response = requests.get( - self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/contents" + self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/contents/{path}" ) if not files_response.ok: self.notify(files_response.text, title="Failed to get files:", severity="error") return + print("Getting most recent commit...") + # get most recent commit commits_response = requests.get( self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/commits", @@ -119,7 +127,7 @@ class RepoViewScreen(Screen): f"[d]{most_recent_commit["commit"]["message"]}" ) - + print("Getting root commits...") rows = [] commit_page_number = 1 @@ -134,8 +142,9 @@ class RepoViewScreen(Screen): "path": ".", "verification": False, "files": False, + "stat": False, "page": commit_page_number, - "limit": page_size + "limit": page_size, } ).json() @@ -144,11 +153,23 @@ class RepoViewScreen(Screen): if len(commits) == page_size: # we reached end of the page commit_page_number += 1 + print("Next page...") else: break - found_readme = False readme: Markdown = self.query_one("#readme") + found_readme = False + + readme.display = path == "." + + # add a ".." folder if we're not in the root directory + if path != ".": + previous_dir = self.current_dir[:self.current_dir.rfind("/")] + rows.append(( + f"[cyan]{self.get_icon_from_name_and_type("..", True)}[/] [@click=screen.view_file('{previous_dir}','dir')]..[/]", + "", + "" + )) for file in files_response.json(): commit = commit_data[file["last_commit_sha"]] @@ -156,12 +177,14 @@ class RepoViewScreen(Screen): commit_created_at = datetime.fromisoformat(commit["created"]).replace(tzinfo=None) rows.append(( - f"[cyan]{self.get_icon_from_name_and_type(file["name"], file["type"] != "file")}[/] {file["name"]}", - f"[d]{commit["commit"]["message"]}", - f"[d]Updated {time_delta(datetime.now() - commit_created_at)} ago" + 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]Updated {time_delta(datetime.now() - commit_created_at)} ago[/]" )) - if file["name"].lower() == "readme.md": + if path == "." and file["name"].lower() == "readme.md": + print("Getting README...") + found_readme = True readme.border_title = f"\uf405 {file["name"]}" @@ -169,12 +192,27 @@ class RepoViewScreen(Screen): self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/raw/{file["name"]}" ).text self.app.call_from_thread(readme.update, readme_content or "Empty README") - + + print("Adding rows...") files.add_rows(rows) - if not found_readme: + if not found_readme and path == ".": self.app.call_from_thread(readme.update, "This repository has no `README.md` file.") + return found_readme + + @work(thread=True, exclusive=True) + def on_mount(self): + print("Getting files...") + files: DataTable = self.query_one("#files") + loading = self.query_one(LoadingIndicator) + + files.display = False + + self.show_directory(self.current_dir) + + + loading.display = False files.display = True