diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5c63b5c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,63 @@ +# Changelog + +All notable user-facing changes to Gitty are documented in this file. + +The project uses calendar versions. Displayed release names use `YYYY.MM.DD`; +package metadata uses the equivalent numeric form without leading zeroes where +required by the package manager. + +## [2026.07.21] - 2026-07-21 + +### Added + +- Full Git worktree management: + - create a worktree from an existing branch; + - create a new branch and worktree together; + - create a detached worktree at a commit; + - open a worktree as a repository tab; + - move, lock, unlock, repair, remove, and prune worktrees. +- A dedicated **Worktrees** entry below **Tags** in the branch panel. +- An **Open in new worktree** action in the local branch context menu. +- Line-level patch selection with Shift-click range selection. +- Stage, unstage, and discard actions for selected lines while retaining the + existing whole-file and whole-hunk workflows. +- Arch Linux package automation that builds from `PKGBUILD`, publishes the + `.pkg.tar.zst` artifact, and updates the Pacman repository database on the + CDN. +- Detailed German and English help for worktrees, line-level staging, Pacman + installation, and release changes. + +### Changed + +- Branch deletion now uses a clearer confirmation dialog with more explicit + branch and upstream information. +- Dialog backdrops blur the application instead of covering it with a nearly + black background. +- Remote operations and authentication errors provide more actionable + feedback. +- Build diagnostics and resource handling for the Arch package pipeline are + more robust. + +### Infrastructure + +- Added centralized error notifications. +- Added structured, privacy-conscious telemetry. +- Stabilized the Arch Linux container build and `makepkg` workflow. + +## [2026.7.20] - 2026-07-13 + +### Added + +- AI-assisted review of staged changes before committing. +- Optional automatic repository refresh. +- Comprehensive German Git documentation in the built-in help. +- Initial `PKGBUILD` and automated package version synchronization. + +### Changed + +- Redesigned the repository action toolbar and workspace status presentation. +- Improved repository tabs, diff styling, spacing, and panel structure. +- Improved file-history state handling. + +[2026.07.21]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.7.21 +[2026.7.20]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.7.20 diff --git a/src/lib/components/HelpOverlay.svelte b/src/lib/components/HelpOverlay.svelte index 170a273..8b3253a 100644 --- a/src/lib/components/HelpOverlay.svelte +++ b/src/lib/components/HelpOverlay.svelte @@ -17,6 +17,7 @@ Lightbulb, ListChecks, Search, + Sparkles, Wrench, X, } from "@lucide/svelte"; @@ -617,6 +618,87 @@ }, ); + deCategories.find((category) => category.id === "app")?.sections.push( + { + id: "app-line-staging", + title: "Änderungen zeilenweise stagen", + summary: "Im Patch-Dialog kannst du nicht nur vollständige Dateien oder Hunks, sondern einzelne hinzugefügte und entfernte Zeilen für den nächsten Commit auswählen.", + steps: [ + "Öffne im Bereich Unstaged den Patch einer geänderten Textdatei.", + "Klicke auf die Auswahlfläche vor einer grünen oder roten Zeile. Mit Shift-Klick markierst du einen zusammenhängenden Bereich.", + "Die Auswahlleiste zeigt die Anzahl der gewählten Zeilen. Stage selected übernimmt nur diese Auswahl in den Staging-Bereich.", + "Öffne denselben Dialog unter Staged und nutze Unstage selected, wenn einzelne Zeilen wieder zurück ins Arbeitsverzeichnis sollen.", + "Prüfe danach den Staged-Diff. Er ist die verbindliche Vorschau des nächsten Commits.", + ], + note: "Bei einer geänderten Zeile stellt Git intern meist eine entfernte und eine hinzugefügte Zeile dar. Wähle beide Seiten, wenn die vollständige Ersetzung in denselben Commit gehört.", + }, + { + id: "app-line-discard", + title: "Hunks und einzelne Zeilen verwerfen", + summary: "Discard selected verwirft nur die markierten Zeilen; Discard Hunk verwirft den vollständigen Abschnitt. Gitty zeigt vor dem Löschen eine Sicherheitsabfrage.", + steps: [ + "Kontrolliere, ob der Dialog Staged changes oder Unstaged changes anzeigt.", + "Markiere exakt die Zeilen, die nicht behalten werden sollen.", + "Lies in der Sicherheitsabfrage Pfad und Umfang und bestätige erst danach.", + "Aktualisiere den Patch, falls Dateien während des geöffneten Dialogs extern verändert wurden.", + ], + note: "Vorsicht: Verwerfen kann nicht zuverlässig rückgängig gemacht werden. Erstelle bei wichtigen Zwischenständen zuerst einen Commit oder Stash.", + }, + { + id: "app-package-updates", + title: "Gitty unter Arch Linux installieren und aktualisieren", + summary: "Ein Pacman-Repository auf der CDN-Seite ermöglicht signierte, versionierte Updates. Alternativ lässt sich eine heruntergeladene .pkg.tar.zst-Datei direkt installieren.", + commands: [ + { command: "sudo pacman --config /pfad/gitty-pacman.conf -Syu gitty", description: "Repository-Konfiguration für genau diesen Aufruf verwenden und Gitty aktualisieren" }, + { command: "sudo pacman -U /pfad/gitty--x86_64.pkg.tar.zst", description: "Ein einzelnes lokales oder heruntergeladenes Paket installieren" }, + { command: "pacman -Qi gitty", description: "Installierte Version und Paketinformationen anzeigen" }, + { command: "pacman -Si gitty", description: "Im konfigurierten Repository verfügbare Version anzeigen" }, + ], + steps: [ + "Für normale Systemupdates trägst du das Gitty-Repository einmal dauerhaft in /etc/pacman.conf ein.", + "Wenn du die Systemdatei nicht ändern möchtest, gib --config bei jedem Pacman-Aufruf erneut an oder verwende ein eigenes Wrapper-Skript.", + "Die Build-Pipeline erzeugt das Paket aus dem PKGBUILD, aktualisiert die Repository-Datenbank und veröffentlicht beides auf dem CDN.", + "Pacman installiert nur dann eine neue Version, wenn Paketversion und Repository-Datenbank entsprechend aktualisiert wurden.", + ], + note: "--config gilt nur für den aktuellen Pacman-Prozess. Ein späteres sudo pacman -Syu erinnert sich nicht automatisch an den zuvor angegebenen Pfad.", + }, + ); + + deCategories.find((category) => category.id === "branches")?.sections.push( + { + id: "branches-worktrees-concept", + title: "Was ein Worktree ist", + summary: "Ein Repository besitzt eine gemeinsame Git-Datenbank, kann aber mehrere Arbeitsordner haben. Jeder Worktree hat eigene ausgecheckte Dateien und normalerweise einen eigenen Branch; Commits und Referenzen sind sofort in allen Worktrees sichtbar.", + steps: [ + "Das Haupt-Worktree ist der Ordner, den du ursprünglich als Repository geöffnet hast.", + "Ein zusätzlicher Worktree ist kein vollständiger Clone: Git-Objekte und Historie werden gemeinsam genutzt, nur Arbeitsordner und Index sind getrennt.", + "Änderungen in Dateien bleiben im jeweiligen Worktree. Ein dort erstellter Commit ist dagegen sofort Teil desselben Repositorys.", + "Worktrees eignen sich besonders für parallele Features, dringende Hotfixes, Reviews oder längere Builds auf einem zweiten Branch.", + "Für vollständig unabhängige Remotes, Konfigurationen oder Experimente ist ein eigener Clone weiterhin die passendere Wahl.", + ], + note: "Ein Branch kann normalerweise nicht gleichzeitig in zwei Worktrees ausgecheckt werden. Das verhindert, dass zwei Ordner denselben Branch widersprüchlich verändern.", + }, + { + id: "branches-worktrees", + title: "Mehrere Branches mit Worktrees parallel öffnen", + summary: "Ein Worktree checkt einen weiteren Branch in einen eigenen Ordner aus. So kannst du an mehreren Aufgaben arbeiten, ohne Branches im Hauptordner umzuschalten oder lokale Änderungen zu stashen.", + steps: [ + "Öffne im Branch-Panel unter Tags den Reiter Worktrees.", + "Wähle Existing branch für einen vorhandenen lokalen Branch, New branch für einen neuen Branch oder Detached für einen festen Commit ohne Branch.", + "Lege einen leeren Zielordner fest und erstelle den Worktree. Open tab öffnet ihn anschließend als eigenen Repository-Tab.", + "Move verschiebt einen nicht aktiven Worktree. Lock schützt ihn vor versehentlichem Prune oder Entfernen, etwa auf einem externen Laufwerk.", + "Remove löscht den Worktree-Ordner und seine Registrierung, behält aber den Branch. Prune entfernt nur veraltete Registrierungen nicht mehr vorhandener Ordner.", + ], + commands: [ + { command: "git worktree list", description: "Alle registrierten Worktrees anzeigen" }, + { command: "git worktree add ../projekt-fix fix/login", description: "Vorhandenen Branch in neuem Ordner auschecken" }, + { command: "git worktree add -b feature/name ../projekt-feature main", description: "Neuen Branch und Worktree von main erstellen" }, + { command: "git worktree prune --dry-run", description: "Veraltete Registrierungen vor dem Aufräumen prüfen" }, + ], + note: "Ein Branch kann normalerweise nur in einem Worktree gleichzeitig ausgecheckt sein. Ein Worktree mit lokalen Änderungen sollte vor Remove committed, gestasht oder bewusst erzwungen entfernt werden.", + }, + ); + deCategories.find((category) => category.id === "branches")?.sections.push( { id: "branches-strategy", @@ -979,6 +1061,87 @@ }, ); + enCategories.find((category) => category.id === "app")?.sections.push( + { + id: "app-line-staging", + title: "Stage changes line by line", + summary: "The patch dialog lets you prepare individual added and deleted lines instead of staging an entire file or hunk.", + steps: [ + "Open the patch of a changed text file in Unstaged.", + "Click the selector in front of a green or red line. Shift-click selects a continuous range.", + "The selection bar shows the number of selected lines. Stage selected moves only that selection into Staged.", + "Open the same dialog under Staged and use Unstage selected to return individual lines to the working tree.", + "Review the Staged diff afterward. It is the authoritative preview of the next commit.", + ], + note: "Git usually represents one edited line as one deletion plus one addition. Select both sides when the complete replacement belongs in the same commit.", + }, + { + id: "app-line-discard", + title: "Discard hunks or individual lines", + summary: "Discard selected removes only selected lines; Discard Hunk removes the complete section. Gitty shows a confirmation before deleting changes.", + steps: [ + "Check whether the dialog currently shows Staged changes or Unstaged changes.", + "Select exactly the lines that should not be kept.", + "Review the file path and scope in the confirmation, then confirm.", + "Refresh the patch if another application changed the file while the dialog was open.", + ], + note: "Caution: discarded work cannot always be recovered. Commit or stash important intermediate work first.", + }, + { + id: "app-package-updates", + title: "Install and update Gitty on Arch Linux", + summary: "A Pacman repository hosted on the CDN provides versioned updates. Alternatively, install a downloaded .pkg.tar.zst package directly.", + commands: [ + { command: "sudo pacman --config /path/gitty-pacman.conf -Syu gitty", description: "Use the custom repository configuration for this invocation and update Gitty" }, + { command: "sudo pacman -U /path/gitty--x86_64.pkg.tar.zst", description: "Install one local or downloaded package file" }, + { command: "pacman -Qi gitty", description: "Show the installed version and package information" }, + { command: "pacman -Si gitty", description: "Show the version available from configured repositories" }, + ], + steps: [ + "For regular system upgrades, add the Gitty repository to /etc/pacman.conf once.", + "If you do not want to change the system file, pass --config on every Pacman invocation or create a dedicated wrapper script.", + "The build pipeline creates the package from PKGBUILD, updates the repository database, and publishes both to the CDN.", + "Pacman offers an update only after both the package version and repository database have been updated.", + ], + note: "--config applies only to the current Pacman process. A later sudo pacman -Syu does not remember a previously supplied configuration path.", + }, + ); + + enCategories.find((category) => category.id === "branches")?.sections.push( + { + id: "branches-worktrees-concept", + title: "What a worktree is", + summary: "One repository has a shared Git database but can have multiple working folders. Each worktree has its own checked-out files and usually its own branch; commits and references are immediately visible from every worktree.", + steps: [ + "The main worktree is the folder you originally opened as the repository.", + "An additional worktree is not a full clone: Git objects and history are shared while the working folder and index remain separate.", + "File changes stay inside their worktree. A commit created there immediately becomes part of the shared repository.", + "Worktrees are useful for parallel features, urgent hotfixes, reviews, or long-running builds on another branch.", + "Use a separate clone when you need independent remotes, configuration, or isolated experiments.", + ], + note: "A branch normally cannot be checked out in two worktrees at once. This prevents two folders from changing the same branch inconsistently.", + }, + { + id: "branches-worktrees", + title: "Open multiple branches in parallel with worktrees", + summary: "A worktree checks out another branch into a separate folder. This lets you work on multiple tasks without switching the main folder or stashing local changes.", + steps: [ + "Open Worktrees below Tags in the Branch panel.", + "Choose Existing branch for a local branch, New branch to create one, or Detached for a fixed commit without a branch.", + "Choose an empty destination folder and create the worktree. Open tab then opens it as a separate repository tab.", + "Move relocates an inactive worktree. Lock protects it from accidental pruning or removal, for example while stored on an external drive.", + "Remove deletes the worktree folder and registration but keeps its branch. Prune removes only stale registrations for missing folders.", + ], + commands: [ + { command: "git worktree list", description: "Show all registered worktrees" }, + { command: "git worktree add ../project-fix fix/login", description: "Check out an existing branch in a new folder" }, + { command: "git worktree add -b feature/name ../project-feature main", description: "Create a branch and worktree from main" }, + { command: "git worktree prune --dry-run", description: "Preview stale registrations before pruning" }, + ], + note: "A branch can normally be checked out in only one worktree at a time. Commit, stash, or deliberately force removal of local changes before removing a worktree.", + }, + ); + enCategories.find((category) => category.id === "branches")?.sections.push( { id: "branches-strategy", @@ -1193,6 +1356,76 @@ }, ); + deCategories.splice(1, 0, { + id: "changelog", + label: "Neu in Gitty", + description: "Änderungen seit der letzten veröffentlichten Version und wichtige Neuerungen früherer Releases.", + sections: [ + { + id: "changelog-2026-07-21", + title: "Version 2026.07.21", + summary: "Dieses Release bündelt paralleles Arbeiten mit Worktrees, präzisere Commits und die neue Arch-Linux-Verteilung.", + steps: [ + "Worktree-Verwaltung: zusätzliche Arbeitsordner erstellen, öffnen, verschieben, sperren, entsperren, reparieren, entfernen und veraltete Registrierungen aufräumen.", + "Worktrees sind direkt über den neuen Reiter unter Tags erreichbar; Branches lassen sich außerdem aus ihrem Kontextmenü in einem Worktree öffnen.", + "Zeilenweises Staging: einzelne Ergänzungen und Löschungen auswählen, per Shift-Klick Bereiche markieren sowie ausgewählte Zeilen stagen, unstagen oder verwerfen.", + "Sicherere Dialoge: verständlichere Branch-Löschabfrage und weichgezeichneter Hintergrund bei geöffneten Dialogen.", + "Arch-Linux-Pakete: automatisierter Build aus dem PKGBUILD, Veröffentlichung von .pkg.tar.zst und Repository-Datenbank für Pacman auf dem CDN.", + "Robustere Remote-Aktionen, zentrale Fehlermeldungen und strukturierte, datensparsame Telemetrie.", + "Erweiterte zweisprachige Hilfe mit Worktree-, Pacman- und Line-Staging-Anleitungen.", + ], + note: "In Paketdateien kann dieselbe Version als 2026.7.21 erscheinen, weil Paketmanager numerische Versionssegmente ohne führende Null verwenden.", + }, + { + id: "changelog-2026-7-20", + title: "Version 2026.7.20", + summary: "Der letzte veröffentlichte Stand konzentrierte sich auf produktiveres Arbeiten, bessere Orientierung und einen stabileren Paket-Build.", + steps: [ + "Vor dem Commit kann eine AI-gestützte Codeprüfung den Staged-Diff analysieren.", + "Automatische Aktualisierung hält Repository-Status und Arbeitsbereich auf Wunsch aktuell.", + "Repository-Aktionsleiste, Statusdarstellung, Tabs und Diff-Ansicht wurden übersichtlicher gestaltet.", + "Die integrierte Hilfe wurde um ausführliche deutsche Git-Dokumentation ergänzt.", + "PKGBUILD und Build-Skripte wurden für die Arch-Linux-Verteilung vorbereitet.", + ], + }, + ], + }); + + enCategories.splice(1, 0, { + id: "changelog", + label: "What's new", + description: "Changes since the latest published version and notable additions from earlier releases.", + sections: [ + { + id: "changelog-2026-07-21", + title: "Version 2026.07.21", + summary: "This release combines parallel worktree workflows, more precise commits, and the new Arch Linux distribution.", + steps: [ + "Worktree management: create, open, move, lock, unlock, repair, remove, and prune additional working folders.", + "Worktrees are available from the new entry below Tags; branches can also be opened in a worktree from their context menu.", + "Line-level staging: select additions and deletions, Shift-click ranges, and stage, unstage, or discard selected lines.", + "Safer dialogs: a clearer branch deletion confirmation and a blurred background while dialogs are open.", + "Arch Linux packages: automated PKGBUILD builds plus publication of .pkg.tar.zst and the Pacman repository database to the CDN.", + "More robust remote operations, centralized error messages, and structured privacy-conscious telemetry.", + "Expanded bilingual help for worktrees, Pacman installation, and line-level staging.", + ], + note: "Package metadata may represent the same release as 2026.7.21 because package managers use numeric version segments without leading zeroes.", + }, + { + id: "changelog-2026-7-20", + title: "Version 2026.7.20", + summary: "The latest published version focused on productivity, clearer navigation, and a more stable package build.", + steps: [ + "AI-assisted pre-commit review can analyze the staged diff before committing.", + "Optional automatic refresh keeps repository status and the workspace current.", + "The repository action bar, status presentation, tabs, and diff view became easier to scan.", + "The built-in help gained comprehensive German Git documentation.", + "PKGBUILD and build scripts prepared the Arch Linux distribution workflow.", + ], + }, + ], + }); + let { language = "en", onClose = () => {} }: Props = $props(); const isGerman = $derived(language === "de"); const categories = $derived(isGerman ? deCategories : enCategories); @@ -1297,6 +1530,7 @@ > {#if category.id === "start"}