From 021d88dc4c2e033e796f9cc687a01542de7f2789 Mon Sep 17 00:00:00 2001 From: Evgenii Alekseev Date: Tue, 10 Mar 2026 14:33:04 +0200 Subject: [PATCH] feat: store and show pkgbuild (implements #157) --- docs/ahriman.core.database.migrations.rst | 8 +++ frontend/src/components/common/CodeBlock.tsx | 58 +++++++++++-------- frontend/src/components/common/CopyButton.tsx | 6 +- .../components/common/RepositorySelect.tsx | 4 +- .../src/components/common/syntaxLanguages.ts | 27 +++++++++ .../components/dialogs/DashboardDialog.tsx | 6 +- .../components/dialogs/KeyImportDialog.tsx | 2 +- .../components/dialogs/PackageInfoDialog.tsx | 49 +++++++++------- frontend/src/components/layout/Navbar.tsx | 9 +-- .../src/components/package/BuildLogsTab.tsx | 3 +- .../src/components/package/ChangesTab.tsx | 46 ++------------- .../src/components/package/PkgbuildTab.tsx | 34 +++++++++++ frontend/src/components/package/TabKey.ts | 27 +++++++++ frontend/src/contexts/RepositoryContext.ts | 4 +- frontend/src/contexts/RepositoryProvider.tsx | 8 +-- frontend/src/hooks/usePackageActions.ts | 12 ++-- frontend/src/hooks/usePackageChanges.ts | 36 ++++++++++++ frontend/src/hooks/usePackageData.ts | 10 ++-- frontend/src/hooks/useSelectedRepository.ts | 4 +- frontend/src/models/Changes.ts | 1 + .../application/application_repository.py | 4 +- src/ahriman/core/build_tools/sources.py | 32 +++++++--- .../core/database/migrations/m017_pkgbuild.py | 25 ++++++++ .../database/operations/changes_operations.py | 11 ++-- src/ahriman/core/repository/executor.py | 3 +- src/ahriman/core/repository/package_info.py | 12 ++-- src/ahriman/models/changes.py | 2 + src/ahriman/web/schemas/changes_schema.py | 3 + src/ahriman/web/views/v1/packages/changes.py | 3 +- .../test_application_repository.py | 16 ++++- .../ahriman/core/build_tools/test_sources.py | 32 +++++----- .../database/migrations/test_m017_pkgbuild.py | 8 +++ .../operations/test_changes_operations.py | 36 ++++++------ .../ahriman/core/repository/test_executor.py | 4 +- .../core/repository/test_package_info.py | 7 +-- 35 files changed, 366 insertions(+), 186 deletions(-) create mode 100644 frontend/src/components/common/syntaxLanguages.ts create mode 100644 frontend/src/components/package/PkgbuildTab.tsx create mode 100644 frontend/src/components/package/TabKey.ts create mode 100644 frontend/src/hooks/usePackageChanges.ts create mode 100644 src/ahriman/core/database/migrations/m017_pkgbuild.py create mode 100644 tests/ahriman/core/database/migrations/test_m017_pkgbuild.py diff --git a/docs/ahriman.core.database.migrations.rst b/docs/ahriman.core.database.migrations.rst index 4b90cc56..29984079 100644 --- a/docs/ahriman.core.database.migrations.rst +++ b/docs/ahriman.core.database.migrations.rst @@ -140,6 +140,14 @@ ahriman.core.database.migrations.m016\_archive module :no-undoc-members: :show-inheritance: +ahriman.core.database.migrations.m017\_pkgbuild module +------------------------------------------------------ + +.. automodule:: ahriman.core.database.migrations.m017_pkgbuild + :members: + :no-undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/frontend/src/components/common/CodeBlock.tsx b/frontend/src/components/common/CodeBlock.tsx index cbd9cbad..02e08e45 100644 --- a/frontend/src/components/common/CodeBlock.tsx +++ b/frontend/src/components/common/CodeBlock.tsx @@ -17,47 +17,57 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import { Box } from "@mui/material"; +import "components/common/syntaxLanguages"; + +import { Box, useTheme } from "@mui/material"; import CopyButton from "components/common/CopyButton"; +import { useThemeMode } from "hooks/useThemeMode"; import React, { type RefObject } from "react"; +import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; +import { githubGist, vs2015 } from "react-syntax-highlighter/dist/esm/styles/hljs"; interface CodeBlockProps { - preRef?: RefObject; - getText: () => string; + content: string; height?: number | string; + language?: string; onScroll?: () => void; - wordBreak?: boolean; + preRef?: RefObject; } export default function CodeBlock({ - preRef, - getText, + content, height, + language = "text", onScroll, - wordBreak, + preRef, }: CodeBlockProps): React.JSX.Element { + const { mode } = useThemeMode(); + const theme = useTheme(); + return - - {getText()} - - - - + + {content} + + {content && + + } ; } diff --git a/frontend/src/components/common/CopyButton.tsx b/frontend/src/components/common/CopyButton.tsx index 2f68feb2..1649c930 100644 --- a/frontend/src/components/common/CopyButton.tsx +++ b/frontend/src/components/common/CopyButton.tsx @@ -23,17 +23,17 @@ import { IconButton, Tooltip } from "@mui/material"; import React, { useEffect, useRef, useState } from "react"; interface CopyButtonProps { - getText: () => string; + text: string; } -export default function CopyButton({ getText }: CopyButtonProps): React.JSX.Element { +export default function CopyButton({ text }: CopyButtonProps): React.JSX.Element { const [copied, setCopied] = useState(false); const timer = useRef>(undefined); useEffect(() => () => clearTimeout(timer.current), []); const handleCopy: () => Promise = async () => { - await navigator.clipboard.writeText(getText()); + await navigator.clipboard.writeText(text); setCopied(true); clearTimeout(timer.current); timer.current = setTimeout(() => setCopied(false), 2000); diff --git a/frontend/src/components/common/RepositorySelect.tsx b/frontend/src/components/common/RepositorySelect.tsx index b80783f2..eb53bc3f 100644 --- a/frontend/src/components/common/RepositorySelect.tsx +++ b/frontend/src/components/common/RepositorySelect.tsx @@ -25,12 +25,12 @@ import type React from "react"; export default function RepositorySelect({ repositorySelect, }: { repositorySelect: SelectedRepositoryResult }): React.JSX.Element { - const { repositories, current } = useRepository(); + const { repositories, currentRepository } = useRepository(); return repository