From 5790b65069ca492f1bafb5f4cdac74a667987b25 Mon Sep 17 00:00:00 2001 From: William Grant Date: Wed, 5 Aug 2026 14:31:59 -0500 Subject: [PATCH] Launch Git Fleet multi-repository graph --- .github/CODEOWNERS | 2 +- .github/workflows/publish.yml | 40 -- .github/workflows/release.yml | 36 ++ .vscodeignore | 8 + CHANGELOG.md | 78 +--- CONTRIBUTING.md | 23 ++ LICENSE | 3 +- NOTICE.md | 9 + README.md | 113 +++--- ROADMAP.md | 20 + SECURITY.md | 7 + docs/PUBLISHING.md | 35 ++ flake.nix | 2 +- l10n/bundle.l10n.json | 16 +- l10n/bundle.l10n.zh-cn.json | 16 +- l10n/bundle.l10n.zh-tw.json | 16 +- media/main.css | 210 ++++++++++ package.json | 184 +++++++-- package.nls.json | 26 +- package.nls.zh-cn.json | 14 +- package.nls.zh-tw.json | 14 +- plans/content-discovery-queue.md | 39 ++ resources/icon.png | Bin 5056 -> 27906 bytes resources/icon.svg | 14 + resources/repository-navigator.svg | 11 + resources/screenshots/repository-fleet.png | Bin 0 -> 155971 bytes resources/screenshots/worktree-history.png | Bin 0 -> 145851 bytes src/avatarManager.ts | 6 +- src/backend/queries/commitDetails.ts | 68 ++++ src/backend/queries/loadWorktrees.ts | 170 ++++++++ src/backend/queries/repoSearch.ts | 2 +- src/backend/types/git.types.ts | 14 + src/backend/types/queries.types.ts | 6 +- src/backend/utils/repoSearch.ts | 19 +- src/config.ts | 5 +- src/diffDocProvider.ts | 5 +- src/extension/constant/const.ts | 2 +- src/extension/initExtension.ts | 175 +++++---- src/extension/l10n/webviewL10n.ts | 12 + src/extension/main.ts | 13 +- src/extension/messageHandler.ts | 53 ++- src/extension/repoManager.ts | 17 +- src/extension/repoNavigator.ts | 364 ++++++++++++++++++ src/extension/repositorySearchRoots.ts | 56 +++ src/extension/utils/logger.ts | 4 +- src/extension/watchForRepos.ts | 11 +- src/extension/webviewHtml.ts | 7 +- src/extension/webviewPanel.ts | 34 +- src/extensionState.ts | 18 +- src/statusBarItem.ts | 4 +- src/types.ts | 2 + src/webview/global.d.ts | 4 +- src/webview/graph.ts | 14 + src/webview/main.ts | 308 +++++++++++++-- tests-ext/extension.test.ts | 10 +- .../backend/queries/commitDetails/get.test.ts | 22 ++ tests/backend/queries/loadWorktrees.test.ts | 51 +++ tests/backend/utils/repoSearch.test.ts | 8 + tests/extension/manifest.test.ts | 23 ++ tests/extension/repoNavigator.test.ts | 33 ++ tests/extension/repositorySearchRoots.test.ts | 81 ++++ tests/extension/watchForRepos.test.ts | 33 +- tests/webview/setup.ts | 15 +- tests/webview/workingTreeAndWorktrees.test.ts | 100 +++++ 64 files changed, 2308 insertions(+), 397 deletions(-) delete mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/release.yml create mode 100644 CONTRIBUTING.md create mode 100644 NOTICE.md create mode 100644 ROADMAP.md create mode 100644 SECURITY.md create mode 100644 docs/PUBLISHING.md create mode 100644 plans/content-discovery-queue.md create mode 100644 resources/icon.svg create mode 100644 resources/repository-navigator.svg create mode 100644 resources/screenshots/repository-fleet.png create mode 100644 resources/screenshots/worktree-history.png create mode 100644 src/backend/queries/loadWorktrees.ts create mode 100644 src/extension/repoNavigator.ts create mode 100644 src/extension/repositorySearchRoots.ts create mode 100644 tests/backend/queries/loadWorktrees.test.ts create mode 100644 tests/extension/manifest.test.ts create mode 100644 tests/extension/repoNavigator.test.ts create mode 100644 tests/extension/repositorySearchRoots.test.ts create mode 100644 tests/webview/workingTreeAndWorktrees.test.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 661fdc95..da94479b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @asispts +* @wrgrant diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index 3ef4cf4b..00000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: publish - -permissions: - contents: read - -on: - push: - tags: - - "v*" - -jobs: - deploy: - name: Deploy to ${{ matrix.name }} - runs-on: ubuntu-latest - strategy: - matrix: - include: - - name: VS Marketplace - pat: VS_MARKETPLACE_TOKEN - registryUrl: https://marketplace.visualstudio.com - - name: Open VSX - pat: OPEN_VSX_TOKEN - steps: - - uses: actions/checkout@v7 - - - uses: pnpm/action-setup@v6 - - uses: actions/setup-node@v7 - with: - node-version: 22 - cache: pnpm - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Publish to ${{ matrix.name }} - uses: HaaLeo/publish-vscode-extension@v2 - with: - pat: ${{ secrets[matrix.pat] }} - registryUrl: ${{ matrix.registryUrl || '' }} - dependencies: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..41c867f1 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,36 @@ +name: Release VSIX + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 + with: + node-version: 22 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Verify + run: pnpm run package && pnpm run test + + - name: Package VSIX + run: pnpm dlx @vscode/vsce package --no-dependencies --out git-fleet-${{ github.ref_name }}.vsix + + - name: Publish GitHub release + uses: softprops/action-gh-release@v2 + with: + generate_release_notes: true + files: git-fleet-${{ github.ref_name }}.vsix diff --git a/.vscodeignore b/.vscodeignore index 265072ad..dfd7df17 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -5,12 +5,20 @@ # Whitelist files !LICENSE !CHANGELOG.md +!CONTRIBUTING.md +!NOTICE.md +!README.md +!ROADMAP.md +!SECURITY.md +!docs/PUBLISHING.md !package.nls*.json !out/ !media/ !l10n/ !resources/icon.png +!resources/repository-navigator.svg +!resources/screenshots/** !resources/webview-icon.svg !resources/webview-icon-dark.svg !resources/webview-icon-light.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 4243f53e..89ac7828 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,73 +2,35 @@ ## [Unreleased] -## [0.5.0] - 2026-07-24 +## [0.1.0] - 2026-08-05 -### Added - -- Git Graph button in the Source Control view title -- Centralized logging with a dedicated "Git Graph" output channel - -### Changed - -- Optimize extension initialization logic -- Replace the "Locate HEAD" button with a highlighted HEAD commit row in the graph -- Status bar: add icons for the active and watching states -- Simplify localization to use English-string keys extracted with @vscode/l10n-dev - -### Fixed - -- Native browser context menu appearing over the graph in browser-based VS Code (vscode.dev / Codespaces) -- Header layout quirks around the refresh button - -## [0.4.0] - 2026-04-10 - -### Added - -- Full internationalization (i18n) support with multiple languages -- Language support: English (default), Simplified Chinese (简体中文), Traditional Chinese (繁體中文) - -### Fixed - -- Escape HTML in git output before rendering - -## [0.3.0] - 2026-03-26 +The first Git Fleet release, forked from Neo Git Graph 0.5.0. ### Added -- Introduce gitClient based on simple-git -- Added a button to locate HEAD in the graph +- A dedicated Git Fleet Activity Bar pane for cross-repository navigation +- Repository arrangements by recent activity, dirty-file count, or folder tree +- A persistent hide-clean-repositories control +- Configurable global repository search roots for projects outside the workspace +- Nested repository discovery to a default depth of four folders +- Clickable Uncommitted Changes details with file-level diffs +- A right-side Git worktree rail with confirmed HEAD positions, dirty state, branch information, inferred bases, and offscreen continuation arrows +- Manifest regression tests for valid VS Code view identifiers ### Changed -- Extract webview bridge -- Extract webview lifecycle - -## [0.2.0] - 2026-03-17 - -### Added +- Renamed the extension, commands, settings, views, logs, and diff scheme to Git Fleet +- Moved cross-repository navigation out of the built-in Source Control pane +- Kept the graph cell visible through row selection styling +- Updated the product identity to `wgrant-dev.git-fleet` -- Add initial test suite and CI configuration - -### Fixed - -- Remove information message - -## [0.1.1] - 2026-02-23 - -### Changed +### Security -- Migrate build system to esbuild and upgrade dependencies -- Add oxlint linter and oxfmt formatter +- Removed an inherited hard-coded GitLab token from avatar lookup requests -## [0.1.0] - 2026-02-18 +## Neo Git Graph history -Initial release +Git Fleet began from Neo Git Graph 0.5.0. Its earlier changelog remains available in the [upstream repository](https://github.com/asispts/neo-git-graph/blob/main/CHANGELOG.md). -[Unreleased]: https://github.com/asispts/neo-git-graph/compare/v0.5.0...HEAD -[0.5.0]: https://github.com/asispts/neo-git-graph/compare/v0.4.0...v0.5.0 -[0.4.0]: https://github.com/asispts/neo-git-graph/compare/v0.3.0...v0.4.0 -[0.3.0]: https://github.com/asispts/neo-git-graph/compare/v0.2.0...v0.3.0 -[0.2.0]: https://github.com/asispts/neo-git-graph/compare/v0.1.1...v0.2.0 -[0.1.1]: https://github.com/asispts/neo-git-graph/compare/v0.1.0...v0.1.1 -[0.1.0]: https://github.com/asispts/neo-git-graph/releases/tag/v0.1.0 +[Unreleased]: https://github.com/wrgrant/git-fleet/compare/v0.1.0...HEAD +[0.1.0]: https://github.com/wrgrant/git-fleet/releases/tag/v0.1.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..003d3f26 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing to Git Fleet + +Thanks for helping make multi-repository Git work easier to understand. + +## Before opening a change + +Open an issue for behavior changes that affect repository discovery, Git mutations, worktree inference, or the extension identity. Small fixes and tests can go directly to a pull request. + +## Local verification + +```sh +pnpm install +pnpm run format +pnpm run lint +pnpm run typecheck +pnpm run test +pnpm run test:ext +pnpm run package +``` + +Keep the repository navigator compact and navigational. Git mutations should remain in a surface that makes their repository and history context obvious. + +All contributions are accepted under the repository's [MIT License](LICENSE). Preserve upstream attribution when moving or substantially rewriting inherited code. diff --git a/LICENSE b/LICENSE index 85d3ad3b..0743d032 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ MIT License -Copyright (c) 2019 mhutchie. Fork (c) 2026-present asispts +Copyright (c) 2019 mhutchie. Fork (c) 2026-present asispts. +Git Fleet modifications (c) 2026 William Grant. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/NOTICE.md b/NOTICE.md new file mode 100644 index 00000000..58238f00 --- /dev/null +++ b/NOTICE.md @@ -0,0 +1,9 @@ +# Attribution notice + +Git Fleet is a software fork of [Neo Git Graph](https://github.com/asispts/neo-git-graph), created and maintained by Asis Pattisahusiwa under the MIT License. + +Neo Git Graph is based on commit [`4af8583`](https://github.com/mhutchie/vscode-git-graph/commit/4af8583a42082b2c230d2c0187d4eaff4b69c665) of [Git Graph](https://github.com/mhutchie/vscode-git-graph), created by Michael Hutchison. That commit and its ancestors were released under the MIT License. Git Fleet does not incorporate later source releases that use a different license. + +Git Fleet retains the original copyright and license notices. The Git Fleet name, repository navigator, working-tree details, worktree visualization, and subsequent modifications are maintained independently by William Grant and contributors. + +Git Fleet is not affiliated with or endorsed by Neo Git Graph, Git Graph, their maintainers, Git, GitHub, Microsoft, or Visual Studio Code. diff --git a/README.md b/README.md index ae9266c7..e7f4e979 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,82 @@
- - -

(neo) Git Graph for Visual Studio Code

-

A clean MIT fork of Git Graph. Visual history, branch actions, and devcontainer support.

-
+ Git Fleet icon +

Git Fleet

+

One pane for every repository. A familiar Git graph for each one.

-[![](https://img.shields.io/github/license/asispts/neo-git-graph)](https://github.com/asispts/neo-git-graph?tab=MIT-1-ov-file) -[![GitHub release](https://img.shields.io/github/v/release/asispts/neo-git-graph)](https://github.com/asispts/neo-git-graph/releases) -[![vscode downloads](https://img.shields.io/visual-studio-marketplace/d/asispts.neo-git-graph?label=download)](https://marketplace.visualstudio.com/items?itemName=asispts.neo-git-graph) -[![vscode installs](https://img.shields.io/visual-studio-marketplace/i/asispts.neo-git-graph?label=install)](https://marketplace.visualstudio.com/items?itemName=asispts.neo-git-graph) -[![open-vsx downloads](https://img.shields.io/open-vsx/dt/asispts/neo-git-graph?label=open-vsx)](https://open-vsx.org/extension/asispts/neo-git-graph) +[![CI](https://github.com/wrgrant/git-fleet/actions/workflows/ci.yaml/badge.svg)](https://github.com/wrgrant/git-fleet/actions/workflows/ci.yaml) +[![GitHub release](https://img.shields.io/github/v/release/wrgrant/git-fleet)](https://github.com/wrgrant/git-fleet/releases) +[![License: MIT](https://img.shields.io/badge/license-MIT-2ea44f)](LICENSE) -![demo](resources/demo.gif) +Git Fleet is a VS Code extension for people working across more repositories and Git worktrees than the built-in Source Control pane makes easy to watch. Its compact Activity Bar navigator tells you what is active, what is dirty, and where each repository lives. Selecting a repository opens the graph and Git actions inherited from Neo Git Graph. -

 

+![Git Fleet repository navigator](resources/screenshots/repository-fleet.png) -## Why this fork +## What Git Fleet adds -The original [Git Graph](https://github.com/mhutchie/vscode-git-graph) by mhutchie changed its license in May 2019. -Everything after [commit 4af8583](https://github.com/mhutchie/vscode-git-graph/commit/4af8583a42082b2c230d2c0187d4eaff4b69c665) is no longer MIT. +- A dedicated Activity Bar pane instead of another toolbar inside Source Control +- Repository discovery below every workspace folder, including nested projects +- Optional global search roots for repositories outside the current workspace +- Recent-activity, dirty-file, and folder-tree arrangements +- A persistent eye control that hides clean repositories +- A clickable Uncommitted Changes row with the same file tree and diff flow as a commit +- A worktree rail showing each checkout's HEAD, dirty state, branch, and inferred base +- Viewport-edge arrows when a worktree connector continues above or below the loaded history -This fork is based on the last MIT commit and: +![Worktrees placed in commit history](resources/screenshots/worktree-history.png) -- Keeps MIT license -- Adds devcontainer support -- Adds internationalization support (English, zh-CN, zh-TW) -- Improves codebase, tooling, and maintainability +The repository navigator is intentionally read-only. Repository-level actions—checkout, branch, merge, tag, reset, cherry-pick, and more—stay in the graph where their context is visible. -## Features +## Install -- **Graph view**: See branches, tags, and uncommitted changes in one graph -- **Commit details**: Click a commit to see message, files, and diffs -- **Branch actions**: Create, checkout, rename, delete, and merge -- **Tag actions**: Create, delete, and push tags -- **Commit actions**: Checkout, cherry-pick, revert, and reset -- **Avatar support**: Optional avatars from GitHub, GitLab, or Gravatar -- **Multi-repo**: Work with multiple repositories in one workspace -- **Devcontainer ready**: Works in remote and container environments +Git Fleet is not yet listed in the VS Code Marketplace. Download the latest `.vsix` from [GitHub Releases](https://github.com/wrgrant/git-fleet/releases), then run: + +```sh +code --install-extension git-fleet-v0.1.0.vsix +``` + +Or choose **Extensions: Install from VSIX...** from the VS Code Command Palette. + +After installation, select the Git Fleet icon in the Activity Bar. The folder-plus button adds a repository search root that should be visible from every VS Code window. ## Configuration -All settings use the `neo-git-graph` prefix. +All extension settings use the `git-fleet` prefix. -| Setting | Default | Description | -| ----------------------------- | --------------- | ------------------------------------------------ | -| `autoCenterCommitDetailsView` | `true` | Center commit details when opened | -| `dateFormat` | `"Date & Time"` | `"Date & Time"`, `"Date Only"`, or `"Relative"` | -| `dateType` | `"Author Date"` | `"Author Date"` or `"Commit Date"` | -| `fetchAvatars` | `false` | Fetch avatars (sends email to external services) | -| `graphColours` | 12 defaults | Colors for graph lines | -| `graphStyle` | `"rounded"` | `"rounded"` or `"angular"` | -| `initialLoadCommits` | `300` | Commits to load on open | -| `loadMoreCommits` | `100` | Commits to load on demand | -| `maxDepthOfRepoSearch` | `0` | Folder depth for repo search | -| `showCurrentBranchByDefault` | `false` | Show only current branch on open | -| `showStatusBarItem` | `true` | Show status bar button | -| `showUncommittedChanges` | `true` | Show uncommitted changes node | -| `tabIconColourTheme` | `"colour"` | `"colour"` or `"grey"` | +| Setting | Default | Purpose | +| -------------------------------------- | ------- | ------------------------------------------------- | +| `git-fleet.repositorySearchRoots` | `[]` | Additional folders to scan in every window | +| `git-fleet.maxDepthOfRepoSearch` | `4` | Nested folder depth used for repository discovery | +| `git-fleet.showUncommittedChanges` | `true` | Show working changes as the first graph row | +| `git-fleet.showCurrentBranchByDefault` | `false` | Open the graph filtered to the current branch | +| `git-fleet.initialLoadCommits` | `300` | Initial graph history length | +| `git-fleet.loadMoreCommits` | `100` | Additional commits loaded on demand | +| `git-fleet.fetchAvatars` | `false` | Fetch commit avatars from external services | -## Installation +The full settings list is available in VS Code under **Extensions → Git Fleet**. -Search for `neo-git-graph` in Extensions, or install from: +## Worktree history -- [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=asispts.neo-git-graph) -- [Open VSX Registry](https://open-vsx.org/extension/asispts/neo-git-graph) +Git records a worktree's current HEAD but not the exact commit from which that worktree was originally created. Git Fleet therefore draws HEAD connectors as confirmed state and labels base connectors as inferred merge bases against the repository's default branch. That distinction is deliberate. -## License +## Project lineage and attribution + +Git Fleet is an MIT-licensed fork of [asispts/neo-git-graph](https://github.com/asispts/neo-git-graph). Neo Git Graph is based on the last MIT-licensed commit of Michael Hutchison's [mhutchie/vscode-git-graph](https://github.com/mhutchie/vscode-git-graph), commit [`4af8583`](https://github.com/mhutchie/vscode-git-graph/commit/4af8583a42082b2c230d2c0187d4eaff4b69c665). -MIT — see [LICENSE](LICENSE). +Git Fleet preserves the MIT license and copyright notices from both upstream projects. It is maintained independently and is not affiliated with or endorsed by either upstream project. See [NOTICE.md](NOTICE.md) for the attribution chain. + +## Development + +```sh +pnpm install +pnpm run typecheck +pnpm run lint +pnpm run test +pnpm run package +``` + +Contributions are welcome. Start with [CONTRIBUTING.md](CONTRIBUTING.md), see [ROADMAP.md](ROADMAP.md) for planned work, and use [docs/PUBLISHING.md](docs/PUBLISHING.md) for the release process. + +## License -> Not related to the original Git Graph project. +[MIT](LICENSE) © Michael Hutchison, Asis Pattisahusiwa, and Git Fleet contributors. diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 00000000..9d2f9dc6 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,20 @@ +# Git Fleet roadmap + +Git Fleet 0.1 focuses on visibility: find repositories, see which ones need attention, and open a familiar graph with worktree context. + +## Next + +- Separate repository **layout** from **sort order**. Layout becomes flat list or folder tree; sort becomes recent activity, dirty-file count, or alphabetical. Tree sorting applies within each folder. +- Let users remove, rename, temporarily disable, and reorder configured repository search roots from the navigator. +- Add stale-branch, ahead/behind, and fetch-state signals without turning the navigator into another Source Control action surface. +- Improve worktree base inference and make the confirmed-versus-inferred distinction even easier to scan. +- Add keyboard-first repository switching. + +## Later + +- Safe, contextual repository actions from the navigator +- Saved fleet scopes for work, personal, client, or monorepo groupings +- Optional notifications or health summaries for abandoned dirty repositories +- Marketplace and Open VSX distribution + +Roadmap items are direction, not commitments. Please open an issue with the problem you are trying to solve, not only a proposed control. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..60e6ba42 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,7 @@ +# Security policy + +Please do not open a public issue for a suspected vulnerability or exposed credential. Use GitHub's private vulnerability reporting for `wrgrant/git-fleet` when it is available, or contact the maintainer through [wgrant.dev](https://wgrant.dev). + +Git Fleet runs Git commands against local repositories and can expose Git actions that change repository state. Review the selected repository and command before confirming a mutation. Avatar fetching is disabled by default because enabling it sends commit email-derived lookup data to external avatar services. + +Only the latest Git Fleet release receives security fixes. diff --git a/docs/PUBLISHING.md b/docs/PUBLISHING.md new file mode 100644 index 00000000..169bd82a --- /dev/null +++ b/docs/PUBLISHING.md @@ -0,0 +1,35 @@ +# Publishing Git Fleet + +GitHub Releases are the first distribution channel. Marketplace publishing is intentionally a separate, manual decision. + +## GitHub release + +1. Confirm `package.json` version, `CHANGELOG.md`, screenshots, and release notes. +2. Run `pnpm run format`, `pnpm run lint`, `pnpm run typecheck`, `pnpm run test`, and `pnpm run package`. +3. Package locally with `pnpm dlx @vscode/vsce package --no-dependencies --out git-fleet-vX.Y.Z.vsix`. Runtime dependencies are bundled by esbuild. +4. Install that exact VSIX into stable VS Code and smoke-test repository discovery, the Activity Bar view, working changes, worktrees, and Git actions. +5. Tag the verified commit as `vX.Y.Z` and push the tag. The release workflow packages a VSIX and attaches it to a GitHub release. + +## First VS Code Marketplace release + +1. Create the Marketplace publisher `wgrant-dev` and verify its public profile. +2. Verify that `package.json` still declares publisher `wgrant-dev`, name `git-fleet`, and a unique version. The resulting extension ID is `wgrant-dev.git-fleet`. +3. Review the listing copy, icon, screenshots, repository link, license, privacy implications, and support links in a packaged VSIX. +4. Upload the already-tested VSIX through the [Marketplace publisher management page](https://marketplace.visualstudio.com/manage/publishers/). VS Code officially supports this manual route, and it keeps the first release independent from a long-lived publishing credential. +5. Verify installation from a clean VS Code profile and confirm updates resolve from the new ID. +6. Only after the manual flow is stable, add a separately approved automated publish job. Follow the current [VS Code publishing documentation](https://code.visualstudio.com/api/working-with-extensions/publishing-extension); Microsoft has announced retirement of global Azure DevOps PATs on December 1, 2026, so prefer the documented Microsoft Entra ID flow instead of designing new automation around a global PAT. + +## Open VSX + +Open VSX uses a separate namespace and token. Claim the `wgrant-dev` namespace, verify ownership, and publish the same already-tested VSIX with `ovsx`. Do not make Marketplace and Open VSX publishing part of the GitHub release job until both identities and recovery procedures are confirmed. + +## Identity invariants + +- GitHub repository: `wrgrant/git-fleet` +- Marketplace publisher: `wgrant-dev` +- Package name: `git-fleet` +- Extension ID: `wgrant-dev.git-fleet` +- Command, view, and setting namespace: `git-fleet` +- Activity Bar view container ID: `git-fleet` + +Changing the publisher or package name after release creates a different extension identity and breaks automatic updates, so treat both values as permanent. diff --git a/flake.nix b/flake.nix index f332c341..a7fd7297 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "(neo) Git Graph — VS Code extension dev environment"; + description = "Git Fleet — VS Code extension development environment"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; diff --git a/l10n/bundle.l10n.json b/l10n/bundle.l10n.json index 4d4ce716..7cfef0b6 100644 --- a/l10n/bundle.l10n.json +++ b/l10n/bundle.l10n.json @@ -1,15 +1,17 @@ { "No Git repository found — watching for one": "No Git repository found — watching for one", - "View Git Graph": "View Git Graph", + "Open Git Fleet": "Open Git Fleet", "Repo": "Repo", "Branch": "Branch", "Show Remote Branches": "Show Remote Branches", "Refresh": "Refresh", - "Unable to load Git Graph": "Unable to load Git Graph", + "Worktrees": "Worktrees", + "Unable to load Git Fleet": "Unable to load Git Fleet", "Either the current workspace does not contain a Git repository, or the Git repository is not configured correctly.": "Either the current workspace does not contain a Git repository, or the Git repository is not configured correctly.", "If you are using a portable Git installation, make sure you have set the Visual Studio Code Setting \"git.path\" to the path of your portable installation (e.g. \"C:\\Program Files\\Git\\bin\\git.exe\" on Windows).": "If you are using a portable Git installation, make sure you have set the Visual Studio Code Setting \"git.path\" to the path of your portable installation (e.g. \"C:\\Program Files\\Git\\bin\\git.exe\" on Windows).", "Added in {0}": "Added in {0}", "Deleted in {0}": "Deleted in {0}", + "Working Tree": "Working Tree", "Loading ...": "Loading ...", "Load More Commits": "Load More Commits", "Show All": "Show All", @@ -20,6 +22,16 @@ "Date": "Date", "Author": "Author", "Commit": "Commit", + "Hover to connect HEAD and its inferred base to history.": "Hover to connect HEAD and its inferred base to history.", + "current": "current", + "clean": "clean", + "{0} changed": "{0} changed", + "prunable": "prunable", + "locked": "locked", + "base {0}": "base {0}", + "{0} ahead · {1} behind": "{0} ahead · {1} behind", + "outside loaded history": "outside loaded history", + "Changes in the checkout that have not been committed.": "Changes in the checkout that have not been committed.", "Unable to load commit details": "Unable to load commit details", "Unable to Copy {0} to Clipboard": "Unable to Copy {0} to Clipboard", "Unable to view diff of file": "Unable to view diff of file", diff --git a/l10n/bundle.l10n.zh-cn.json b/l10n/bundle.l10n.zh-cn.json index c6fd057e..00496c55 100644 --- a/l10n/bundle.l10n.zh-cn.json +++ b/l10n/bundle.l10n.zh-cn.json @@ -1,10 +1,11 @@ { "No Git repository found — watching for one": "未找到 Git 仓库 — 正在监视", - "View Git Graph": "查看 Git 分支图", + "Open Git Fleet": "打开 Git Fleet", "Repo": "仓库", "Branch": "分支", "Show Remote Branches": "显示远程分支", "Refresh": "刷新", + "Worktrees": "工作树", "Loading ...": "加载中 ...", "Load More Commits": "加载更多提交", "Show All": "显示全部", @@ -15,9 +16,20 @@ "Date": "日期", "Author": "作者", "Commit": "提交", - "Unable to load Git Graph": "无法加载 Git 图形", + "Unable to load Git Fleet": "无法加载 Git Fleet", "Either the current workspace does not contain a Git repository, or the Git repository is not configured correctly.": "当前工作区不包含 Git 仓库,或者 Git 仓库配置不正确。", "If you are using a portable Git installation, make sure you have set the Visual Studio Code Setting \"git.path\" to the path of your portable installation (e.g. \"C:\\Program Files\\Git\\bin\\git.exe\" on Windows).": "如果您使用的是便携版 Git,请确保已将 Visual Studio Code 的设置 “git.path” 设置为便携版安装的路径(例如 Windows 上的 “C:\\Program Files\\Git\\bin\\git.exe”)。", + "Working Tree": "工作目录", + "Hover to connect HEAD and its inferred base to history.": "悬停以将 HEAD 及其推断的基点连接到历史记录。", + "current": "当前", + "clean": "干净", + "{0} changed": "{0} 个更改", + "prunable": "可清理", + "locked": "已锁定", + "base {0}": "基点 {0}", + "{0} ahead · {1} behind": "领先 {0} · 落后 {1}", + "outside loaded history": "在已加载历史记录之外", + "Changes in the checkout that have not been committed.": "检出目录中尚未提交的更改。", "Add Tag": "添加标签", "Create Branch": "创建分支", "Checkout": "检出", diff --git a/l10n/bundle.l10n.zh-tw.json b/l10n/bundle.l10n.zh-tw.json index 87da50c2..35a48543 100644 --- a/l10n/bundle.l10n.zh-tw.json +++ b/l10n/bundle.l10n.zh-tw.json @@ -1,10 +1,11 @@ { "No Git repository found — watching for one": "找不到 Git 存放庫 — 正在監看", - "View Git Graph": "檢視 Git 分支圖", + "Open Git Fleet": "開啟 Git Fleet", "Repo": "存放庫", "Branch": "分支", "Show Remote Branches": "顯示遠端分支", "Refresh": "重新整理", + "Worktrees": "工作樹", "Loading ...": "載入中 ...", "Load More Commits": "載入更多提交", "Show All": "顯示全部", @@ -15,9 +16,20 @@ "Date": "日期", "Author": "作者", "Commit": "提交", - "Unable to load Git Graph": "無法載入 Git 圖形", + "Unable to load Git Fleet": "無法載入 Git Fleet", "Either the current workspace does not contain a Git repository, or the Git repository is not configured correctly.": "目前工作區不包含 Git 存放庫,或者 Git 存放庫設定不正確。", "If you are using a portable Git installation, make sure you have set the Visual Studio Code Setting \"git.path\" to the path of your portable installation (e.g. \"C:\\Program Files\\Git\\bin\\git.exe\" on Windows).": "如果您使用的是可攜式 Git 安裝程式,請確保已將 Visual Studio Code 的設定 “git.path” 設定為該可攜式安裝程式的內容路徑(例如 Windows 上的 “C:\\Program Files\\Git\\bin\\git.exe”)。", + "Working Tree": "工作目錄", + "Hover to connect HEAD and its inferred base to history.": "暫留以將 HEAD 及其推斷的基點連接到歷史記錄。", + "current": "目前", + "clean": "乾淨", + "{0} changed": "{0} 個變更", + "prunable": "可清理", + "locked": "已鎖定", + "base {0}": "基點 {0}", + "{0} ahead · {1} behind": "領先 {0} · 落後 {1}", + "outside loaded history": "在已載入歷史記錄之外", + "Changes in the checkout that have not been committed.": "檢出目錄中尚未提交的變更。", "Add Tag": "新增標籤", "Create Branch": "建立分支", "Checkout": "檢出", diff --git a/media/main.css b/media/main.css index d3ecd4c4..322a9ca0 100644 --- a/media/main.css +++ b/media/main.css @@ -24,6 +24,10 @@ body.unableToLoad p { #content { position: relative; } +body.worktreesVisible #content, +body.worktreesVisible #footer { + margin-right: 276px; +} /* Commit Graph */ #commitGraph { @@ -83,6 +87,12 @@ body.unableToLoad p { #commitTable tr.commit:hover td { cursor: pointer; } +#commitTable tr.commit:hover td:first-child, +#commitTable tr.commit.contextMenuActive td:first-child, +#commitTable tr.commit.dialogActive td:first-child, +#commitTable tr.commit.commitDetailsOpen td:first-child { + background-color: transparent; +} #commitTable td { line-height: 24px; padding: 0 4px; @@ -170,6 +180,186 @@ body.unableToLoad p { border-right: 1px solid rgba(128, 128, 128, 0.2); user-select: text; } +#commitDetails.workingTreeDetails #commitDetailsSummary { + display: flex; + flex-direction: column; + justify-content: center; +} +#commitDetails.workingTreeDetails #commitDetailsSummary h3 { + margin: 0 0 6px; + font-size: 14px; +} +#commitDetails.workingTreeDetails #commitDetailsSummary p { + margin: 0; + color: var(--vscode-descriptionForeground); +} + +/* Worktree history rail */ +#worktreeRail { + position: fixed; + top: 44px; + right: 8px; + bottom: 8px; + z-index: 4; + width: 256px; + display: flex; + flex-direction: column; + overflow: hidden; + border: 1px solid var(--vscode-panel-border, rgba(128, 128, 128, 0.35)); + border-radius: 6px; + background: var(--vscode-editor-background); + box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16); +} +#worktreeRail[hidden] { + display: none; +} +#worktreeHeader { + flex: none; + padding: 9px 10px 8px; + border-bottom: 1px solid var(--vscode-panel-border, rgba(128, 128, 128, 0.28)); +} +.worktreeTitle { + display: flex; + justify-content: space-between; + font-weight: 600; +} +.worktreeTitle span:last-child, +.worktreeHelp, +.worktreePath, +.worktreeMeta { + color: var(--vscode-descriptionForeground); +} +.worktreeHelp { + margin-top: 3px; + font-size: 10px; + line-height: 1.35; +} +#worktreeList { + min-height: 0; + overflow: auto; +} +.worktreeItem { + display: block; + width: 100%; + padding: 8px 9px; + border: 0; + border-bottom: 1px solid rgba(128, 128, 128, 0.2); + background: transparent; + color: var(--vscode-foreground); + text-align: left; + cursor: pointer; +} +.worktreeItem:hover, +.worktreeItem:focus, +.worktreeItem.active { + outline: none; + background: var(--vscode-list-hoverBackground); +} +.worktreeTopline, +.worktreeMeta { + display: flex; + align-items: center; + gap: 6px; + min-width: 0; +} +.worktreeStatus { + width: 7px; + height: 7px; + flex: none; + border-radius: 50%; + background: var(--vscode-testing-iconPassed, #2f9e44); +} +.worktreeStatus.dirty { + background: var(--vscode-gitDecoration-modifiedResourceForeground, #d29922); +} +.worktreeStatus.prunable { + background: var(--vscode-errorForeground, #f85149); +} +.worktreeBranch { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: 600; +} +.worktreeCurrent { + flex: none; + color: var(--vscode-textLink-foreground); + font-size: 10px; +} +.worktreeSha { + margin-left: auto; + flex: none; + color: var(--vscode-descriptionForeground); + font: 10px var(--vscode-editor-font-family); +} +.worktreePath { + margin: 3px 0 0 13px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font: 10px/1.35 var(--vscode-editor-font-family); +} +.worktreeMeta { + margin: 4px 0 0 13px; + font-size: 10px; +} +.worktreeMeta .dirty { + color: var(--vscode-gitDecoration-modifiedResourceForeground, #d29922); +} +.worktreeMeta .base { + color: var(--vscode-textLink-foreground); +} +#worktreeConnectorOverlay { + position: fixed; + inset: 0; + z-index: 3; + width: 100%; + height: 100%; + pointer-events: none; + overflow: visible; +} +#worktreeConnectorOverlay path { + fill: none; + vector-effect: non-scaling-stroke; +} +#worktreeConnectorOverlay .headLink { + stroke: var(--vscode-textLink-foreground); + stroke-width: 2.25; +} +#worktreeConnectorOverlay .baseLink { + stroke: var(--vscode-gitDecoration-modifiedResourceForeground, #d29922); + stroke-width: 1.75; + stroke-dasharray: 5 4; +} +#worktreeConnectorOverlay circle { + fill: var(--vscode-editor-background); + vector-effect: non-scaling-stroke; +} +#worktreeConnectorOverlay .headDot { + stroke: var(--vscode-textLink-foreground); + stroke-width: 2; +} +#worktreeConnectorOverlay .baseDot { + stroke: var(--vscode-gitDecoration-modifiedResourceForeground, #d29922); + stroke-width: 1.75; +} +#worktreeConnectorOverlay .headArrow { + fill: var(--vscode-textLink-foreground); +} +#worktreeConnectorOverlay .baseArrow { + fill: var(--vscode-gitDecoration-modifiedResourceForeground, #d29922); +} +@media (max-width: 760px) { + body.worktreesVisible #content, + body.worktreesVisible #footer { + margin-right: 0; + } + #worktreeRail { + width: 218px; + opacity: 0.96; + } +} .commitDetailsSummaryTop { display: inline-table; width: 100%; @@ -327,6 +517,26 @@ svg.fileIcon { #commitTable tr.commit.head:hover td:not(:first-child) { background-color: var(--vscode-list-hoverBackground); } +#commitTable tr.worktreeHead td:not(:first-child) { + box-shadow: + inset 0 1px 0 color-mix(in srgb, var(--vscode-textLink-foreground) 42%, transparent), + inset 0 -1px 0 color-mix(in srgb, var(--vscode-textLink-foreground) 42%, transparent); +} +#commitTable tr.worktreeBase td:not(:first-child) { + box-shadow: + inset 0 1px 0 + color-mix( + in srgb, + var(--vscode-gitDecoration-modifiedResourceForeground, #d29922) 38%, + transparent + ), + inset 0 -1px 0 + color-mix( + in srgb, + var(--vscode-gitDecoration-modifiedResourceForeground, #d29922) 38%, + transparent + ); +} /* Ref labels */ .gitRef { diff --git a/package.json b/package.json index 4901e475..a5627cb7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "neo-git-graph", - "displayName": "(neo) Git Graph", - "version": "0.5.0", + "name": "git-fleet", + "displayName": "Git Fleet", + "version": "0.1.0", "description": "%description%", "categories": [ "SCM Providers", @@ -12,18 +12,25 @@ "git", "git graph", "git history", - "git log" + "git log", + "multi repository", + "repository manager", + "worktree" ], - "homepage": "https://github.com/asispts/neo-git-graph", + "homepage": "https://github.com/wrgrant/git-fleet#readme", "bugs": { - "url": "https://github.com/asispts/neo-git-graph/issues" + "url": "https://github.com/wrgrant/git-fleet/issues" }, "license": "MIT", "author": { - "name": "Asis Pattisahusiwa", - "email": "asispts@gmail.com" + "name": "William Grant", + "url": "https://wgrant.dev" }, "contributors": [ + { + "name": "Asis Pattisahusiwa", + "url": "https://github.com/asispts" + }, { "name": "Michael Hutchison", "url": "https://github.com/mhutchie" @@ -31,9 +38,9 @@ ], "repository": { "type": "git", - "url": "https://github.com/asispts/neo-git-graph.git" + "url": "https://github.com/wrgrant/git-fleet.git" }, - "publisher": "asispts", + "publisher": "wgrant-dev", "main": "./out/extension.js", "scripts": { "typecheck": "tsc -p . --noEmit && tsc -p ./src --noEmit && tsc -p ./src/webview --noEmit && tsc -p ./tests --noEmit && tsc -p ./tests-ext --noEmit", @@ -76,8 +83,8 @@ "contributes": { "commands": [ { - "category": "(neo) Git Graph", - "command": "neo-git-graph.view", + "category": "Git Fleet", + "command": "git-fleet.view", "title": "%command.view%", "icon": { "light": "resources/webview-icon-light.svg", @@ -85,30 +92,124 @@ } }, { - "category": "(neo) Git Graph", - "command": "neo-git-graph.clearAvatarCache", + "category": "Git Fleet", + "command": "git-fleet.clearAvatarCache", "title": "%command.clearAvatarCache%" + }, + { + "category": "Git Fleet", + "command": "git-fleet.openRepositoryGraph", + "title": "%command.openRepositoryGraph%" + }, + { + "category": "Git Fleet", + "command": "git-fleet.refreshRepositoryNavigator", + "icon": "$(refresh)", + "title": "%command.refreshRepositoryNavigator%" + }, + { + "category": "Git Fleet", + "command": "git-fleet.changeRepositoryNavigatorMode", + "icon": "$(list-tree)", + "title": "%command.changeRepositoryNavigatorMode%" + }, + { + "category": "Git Fleet", + "command": "git-fleet.hideCleanRepositories", + "icon": "$(eye-closed)", + "title": "%command.hideCleanRepositories%" + }, + { + "category": "Git Fleet", + "command": "git-fleet.showAllRepositories", + "icon": "$(eye)", + "title": "%command.showAllRepositories%" + }, + { + "category": "Git Fleet", + "command": "git-fleet.addRepositorySearchRoot", + "icon": "$(folder-opened)", + "title": "%command.addRepositorySearchRoot%" + }, + { + "category": "Git Fleet", + "command": "git-fleet.openRepositorySearchRootsSettings", + "icon": "$(settings-gear)", + "title": "%command.openRepositorySearchRootsSettings%" + } + ], + "viewsContainers": { + "activitybar": [ + { + "id": "git-fleet", + "title": "%viewContainer.gitFleet%", + "icon": "resources/repository-navigator.svg" + } + ] + }, + "views": { + "git-fleet": [ + { + "id": "git-fleet.repositoryNavigator", + "name": "%view.repositoryNavigator%", + "icon": "resources/repository-navigator.svg", + "contextualTitle": "%viewContainer.gitFleet%" + } + ] + }, + "viewsWelcome": [ + { + "view": "git-fleet.repositoryNavigator", + "contents": "No repositories with uncommitted changes.\n[Show all repositories](command:git-fleet.showAllRepositories)", + "when": "gitFleet.hideCleanRepositories" } ], "menus": { - "scm/title": [ + "view/title": [ + { + "command": "git-fleet.addRepositorySearchRoot", + "group": "navigation@1", + "when": "view == git-fleet.repositoryNavigator" + }, + { + "command": "git-fleet.changeRepositoryNavigatorMode", + "group": "navigation@2", + "when": "view == git-fleet.repositoryNavigator" + }, + { + "command": "git-fleet.hideCleanRepositories", + "group": "navigation@3", + "when": "view == git-fleet.repositoryNavigator && !gitFleet.hideCleanRepositories" + }, { - "command": "neo-git-graph.view", + "command": "git-fleet.showAllRepositories", + "group": "navigation@3", + "when": "view == git-fleet.repositoryNavigator && gitFleet.hideCleanRepositories" + }, + { + "command": "git-fleet.refreshRepositoryNavigator", + "group": "navigation@4", + "when": "view == git-fleet.repositoryNavigator" + } + ], + "view/item/context": [ + { + "command": "git-fleet.openRepositoryGraph", "group": "navigation", - "when": "scmProvider == git" + "when": "view == git-fleet.repositoryNavigator && viewItem == repositoryNavigator.repository" } ] }, "configuration": { "type": "object", - "title": "(neo) Git Graph", + "title": "Git Fleet", "properties": { - "neo-git-graph.autoCenterCommitDetailsView": { + "git-fleet.autoCenterCommitDetailsView": { "type": "boolean", "default": true, "description": "%config.autoCenterCommitDetailsView%" }, - "neo-git-graph.dateFormat": { + "git-fleet.dateFormat": { "type": "string", "enum": [ "Date & Time", @@ -123,7 +224,7 @@ "default": "Date & Time", "description": "%config.dateFormat%" }, - "neo-git-graph.dateType": { + "git-fleet.dateType": { "type": "string", "enum": [ "Author Date", @@ -136,12 +237,12 @@ "default": "Author Date", "description": "%config.dateType%" }, - "neo-git-graph.fetchAvatars": { + "git-fleet.fetchAvatars": { "type": "boolean", "default": false, "description": "%config.fetchAvatars%" }, - "neo-git-graph.graphColours": { + "git-fleet.graphColours": { "type": "array", "items": { "type": "string", @@ -164,7 +265,7 @@ ], "description": "%config.graphColours%" }, - "neo-git-graph.graphStyle": { + "git-fleet.graphStyle": { "type": "string", "enum": [ "rounded", @@ -177,37 +278,46 @@ "default": "rounded", "description": "%config.graphStyle%" }, - "neo-git-graph.initialLoadCommits": { + "git-fleet.initialLoadCommits": { "type": "number", "default": 300, "description": "%config.initialLoadCommits%" }, - "neo-git-graph.loadMoreCommits": { + "git-fleet.loadMoreCommits": { "type": "number", "default": 100, "description": "%config.loadMoreCommits%" }, - "neo-git-graph.maxDepthOfRepoSearch": { + "git-fleet.maxDepthOfRepoSearch": { "type": "number", - "default": 0, + "default": 4, "description": "%config.maxDepthOfRepoSearch%" }, - "neo-git-graph.showCurrentBranchByDefault": { + "git-fleet.repositorySearchRoots": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "scope": "machine-overridable", + "description": "%config.repositorySearchRoots%" + }, + "git-fleet.showCurrentBranchByDefault": { "type": "boolean", "default": false, "description": "%config.showCurrentBranchByDefault%" }, - "neo-git-graph.showStatusBarItem": { + "git-fleet.showStatusBarItem": { "type": "boolean", "default": true, "description": "%config.showStatusBarItem%" }, - "neo-git-graph.showUncommittedChanges": { + "git-fleet.showUncommittedChanges": { "type": "boolean", "default": true, "description": "%config.showUncommittedChanges%" }, - "neo-git-graph.tabIconColourTheme": { + "git-fleet.tabIconColourTheme": { "type": "string", "enum": [ "colour", @@ -226,9 +336,17 @@ "activationEvents": [ "onStartupFinished" ], + "extensionKind": [ + "workspace" + ], "icon": "resources/icon.png", "engines": { "vscode": "^1.98.0" }, - "packageManager": "pnpm@11.15.1" + "packageManager": "pnpm@11.15.1", + "capabilities": { + "untrustedWorkspaces": { + "supported": false + } + } } diff --git a/package.nls.json b/package.nls.json index c12da961..26dd31e8 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,13 +1,22 @@ { - "description": "A clean MIT fork of Git Graph. Visual history, branch actions, and devcontainer support.", - "command.view": "View Git Graph (git log)", + "description": "See every repository, working tree, and worktree from one VS Code pane.", + "command.view": "Open Git Fleet Graph", "command.clearAvatarCache": "Clear Avatar Cache", + "command.openRepositoryGraph": "Open Repository Graph", + "command.refreshRepositoryNavigator": "Refresh Repository Navigator", + "command.changeRepositoryNavigatorMode": "Change Repository Arrangement", + "command.hideCleanRepositories": "Hide Clean Repositories", + "command.showAllRepositories": "Show Clean Repositories", + "command.addRepositorySearchRoot": "Add Repository Search Root", + "command.openRepositorySearchRootsSettings": "Manage Repository Search Roots", + "viewContainer.gitFleet": "Git Fleet", + "view.repositoryNavigator": "Repositories", "config.autoCenterCommitDetailsView": "Automatically center the commit details view when it is opened.", - "config.dateFormat": "Specifies the date format to be used in the date column of Git Graph.", + "config.dateFormat": "Specifies the date format used in the graph date column.", "config.dateFormat.dateTime": "Show the date and time, for example \"19 Mar 2019 21:34\"", "config.dateFormat.dateOnly": "Show the date only, for example \"19 Mar 2019\"", "config.dateFormat.relative": "Show relative times, for example \"5 minutes ago\"", - "config.dateType": "Specifies the date type to be displayed throughout Git Graph.", + "config.dateType": "Specifies the date type displayed throughout Git Fleet.", "config.dateType.authorDate": "Use the author date of a commit", "config.dateType.commitDate": "Use the committer date of a commit", "config.fetchAvatars": "Fetch avatars of commit authors and committers. By enabling this setting, you consent to commit author and committer email addresses being sent GitHub, GitLab or Gravatar, depending on the repositories remote origin.", @@ -18,11 +27,12 @@ "config.graphStyle.angular": "Use angular lines when transitioning between branches on the graph", "config.initialLoadCommits": "Specifies the number of commits to initially load.", "config.loadMoreCommits": "Specifies the number of commits to load when the \"Load More Commits\" button is pressed (only shown when more commits are available).", - "config.maxDepthOfRepoSearch": "Specifies the maximum depth of subfolders to search when discovering repositories in the workspace.", - "config.showCurrentBranchByDefault": "Show the current branch by default when Git Graph is opened. Default: false (show all branches)", - "config.showStatusBarItem": "Show a Status Bar item which opens Git Graph when clicked.", + "config.maxDepthOfRepoSearch": "Specifies the maximum depth of subfolders to search when discovering repositories in the workspace. Defaults to 4 so a parent code folder can discover nested projects.", + "config.repositorySearchRoots": "Additional folders Git Fleet searches for repositories in every VS Code window. Use this for repositories outside the current workspace.", + "config.showCurrentBranchByDefault": "Show the current branch by default when the graph is opened. Default: false (show all branches)", + "config.showStatusBarItem": "Show a Status Bar item which opens Git Fleet when clicked.", "config.showUncommittedChanges": "Show uncommitted changes (set to false to decrease load time on large repositories).", - "config.tabIconColourTheme": "Specifies the colour theme of the icon displayed on the Git Graph tab.", + "config.tabIconColourTheme": "Specifies the colour theme of the icon displayed on the Git Fleet tab.", "config.tabIconColourTheme.colour": "Show a colour icon which suits most Visual Studio Code colour themes", "config.tabIconColourTheme.grey": "Show a grey icon which suits Visual Studio Code colour themes that are predominantly grayscale" } diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 02dcf638..e2fe8564 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -1,7 +1,16 @@ { - "description": "Git Graph 的纯净 MIT 分支。可视化历史记录、分支操作和开发容器支持。", - "command.view": "查看 Git Graph (git log)", + "description": "在一个 VS Code 面板中查看所有仓库、工作目录和 worktree。", + "command.view": "打开 Git Fleet 图形", "command.clearAvatarCache": "清除头像缓存", + "command.openRepositoryGraph": "打开仓库图形", + "command.refreshRepositoryNavigator": "刷新仓库导航器", + "command.changeRepositoryNavigatorMode": "更改仓库导航器布局", + "command.hideCleanRepositories": "隐藏无更改的仓库", + "command.showAllRepositories": "显示无更改的仓库", + "command.addRepositorySearchRoot": "添加仓库搜索根目录", + "command.openRepositorySearchRootsSettings": "管理仓库搜索根目录", + "viewContainer.gitFleet": "Git 仓库总览", + "view.repositoryNavigator": "仓库", "config.autoCenterCommitDetailsView": "打开提交详情视图时自动居中显示。", "config.dateFormat": "指定 Git 图形日期列中使用的日期格式。", "config.dateFormat.dateTime": "显示日期和时间,例如 \"2019年3月19日 21:34\"", @@ -19,6 +28,7 @@ "config.initialLoadCommits": "指定初始加载的提交数量。", "config.loadMoreCommits": "指定按下“加载更多提交”按钮时要加载的提交数量(仅在有更多提交可用时显示)。", "config.maxDepthOfRepoSearch": "指定在工作区中发现仓库时搜索的子文件夹最大深度。", + "config.repositorySearchRoots": "Git Fleet 在每个 VS Code 窗口中搜索仓库的其他文件夹。适用于当前工作区之外的仓库。", "config.showCurrentBranchByDefault": "打开 Git 图形时默认显示当前分支。默认值:false(显示所有分支)", "config.showStatusBarItem": "显示状态栏项,单击时打开 Git 图形。", "config.showUncommittedChanges": "显示未提交的更改(在大型仓库上设置为 false 以减少加载时间)。", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index ea910d99..60b45687 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -1,7 +1,16 @@ { - "description": "Git Graph 的純淨 MIT 分支。視覺化歷史記錄、分支操作和開發容器支援。", - "command.view": "檢視 Git Graph (git log)", + "description": "在一個 VS Code 面板中查看所有儲存庫、工作目錄和 worktree。", + "command.view": "開啟 Git Fleet 圖形", "command.clearAvatarCache": "清除頭像快取", + "command.openRepositoryGraph": "開啟儲存庫圖形", + "command.refreshRepositoryNavigator": "重新整理儲存庫導覽器", + "command.changeRepositoryNavigatorMode": "變更儲存庫導覽器版面配置", + "command.hideCleanRepositories": "隱藏無變更的儲存庫", + "command.showAllRepositories": "顯示無變更的儲存庫", + "command.addRepositorySearchRoot": "新增儲存庫搜尋根目錄", + "command.openRepositorySearchRootsSettings": "管理儲存庫搜尋根目錄", + "viewContainer.gitFleet": "Git 儲存庫總覽", + "view.repositoryNavigator": "儲存庫", "config.autoCenterCommitDetailsView": "開啟提交詳情檢視時自動置中顯示。", "config.dateFormat": "指定 Git 圖形日期欄中使用的日期格式。", "config.dateFormat.dateTime": "顯示日期和時間,例如 \"2019年3月19日 21:34\"", @@ -19,6 +28,7 @@ "config.initialLoadCommits": "指定初始載入的提交數量。", "config.loadMoreCommits": "指定按下「載入更多提交」按鈕時要載入的提交數量(僅在有更多提交可用時顯示)。", "config.maxDepthOfRepoSearch": "指定在工作區中發現存放庫時搜尋的子資料夾最大深度。", + "config.repositorySearchRoots": "Git Fleet 在每個 VS Code 視窗中搜尋儲存庫的其他資料夾。適用於目前工作區之外的儲存庫。", "config.showCurrentBranchByDefault": "開啟 Git 圖形時預設顯示目前分支。預設值:false(顯示所有分支)", "config.showStatusBarItem": "顯示狀態列項目,按一下時開啟 Git 圖形。", "config.showUncommittedChanges": "顯示未提交的變更(在大型存放庫上設定為 false 以減少載入時間)。", diff --git a/plans/content-discovery-queue.md b/plans/content-discovery-queue.md new file mode 100644 index 00000000..33ec61f3 --- /dev/null +++ b/plans/content-discovery-queue.md @@ -0,0 +1,39 @@ +# Content discovery queue + +## 2026-08-05 — Audit inherited network code before publishing a fork + +- Why it matters: An MIT license permits reuse, but a public release still needs its own credential and privacy audit. +- Evidence: The inherited GitLab avatar request contained a hard-coded API token. Git Fleet removed the token and retained the public unauthenticated lookup path. +- Files changed: `src/avatarManager.ts`, `SECURITY.md`, `CHANGELOG.md` +- Suggested content angle: Rebranding is the visible part of launching a fork; inspecting every outbound request is the part that keeps the launch safe. + +## 2026-08-05 — Treat the working tree as graph data, not a decorative row + +- Why it matters: Users already understand Neo's commit detail tree, so the useful extension is making the uncommitted pseudo-commit satisfy the same data contract and open combined HEAD-to-checkout diffs. +- Evidence: The `*` commit now returns file changes, opens the shared details tree, and routes added, modified, renamed, and deleted working-tree paths through VS Code's diff editor. +- Files changed: `src/backend/queries/commitDetails.ts`, `src/extension/messageHandler.ts`, `src/webview/main.ts`, `src/diffDocProvider.ts` +- Suggested content angle: A small data-model repair can unlock a large interaction without duplicating UI. + +## 2026-08-05 — Overlay worktree state on the history users already know + +- Why it matters: A worktree count answers how many checkouts exist but not where their HEADs or inferred branch points sit in history. +- Evidence: The graph now has a dedicated right rail, live HEAD/base connectors, row cues, and viewport-edge arrows for offscreen or unloaded endpoints. +- Files changed: `src/backend/queries/loadWorktrees.ts`, `src/webview/graph.ts`, `src/webview/main.ts`, `media/main.css` +- Suggested content angle: Git records worktree HEADs but not creation points, so honest visualization distinguishes confirmed state from inferred merge bases. + +## 2026-08-04 — A repository navigator should not be an action surface + +- Status: idea +- Evidence: The built-in Source Control pane repeats commit inputs, large primary buttons, and dense toolbars for every repository. In the supplied example, a repository with 811 dirty files makes fleet-level navigation effectively disappear. +- Product insight: Separate the cross-repository questions (where is activity, what is dirty, which repository needs attention) from repository-level Git mutations. Keep the left pane compact and navigational; keep detailed history and actions in the graph. +- Platform insight: VS Code extensions can contribute a dedicated Activity Bar View Container containing a native Tree View. This avoids rewriting Source Control entirely and lets users move the whole Git Fleet surface to the secondary sidebar or bottom panel. +- Implementation surfaces: `src/extension/repoNavigator.ts`, `src/extension/initExtension.ts`, `package.json` +- Discovery guardrail: Parent-folder scans deliberately skip dependency and build-cache directories such as `node_modules`, `.venv`, `DerivedData`, and `target`, so increasing the useful default scan depth does not flood the navigator with generated checkouts. + +## 2026-08-04 — Stop replacing built-in panes; compose a new native surface + +- Status: idea +- Why it matters: Extension APIs are strongest when a product adds a focused navigation surface instead of trying to subtract controls from a built-in one. +- Evidence: The repository tree moved from the Source Control container to one custom Activity Bar View Container. The resulting toolbar needs only three controls: layout, hide/show clean repositories, and refresh. +- Files changed: `package.json`, `src/extension/repoNavigator.ts`, `src/extensionState.ts`, `resources/repository-navigator.svg` +- Suggested content angle: A short build thread showing how a screenshot complaint about 811 dirty files led from “replace Source Control” to “create a native Git Fleet panel.” diff --git a/resources/icon.png b/resources/icon.png index c100c8525fe505d84880beb231a2dd1dad0d7970..3a0f57f1929c53272d08f6480a1025f0591a1401 100644 GIT binary patch literal 27906 zcmeFZ+X^W1!YpXZ!E z;+z-5%)q_(UVHUk>)J%Bzg56OCqoB;Kv+tOvYH?e0`L(5goXmVUHDAh0dHV;O$BLC z+0-{=c7}|H#6V)&T-R zKuWSw+CJdJOw<7Fo~u4J!8UJA8rsifei&^S5eOfn-gA$x+)oyduB`YIYj=l1hX}~^ zArQY5;DOA~3T_LBS z;Pcy}!pVW8z2wxaw|k_;EZp4j=;%=_9XY}1=oqCiSd=}?p`@rW3^s3OE`~!J6bwRR zVKC?Y*5B2Y87RgH4GaiiVG#Z*E%TA}YvAv$-z*2OhCE?eJP?riNky)nl@1IU?sLlZWPk4Z6>jePi;&Q$uL6-cDi{|OLX1{#N2w}gDw*m0^PR}) zG0TWT=LvT3ykk+1O6s^xHdKjR$mv5no@~4n2no`Ojljjl#qafprRBb|!(aw;juu@N zOTM!j8zLvi7&w}BA$eyhSXhw7|I+I#1_BKT;f{VxAeT?vb#>X}GDT}nR~F}y6fOEQ zKF@c=PM3#l=&eBD$$FooSx~O}OI(!a5i}4-_IF6)r*kqM=drU%t*xR7!Ytq}VbJvS z^u^yP8AB>&}a#|<3FStn;k=|>BYtF{N1Cndz)t3 zMJz!pgH8K9aZU^*Z6tH|QqMGJJYSy0A!4D0DaQeItuy4)#UDwt?hOeOGie@dV4DVL zZ+>`Cv|XK@6RvWN7_=OYJx&!Osv8){!GjJ=(tC(+re|kGFF-l&&-0oyAY^4_9X52* zUyLDMf62(mNPH7sL4rG$iFnc%rh2hUpk`qOM@9_I{*MY~1QUa&kZ*h|c@k~@djlME zdBMTX6re1V<3hdF`okSPb4l1oKnXx-wz9zr_yK39;d`Zh)W7JYVtYHO8d_XIUy^Xf zO|HciQE@11in(q7V>C?;IHdb2aBtG!Sj*Vh2&-PEumXu62WhzJDz@1J-}$LAj%Fd` zS+{zT8l6^^=zHJf+;(tI%;A^lNki&LK@xxATa%;X-jaW`-gEE&kAU5;oru@Va@^u@ z4$~LAJ~1O-iy{#d5g^&x@kwY8A8 zH^}RFUS)RKM>KO}*z--^F46O@f zzXC$|I6HB9k_a$ikeJo+rrP5tGBUCY1rYJ`wn1o$^v~ATwCYPeoOvD1Pl@YD4&KA= zG&=sN1`jyZSuB@ff1VBm?jqpH81`6|i8tVFA#3Nuo&uLfgKmf6!|Gx*x<4<_Q2Qo7U}#SJ_2+t@q*W}L96?HdiNH;%!W=h5dX98 z6p$Lb7<}j0&ip;pMlQ#XAMMKoXfIwA{q5k+x$*kY(lm{S zMF`M!(r&?Q96}=*=aZ77_N;_7k)V!ScjjPGM3#Mg+*+&z=BxFZN4yoiao*?gTKlak;et5#RiS;hj&ZtV^h@sr$+g>`mO(P{ElMb!ph#5lQ^xE!QAb4 zD6D~4d`mop&lF!Mt+jol9?$DhxwQNK$|id)KMG>0Rh3b zE8S|UNY%l=JEtNA$uSGOcKmqUaxAsj(0PIG&8z>r zF^CFM(6^3+Mg}K`QnHanNGDA1*(LJ3&b?GtQE8GwPXE6gJwo!kJd`R+a%r$kfvy=ZH^`GJby_GXunR0BentEh<=qo4AXRW&e95z zvU&FRfDC1FEW)qqZ{u|=c?~X?VANfnj!MxClJGN!r3X*3V4nY?yiUJZZ6J%5b~90e>gL~22l6f|)#NPxPb_{6C+iB?`{Nuk3tKbE z(@R6rKjB5Y{jZ(f&S{RTrGBO$vZRY!31WtVw>Zl><3G$i(+`o z&{^{7vIqBJjuWBs_-NH8))McYw#Z2pS7?K_NY{p+DE+FTpE#(*MQtki>Y$$lv`q}< zbVC1XXPLbDTdY!&yTbA7WrSl)XXBBm-9h6KKTi$RqWHrba0nA+@Tde_GvuXqLujy? z4@Iaag)}WCs+M_%^VTAavbmZ(^oypRj(nj(c~Eu97?!n(Gx9Yi3-F4{Tx%BgR`tQ0Xyw`o)dDPt@{)0f?2Y>wY@qADpoSVn$V4I z+k4hLH6!#RLZy%o@3yx0Disr&E3=d*Fy=biC7ZQJ(h>yHx-*&KbVssjol#b?Ynv6OW*LJETqJOE$ zf%IU6s@3{ox%4szn~;#2i}A-B16@2Trp%n=lzUdVI&nV+)7tvF)PR4ZhN5D%`M?Nc zr3UI+q25Xkj&Q?qPwX14-5L<>Gn~Y#UAfw!Fp#A;*5~E}A+&wp_(xuF2 zpXUi2^$*JU%{U`qkq)9YM0b-OLQp1=UmxpU(q2^i7p3GKZKul(j>nIf7Sx96?~0mF z8h5+9_zMZ%>h4A{?}J;bm_6HTsqZhEevZyg{JTpR5o!0}W`zGBszO7;l-+qt$r%!Y z6yauwNAeoPu2)s)P}R|67ZR~6Y}P+(H7Lmf8)dk9+c6MJOsCD7s-dL|>C+34Wp(Jt zL20DHD*S+8VR)ItOi-lB4E4+=CU4q)$oG%d+%p^KP}lr5ey+AQYk*KmfM^!Tgwb>OS>gC z+8f@=X6-%W{jv*ohz3x2t|j-L}!&t)PWknbn-3SZ zJ4&$j%_i@YTQcxJq(7>wwpA=$P1opWx!`y+d8e<4<^`Ir3>kuOn^#2Hvh75Ln=_40 z97oCvIrXIb@c2$&?9Q{4vb`2^7etCsq#G^h4tv)4gLsE@-KcI=zo?RE$B*nIsyXkg zuY7?o-rZlW?gx^`I$AB2cFPqvj=TGJ6rSDL+mN-?1^zX<4U-U^ul0r>N+AZ8mQ@xW z@#&34T8-SgjAi8-*1dmq>hX(Z@WuD*kAAmNI)jYDA27VLA^XtLv}D)6l34!dJ6$^j zGpS)>PwYLhKZf_@la5!-gg0KxtUlc4sM=>LVuVRLM9Qr>ewusS&h;38R`MMVXUCJo zi}UOb4B4GbCiSNr=|gI=I?ss8Dym}AckqN=P;$IC)PV>iS%nb9|F)A|I2~n0GQ7=( zf5yXNv+ef4cE6=+w{w)c*858wb%gbM59rkvw2V=6)eI@-vEsWNQGofq&D$ES&MoUa zDQLFhhx}GD|1qv=iDPx93jcr1#D57|J-Hy0yQ4t*YB#@e8=KYjYx~7_Pmm9+Cqza; z$c)^E6X}6Ybi5OFJ3&vqKn8zcsX4(5eyu^gGW7v*Yzbdzuy$^=C$z`gv--CTwq(OS zy9y00>cPVNzmvd6deinOy8GTt@ohyj<%x5#?9S^Qfy*%VjXqpg(7-n>{puGxv<#%7Df=`Znn!m0O#6HRv| zOq7v?dwLaZ*G7ITjqaWcwMcmVK-yb~-txca_PzHDZ@YE>4Sto&|MZvM2&po}I40aHYUQT!7u7lp{{z~L(*(e`4}87tw-W+x_OgDRdc8&&Ah+@*D<>`%6H-5v#f6>fdqBHtZVK+`EaIFSYzQdRE)Bq>B=*8O8G=IkSh&~0V{e)W- z)y^sd!OHDA4}1+z3(!wDwPCN3aj{&Fq2>)}y0wS4uZ`lZ-U zeP52vJn&y-B;>2tvM8pw({~MEAM!)}2g>DtYYq>wWMk)cd0>bWRO;LSG1NQ^vZxa5 z1|2yNj)~;%p<@RXO?ET0Bo}fB+OOX~tRDM^%T!$H@e;Q?oATEkXKM12u+?;BwbanJ zs_&G>U5d!Oh({yd$?2drw02;y{8}lpHie$~qE^MOcn?S3T!%r=_IiTj@2+fBz_y zb)0j&95FlbvIcP=oJ=&vVi=d_v|I9A}KqmZ-^}SsF>T4rE))#u>YR;xX zey@rRL~o*?+gFYyaCG`VO*2jgbqOrF!tUQgyF!seZ1VfGDNHxu~QSQ<= z3g22@RruL{nGmWFOB4J{SwtDyx2ta_Xr;ZSVQ0cP{R*{nxhLgee$v}0o5y~1WdO%q zlmMlU(@$e%AI1M0m1xX%p-Y~)TDT;T}p@f)P9TGG6Q^SDm4{-D*QHKM*FKaR+E$z zo#eDMwRi7&jmxIAJ1nWZ4Sv`vb#X#ljf$|l2An0Ir1p7lk74tfP!GP$C7y7%D=udD z%vwihF=nZZ?y}OOh>Uso*Qsx80<*K@3u)n6R_mEY(dt3#y2GI6kdB=xFGRHK;v4n~$^JG9tA@4tpj-{5ykx4&GrgRF2`$BIzd6&4?0 zC-57T{kQA-;rf12VQYUq@ak(hcPOinM={J%o|xGyLHdcgz3pWafB*$`KrCbsRRdY!E%o!LFQXwK??Iey4$NP4SB z!v4#r(b?JxT+u%-(_!tH3lfw`z#WsnD}Rfb5jvOPpHK@!A6>{T=6<9m8?|oQk{r<4 zN->-`VH(y~_8s_ksAT5*gyC)?PDClG+6P^gX&xwM`4NcZi#!y+LehCdVe(^$moK-t zW^y96#zJ1JI4&+FN0mu!ma6UUXT8Oa^EVMpMp5T2r*8VS0S?b;qI&3xX1v_=FI=)099~3*tdS>z0APF}hXk@|3t=c1aSjN!fT*m9pgoMUCd$by4Em zBk`K7wB!TPp+j}5zr02uKgXU39(zl;MSIPJ|BqC$!^)Z9U5h$th*MX|DxyW9sFcFo zu=`_lhkntW(%3ArXh%fDyEF%oFP>ma|e}f#W~4#c)wq z2y}n8DSpzunmCwMQgU^n1>0;iRJEfwKJi|pfaCt9Q-A}0q05~q`lw-}wfXfd&iKl4 zHd9@Ouy@##;XY1nxl9-^4GcbwylIZm6p%eua+*wo#wf zdsTvr1CLCJ{_V!Nx#}GCY(7IjDCgyC117OUq?n7uHk59_s6?L(NT{6 zSUbDM>H9!xnUhoM{?_~FFvv?LNjqxtYGTGfNYg3QkHmImUDEcx7@B`)XoZ1MA=l}R z^trA)#E-STGK-(9HjUr?W*9m%zFG(*$UKWa@>LW!iQ5I0ttZLVt9sR;;Y@CLOrxe! z0k1O2jqJGdr&9GM_luzq?t^AwALT7|YXwl2)>*_Ej|Y-nFl29&An)*~Y*UOenBIJQ zh>SjVir;;0`a-nqK$rM?UO~Le^j6^O)pyl4Bb&O5u=@80;K^jcL|v$~wwc}i(`|i6 zx)9u*w(Tce!SGw#&XUaU_HbX6vFek`-&^zSET$8~F)qhOqeYLm@5LKb1QvCwx4%)( z(=98r!ZziZtIL<~K5P_tOep8dg}Q>uWvxoBVdcs08f>qmaXjh$V(9f65g{JyM%!Ms zDNh1c3l$Ch3(X0d^ITw3#xJi`0~CU(27yDJ=ASi;ryEuMvfnlcSqqN>(X2E(Wa$i% z8JebI-A?SO7xMD+*Q;2`bq58Q-yZh$PFK6;W?Sl+%o_F&@JYCJ!OULhP^Pl$W)P;#3x! zsK*ul{nlfJFrZbGrL+nvd>lxR;-8+1n*Uv3$Bo2-bHosIs&Dmr``Mc|^&C-KnAD%hPE~#yQU9#ve-Mj0Szl^uKRx4+vJ?i_a6$ zF)nrcpshMNHguFY1zqvZ3HW1WU=hNT$;QdCLDb|+qsb<@Mf>)`Ac@?XErJPo(%0^MtRzGr*!fM_a52j9Y5cE#d$}GTJ|oeP6VYU@H`JA{^WXmyfCk4f$=!75qF$} zwyM*d@()7)*QXt|<=gPO!}naZA3Q%4GH&E3elylpELL z^zR=r{kX`CuApv`K8o=74-wa_X-J=5kY!aw^uoCwh>NKyI%2!qJ~wGc+Gg}#uyj-k^aFgS zD!VWjmqyxj*t)2b0_s+1X>AuvLk5a0Gn(GFW{Z%GA5XtyZDq|z+EX0SH4kUh+R?_+ z7+EH2Jzm&y8jHstRrQ?_sBF=kNhMnnR-d%HeH38bTMYGdP%dM! zm>kEzS$q_Y=s|*j!Hh_2ARfb@#Eon!KJSMjOA76>#ZH7d%VPsN<7{Zb4Xcks?AGnk zt(Rb8sLf>^V@t#dfxUuZiu!z4|F{TBP-uvI^Kp;8FiwnK5S;Bm_~I z$N4YwY6V!s18ldK5k-%WCbUUp{FL7yfA{&` z$Y>hoCw8Ltl>4S^-(Dk9fsv4sZjRabkmD<{agLS=!rNoe$@Q#r*8953)6bHAT+@uN zwT)Q4K4gSv-yj>$@M2z_)HTAUFXK|IjZE~Sqxu-qoON(lf}rR|&7u!ZomT zt)G#=d0~X>yCp83#``N8iK9l}$5BJ(~djcO2-819aK57YXKOu?9c+9G$X0N+Yb2K26H}^Lp2ib*2xu1s8mB_F6VwyMe$$|%vCytvU_%i7k!k!?zC)95 z>g$zJ8VXxXIsS!Y6wjrc=XGH;O@+IUlFUSyjP+YJUB`>)h5l>zJ|S?)#*CZ!SjI(s z5O5=p^rbBPhSkgA-a=J;d>p4t<)Y1XnvAI=pX*r^!vEM(8}%$-*e_-n>st!6r6yb< ze$LP}C^7kS`G>8h8B6#(82<}KzmGmKE;$tYs{fkbpIi^Zo z+??7O!i(|8B4bxsYDv|9S%l;6A6+e!>w0X2>Sp?DTi6C+9QBPYI+s5B#-wWVx~wj_ z6LS$+TboQ?iHkK8<;3-a;+!IER85UXwxCs@7C zE}X>>fV%|s8@=Rs9;+ z(}PRIS)3!Ggg#K~pRzhz1vVv@laWTvXndf#y@ zjX71q!&OTX>o{%l1D5o+Ia!C%3oDdUe)~|uPNj}`@d9cq7KtselsCb|cF_vuX!ea< zrA@9=!ER-03F*R?24Q!?QFzThB6iC4VYhz!O(1U{)a;S{#N>-CkJgl*$|%A1c9Gt= zQZvNbKBwY#gT(zTWx?gLJ@#R#+qz6^p~H0) z%F7IqH~8AD8m8aF>o5pob!h$GQ(#j0w&3gfh8fggaUkc$RXM=tXTvnnG`r0!LN^@S z)(EY{UnS+_2(F+fAwn@x)0uy(g_tqnW@uOeYepN;X|BXJCiNz}Dn+e~#ET^Ud1d6P z{uTPa0-&bNi4uv6fF_5ObW88Re;z-Vcf81O7sj0pVqdKNf;MhDG=-i^XK3mkcAO+s zugYY7ldbUUMN6`&pjqvQkUjP`IEp8PH>eU$tC(c|Azo**|2RlvP76X^`;M`$Ju$lT zfPX*Tq$5gp(Jyv}j!*r&fmJ2{-b52;T}MuHS_U!!25>E-4$$G72$^2~{g zl?i9Uwy8&vX=?QN(YEsb>&+eN&TH|%SiM@C~-DjR=P>Fp|@dX>!$r)EH>i< z{cYoy^Zl@cAyo-EM!OCAccybB4_q-r-DH<+UyGQ_HkC?D{RRs9l$yvLY;(I= zMJ}Qipy^XG?yfYYlcu$QS2ZGD5Pd9)p{D+2i}k3+QQ+w}-st$6`s?H5TYI?NoAz=$ zI3HpIg9FJaCCHB*b;miS_T|YNNmb{{_&fAce2L$_b=_X zNNHv@-aMI_VSnd|z%4)r>$$9UrfH8`;xZO~3ojk+bO==#5^cH4?J@qf>w&Ku4>H$NflpLCDSdM=DyaE<8K&-`1kNHN^~xV zS4NS_9vSGi({rG|dsp$u8tI#m4ZUpnMz!nHe4^eF>$!buVy15DX=hQ)FRnX8jCkhJ z4jc`Y8tAK?UV8rcNn+H!0FmocOKKizr$iG2YqYAgjGvHH71&-~aEr{qLwV5Ez87U? zm$#o(Yr(N`aPm8ry`r`F)F*t?)^uO#OSpk+ek3;4g}QT_xoWSdWku6CZF(m+TY#sN zSu;j3V)h0oQthU!#{@Wfs&0zE_4=8N62GYo`hYf_ye;5mNYWQXdc}W<8Ku=jERoXA z>(BkzZ7NwlDh}~P&!hWal@I5bo&L9(7D#vJu&}jhAoIvxxk;e!w)H%+?%4c5Z))E6 zm)0JYS#7wcE(J~DtIM{ohe(&x&5_S$+6e;71e!Ko4j3#>nG%hz=z9quS`z}1$*=}? zBt=uoLxZ0~#ZTq}2aPb^UY!DRpqX76a!K z(_iCTBzS6Ke_d^hbGL?r%1q+89)sgJf{dIRqAsw|_7qpKe2q28@lt$w=&0h&71lq9 zn5L`l5&3o}5$V)8`kPi#b=zRS51db8&Un2x5ay#RIUX5kxUWFjI>J;1&5TR6YS7l1 zJV&I;FmEn}Imy~t)1G#UAS=|CGUPwk=Smv$!T^NF+@Bm&UzA&QNCxf@rkre*KKgq; zqT1{$Zp#F3o}^UChvCrh%qJlVkX0Ixfid}ndXoNHDIB%iC_ksF>{rS6bTO9RHhj(A zAonFO1NkKJkquJNW_O()C+eJJ8WnpV zbCAxAwjkhNp`oEtci-U!(Qnl%a|=)i|b4sK(DqjqX<;4HL)@9V$PVsRF^KtdQcE58XDjmb4X(XLZ7l+ zsOo;+I~1jBecw36yLvo{S-%qz3Z&;0X&83(8sfPbA}F)H+zaHDRY_?+ja@B)jXjwV zYsP9z{Qz3QH@_tfLcVD4B53c%0Bj>h`7C)_RGzgg&Dkg6R9Tj5VkSYusP~a@y5Ki%+({v?Zqpu_N+Uf3^uGqWV8(NcfHoqZBh>I%+!VV^4zrYVUr#=1wulZkQR(xN{mU<9CLr05X0-<&) z=Xr7*KLXVtJhk9W4o0WRYY)rB_Un6g(r7GS)V6T#8*J5d&JVcmAnFq*>(1Uf;w$vxWg*2^l+Yw7xb~Tf9 zZlmCVk`MU<=knq;EbgLhow~ozcLU>$Z-(JDCU6Dva|(7%idDo>lHXQGiXXPt>n0 zt$@gT8(}Qbg2O+e(6uO!q1E9eZE~nVej&>bl%jIo8|9RTOs|L5iBZmwp+e4C>#k}~ zBu{*QBmD*2Y7(&FEswvo!r+y5`f;(PhQYCcPM%CFcAKzp>(Y z(?TUeK|r=94(K(=o^JZ9&mN#80uj$MmSKA1_!b9VyX0Fr0N_FZ2gB=;ez5a)=qA@oIzGI5{@KFAT$pRrcG6H^4*Uc6c;eSt{Jp0McPpFgs zLy1BD{|NvH?EiO|=vD7vYg?T!kPg5XUw#BVWs<-D`h8we7(^BmBomnFQNdN|JmCoe zqrFTC9#DOP-~I8l&ff@Gek%=m>Of!ymlkAf-;ps+JHZ^>&Z|o)$wGqpa9usqj%hLu z_A|kZcec+8$p2EzJrf-}n4JQI6-La4B@Kxs4ZbrJ2B9=le4lv(tcKavT&dflo0QS& zL8%TxkY_Y^^Gwa7s+_l^yBVdk+HbBC6qHD? zeG2BoJ2|;dU0H5XzI6yJ@J2wVcrM#wg*7$)RBX}pUNzqn$pIn7CHQd5s+zUz6RR_KNLfq-Bj&T%!g>Pk-G7N z5ouD3btb01g4e=+YzhSHY=$V0$U!(!L42SQPZQFbre_`r2v~!Bn#2%|?8Zb(kidZi zC)k%-JrH3K%sdQV6j-ntF{?t=LB|KV)9D=B*`h2GuwrbL&L*8;w!pGqWFQ@3naCp` zgPI!|*-jPsi!9irGcm?Yh#ib?T5>>v6hM!tvuCUGiWm$-AX9dHHhgQ3MxkqC3&dIkWNKlwyh2X zTOJ{GIW7tiy$Q*P?Xz^{+W=JNpUbmz@J(3X|Fe(yRBHPC+MF2N7wW6C;Bxwph&eqv zV`GpMh=?^7s{7BrvRj*fe(((6*D3rc*%(1Vni6tnk^E-=5L)n zO;T%+_Btlx6<#o+IkjYlQChadJ9i^SEFg^JhPK4Lg;bCRPhfgB-ih4#%Rhj~e0=6rX!Y$Z;T%dYZt6Up}#fkDRulmMzJJ;6s z89jMbTvv01$}DHXDbpYy$9Cju2F}$Gr96i?pzIVZPjArk5j?FsxXOI^YXadutZA|& zO&tT_juv-<^~;;eGkBU_x`E=Qfal$wFb9AtMeB#pj(vVl!NfK!l7}9at%p zV}r16G94LX5VHprH$$mDq5y~)3CX>h)l8WIf9~!AtNT0VszH%{YrBC?p3I;YIMHOx zz>(qu7mR{)Kv7ptO)*>wwi|+vJH`nn$vgSC&(Oyv7G&7;()=abcNL&Q*37T{Wcsy5 zhA38yF2}oCWHKA(fu;GLmt6>jT?dFv5E&H=^=XNSW&ZrFoc zV7xjWVT>{AayZGs!Bj6~FSTrF9Rc_!fL++d13MywL<1WA11&NNRsU^p-joT91yk*1 zX%rO;7%Yw-v0oL3nBWgmgZoiH=ca@K`;T?kII?{=_*Taw)RRn^gD-)tB?k%VLbh{x zHc6TwPv_N(N%*s&NFli@;37@vz6xbsbaH}~WVWi&gnGR!DZv8FogOy=D60-WK}Xm~ zj^UK+Up}Nu0EX;Sf-%n?jN;zLrYn1uRq{U~@FFNH-%6J+oY_lbg2ZFR9PI!{6P${s zBw^N<2PV#3;xrh_-k|qaGp_>A1+fs~y5b{Ln*Jl~u?9`C%(uSfwP}~a(isCINCO+i z{WvZ`+l)H9$lN(NV+yWdVUQRfTqr?7=w%-BGxv8p_s}b(HxSkQPqZ{qfYNI)93>?A zyJk{WqzJ_B^C=l1PN9Gi2_h(SM=m54k{c+ogG0E9iur+e?6AxZgpvvt&7Lp2Pg?yw zI+@ILIwDAnG-Lmz8usEPG6Xg~R9pirIcJCOYouwhkQfL6pF~=%vqAnR+1n>yN9U-b zyADzQio&JpWj!i*nIM9EGR0VYNxOzX?LW5u0{jXZihbFS$pHsPC)f{@45>+?CMiT* z9$Hk_+ zHEcZCOZ~1!xYh9+9XS#}MHB(`m7S=UAvQxyfO;fR;+MPZzvtEXvvyGK5}ZzB&VxY7 zbg4VMp_LK$rFo=0U4jJxtN{=eLB|StdsVrLtXT6_cJZB1(!g+6%U}sI0t#Ix3A}-P z(L^A6@=3TnoeLO{_&lJ%uDJZLO+_afeU}vXEzld7vwM~PDfkJ^1ITli^g%QN%1&|u zjqp-1nMeUHz$fG~CuxU4^f`xM&PIX8T%Fc&?}agRRS2*bV`J4RJ7u$JOtFT)!rvUG zU;M2wEY9h-dkzot>Nfu#R0X0D44Kt!i)mqdpXhKCRB5~{NzPuJr&Vm1KO{MP84cZ!uGb^YJln`%6$eZH9|lLbCJGzr1QBs3f`aYuo`>MAsllZ_tk-s%F$h`p1TnyyBhay5K1WH)INiH# zYV8Kt=HK`-7|tLBf)esisPtas;ASF_w*~x-Cg+(FSZ<@K29VCOjjA@Zhhz%8!Z2rs z@Xvk+somvoPeT7aVX|4B!ZjeB{Qx_6JuU!DO$p2@lNoNJ6R3`Ykcal;t8qzRMVDM; zo$|05wxq>`IL`aRcYj@uZzzq7Hn;k801OkCe1$k&ECD4$X+`R4vmg1uN zsJE4(Q}4yKLEtt(Pje>mU|hq6e<(4u8!CsAp)@+xuKMrRDd5E+bnq)Eh2D`(3=)nJrRx~|BwL_$;CuEq#Zj7`?W>1YY~qo=QMn2 zE%MX6I8U$y6TuJ2j3HI@U59Mqo(X4hB}p{9m|<}QR7^OMmql8myFF&O>dKuRo;;pe z3u<Ouh4cw0rs}V$P#!J0Hu{~(%0e3fe57s)7*o2*rhZy36PDh z&4KAI)tv5BIm$a?g5#ESr0 z2LR%=)PCBo@v>@7vGKnxSU%?yNtHD7eW`&gieE0@1GvP@H~+F`gdnQ8>X9I|>&5G= zS8R6oD#IZz(}9%NY1RRV;Mahx`q$aC_e-5RO2}SDkdKled9@tA%6$yx!Nrxz0RVLU z?22un(53C4TUv_u?C(!#Wb~c|Y%iS7Q}pYNLR!#Rw~}x8CUP68x@ zmXb9n04KEKu&VtyBlZd-1POPH^gn%0DEc%0p18BeGH*p_)EuK?DsaI*3LGaY1b&*5 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 M9^5aGGkNvD0G6-dXaE2J literal 5056 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 AKmY&$ diff --git a/resources/icon.svg b/resources/icon.svg new file mode 100644 index 00000000..8211c0eb --- /dev/null +++ b/resources/icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/resources/repository-navigator.svg b/resources/repository-navigator.svg new file mode 100644 index 00000000..fc0836e3 --- /dev/null +++ b/resources/repository-navigator.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/resources/screenshots/repository-fleet.png b/resources/screenshots/repository-fleet.png new file mode 100644 index 0000000000000000000000000000000000000000..26a37295e28fc8ba489310e5574e1d1af2b9842f GIT binary patch literal 155971 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

BIa} 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�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�x_9bGkG>xMrwAv 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 literal 0 HcmV?d00001 diff --git a/resources/screenshots/worktree-history.png b/resources/screenshots/worktree-history.png new file mode 100644 index 0000000000000000000000000000000000000000..502ec291259de612e641ee3931ab450999c76fac GIT binary patch literal 145851 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 z z3MlIzZ(!Y_v$ztX!x&oo0Y(7^1&Lc&hXU2W%gSON9VZ#7oOqx@j>Lelbvo3#alcu? zq$KR)9JZsAr>^rW(cW88{lZC+HvVM8Ns#?#_ebZ4+o?33fC7Q+snKP_r}d|!VMbEP zSsd*yA;G^+g%iuoN8&qqCJAEMUR`5ktC;+Yi;#kM-n$)A^R{f_L3>1MN`^j;VnXlY zA*Ywu=hoe@icy&s$tEG^4d<8)q2s~PMQE&40{D?@;p(J}ih&ucGA)dHp?c>#=oWH|Cb`ZK4`u|Hcflp`P+l^JDL?kKVp`YYuNFTR=~ zvA)jx(cU8@&XBNlQ7_7KzrAfr#mK1`ODX;<28ZIME!n&K_+3ibI1_>2UTs_LM_;V^ zDSF%42M=NFeum1R>D>Yw>mnAPbqXbyO&+5`w)}CGJnjB$`&c9$Ht}##bjwlhoR?FcTi%BPTP}$4Ix{0bb4$-5HAzC;=QDfU|G@%^iY6fC zuXgU?&x7;GNJ#TqUjxlS?v2W z8fi-W_k@_rPkGvidr3B2HjU<5e4if4N)y!%<#hnjK`^-3(EAkr!4Hqc- z@9{dDHmAC#!Rve4e0ucux&yW;D`WYgPp06c;q*5Mm>QKD84I$Q-s0diUz?v>sfJ~3 z?EF;2DAERn1iC=znJZ*Lff$iYoE!lGy-j)$yoErjOiamJ;j!T_cm6itXLV=d4%AJe zO#PZ7ZZCy$GVw(r?+C+18Gtlt#w{Pvps2Q0kfQKh-o*!ie%?(&?-MJjyKNQK{T=o) z50-{gvNm~In{Rf(0>lt*m5ejqC-s4YyNT)Hxq$qgO%GH>*Nwwpz$ScgTr)l)sOPd) z+f%QD1xvwii!)7MtA7#4JTgKmP}U0lvbtGkQQwr|xotPYJT^_fJ)RTGf%!nCE(&0# z9P%&na1gt1=CzDydBVeq@=zm86tv~sOxzYFuywbfUrT`cqyY3FW!Je=(4Eyttwa_B zm23*4u1Y9e4stSWDOsJwDEF1<}~Xp4dKGw-+pLKGyVXA3LyuH^+IQJ#MFGlix1kGDdfE8IJ1hEb5FBX9{t2^K!XhyLRH*RrEQ z6n2~|lGEat3rl+a>^T86WyN_C1^ER<`habu;H$WPr*|W`gzN&?ew`J@U9fKQDfpeH zT=EDh9>&4}o`1v1io>Sx%@zK-R+YX^^yH^mpYao>Qh#RA0Mp-y^9Xr46twTcAeE~P z^Pi1FpyE>S@!`#zmCfr_Z33bjd2$rID?oSPg)gGu)Ja8H-RJ3ieKD2o%I(hhh`3P2 zDxmw!o1u_YrSSmBN$P84@~n){1_eDn?4<<=F#ydr%BIOq9mmbxvtNFOFcsOy1q}~N zDV4nCaz2?e0WwC!+uI3 zuZ||)gJ1oH`=<4HPTG37ueaM1PKuNecziy__Owv*`Y=ps zA{NU}+aHCS$YLf*Clf~I)Q83;i{1Ki{YFXfMtrE8frFl(Sx_fUXXK_RR20cPod4`1 zDGsH^qrU$ea;zY<5n(!PO8hgNC@TNaimd1oP!%`)=y$g}8!Pmj11U%1bB}};`a%cE z>CNfY-BGnx&qod_iO$oyJ^aInU+n((Ts9ClAU%h!6?ncHZ^a4UDO#6W`=12W2C}7{ z%Q!>ax|5|y3G+6B5S0fnaiHQbrbTS`q?Y4UeeX1V?k{lzo{UCaLDQ^|hD;AEHxN+06YA?*hLD zAN4dffx>SBLJhEIsndW2w)N%HWAk0|RE2hFfNJ6>&T2CIl|)xfEq2uXWA_@h8+c(}xs;HzLMs8KCro=zC+|bQr<5Se zHVayx466yJE2oR|#VH}iFiU~dXouH1KtpzXgzx``bVS?>C+yC`sU&b&n1W?g@x%A* zRI2ABLox6fO9(d4!y(Id2mR@hUJB;g^c9Pgr)SUh^$nq;l!VXmfp$ubO45j&{NQx^ zX6Ujse?BCJarpYK#3vB?1(Ivni+>NPhRKzxQgO(C4T}))zG%^&*0z2C?WI2V^Z>}r z`*Dw!Q6#syde3PJAaTrsxvK51k+znX{;ru!7;?m5*SZZihGUk{7a3po1VdpIYdNQXoeerRk_okDDdE1roZxYS{k3qb#9BRPH zrr{j7BPfJ-%kCQGNg`?c*c<3AF$4XSNL`Lz1=Iu7`AI3KTI}X-4Fi0G|BO4Y0H{Wno zE3{b}*U|*6VjRlgrx`Lhci?5ltpA+Ty&B^DLu!brbwBYs9?frkr7`a$jb+QWR{8Aa zgdLRKj*dNwf`R#MLqN~vPUefe-?DMQZywL58-yaE@Xf1sR==z{1gr=S93CX{{ga7v z48u*yis+iTnZjyC%*YY)scT>V-=b2vqReN01@iQg{H^=vFV6VjN~teevN>-yZ;ZV{ z=aW)8O$tzn1?49oi%RE=T|jPjgWUj73R0*4i$kx;4hhE53|IBRXV0`aCTqJvy2kTW9 zq&5hQL457*YGk%i`8)Z38 ze#f9IU75~dQQZ!5BC?sUD@xc{>pOwpB?*1|+vNv;0r5)nV&nI7ggo~x?4d)QmM`Qw zO?It^HfZqJ-C*i^>MyVI6e@G6T`mosT8U%D%}LMOJ~lf=@Tb&&pLL2E;Eu(7r&wgq zgC#Su$4?^Du{U3}<_}|8>gn)uSq}~iN zxHM+$eI;%BZwmi@&50sQ+krQu*64dYun6I27l`vNBE(cp>5!=r#&Slf^`prLCx>603J!k=3-!otQo9{}|7 z-pqGgPmjxmGX>h7U4ds!`4=}jHdQf;&(?7AxioZ%se8`lu5~k&LGL3PAv+MzwXmB$ zJ8MjXc&&jG@}>_KiXrli+Jej+_fjm+i)8%`aJCOfy0GVLqW$|&5)$-9CK9A(#g2tD zk^UM=&5l3ug1y=@9Xr7Dm+1bDv=_Ip@GS>0s>ifI0WGJ7X&j9wX4ruVITks7YfJz+ zhDS*LF=V+@PYe!c8Qsy45)lm^_ZfED#IX@@ORvmT6n}ir^Z9?25C7~yC+B^z>1BMD z&&-)Rz?=fUjfG7_GwG@$<9*6Ek(%TI5j__W?Qi~;V>Vgkq{7Nzx2BL-_wpp&rU@c{ zvA9j%VL49lp4m8XEJMf$`T)2LM*z6|f)^M&dJskbLuc{7`&~Dp=b1rY6p29DM%%3b zkB-3W*p`4{iKP}5N}VRxQaivuKQlY?T-XX`;I;s(Q$4VD#)n+@5$XG^-Wonrl z;&^r$6!UKaZT@Lw*_;b3;ju(43IFB@fe&P}*VhVB_KF;`BAVp3_B>%->_J8T2qiH9cjV_-c z;gmt8sp!Zk(5HmKSqo_4HjP^fTQ$z<>w1%y?zj}<0G?vC!_yE zR`EGGecr;@5{Ji1V%gYE#*bU%)te7;byR9y8AS70TUFyJ6~bYKvgv%Ih`mM>K&?pO zX+0t5=P#M7_e@yb`}mui#nA5k(|^yB%=leQV@Q1`a$m7R;E8m;+LdbMm(8u?R^Py} z71U9&(CP>(8PTUrQ@k!LO-ePzhWPKn*oRTWNXOluFyLb1Be6szhxMek7h0CIBfklH zZJ)Sep~q!^2#k)7y6dsXLYzz7TTx(LHeToolKNrZA{e-)zwCGa7a5mUI-Wv;{gdMa zk7?DXzV<#m@l?;-KYcH1{Qbu|qSlz^+<1pMFHzs|l(PCgPAA$2Zx~gL-;CGqvn4~3 z`MRnO)I1q85mTsV{{smUlFFsq%4$^36D_XfuMXIHxE1Hcug-ZL4|2BG)lKipaiK4n zMWz6Z7slzr%zPRmGl^57m#iAUZ1zi>)c{eRB z;cM*=AEmc2Qc|Atd6!8)d|iCloeLI^sSQzOWf3gS=ZXvgTZ!)N@=s`c8Bka}so#Jo zF8Sx6i(y7q7de~wc-@xQ(NKTtp*8&f!2&jZobN2Ew9zFxjoA{{`kTdOWDM0&I(@vb z1fKsz-XE5iLa)uswG5TNl2*>GD8T|LlRi(EaDPg|tu!~Wb8nzeBv$2D*0!-qNp@nP z+v7c?IkzbPJ1n1|sN(j4k>=&v_L(_50j;e?aK_wSIT#&JNxFX8^w>chqDL*!bbnxSe|6L&EWLpOH9Li!<}( z2J0Pb3a$FSUc6VH{;(J4TBXhwt$*uA0Yi=9{1WH}%f2Gmv_EQ;DpkL1=juw&F)UOP z1Fka$D49G|EwcE##MEmRVXWP#>-Oxe|LzN2uQ7fU6JB35gz4#Y`KE0II|&7;1penv zLj4Ll2J|JRfH`c20D#{Ap}(C?K>P70$=LOEmj?X;E~(C-8+N&0%L z@wsyzE?Qn$H!?t8n*t08t*r0pbozX}j~48URCXi*2_$10r&}2vwLk^m!AfIBf-mqx zGj$Yh_;Z7s>+Ly|eC~FsXuykSuo2j*2RjC`f+zqdnR4fA-a={7GT`5aO-jmy@@`D4 zQxvF_DU?gC@`ijroK^3}cX>q|%_ZxwT-M0$uqN(C0W`oQHI@~Bi!ZP0l6*GD<50`T zB~ZzMp&P$+2Du9<%hie?%M+vHOg-qLSx~5%^4bUAESA zroc*xDmHQoFfavG=(nn}>Td?f3()#8sx?*UdoNogv^eH;z>eFW86~&3L++4#h};^1 z*_t*}A5*8gJ9GsyahH=sqaq5pRQ^6PlpcM#1SiYxs#*e~jlwM*Gz<2xO9sooFYH zlw{~p9()7TQj|xFm9tJ&TgQoceN6Eh4yXg)AN3apPQB}8Hg#NpH4b{&PN#$wa`fG$ zPg6`53?p_{W@Q%!DMB2hb}_r%&C zQ_Y)a&b!nUKU0$M+O^=kaUaSHMp(B@pen^8u`%RUrh5-#A_=qOq>@Wc5D7*YecJHn zvoqIL5NZqwaL8{SFfMu?MIfo==1e=^Lh@RHM|&M z0cAxrca9*uXbN2@3ZCZ6u;}A$lRoq1grYjjahvr&o&5^xLtt9{pJMC_vgEc*E0D@B z&Xk2Gs$)Zin_o|E;w|=gtF*aWdD;AO#6ZMHY#_K%p1Z%6y6;2@AXjEPSf74NCM+lU zoKBfI1N?e<&0As|hJdymMX!Ke>1WP=g+!=oaGy?LbO=4VkyMR|c^ZA?_h$CmH+o8H zFI=MVT#5JN-=pZ>IuQCH_}>R>8Xs;W={w2{IHq!oeBKUm1fqDx6%i|G@33KqZitp? zSiSkp2WR#_QCH+6r}K7t&Vw|ax`bNC6Ln2m%>e90MZ~5r>~hPSqB^Pr;}ykL?YS9_ zSLThJq9AQwm{AEyPIc#P8M0khm-NA2JI+Cf7H6?h=$6PbGF5yP>fJrI$CS2@!%4$m8*vmRl9LIF~GMQ)Jg)UEfuxOYN?E8 zR~e3A$A)+hC@?FIKGQwJ((|N1dUOB)3G!qneRxJ%z;FNqNbRyera2h=T<-xizkEEj zKD^CpI)BU|75ROQ*1d~;I1AH%?&p+Kp z4f&&synED$^m&H|bPjM`>QCe3FpfsdD}PB3B#KM};%JL{f9P^~Y7&E*=B59E zXd2#yWn5tMhJSmAq#^25g1WVP#K+*{8vi22Dp+KzI3 zuHL6@RUHC#Mc_QLx(C1QPCUTxOevQ_pF-d4j`pT+5QXsEPQ$e(y8tRAX(G-pEnXEg2WY4lI+F z%du@aj?w=#Z7!F~RoEn|6uh2~s*2X>o?DkdtES4SR#`}0qsyw5Z_o4YXdCazdOvsd z7nxi-iOeM5s&&V$GuX*lUKCsXUnQmIx_=mO5YqOrudiL7=BAXt{hMA+qtuJSJ%8D! z)L<@*TouV+wY_*z5Q*3BUOK9U2U5Ky$ziMunad3^#65_}wQPMJ8RG|6bYd_`t2(LLmXq^YF}@&&c*rZ4^!wChFtG-jf`ru z*+|-Ae=wQ})I)g2-aAP)-U)*CEgDSUD;{&%Ou=3*@Gg*sNEn2t}};yl)R= znD%z^xbWSmqwznZpxeD)?o>cx>#P9kQ~Ut%)^zGskdw6UwMi(J$rNap>zr21+}c?k zSW0v_6p~N2v$S}gF=pzE`et3B+bwA31&SM%ntDP_`pO&j*LxWVH&(TaMWuV_{=S?NTxnz6(!qV4 z=g2aZ`*91Z1k5y=4_+)akNJB`&{Hu(z~QjVQI}e3y5^ow4i8WiJE}8kCV?^YH=~Im zYDQvS;R8;>oZq*w%V*WxPDi=z5K7KnSlQ0WcPIPV?8_QA_bv7wIrU z8V7?)V~+P%85+5m|93vJ?bPGBc3mAkgn2psFa4}ssxHapdO?FiCJUT(rkkgVw&R9c z-`BXAHoPrWt5hAVfm!D^Q-P4!iEZa~@QG(4PgumP;Ri0amanRON+Um`LN*4Y&}Ltb z+XqM|l`z7|E62t!j8%{PaMx3t^)`sk0WD6z2U@;ugfp5{Ll8iRRq2sOBpP9+d5lf6 z&u!aXbothFI+rZR_aPBRGA!dn-R^oG9|8bc##-KEe1UTVeLN7^QqDH4#>;R%Dg6M6 zkD?Gpls(LL%|3a2dfoC1C~wd8>R6>~GYbVm{Uzn}w;Pdn2;K-r=!P&;Ncjo3Vlzh% z1jw^9vqozvx@C{}i}!%kE1iv7)5U5tPseUtFebY*5f+EVtoFo|NU8p8yI#F>T#P4t8vPz7PyUbS_u zwoez(m3lR8cRZNPNU0D8-Dj9Q;+n2fuKFqCEL?VR`xH9lRCz?dm``tUx*!9nu20rA zhMT-KdsW?^i&B(hTmY3q1-wFxe*n3mI;o`cHnOSvyiFn7a(7?wo9*?;{SM)9^xJLI%IbONn#`=u!ag*eJJ#nv{pK zYWAst?~V@~<}XD5M(6cMo8dy&B=P&dQA1@CFKI#wjbC0syM?|Oc*U^bVsGh~PuBtb-YP& z9J_(u2b0qhgLX=+3FKam*IQlYxem_9WYjd+=Zh%^KgDBU{E#0-bJv5#rupiV?chH{ ztMl5wg-@114rbFjMW^JP;9_Nty2W^2N>3U??UHb@_=lVIMl*iQCuKP=XgmjR^jiYDA(InQ zjIt7c46VJ7;&GsfSO&r-HhP3jP{FVj6PcNmltl_W%i@4?bcF&p7ot-o*W4n6)p>yonc&N zaR(F5rUTcu{XJ$y z{7$?3^ZowD>&3C&?K=N5HV{jQl~NLjHkX3DO8VKnX9T;1Q@uyC;cFd zAIl~9(g|dyr}j>k5NmFN{_v`u%S*W%l@6%$r0oy5{HNq1x#VWj# zv70qUs`}<=+A1^a;1Ji~`D?ya`Q>B7ckc06SL!6})ntSHUHI&wG2-|D3dru?(VvZq7z*qZy6*d!;7kHjL zaHFx(7jalC{RK^T`F@FO4#*SZ<&;W(zz>eWTW`2Q2tJ(IXAt~}IBJmNPlADfS7ws! zEYf-T@d7Uy->ELkziX93k`aIMVX(iQ#oCbbz7;l4sd!k7&n6(%hms$ zRogoVx!i9O^=rD^nELss55agMQ{%)rI0+U_1Tk7&qOMHnAU38->-k2pND37djnH_d z=`t5j{$!fNJl-QUuHD)XTd9{;PbE<0`@NxP0J}Z_^-B`raoDTGs*bcBQPh^)y__ z`F08OKCxA9=K9Y8JhCF|V1kgnci;r(#E0i@6(}N(i{cONp2z%Vb~_v8KYWPA7t)|DP22pT;Zh&+xVllR*=pC4fQ?PC;D8cMq(CdURV!6YVsGZO~zZVHdBU;VfibIZs{~R z3{aACvH#x(X8<9;TfhNuxwho%q|In9CFI`bnzlWDb(Pozg$jlbDpf=zL*RY-bz(^% z1<8r2LAIfHjEPzA4y1mxz!5O>#inBTZtSXGuycw-9*yoOkAkP(@6MK$?pe+AzT<=> zz@Ks^A|Q!jPglr)DgopobL}Z|y&sWkxUhH|zDI4vvROE?_xXeUc`QO-w2`u{f%Se| z`(?*$(z2k^d0~jdne}R$iZkjFx|ylfkIECxrzl9H$2HHKwT}}1*2j0{P8Wbi_k2<+ zKP_M*n3=EkhjXhq!$#HNLgEGq&VEGQa0-^t^Jt3@NZ(N35Q>4sMKENG

6nI>}%# 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³>@6q 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 { + const [statusOutput, head, branch] = await Promise.all([ + git.raw(["status", "--porcelain=v1", "-z", "--untracked-files=all"]), + git.revparse(["HEAD"]), + git.branchLocal() + ]); + const fileChanges = parseWorkingTreeStatus(statusOutput).map((change) => ({ + oldFilePath: change.oldFilePath, + newFilePath: change.newFilePath, + type: workingTreeChangeType(change.status), + // Working-tree diffs are opened directly against the checkout, including + // untracked files. Zeroes keep every text file actionable in the file tree. + additions: 0, + deletions: 0 + })); + return { + hash: "*", + parents: [head.trim()], + author: "", + email: "", + date: Math.round(Date.now() / 1000), + committer: "", + body: branch.current ? `Working tree on ${branch.current}` : "Working tree", + fileChanges + }; +} + export async function commitDetails( git: SimpleGit, input: CommitDetailsInput ): Promise> { try { + if (input.commitHash === "*") { + return { commitDetails: await workingTreeDetails(git) }; + } const [details, nameStatusLines, numStatLines] = await Promise.all([ fetchCommitInfo(git, input.commitHash, input.dateType), fetchNameStatus(git, input.commitHash), diff --git a/src/backend/queries/loadWorktrees.ts b/src/backend/queries/loadWorktrees.ts new file mode 100644 index 00000000..41c23815 --- /dev/null +++ b/src/backend/queries/loadWorktrees.ts @@ -0,0 +1,170 @@ +import * as fs from "node:fs"; +import * as path from "node:path"; + +import type { SimpleGit } from "simple-git"; + +import type { GitWorktree, QueryResult } from "@/backend/types"; + +type ParsedWorktree = { + path: string; + head: string; + branch: string; + detached: boolean; + locked: string | null; + prunable: string | null; +}; + +function comparablePath(value: string) { + try { + return fs.realpathSync.native(value); + } catch { + return path.resolve(value); + } +} + +function parseWorktrees(stdout: string): ParsedWorktree[] { + return stdout + .trim() + .split(/\r?\n\r?\n/) + .filter(Boolean) + .map((block) => { + const worktree: ParsedWorktree = { + path: "", + head: "", + branch: "(detached)", + detached: false, + locked: null, + prunable: null + }; + for (const line of block.split(/\r?\n/)) { + const separator = line.indexOf(" "); + const key = separator === -1 ? line : line.substring(0, separator); + const value = separator === -1 ? "" : line.substring(separator + 1); + if (key === "worktree") { + worktree.path = value; + } else if (key === "HEAD") { + worktree.head = value; + } else if (key === "branch") { + worktree.branch = value.replace(/^refs\/heads\//, ""); + } else if (key === "detached") { + worktree.detached = true; + } else if (key === "locked") { + worktree.locked = value || "locked"; + } else if (key === "prunable") { + worktree.prunable = value || "prunable"; + } + } + return worktree; + }) + .filter((worktree) => worktree.path !== "" && worktree.head !== ""); +} + +async function resolveBaseline(git: SimpleGit): Promise<{ ref: string; sha: string } | null> { + const candidates: string[] = []; + try { + candidates.push( + (await git.raw(["symbolic-ref", "--quiet", "--short", "refs/remotes/origin/HEAD"])).trim() + ); + } catch { + // Repositories without an origin HEAD fall through to conventional branches. + } + candidates.push("main", "master"); + try { + const current = (await git.raw(["branch", "--show-current"])).trim(); + if (current) { + candidates.push(current); + } + } catch { + // A detached checkout can still resolve one of the earlier candidates. + } + const uniqueCandidates = new Set(candidates.filter(Boolean)); + const resolved = await Promise.all( + Array.from(uniqueCandidates, async (ref) => { + try { + return { ref, sha: (await git.revparse([ref])).trim() }; + } catch { + return null; + } + }) + ); + for (const candidate of resolved) { + if (candidate !== null) { + return candidate; + } + } + return null; +} + +async function tryRaw(git: SimpleGit, args: string[]): Promise { + try { + const output = (await git.raw(args)).trim(); + return output || null; + } catch { + return null; + } +} + +export async function loadWorktrees( + git: SimpleGit, + currentRepo: string +): Promise> { + try { + const [rawWorktrees, baseline] = await Promise.all([ + git.raw(["worktree", "list", "--porcelain"]), + resolveBaseline(git) + ]); + const parsed = parseWorktrees(rawWorktrees); + const worktrees: GitWorktree[] = await Promise.all( + parsed.map(async (worktree) => { + const usable = worktree.prunable === null && fs.existsSync(worktree.path); + const [dirtyOutput, forkPoint, mergeBase, counts] = await Promise.all([ + usable + ? tryRaw(git, [ + "-C", + worktree.path, + "status", + "--porcelain=v1", + "--untracked-files=all" + ]) + : Promise.resolve(null), + baseline && worktree.head !== baseline.sha + ? tryRaw(git, ["merge-base", "--fork-point", baseline.ref, worktree.head]) + : Promise.resolve(null), + baseline && worktree.head !== baseline.sha + ? tryRaw(git, ["merge-base", baseline.ref, worktree.head]) + : Promise.resolve(baseline?.sha ?? null), + baseline + ? tryRaw(git, [ + "rev-list", + "--left-right", + "--count", + `${baseline.ref}...${worktree.head}` + ]) + : Promise.resolve(null) + ]); + const [behind, ahead] = counts?.split(/\s+/).map(Number) ?? [null, null]; + return { + path: worktree.path, + head: worktree.head, + branch: worktree.branch, + detached: worktree.detached, + locked: worktree.locked, + prunable: worktree.prunable, + current: comparablePath(worktree.path) === comparablePath(currentRepo), + dirtyCount: + dirtyOutput === null + ? usable + ? 0 + : null + : dirtyOutput.split(/\r?\n/).filter(Boolean).length, + baseSha: worktree.head === baseline?.sha ? worktree.head : (forkPoint ?? mergeBase), + ahead: Number.isFinite(ahead) ? ahead : null, + behind: Number.isFinite(behind) ? behind : null + }; + }) + ); + return { worktrees, baselineRef: baseline?.ref ?? null }; + } catch { + return { worktrees: [], baselineRef: null }; + } +} diff --git a/src/backend/queries/repoSearch.ts b/src/backend/queries/repoSearch.ts index d31c2452..6b04b7a2 100644 --- a/src/backend/queries/repoSearch.ts +++ b/src/backend/queries/repoSearch.ts @@ -8,5 +8,5 @@ export async function findGitRepos( const results = await Promise.all( paths.map((p) => searchDirectoryForRepos(p, maxDepth, gitPath, [])) ); - return results.flat(); + return [...new Set(results.flat())]; } diff --git a/src/backend/types/git.types.ts b/src/backend/types/git.types.ts index 76dda90a..6900f99a 100644 --- a/src/backend/types/git.types.ts +++ b/src/backend/types/git.types.ts @@ -49,6 +49,20 @@ export type GitCommitDetails = { fileChanges: GitFileChange[]; }; +export type GitWorktree = { + path: string; + head: string; + branch: string; + current: boolean; + detached: boolean; + locked: string | null; + prunable: string | null; + dirtyCount: number | null; + baseSha: string | null; + ahead: number | null; + behind: number | null; +}; + export type GitFileChangeType = "A" | "M" | "D" | "R"; export type DateType = "Author Date" | "Commit Date"; export type GitResetMode = "soft" | "mixed" | "hard"; diff --git a/src/backend/types/queries.types.ts b/src/backend/types/queries.types.ts index b29d6acb..8b030621 100644 --- a/src/backend/types/queries.types.ts +++ b/src/backend/types/queries.types.ts @@ -1,4 +1,4 @@ -import type { GitCommitDetails, GitCommitNode } from "./git.types"; +import type { GitCommitDetails, GitCommitNode, GitWorktree } from "./git.types"; type QueryPayloads = { commitDetails: { @@ -24,6 +24,10 @@ type QueryPayloads = { hard: boolean; }; }; + loadWorktrees: { + request: { repo: string }; + response: { worktrees: GitWorktree[]; baselineRef: string | null }; + }; }; export type QueryRequest = { diff --git a/src/backend/utils/repoSearch.ts b/src/backend/utils/repoSearch.ts index 1ad7ec06..38becb92 100644 --- a/src/backend/utils/repoSearch.ts +++ b/src/backend/utils/repoSearch.ts @@ -3,6 +3,19 @@ import * as fs from "node:fs/promises"; import { isGitRepository } from "@/backend/utils/git"; import { evalPromises } from "@/backend/utils/promise"; +const EXCLUDED_DIRECTORIES = new Set([ + ".cache", + ".direnv", + ".next", + ".turbo", + ".venv", + "DerivedData", + "Pods", + "node_modules", + "target", + "venv" +]); + async function isDirectory(path: string): Promise { return fs .stat(path) @@ -36,7 +49,11 @@ export async function searchDirectoryForRepos( const dirs: string[] = []; for (let i = 0; i < dirContents.length; i++) { - if (dirContents[i] !== ".git" && (await isDirectory(directory + "/" + dirContents[i]))) { + if ( + dirContents[i] !== ".git" && + !EXCLUDED_DIRECTORIES.has(dirContents[i]) && + (await isDirectory(directory + "/" + dirContents[i])) + ) { dirs.push(directory + "/" + dirContents[i]); } } diff --git a/src/config.ts b/src/config.ts index 37188ebc..356cd720 100644 --- a/src/config.ts +++ b/src/config.ts @@ -6,7 +6,7 @@ import { DateFormat, GraphStyle } from "./types"; type TabIconColourTheme = "colour" | "grey"; function getConfig(key: string, defaultValue: T): T { - return vscode.workspace.getConfiguration("neo-git-graph").get(key, defaultValue); + return vscode.workspace.getConfiguration("git-fleet").get(key, defaultValue); } export const config = { @@ -31,7 +31,8 @@ export const config = { graphStyle: (): GraphStyle => getConfig("graphStyle", "rounded"), initialLoadCommits: (): number => getConfig("initialLoadCommits", 300), loadMoreCommits: (): number => getConfig("loadMoreCommits", 75), - maxDepthOfRepoSearch: (): number => getConfig("maxDepthOfRepoSearch", 0), + maxDepthOfRepoSearch: (): number => getConfig("maxDepthOfRepoSearch", 4), + repositorySearchRoots: (): string[] => getConfig("repositorySearchRoots", []), showCurrentBranchByDefault: (): boolean => getConfig("showCurrentBranchByDefault", false), showStatusBarItem: (): boolean => getConfig("showStatusBarItem", true), showUncommittedChanges: (): boolean => getConfig("showUncommittedChanges", true), diff --git a/src/diffDocProvider.ts b/src/diffDocProvider.ts index 77c625e2..da24ee95 100644 --- a/src/diffDocProvider.ts +++ b/src/diffDocProvider.ts @@ -4,7 +4,7 @@ import { GitInstance } from "./backend/gitClient"; import { getPathFromStr } from "./backend/utils/path"; export class DiffDocProvider implements vscode.TextDocumentContentProvider { - public static scheme = "neo-git-graph"; + public static scheme = "git-fleet"; private gitClient: GitInstance; private onDidChangeEventEmitter = new vscode.EventEmitter(); private docs = new Map(); @@ -34,6 +34,9 @@ export class DiffDocProvider implements vscode.TextDocumentContentProvider { } let request = decodeDiffDocUri(uri); + if (request.commit === "__EMPTY__") { + return ""; + } return this.gitClient() .cwd(request.repo) .show([`${request.commit}:${request.filePath}`]) diff --git a/src/extension/constant/const.ts b/src/extension/constant/const.ts index 1ee834d3..15f38c9f 100644 --- a/src/extension/constant/const.ts +++ b/src/extension/constant/const.ts @@ -1 +1 @@ -export const EXTENSION_NAME = "(neo) Git Graph"; +export const EXTENSION_NAME = "Git Fleet"; diff --git a/src/extension/initExtension.ts b/src/extension/initExtension.ts index 7fa52a05..9e9841ee 100644 --- a/src/extension/initExtension.ts +++ b/src/extension/initExtension.ts @@ -12,6 +12,8 @@ import { EXTENSION_NAME } from "@/extension/constant/const"; import { createMaxDepthTracker } from "@/extension/maxDepthTracker"; import { registerMessageHandlers } from "@/extension/messageHandler"; import { createRepoManager, RepoManager } from "@/extension/repoManager"; +import { registerRepositoryNavigator } from "@/extension/repoNavigator"; +import { getRepositorySearchRoots } from "@/extension/repositorySearchRoots"; import { logger } from "@/extension/utils/logger"; import { WebviewBridge, webviewBridgeFactory } from "@/extension/webviewBridge"; import { createWebviewPanel, WebviewPanel } from "@/extension/webviewPanel"; @@ -29,59 +31,76 @@ function registerViewCommand( gitClient: GitClient ) { let currentPanel: WebviewPanel | undefined; - ctx.subscriptions.push( - vscode.commands.registerCommand("neo-git-graph.view", () => { - if (currentPanel) { - currentPanel.reveal(vscode.window.activeTextEditor?.viewColumn); - return; + let selectRepo: ((repo: string) => void) | undefined; + + function openGraph(repo?: string, column?: vscode.ViewColumn) { + if (currentPanel) { + if (repo) { + selectRepo?.(repo); + currentPanel.selectRepo(repo); } + currentPanel.reveal(column); + return; + } - const vsPanel = vscode.window.createWebviewPanel( - "neo-git-graph", - EXTENSION_NAME, - vscode.window.activeTextEditor?.viewColumn ?? vscode.ViewColumn.One, - { - enableScripts: true, - localResourceRoots: [ - buildExtensionUri(ctx.extensionPath, "media"), - buildExtensionUri(ctx.extensionPath, "out") - ] - } - ); + const vsPanel = vscode.window.createWebviewPanel( + "git-fleet", + EXTENSION_NAME, + column ?? vscode.window.activeTextEditor?.viewColumn ?? vscode.ViewColumn.One, + { + enableScripts: true, + localResourceRoots: [ + buildExtensionUri(ctx.extensionPath, "media"), + buildExtensionUri(ctx.extensionPath, "out") + ] + } + ); - let bridge!: WebviewBridge; - const repoFileWatcher = new RepoFileWatcher(() => { - if (vsPanel.visible) { - bridge.post({ command: "refresh" }); - } - }); - bridge = webviewBridgeFactory(vsPanel.webview, repoFileWatcher); - avatarManager.registerBridge(bridge.post.bind(bridge)); - - const { onPanelShown } = registerMessageHandlers(bridge, { - config, - gitClient, - repoManager, - extensionState, - avatarManager, - repoFileWatcher - }); - - currentPanel = createWebviewPanel({ - panel: vsPanel, - bridge, - config, - repoFileWatcher, - extensionPath: ctx.extensionPath, - extensionState, - avatarManager, - repoManager, - onDispose: () => { - currentPanel = undefined; - }, - onPanelShown - }); - }) + let bridge!: WebviewBridge; + const repoFileWatcher = new RepoFileWatcher(() => { + if (vsPanel.visible) { + bridge.post({ command: "refresh" }); + } + }); + bridge = webviewBridgeFactory(vsPanel.webview, repoFileWatcher); + avatarManager.registerBridge(bridge.post.bind(bridge)); + + const handlers = registerMessageHandlers(bridge, { + config, + gitClient, + repoManager, + extensionState, + avatarManager, + repoFileWatcher + }); + selectRepo = handlers.selectRepo; + if (repo) { + selectRepo(repo); + } + + currentPanel = createWebviewPanel({ + panel: vsPanel, + bridge, + config, + repoFileWatcher, + extensionPath: ctx.extensionPath, + extensionState, + avatarManager, + repoManager, + onDispose: () => { + currentPanel = undefined; + }, + onPanelShown: handlers.onPanelShown + }); + } + + ctx.subscriptions.push( + vscode.commands.registerCommand("git-fleet.view", () => + openGraph(undefined, vscode.window.activeTextEditor?.viewColumn) + ), + vscode.commands.registerCommand("git-fleet.openRepositoryGraph", (repo: string) => + openGraph(repo, currentPanel ? undefined : vscode.ViewColumn.Beside) + ) ); } @@ -97,7 +116,7 @@ export function initExtension( const avatarManager = new AvatarManager(config.gitPath, extensionState); ctx.subscriptions.push( - vscode.commands.registerCommand("neo-git-graph.clearAvatarCache", () => { + vscode.commands.registerCommand("git-fleet.clearAvatarCache", () => { avatarManager.clearCache(); }) ); @@ -114,7 +133,17 @@ export function initExtension( const repoManager = createRepoManager(extensionState, statusBarItem, config); repoManager.setRepos(repos); repoManager.sendRepos(); + const rescanRepositories = async () => { + const repoDirs = await findGitRepos( + getRepositorySearchRoots(), + config.gitPath(), + config.maxDepthOfRepoSearch() + ); + repoManager.setRepos(repoDirs); + repoManager.sendRepos(); + }; registerViewCommand(ctx, repoManager, extensionState, avatarManager, gitClient); + registerRepositoryNavigator(ctx, repoManager, extensionState, rescanRepositories); const gitWatcher = vscode.workspace.createFileSystemWatcher("**/.git"); ctx.subscriptions.push( @@ -131,49 +160,17 @@ export function initExtension( repoManager.sendRepos(); } }), - vscode.workspace.onDidChangeWorkspaceFolders(async (e) => { - if (e.added.length > 0) { - const paths = e.added.map((f) => f.uri.fsPath); - const repoDirs = await findGitRepos( - paths, - config.gitPath(), - config.maxDepthOfRepoSearch() - ); - for (const repo of repoDirs) { - repoManager.addRepo(repo); - } - if (repoDirs.length > 0) { - repoManager.sendRepos(); - } - } - if (e.removed.length > 0) { - let changes = false; - for (const folder of e.removed) { - if (repoManager.removeReposWithinFolder(folder.uri.fsPath)) { - changes = true; - } - } - if (changes) { - repoManager.sendRepos(); - } - } - }), + vscode.workspace.onDidChangeWorkspaceFolders(() => void rescanRepositories()), vscode.workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("neo-git-graph.showStatusBarItem")) { + if (e.affectsConfiguration("git-fleet.showStatusBarItem")) { statusBarItem.refresh(); } else if (e.affectsConfiguration("git.path")) { gitClient.setGitPath(config.gitPath()); - } else if (e.affectsConfiguration("neo-git-graph.maxDepthOfRepoSearch")) { + } else if (e.affectsConfiguration("git-fleet.repositorySearchRoots")) { + void rescanRepositories(); + } else if (e.affectsConfiguration("git-fleet.maxDepthOfRepoSearch")) { if (maxDepth.increased(config.maxDepthOfRepoSearch())) { - const paths = (vscode.workspace.workspaceFolders ?? []).map((f) => f.uri.fsPath); - void findGitRepos(paths, config.gitPath(), config.maxDepthOfRepoSearch()).then( - (repoDirs) => { - if (repoDirs.length > 0) { - repoManager.setRepos(repoDirs); - repoManager.sendRepos(); - } - } - ); + void rescanRepositories(); } } }) diff --git a/src/extension/l10n/webviewL10n.ts b/src/extension/l10n/webviewL10n.ts index eba5e534..e1d80a69 100644 --- a/src/extension/l10n/webviewL10n.ts +++ b/src/extension/l10n/webviewL10n.ts @@ -22,6 +22,18 @@ export function getWebviewLocalizedStrings() { date: vscode.l10n.t("Date"), author: vscode.l10n.t("Author"), commit: vscode.l10n.t("Commit"), + worktrees: vscode.l10n.t("Worktrees"), + worktreeHelp: vscode.l10n.t("Hover to connect HEAD and its inferred base to history."), + worktreeCurrent: vscode.l10n.t("current"), + worktreeClean: vscode.l10n.t("clean"), + worktreeChanged: vscode.l10n.t("{0} changed"), + worktreePrunable: vscode.l10n.t("prunable"), + worktreeLocked: vscode.l10n.t("locked"), + worktreeBase: vscode.l10n.t("base {0}"), + worktreeDivergence: vscode.l10n.t("{0} ahead · {1} behind"), + worktreeOutsideHistory: vscode.l10n.t("outside loaded history"), + workingTree: vscode.l10n.t("Working Tree"), + workingTreeHelp: vscode.l10n.t("Changes in the checkout that have not been committed."), // Error messages unableToLoadCommitDetails: vscode.l10n.t("Unable to load commit details"), diff --git a/src/extension/main.ts b/src/extension/main.ts index 26cb0228..2c0a7a42 100644 --- a/src/extension/main.ts +++ b/src/extension/main.ts @@ -4,13 +4,17 @@ import { findGitRepos } from "@/backend/queries/repoSearch"; import { getGitVersion } from "@/backend/utils/git"; import { config } from "@/config"; import { initExtension } from "@/extension/initExtension"; +import { + getRepositorySearchRoots, + registerRepositorySearchRootCommands +} from "@/extension/repositorySearchRoots"; import { logger } from "@/extension/utils/logger"; import { watchForRepos } from "@/extension/watchForRepos"; import { StatusBarItem } from "@/statusBarItem"; export async function activate(ctx: vscode.ExtensionContext) { logger.init(ctx); - logger.log("Starting Neo Git Graph ..."); + logger.log("Starting Git Fleet ..."); const gitPath = config.gitPath(); const gitVersion = await getGitVersion(gitPath); @@ -22,15 +26,16 @@ export async function activate(ctx: vscode.ExtensionContext) { const statusBarItem = new StatusBarItem(ctx, config); statusBarItem.refresh(); + registerRepositorySearchRootCommands(ctx); - const paths = (vscode.workspace.workspaceFolders ?? []).map((f) => f.uri.fsPath); - logger.log(`Searching workspace for new repos (${paths.length} folder(s)) ...`); + const paths = getRepositorySearchRoots(); + logger.log(`Searching ${paths.length} configured root(s) for repositories ...`); const repoDirs = await findGitRepos(paths, gitPath, config.maxDepthOfRepoSearch()); if (repoDirs.length > 0) { logger.log(`Found ${repoDirs.length} repo(s)`); initExtension(ctx, repoDirs, statusBarItem); - logger.log("Started Neo Git Graph - Ready to use!"); + logger.log("Started Git Fleet - Ready to use!"); return; } diff --git a/src/extension/messageHandler.ts b/src/extension/messageHandler.ts index 8abe1ff0..0b3df04e 100644 --- a/src/extension/messageHandler.ts +++ b/src/extension/messageHandler.ts @@ -1,3 +1,5 @@ +import * as path from "node:path"; + import * as vscode from "vscode"; import { AvatarManager } from "@/avatarManager"; @@ -14,6 +16,7 @@ import { GitClient } from "@/backend/gitClient"; import { commitDetails } from "@/backend/queries/commitDetails"; import { loadBranches } from "@/backend/queries/loadBranches"; import { loadCommits } from "@/backend/queries/loadCommits"; +import { loadWorktrees } from "@/backend/queries/loadWorktrees"; import { GitFileChangeType } from "@/backend/types"; import { abbrevCommit } from "@/backend/utils/string"; import { Config } from "@/config"; @@ -33,6 +36,9 @@ function viewDiff( newFilePath: string, type: GitFileChangeType ): Promise { + if (commitHash === "*") { + return viewWorkingTreeDiff(repo, oldFilePath, newFilePath, type); + } const abbrevHash = abbrevCommit(commitHash); const pathComponents = newFilePath.split("/"); const title = @@ -58,6 +64,25 @@ function viewDiff( }); } +function viewWorkingTreeDiff( + repo: string, + oldFilePath: string, + newFilePath: string, + type: GitFileChangeType +): Promise { + const fileName = path.basename(newFilePath); + const title = `${fileName} (${vscode.l10n.t("Working Tree")})`; + const empty = encodeDiffDocUri(repo, newFilePath, "__EMPTY__"); + const left = type === "A" ? empty : encodeDiffDocUri(repo, oldFilePath, "HEAD"); + const right = type === "D" ? empty : vscode.Uri.file(path.join(repo, newFilePath)); + return Promise.resolve( + vscode.commands.executeCommand("vscode.diff", left, right, title, { preview: true }) + ).then( + () => true, + () => false + ); +} + export function registerMessageHandlers( bridge: WebviewBridge, deps: { @@ -73,6 +98,16 @@ export function registerMessageHandlers( let currentRepo: string | null = null; + function selectRepo(repo: string) { + if (repo === currentRepo) { + return; + } + currentRepo = repo; + gitClient.setRepo(repo); + extensionState.setLastActiveRepo(repo); + repoFileWatcher.start(repo); + } + function registerAction( command: T, handler: (msg: Extract) => Promise @@ -132,6 +167,13 @@ export function registerMessageHandlers( }); }); + bridge.onMessage("loadWorktrees", async (msg) => { + bridge.post({ + command: "loadWorktrees", + ...(await loadWorktrees(gitClient.getInstance(), msg.repo)) + }); + }); + bridge.onMessage("commitDetails", async (msg) => { bridge.post({ command: "commitDetails", @@ -145,13 +187,7 @@ export function registerMessageHandlers( // --- Infrastructure handlers --- bridge.onMessage("selectRepo", (msg) => { - if (msg.repo === currentRepo) { - return; - } - currentRepo = msg.repo; - gitClient.setRepo(msg.repo); - extensionState.setLastActiveRepo(msg.repo); - repoFileWatcher.start(msg.repo); + selectRepo(msg.repo); }); bridge.onMessage("loadRepos", async (msg) => { @@ -190,6 +226,7 @@ export function registerMessageHandlers( return { onPanelShown: () => { currentRepo = null; - } + }, + selectRepo }; } diff --git a/src/extension/repoManager.ts b/src/extension/repoManager.ts index 812d7bc6..399166c9 100644 --- a/src/extension/repoManager.ts +++ b/src/extension/repoManager.ts @@ -20,7 +20,7 @@ export function createRepoManager( config: Config ) { let repos = extensionState.getRepos(); - let viewCallback: ((repos: GitRepoSet, numRepos: number) => void) | null = null; + const viewCallbacks = new Set<(repos: GitRepoSet, numRepos: number) => void>(); function setRepos(repoDirs: string[]) { const next: GitRepoSet = {}; @@ -39,8 +39,8 @@ export function createRepoManager( const sorted = getRepos(); const numRepos = Object.keys(sorted).length; statusBarItem.setNumRepos(numRepos); - if (viewCallback !== null) { - viewCallback(sorted, numRepos); + for (const callback of viewCallbacks) { + callback(sorted, numRepos); } } @@ -50,11 +50,16 @@ export function createRepoManager( } function registerViewCallback(cb: (repos: GitRepoSet, numRepos: number) => void) { - viewCallback = cb; + viewCallbacks.add(cb); + return () => viewCallbacks.delete(cb); } - function deregisterViewCallback() { - viewCallback = null; + function deregisterViewCallback(cb?: (repos: GitRepoSet, numRepos: number) => void) { + if (cb) { + viewCallbacks.delete(cb); + } else { + viewCallbacks.clear(); + } } function isDirectoryWithinRepos(path: string) { diff --git a/src/extension/repoNavigator.ts b/src/extension/repoNavigator.ts new file mode 100644 index 00000000..b1a32691 --- /dev/null +++ b/src/extension/repoNavigator.ts @@ -0,0 +1,364 @@ +import * as path from "node:path"; + +import { simpleGit } from "simple-git"; +import * as vscode from "vscode"; + +import { evalPromises } from "@/backend/utils/promise"; +import { config } from "@/config"; +import { getRepositorySearchRoots } from "@/extension/repositorySearchRoots"; +import { ExtensionState } from "@/extensionState"; +import { RepositoryNavigatorMode } from "@/types"; + +import { RepoManager } from "./repoManager"; + +const VIEW_ID = "git-fleet.repositoryNavigator"; +const HIDE_CLEAN_CONTEXT = "gitFleet.hideCleanRepositories"; + +export type RepositorySummary = { + branch: string; + dirtyCount: number; + latestCommitAt: number; + latestCommitMessage: string; + name: string; + path: string; + worktreeCount: number; +}; + +export function filterRepositorySummaries( + summaries: RepositorySummary[], + hideCleanRepositories: boolean +): RepositorySummary[] { + return hideCleanRepositories ? summaries.filter((summary) => summary.dirtyCount > 0) : summaries; +} + +type RepositoryNode = { + kind: "repository"; + summary: RepositorySummary; +}; + +type FolderNode = { + children: NavigatorNode[]; + kind: "folder"; + label: string; +}; + +type NavigatorNode = FolderNode | RepositoryNode; + +type MutableFolder = FolderNode & { folders: Map }; + +const MODE_LABELS: Record = { + activity: "Recent activity", + dirty: "Dirty files", + tree: "Folder tree" +}; + +function formatAge(timestamp: number): string { + if (timestamp === 0) { + return "no commits"; + } + const elapsedMinutes = Math.max(0, Math.floor((Date.now() - timestamp) / 60_000)); + if (elapsedMinutes < 60) { + return elapsedMinutes <= 1 ? "now" : `${elapsedMinutes}m`; + } + const elapsedHours = Math.floor(elapsedMinutes / 60); + if (elapsedHours < 24) { + return `${elapsedHours}h`; + } + const elapsedDays = Math.floor(elapsedHours / 24); + if (elapsedDays < 30) { + return `${elapsedDays}d`; + } + return `${Math.floor(elapsedDays / 30)}mo`; +} + +async function loadRepositorySummary(repoPath: string): Promise { + const git = simpleGit({ + baseDir: repoPath, + binary: config.gitPath(), + maxConcurrentProcesses: 3, + trimmed: false + }); + + try { + const [status, log, worktreeOutput] = await Promise.all([ + git.status(), + git.log({ maxCount: 1 }), + git.raw(["worktree", "list", "--porcelain"]).catch(() => "") + ]); + const latest = log.latest; + const latestCommitAt = latest ? Date.parse(latest.date) : 0; + const worktreeCount = worktreeOutput + .split("\n") + .filter((line) => line.startsWith("worktree ")).length; + + return { + branch: status.current ?? "detached", + dirtyCount: status.files.length, + latestCommitAt: Number.isNaN(latestCommitAt) ? 0 : latestCommitAt, + latestCommitMessage: latest?.message ?? "No commits yet", + name: path.basename(repoPath), + path: repoPath, + worktreeCount: Math.max(1, worktreeCount) + }; + } catch { + return { + branch: "unavailable", + dirtyCount: 0, + latestCommitAt: 0, + latestCommitMessage: "Repository details could not be loaded", + name: path.basename(repoPath), + path: repoPath, + worktreeCount: 1 + }; + } +} + +function sortNodes(nodes: NavigatorNode[]): void { + nodes.sort((a, b) => { + if (a.kind !== b.kind) { + return a.kind === "folder" ? -1 : 1; + } + const aLabel = a.kind === "folder" ? a.label : a.summary.name; + const bLabel = b.kind === "folder" ? b.label : b.summary.name; + return aLabel.localeCompare(bLabel); + }); + for (const node of nodes) { + if (node.kind === "folder") { + sortNodes(node.children); + } + } +} + +function buildFolderTree(summaries: RepositorySummary[]): NavigatorNode[] { + const searchRoots = getRepositorySearchRoots(); + const root: MutableFolder = { children: [], folders: new Map(), kind: "folder", label: "" }; + + for (const summary of summaries) { + const containingRoot = searchRoots + .filter((rootPath) => { + const relative = path.relative(rootPath, summary.path); + return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative)); + }) + .toSorted((a, b) => b.length - a.length)[0]; + + const relativePath = containingRoot + ? path.relative(containingRoot, summary.path) + : summary.name; + const segments = (relativePath === "" ? [summary.name] : relativePath.split(path.sep)).filter( + Boolean + ); + if (searchRoots.length > 1 && containingRoot) { + segments.unshift(path.basename(containingRoot)); + } + + let parent = root; + for (const segment of segments.slice(0, -1)) { + let folder = parent.folders.get(segment); + if (!folder) { + folder = { children: [], folders: new Map(), kind: "folder", label: segment }; + parent.folders.set(segment, folder); + parent.children.push(folder); + } + parent = folder; + } + parent.children.push({ kind: "repository", summary }); + } + + sortNodes(root.children); + return root.children; +} + +class RepositoryNavigatorProvider implements vscode.TreeDataProvider { + private readonly changeEmitter = new vscode.EventEmitter(); + private loading: Promise | undefined; + private summaries: RepositorySummary[] | undefined; + + public readonly onDidChangeTreeData = this.changeEmitter.event; + + public constructor( + private readonly repoManager: RepoManager, + private readonly extensionState: ExtensionState + ) {} + + public get mode(): RepositoryNavigatorMode { + return this.extensionState.getRepositoryNavigatorMode(); + } + + public get hideCleanRepositories(): boolean { + return this.extensionState.getHideCleanRepositories(); + } + + public setMode(mode: RepositoryNavigatorMode): void { + this.extensionState.setRepositoryNavigatorMode(mode); + this.changeEmitter.fire(undefined); + } + + public setHideCleanRepositories(hidden: boolean): void { + this.extensionState.setHideCleanRepositories(hidden); + this.changeEmitter.fire(undefined); + } + + public refresh(): void { + this.loading = undefined; + this.summaries = undefined; + this.changeEmitter.fire(undefined); + } + + public getTreeItem(node: NavigatorNode): vscode.TreeItem { + if (node.kind === "folder") { + const item = new vscode.TreeItem(node.label, vscode.TreeItemCollapsibleState.Expanded); + item.iconPath = new vscode.ThemeIcon("folder"); + item.contextValue = "repositoryNavigator.folder"; + return item; + } + + const { summary } = node; + const item = new vscode.TreeItem(summary.name, vscode.TreeItemCollapsibleState.None); + const state = summary.dirtyCount === 0 ? "clean" : `${summary.dirtyCount} dirty`; + const worktrees = summary.worktreeCount > 1 ? ` · ${summary.worktreeCount} worktrees` : ""; + item.description = `${summary.branch} · ${state}${worktrees} · ${formatAge(summary.latestCommitAt)}`; + item.iconPath = + summary.dirtyCount === 0 + ? new vscode.ThemeIcon("repo") + : new vscode.ThemeIcon( + "circle-filled", + new vscode.ThemeColor("gitDecoration.modifiedResourceForeground") + ); + item.contextValue = "repositoryNavigator.repository"; + item.command = { + arguments: [summary.path], + command: "git-fleet.openRepositoryGraph", + title: "Open Repository Graph" + }; + const tooltip = new vscode.MarkdownString(); + tooltip.appendMarkdown(`**${summary.name}** \n`); + tooltip.appendText(`${summary.path}\n`); + tooltip.appendMarkdown(`\n${summary.latestCommitMessage} \n`); + tooltip.appendText( + `${summary.branch} · ${summary.dirtyCount} dirty files · ${summary.worktreeCount} worktrees` + ); + item.tooltip = tooltip; + return item; + } + + public async getChildren(node?: NavigatorNode): Promise { + if (node?.kind === "folder") { + return node.children; + } + if (node?.kind === "repository") { + return []; + } + + const summaries = filterRepositorySummaries( + await this.getSummaries(), + this.hideCleanRepositories + ); + if (this.mode === "tree") { + return buildFolderTree(summaries); + } + + const sorted = [...summaries]; + if (this.mode === "dirty") { + sorted.sort((a, b) => b.dirtyCount - a.dirtyCount || b.latestCommitAt - a.latestCommitAt); + } else { + sorted.sort((a, b) => b.latestCommitAt - a.latestCommitAt || a.name.localeCompare(b.name)); + } + return sorted.map((summary) => ({ kind: "repository", summary })); + } + + private getSummaries(): Promise { + if (this.summaries) { + return Promise.resolve(this.summaries); + } + this.loading ??= evalPromises( + Object.keys(this.repoManager.getRepos()), + 4, + loadRepositorySummary + ) + .then((summaries) => { + this.summaries = summaries; + return summaries; + }) + .finally(() => { + this.loading = undefined; + }); + return this.loading; + } +} + +export function registerRepositoryNavigator( + ctx: vscode.ExtensionContext, + repoManager: RepoManager, + extensionState: ExtensionState, + rescanRepositories: () => Promise = async () => {} +): void { + const provider = new RepositoryNavigatorProvider(repoManager, extensionState); + const treeView = vscode.window.createTreeView(VIEW_ID, { + showCollapseAll: true, + treeDataProvider: provider + }); + + const updateDescription = () => { + treeView.description = `${MODE_LABELS[provider.mode]}${provider.hideCleanRepositories ? " · Dirty only" : ""}`; + }; + updateDescription(); + void vscode.commands.executeCommand( + "setContext", + HIDE_CLEAN_CONTEXT, + provider.hideCleanRepositories + ); + + const setHideCleanRepositories = (hidden: boolean) => { + provider.setHideCleanRepositories(hidden); + updateDescription(); + void vscode.commands.executeCommand("setContext", HIDE_CLEAN_CONTEXT, hidden); + }; + + const deregisterRepoListener = repoManager.registerViewCallback(() => provider.refresh()); + ctx.subscriptions.push( + treeView, + { dispose: deregisterRepoListener }, + vscode.commands.registerCommand("git-fleet.refreshRepositoryNavigator", async () => { + await rescanRepositories(); + provider.refresh(); + }), + vscode.commands.registerCommand("git-fleet.changeRepositoryNavigatorMode", async () => { + const modes: Array<{ description: string; label: string; mode: RepositoryNavigatorMode }> = [ + { + description: "Newest commit first", + label: MODE_LABELS.activity, + mode: "activity" + }, + { + description: "Most uncommitted files first", + label: MODE_LABELS.dirty, + mode: "dirty" + }, + { + description: "Mirror folders below the workspace", + label: MODE_LABELS.tree, + mode: "tree" + } + ]; + const selection = await vscode.window.showQuickPick(modes, { + placeHolder: "Choose how repositories are arranged" + }); + if (selection) { + provider.setMode(selection.mode); + updateDescription(); + } + }), + vscode.commands.registerCommand("git-fleet.hideCleanRepositories", () => + setHideCleanRepositories(true) + ), + vscode.commands.registerCommand("git-fleet.showAllRepositories", () => + setHideCleanRepositories(false) + ), + vscode.workspace.onDidSaveTextDocument(() => provider.refresh()), + vscode.window.onDidChangeWindowState((state) => { + if (state.focused) { + provider.refresh(); + } + }) + ); +} diff --git a/src/extension/repositorySearchRoots.ts b/src/extension/repositorySearchRoots.ts new file mode 100644 index 00000000..87ed30fa --- /dev/null +++ b/src/extension/repositorySearchRoots.ts @@ -0,0 +1,56 @@ +import * as os from "node:os"; +import * as path from "node:path"; + +import * as vscode from "vscode"; + +import { config } from "@/config"; + +const SETTINGS_QUERY = "@ext:wgrant-dev.git-fleet repositorySearchRoots"; + +function normalizeRoot(root: string): string { + const expanded = + root === "~" + ? os.homedir() + : root.startsWith(`~${path.sep}`) + ? path.join(os.homedir(), root.slice(2)) + : root; + return path.resolve(expanded); +} + +export function getRepositorySearchRoots(): string[] { + const workspaceRoots = (vscode.workspace.workspaceFolders ?? []).map( + (folder) => folder.uri.fsPath + ); + return [...new Set([...workspaceRoots, ...config.repositorySearchRoots()].map(normalizeRoot))]; +} + +export function registerRepositorySearchRootCommands(ctx: vscode.ExtensionContext): void { + ctx.subscriptions.push( + vscode.commands.registerCommand("git-fleet.addRepositorySearchRoot", async () => { + const selected = await vscode.window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: true, + openLabel: "Watch for Git repositories", + title: "Add Git Fleet Search Root" + }); + if (!selected?.length) { + return; + } + + const roots = [ + ...new Set( + [...config.repositorySearchRoots(), ...selected.map((uri) => uri.fsPath)].map( + normalizeRoot + ) + ) + ]; + await vscode.workspace + .getConfiguration("git-fleet") + .update("repositorySearchRoots", roots, vscode.ConfigurationTarget.Global); + }), + vscode.commands.registerCommand("git-fleet.openRepositorySearchRootsSettings", () => + vscode.commands.executeCommand("workbench.action.openSettings", SETTINGS_QUERY) + ) + ); +} diff --git a/src/extension/utils/logger.ts b/src/extension/utils/logger.ts index 62a96de3..72a5c3ea 100644 --- a/src/extension/utils/logger.ts +++ b/src/extension/utils/logger.ts @@ -4,14 +4,14 @@ let _channel: vscode.OutputChannel | undefined; export const logger = { init: (ctx: vscode.ExtensionContext) => { - _channel = vscode.window.createOutputChannel("Neo Git Graph"); + _channel = vscode.window.createOutputChannel("Git Fleet"); ctx.subscriptions.push(_channel); }, log: (msg: string) => { if (!_channel) { // eslint-disable-next-line no-console - console.warn("[Neo Git Graph] log() called before initLogger()"); + console.warn("[Git Fleet] log() called before initLogger()"); return; } diff --git a/src/extension/watchForRepos.ts b/src/extension/watchForRepos.ts index 7101108d..41228500 100644 --- a/src/extension/watchForRepos.ts +++ b/src/extension/watchForRepos.ts @@ -5,6 +5,7 @@ import { config } from "@/config"; import { EXTENSION_NAME } from "@/extension/constant/const"; import type { InitExtension } from "@/extension/initExtension"; import { createMaxDepthTracker } from "@/extension/maxDepthTracker"; +import { getRepositorySearchRoots } from "@/extension/repositorySearchRoots"; import { StatusBarItem } from "@/statusBarItem"; type WatcherState = { @@ -29,7 +30,7 @@ async function check( if (state.disposed) { return; } - const paths = (vscode.workspace.workspaceFolders ?? []).map((f) => f.uri.fsPath); + const paths = getRepositorySearchRoots(); const repoDirs = await findGitRepos(paths, config.gitPath(), config.maxDepthOfRepoSearch()); if (repoDirs.length === 0 || state.disposed) { return; @@ -53,13 +54,15 @@ export function watchForRepos( check(ctx, state, onReposFound, statusBarItem) ), vscode.workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("neo-git-graph.maxDepthOfRepoSearch")) { + if (e.affectsConfiguration("git-fleet.repositorySearchRoots")) { + void check(ctx, state, onReposFound, statusBarItem); + } else if (e.affectsConfiguration("git-fleet.maxDepthOfRepoSearch")) { if (maxDepth.increased(config.maxDepthOfRepoSearch())) { void check(ctx, state, onReposFound, statusBarItem); } } }), - vscode.commands.registerCommand("neo-git-graph.view", async () => { + vscode.commands.registerCommand("git-fleet.view", async () => { await vscode.window.showErrorMessage(EXTENSION_NAME, { detail: vscode.l10n.t( "Either the current workspace does not contain a Git repository, or the Git repository is not configured correctly." @@ -67,7 +70,7 @@ export function watchForRepos( modal: true }); }), - vscode.commands.registerCommand("neo-git-graph.clearAvatarCache", async () => { + vscode.commands.registerCommand("git-fleet.clearAvatarCache", async () => { await vscode.window.showErrorMessage(EXTENSION_NAME, { detail: vscode.l10n.t( "Either the current workspace does not contain a Git repository, or the Git repository is not configured correctly." diff --git a/src/extension/webviewHtml.ts b/src/extension/webviewHtml.ts index 694b3869..874ff308 100644 --- a/src/extension/webviewHtml.ts +++ b/src/extension/webviewHtml.ts @@ -71,6 +71,11 @@ export function buildWebviewHtml(opts: {

+ +
    @@ -82,7 +87,7 @@ export function buildWebviewHtml(opts: { `; } else { body = ` -

    ${vscode.l10n.t("Unable to load Git Graph")}

    +

    ${vscode.l10n.t("Unable to load Git Fleet")}

    ${vscode.l10n.t("Either the current workspace does not contain a Git repository, or the Git repository is not configured correctly.")}

    ${vscode.l10n.t('If you are using a portable Git installation, make sure you have set the Visual Studio Code Setting "git.path" to the path of your portable installation (e.g. "C:\\Program Files\\Git\\bin\\git.exe" on Windows).')}

    `; diff --git a/src/extension/webviewPanel.ts b/src/extension/webviewPanel.ts index cc92c917..6668bde6 100644 --- a/src/extension/webviewPanel.ts +++ b/src/extension/webviewPanel.ts @@ -39,6 +39,7 @@ export function createWebviewPanel(opts: { const disposables: vscode.Disposable[] = []; let isGraphViewLoaded = false; let isPanelVisible = true; + let deregisterRepoListener: (() => boolean) | undefined; panel.iconPath = config.tabIconColourTheme() === "colour" @@ -65,7 +66,7 @@ export function createWebviewPanel(opts: { panel.dispose(); avatarManager.deregisterBridge(); repoFileWatcher.stop(); - repoManager.deregisterViewCallback(); + deregisterRepoListener?.(); while (disposables.length) { const x = disposables.pop(); if (x) { @@ -92,25 +93,30 @@ export function createWebviewPanel(opts: { disposables ); - repoManager.registerViewCallback((repos: GitRepoSet, numRepos: number) => { - if (!panel.visible) { - return; - } - if ((numRepos === 0 && isGraphViewLoaded) || (numRepos > 0 && !isGraphViewLoaded)) { - update(); - } else { - bridge.post({ - command: "loadRepos", - repos, - lastActiveRepo: extensionState.getLastActiveRepo() - }); + deregisterRepoListener = repoManager.registerViewCallback( + (repos: GitRepoSet, numRepos: number) => { + if (!panel.visible) { + return; + } + if ((numRepos === 0 && isGraphViewLoaded) || (numRepos > 0 && !isGraphViewLoaded)) { + update(); + } else { + bridge.post({ + command: "loadRepos", + repos, + lastActiveRepo: extensionState.getLastActiveRepo() + }); + } } - }); + ); return { reveal(column?: vscode.ViewColumn) { panel.reveal(column); }, + selectRepo(repo: string) { + bridge.post({ command: "selectRepo", repo }); + }, dispose }; } diff --git a/src/extensionState.ts b/src/extensionState.ts index 6a0ffbc7..4d66f274 100644 --- a/src/extensionState.ts +++ b/src/extensionState.ts @@ -3,12 +3,14 @@ import * as fs from "node:fs"; import { ExtensionContext, Memento } from "vscode"; import { getPathFromStr } from "./backend/utils/path"; -import { Avatar, AvatarCache, GitRepoSet } from "./types"; +import { Avatar, AvatarCache, GitRepoSet, RepositoryNavigatorMode } from "./types"; const AVATAR_STORAGE_FOLDER = "/avatars"; const AVATAR_CACHE = "avatarCache"; const LAST_ACTIVE_REPO = "lastActiveRepo"; const REPO_STATES = "repoStates"; +const REPOSITORY_NAVIGATOR_MODE = "repositoryNavigatorMode"; +const HIDE_CLEAN_REPOSITORIES = "hideCleanRepositories"; export class ExtensionState { private globalState: Memento; @@ -52,6 +54,20 @@ export class ExtensionState { this.workspaceState.update(LAST_ACTIVE_REPO, repo); } + /* Repository Navigator */ + public getRepositoryNavigatorMode() { + return this.workspaceState.get(REPOSITORY_NAVIGATOR_MODE, "activity"); + } + public setRepositoryNavigatorMode(mode: RepositoryNavigatorMode) { + this.workspaceState.update(REPOSITORY_NAVIGATOR_MODE, mode); + } + public getHideCleanRepositories() { + return this.workspaceState.get(HIDE_CLEAN_REPOSITORIES, false); + } + public setHideCleanRepositories(hidden: boolean) { + this.workspaceState.update(HIDE_CLEAN_REPOSITORIES, hidden); + } + /* Avatars */ public isAvatarStorageAvailable() { return this.avatarStorageAvailable; diff --git a/src/statusBarItem.ts b/src/statusBarItem.ts index 64bd5733..a78140a0 100644 --- a/src/statusBarItem.ts +++ b/src/statusBarItem.ts @@ -13,7 +13,7 @@ export class StatusBarItem { this.config = config; this.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 1); this.statusBarItem.name = EXTENSION_NAME; - this.statusBarItem.command = "neo-git-graph.view"; + this.statusBarItem.command = "git-fleet.view"; context.subscriptions.push(this.statusBarItem); logger.log( `StatusBarItem created (showStatusBarItem=${config.showStatusBarItem()}, numRepos=0)` @@ -35,7 +35,7 @@ export class StatusBarItem { this.statusBarItem.tooltip = vscode.l10n.t("No Git repository found — watching for one"); } else { this.statusBarItem.text = `$(type-hierarchy) ${EXTENSION_NAME}`; - this.statusBarItem.tooltip = vscode.l10n.t("View Git Graph"); + this.statusBarItem.tooltip = vscode.l10n.t("Open Git Fleet"); } this.statusBarItem.show(); } else { diff --git a/src/types.ts b/src/types.ts index 370fb518..4a9fd220 100644 --- a/src/types.ts +++ b/src/types.ts @@ -35,6 +35,7 @@ export type AvatarCache = { [email: string]: Avatar }; export type DateFormat = "Date & Time" | "Date Only" | "Relative"; export type GraphStyle = "rounded" | "angular"; +export type RepositoryNavigatorMode = "activity" | "dirty" | "tree"; /* Infrastructure Request / Response Messages */ @@ -116,4 +117,5 @@ export type ResponseMessage = | ResponseLoadRepos | ResponseCopyToClipboard | ResponseViewDiff + | RequestSelectRepo | ResponseRefresh; diff --git a/src/webview/global.d.ts b/src/webview/global.d.ts index 03f3d209..31b95586 100644 --- a/src/webview/global.d.ts +++ b/src/webview/global.d.ts @@ -1,4 +1,4 @@ -import type { GitCommitDetails, GitCommitNode } from "@/backend/types"; +import type { GitCommitDetails, GitCommitNode, GitWorktree } from "@/backend/types"; import * as GG from "@/types"; declare global { @@ -114,6 +114,8 @@ declare global { maxCommits: number; showRemoteBranches: boolean; expandedCommit: ExpandedCommit | null; + worktrees?: GitWorktree[]; + worktreeBaselineRef?: string | null; } } diff --git a/src/webview/graph.ts b/src/webview/graph.ts index be4d42a7..b95e0f14 100644 --- a/src/webview/graph.ts +++ b/src/webview/graph.ts @@ -442,6 +442,20 @@ export class Graph { return this.vertices[v].getColour() % this.config.graphColours.length; } + public getVertexPoint(v: number, expandedCommit: ExpandedCommit | null): Pixel | null { + if (v < 0 || v >= this.vertices.length) { + return null; + } + const point = this.vertices[v].getPoint(); + return { + x: point.x * this.config.grid.x + this.config.grid.offsetX, + y: + point.y * this.config.grid.y + + this.config.grid.offsetY + + (expandedCommit !== null && v > expandedCommit.id ? this.config.grid.expandY : 0) + }; + } + public limitMaxWidth(maxWidth: number) { this.maxWidth = maxWidth; this.applyMaxWidth(this.getWidth()); diff --git a/src/webview/main.ts b/src/webview/main.ts index 7ecb5e5f..34fb54b6 100644 --- a/src/webview/main.ts +++ b/src/webview/main.ts @@ -4,6 +4,7 @@ import type { GitCommitNode, GitFileChange, GitFileChangeType, + GitWorktree, GitResetMode } from "@/backend/types"; @@ -26,6 +27,9 @@ class GitGraphView { private avatars: AvatarImageCollection = {}; private currentBranch: string | null = null; private currentRepo!: string; + private worktrees: GitWorktree[] = []; + private worktreeBaselineRef: string | null = null; + private activeWorktree: { worktree: GitWorktree; item: HTMLElement } | null = null; private graph: Graph; private config: Config; @@ -58,6 +62,8 @@ class GitGraphView { this.footerElem = document.getElementById("footer")!; this.repoDropdown = new Dropdown("repoSelect", true, l10n.repo, (value) => { this.currentRepo = value; + this.worktrees = []; + this.worktreeBaselineRef = null; this.maxCommits = this.config.initialLoadCommits; this.expandedCommit = null; this.currentBranch = null; @@ -99,6 +105,8 @@ class GitGraphView { this.maxCommits = prevState.maxCommits; this.expandedCommit = prevState.expandedCommit; this.avatars = prevState.avatars; + this.worktrees = prevState.worktrees ?? []; + this.worktreeBaselineRef = prevState.worktreeBaselineRef ?? null; this.loadBranches(prevState.gitBranches, prevState.gitBranchHead, true, true); this.loadCommits( prevState.commits, @@ -112,6 +120,13 @@ class GitGraphView { this.requestLoadBranchesAndCommits(false); } + public loadWorktrees(worktrees: GitWorktree[], baselineRef: string | null) { + this.worktrees = worktrees; + this.worktreeBaselineRef = baselineRef; + this.saveState(); + this.renderWorktrees(); + } + /* Loading Data */ public loadRepos(repos: GG.GitRepoSet, lastActiveRepo: string | null) { this.gitRepos = repos; @@ -144,6 +159,21 @@ class GitGraphView { } } + public selectRepo(repo: string) { + if (repo === this.currentRepo || typeof this.gitRepos[repo] === "undefined") { + return; + } + this.currentRepo = repo; + this.worktrees = []; + this.worktreeBaselineRef = null; + this.maxCommits = this.config.initialLoadCommits; + this.expandedCommit = null; + this.currentBranch = null; + this.saveState(); + this.loadRepos(this.gitRepos, repo); + this.refresh(true); + } + public loadBranches( branchOptions: string[], branchHead: string | null, @@ -320,6 +350,7 @@ class GitGraphView { return; } this.loadCommitsCallback = loadedCallback; + sendMessage({ command: "loadWorktrees", repo: this.currentRepo! }); sendMessage({ command: "loadCommits", repo: this.currentRepo!, @@ -368,7 +399,9 @@ class GitGraphView { moreCommitsAvailable: this.moreCommitsAvailable, maxCommits: this.maxCommits, showRemoteBranches: this.showRemoteBranches, - expandedCommit: this.expandedCommit + expandedCommit: this.expandedCommit, + worktrees: this.worktrees, + worktreeBaselineRef: this.worktreeBaselineRef }); } @@ -376,6 +409,7 @@ class GitGraphView { private render() { this.renderTable(); this.renderGraph(); + this.renderWorktrees(); } private renderGraph() { let colHeadersElem = document.getElementById("tableColHeaders"); @@ -398,6 +432,7 @@ class GitGraphView { : this.config.grid.y; this.config.grid.offsetY = headerHeight + this.config.grid.y / 2; this.graph.render(this.expandedCommit); + this.redrawActiveWorktree(); } private renderTable() { let html = `${l10n.graph}${l10n.description}${l10n.date}${l10n.author}${l10n.commit}`, @@ -429,13 +464,12 @@ class GitGraphView { } html += "e, [ @@ -1099,9 +1137,196 @@ class GitGraphView { active = window.scrollY > 0; this.scrollShadowElem.className = active ? "active" : ""; } + this.redrawActiveWorktree(); }); } + private renderWorktrees() { + const rail = document.getElementById("worktreeRail")!; + const header = document.getElementById("worktreeHeader")!; + const list = document.getElementById("worktreeList")!; + this.clearWorktreeConnections(); + if (this.worktrees.length === 0) { + rail.hidden = true; + document.body.classList.remove("worktreesVisible"); + header.innerHTML = ""; + list.innerHTML = ""; + return; + } + + rail.hidden = false; + document.body.classList.add("worktreesVisible"); + header.innerHTML = + '
    ' + + escapeHtml(l10n.worktrees) + + "" + + this.worktrees.length + + '
    ' + + escapeHtml(l10n.worktreeHelp) + + "
    "; + list.innerHTML = ""; + + for (const worktree of this.worktrees) { + const item = document.createElement("button"); + item.className = "worktreeItem"; + const dirty = worktree.dirtyCount !== null && worktree.dirtyCount > 0; + const statusClass = worktree.prunable !== null ? "prunable" : dirty ? "dirty" : ""; + const statusText = + worktree.prunable !== null + ? l10n.worktreePrunable + : dirty + ? l10n.worktreeChanged.replace("{0}", String(worktree.dirtyCount)) + : l10n.worktreeClean; + const divergence = + worktree.ahead === null || worktree.behind === null + ? l10n.worktreeOutsideHistory + : l10n.worktreeDivergence + .replace("{0}", String(worktree.ahead)) + .replace("{1}", String(worktree.behind)); + const pathParts = worktree.path.replace(/\\/g, "/").split("/"); + const shortPath = pathParts[pathParts.length - 1] || worktree.path; + item.innerHTML = + '' + + escapeHtml(worktree.branch) + + "" + + (worktree.current + ? '' + escapeHtml(l10n.worktreeCurrent) + "" + : "") + + '' + + escapeHtml(worktree.head.substring(0, 8)) + + '' + + escapeHtml(shortPath) + + '' + + escapeHtml(statusText) + + "" + + escapeHtml(divergence) + + "" + + (worktree.locked !== null ? "" + escapeHtml(l10n.worktreeLocked) + "" : "") + + (worktree.baseSha !== null + ? '' + + escapeHtml(l10n.worktreeBase.replace("{0}", worktree.baseSha.substring(0, 8))) + + "" + : "") + + ""; + item.addEventListener("mouseenter", () => this.drawWorktreeConnections(worktree, item)); + item.addEventListener("focus", () => this.drawWorktreeConnections(worktree, item)); + item.addEventListener("mouseleave", () => this.clearWorktreeConnections()); + item.addEventListener("blur", () => this.clearWorktreeConnections()); + item.addEventListener("click", () => { + const row = this.findCommitRow(worktree.head); + row?.scrollIntoView({ block: "center", behavior: "smooth" }); + window.setTimeout(() => this.drawWorktreeConnections(worktree, item), 280); + }); + list.appendChild(item); + } + } + + private findCommitRow(hash: string): HTMLElement | null { + const rows = this.tableElem.getElementsByTagName("tr"); + for (let i = 0; i < rows.length; i++) { + if (rows[i].dataset.hash === hash) { + return rows[i]; + } + } + return null; + } + + private clearWorktreeConnections() { + this.activeWorktree?.item.classList.remove("active"); + this.activeWorktree = null; + document.getElementById("worktreeConnectorOverlay")?.replaceChildren(); + this.tableElem + .querySelectorAll(".worktreeHead,.worktreeBase") + .forEach((row) => row.classList.remove("worktreeHead", "worktreeBase")); + } + + private redrawActiveWorktree() { + if (this.activeWorktree !== null) { + this.drawWorktreeConnections(this.activeWorktree.worktree, this.activeWorktree.item); + } + } + + private drawWorktreeConnections(worktree: GitWorktree, item: HTMLElement) { + const overlay = document.getElementById("worktreeConnectorOverlay")!; + this.tableElem + .querySelectorAll(".worktreeHead,.worktreeBase") + .forEach((row) => row.classList.remove("worktreeHead", "worktreeBase")); + this.activeWorktree?.item.classList.remove("active"); + this.activeWorktree = { worktree, item }; + item.classList.add("active"); + + const sourceRect = item.getBoundingClientRect(); + const source = { x: sourceRect.left - 4, y: sourceRect.top + sourceRect.height / 2 }; + const head = this.worktreeRoute(worktree.head); + const base = + worktree.baseSha !== null && worktree.baseSha !== worktree.head + ? this.worktreeRoute(worktree.baseSha) + : null; + const paths: string[] = []; + if (base !== null) { + paths.push( + this.worktreeConnectorPath({ x: source.x, y: source.y + 3 }, base.point, "baseLink") + ); + paths.push(this.worktreeEndpoint(base, "base")); + this.findCommitRow(worktree.baseSha!)?.classList.add("worktreeBase"); + } + paths.push( + this.worktreeConnectorPath({ x: source.x, y: source.y - 3 }, head.point, "headLink") + ); + paths.push(this.worktreeEndpoint(head, "head")); + this.findCommitRow(worktree.head)?.classList.add("worktreeHead"); + overlay.innerHTML = paths.join(""); + } + + private worktreeRoute(hash: string): { point: Pixel; edge: "up" | "down" | null } { + const graphRect = document.getElementById("commitGraph")!.getBoundingClientRect(); + const headerRect = document.getElementById("tableColHeaders")?.getBoundingClientRect(); + const controlsRect = document.getElementById("controls")!.getBoundingClientRect(); + const top = Math.max(controlsRect.bottom, headerRect?.bottom ?? controlsRect.bottom) + 1; + const bottom = window.innerHeight - 8; + const index = this.commitLookup[hash]; + const vertex = + typeof index === "number" ? this.graph.getVertexPoint(index, this.expandedCommit) : null; + if (vertex === null) { + return { point: { x: graphRect.left + this.config.grid.offsetX, y: bottom }, edge: "down" }; + } + const actual = { x: graphRect.left + vertex.x, y: graphRect.top + vertex.y }; + if (actual.y < top) { + return { point: { x: actual.x, y: top }, edge: "up" }; + } + if (actual.y > bottom) { + return { point: { x: actual.x, y: bottom }, edge: "down" }; + } + return { point: actual, edge: null }; + } + + private worktreeConnectorPath(source: Pixel, target: Pixel, className: string) { + const direction = target.x >= source.x ? 1 : -1; + const bend = Math.max(52, Math.min(180, Math.abs(source.x - target.x) * 0.33)); + return ``; + } + + private worktreeEndpoint( + route: { point: Pixel; edge: "up" | "down" | null }, + type: "head" | "base" + ) { + if (route.edge === null) { + return ``; + } + const { x, y } = route.point; + const arrow = + route.edge === "up" + ? `M ${x - 5} ${y + 7} L ${x} ${y} L ${x + 5} ${y + 7} Z` + : `M ${x - 5} ${y - 7} L ${x} ${y} L ${x + 5} ${y - 7} Z`; + return ``; + } + /* Commit Details */ private loadCommitDetails(sourceElem: HTMLElement) { this.hideCommitDetails(); @@ -1153,32 +1378,42 @@ class GitGraphView { let newElem = document.createElement("tr"), html = '
    "; + } else { html += - ''; + ''; + html += detailRowHtml(l10n.detailCommit, escapeHtml(commitDetails.hash)) + "
    "; + html += detailRowHtml(l10n.detailParents, commitDetails.parents.join(", ")) + "
    "; + html += + detailRowHtml( + l10n.detailAuthor, + escapeHtml(commitDetails.author) + + ' <' + + escapeHtml(commitDetails.email) + + ">" + ) + "
    "; + html += + detailRowHtml(l10n.detailDate, new Date(commitDetails.date * 1000).toString()) + "
    "; + html += detailRowHtml(l10n.detailCommitter, escapeHtml(commitDetails.committer)) + "
    "; + if (typeof this.avatars[commitDetails.email] === "string") { + html += + ''; + } + html += "


    "; + html += escapeHtml(commitDetails.body).replace(/\n/g, "
    ") + ""; } - html += "

    "; - html += escapeHtml(commitDetails.body).replace(/\n/g, "
    ") + ""; html += '
    ' + generateGitFileTreeHtml(fileTree, commitDetails.fileChanges) + @@ -1187,6 +1422,9 @@ class GitGraphView { html += ""; newElem.id = "commitDetails"; + if (commitDetails.hash === "*") { + newElem.className = "workingTreeDetails"; + } newElem.innerHTML = html; insertAfter(newElem, this.expandedCommit.srcElem); @@ -1325,9 +1563,15 @@ window.addEventListener("message", (event) => { case "loadCommits": gitGraph.loadCommits(msg.commits, msg.head, msg.moreCommitsAvailable, msg.hard); break; + case "loadWorktrees": + gitGraph.loadWorktrees(msg.worktrees, msg.baselineRef); + break; case "loadRepos": gitGraph.loadRepos(msg.repos, msg.lastActiveRepo); break; + case "selectRepo": + gitGraph.selectRepo(msg.repo); + break; case "mergeBranch": refreshGraphOrDisplayError(msg.status, l10n.unableToMergeBranch); break; diff --git a/tests-ext/extension.test.ts b/tests-ext/extension.test.ts index f425941f..702fb166 100644 --- a/tests-ext/extension.test.ts +++ b/tests-ext/extension.test.ts @@ -3,13 +3,11 @@ import * as assert from "node:assert"; import * as vscode from "vscode"; function isPanelOpen() { - return vscode.window.tabGroups.all - .flatMap((g) => g.tabs) - .some((t) => t.label === "(neo) Git Graph"); + return vscode.window.tabGroups.all.flatMap((g) => g.tabs).some((t) => t.label === "Git Fleet"); } async function openPanel() { - await vscode.commands.executeCommand("neo-git-graph.view"); + await vscode.commands.executeCommand("git-fleet.view"); const deadline = Date.now() + 2000; while (!isPanelOpen() && Date.now() < deadline) { await new Promise((r) => setTimeout(r, 50)); // eslint-disable-line no-await-in-loop @@ -18,7 +16,7 @@ async function openPanel() { suite("GitGraphPanel", () => { suiteSetup(async () => { - const ext = vscode.extensions.getExtension("asispts.neo-git-graph"); + const ext = vscode.extensions.getExtension("asispts.git-fleet"); await ext?.activate(); }); @@ -41,7 +39,7 @@ suite("GitGraphPanel", () => { assert.ok(isPanelOpen()); const tabsBefore = vscode.window.tabGroups.all.flatMap((g) => g.tabs).length; - await vscode.commands.executeCommand("neo-git-graph.view"); + await vscode.commands.executeCommand("git-fleet.view"); await new Promise((r) => setTimeout(r, 300)); const tabsAfter = vscode.window.tabGroups.all.flatMap((g) => g.tabs).length; diff --git a/tests/backend/queries/commitDetails/get.test.ts b/tests/backend/queries/commitDetails/get.test.ts index 758a39e1..f2270347 100644 --- a/tests/backend/queries/commitDetails/get.test.ts +++ b/tests/backend/queries/commitDetails/get.test.ts @@ -99,4 +99,26 @@ describe("commitDetails", () => { const result = await commitDetails(simpleGit(repo), { commitHash, dateType: "Author Date" }); expect(result.commitDetails!.body).toContain("init"); }); + + it("returns working-tree details for the uncommitted pseudo commit", async () => { + const dirtyRepo = makeRepo(); + try { + fs.writeFileSync(path.join(dirtyRepo, "f"), "changed"); + fs.writeFileSync(path.join(dirtyRepo, "new-file"), "new"); + const result = await commitDetails(simpleGit(dirtyRepo), { + commitHash: "*", + dateType: "Author Date" + }); + expect(result.commitDetails).toMatchObject({ + hash: "*", + parents: [expect.any(String)], + fileChanges: expect.arrayContaining([ + expect.objectContaining({ newFilePath: "f", type: "M" }), + expect.objectContaining({ newFilePath: "new-file", type: "A" }) + ]) + }); + } finally { + fs.rmSync(dirtyRepo, { recursive: true, force: true }); + } + }); }); diff --git a/tests/backend/queries/loadWorktrees.test.ts b/tests/backend/queries/loadWorktrees.test.ts new file mode 100644 index 00000000..1aaf58ff --- /dev/null +++ b/tests/backend/queries/loadWorktrees.test.ts @@ -0,0 +1,51 @@ +import * as fs from "node:fs"; +import * as os from "node:os"; +import * as path from "node:path"; + +import { simpleGit } from "simple-git"; +import { afterEach, describe, expect, it } from "vitest"; + +import { loadWorktrees } from "@/backend/queries/loadWorktrees"; + +import { git, makeRepo } from "@tests/backend/helpers"; + +const cleanup: string[] = []; + +afterEach(() => { + for (const directory of cleanup.splice(0)) { + fs.rmSync(directory, { recursive: true, force: true }); + } +}); + +describe("loadWorktrees", () => { + it("returns the main checkout and linked worktrees with inferred history points", async () => { + const repo = makeRepo(); + const worktreeParent = fs.mkdtempSync(path.join(os.tmpdir(), "ngg-worktree-test-")); + const linked = path.join(worktreeParent, "feature-checkout"); + cleanup.push(worktreeParent, repo); + git(["worktree", "add", "-b", "feature/test", linked], repo); + fs.writeFileSync(path.join(linked, "dirty-file"), "dirty"); + + const result = await loadWorktrees(simpleGit(repo), repo); + + expect(result.baselineRef).toBe("main"); + expect(result.worktrees).toHaveLength(2); + expect(result.worktrees).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + branch: "main", + current: true, + baseSha: expect.any(String) + }), + expect.objectContaining({ + branch: "feature/test", + current: false, + dirtyCount: 1, + baseSha: expect.any(String), + ahead: 0, + behind: 0 + }) + ]) + ); + }); +}); diff --git a/tests/backend/utils/repoSearch.test.ts b/tests/backend/utils/repoSearch.test.ts index b364db8d..c3b83b6c 100644 --- a/tests/backend/utils/repoSearch.test.ts +++ b/tests/backend/utils/repoSearch.test.ts @@ -19,6 +19,7 @@ let tmpDir: string; let repoA: string; let repoB: string; let nonRepoDir: string; +let dependencyRepo: string; function initRepo(dir: string) { fs.mkdirSync(dir, { recursive: true }); @@ -41,9 +42,11 @@ beforeAll(() => { repoA = path.join(tmpDir, "repo-a"); repoB = path.join(tmpDir, "nested", "repo-b"); nonRepoDir = path.join(tmpDir, "not-a-repo"); + dependencyRepo = path.join(tmpDir, "node_modules", "dependency-repo"); initRepo(repoA); initRepo(repoB); + initRepo(dependencyRepo); fs.mkdirSync(nonRepoDir); fs.writeFileSync(path.join(nonRepoDir, "readme.txt"), "hello"); fs.mkdirSync(path.join(tmpDir, "plain")); @@ -104,4 +107,9 @@ describe("searchDirectoryForRepos", () => { const result = await searchDirectoryForRepos(tmpDir, 2, "git", []); expect(result.every((r) => !r.includes("/.git"))).toBe(true); }); + + it("skips dependency and build-cache directories", async () => { + const result = await searchDirectoryForRepos(tmpDir, 3, "git", []); + expect(result).not.toContain(dependencyRepo); + }); }); diff --git a/tests/extension/manifest.test.ts b/tests/extension/manifest.test.ts new file mode 100644 index 00000000..60f66383 --- /dev/null +++ b/tests/extension/manifest.test.ts @@ -0,0 +1,23 @@ +import * as fs from "node:fs"; + +import { describe, expect, it } from "vitest"; + +type ExtensionManifest = { + contributes: { + viewsContainers: { activitybar: { id: string }[] }; + views: Record; + }; +}; + +const manifest = JSON.parse( + fs.readFileSync(new URL("../../package.json", import.meta.url), "utf8") +) as ExtensionManifest; + +describe("extension manifest", () => { + it("uses VS Code-compatible Activity Bar container IDs", () => { + for (const container of manifest.contributes.viewsContainers.activitybar) { + expect(container.id).toMatch(/^[A-Za-z0-9_-]+$/); + expect(manifest.contributes.views).toHaveProperty(container.id); + } + }); +}); diff --git a/tests/extension/repoNavigator.test.ts b/tests/extension/repoNavigator.test.ts new file mode 100644 index 00000000..76781ae8 --- /dev/null +++ b/tests/extension/repoNavigator.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, it, vi } from "vitest"; + +import { filterRepositorySummaries, RepositorySummary } from "@/extension/repoNavigator"; + +vi.mock("vscode", () => ({ + workspace: { + getConfiguration: () => ({ get: (_key: string, defaultValue: unknown) => defaultValue }) + } +})); + +function summary(name: string, dirtyCount: number): RepositorySummary { + return { + branch: "main", + dirtyCount, + latestCommitAt: 0, + latestCommitMessage: "Test commit", + name, + path: `/repos/${name}`, + worktreeCount: 1 + }; +} + +describe("filterRepositorySummaries", () => { + const repositories = [summary("clean", 0), summary("dirty", 3)]; + + it("returns every repository when the filter is disabled", () => { + expect(filterRepositorySummaries(repositories, false)).toEqual(repositories); + }); + + it("hides repositories without uncommitted changes", () => { + expect(filterRepositorySummaries(repositories, true)).toEqual([repositories[1]]); + }); +}); diff --git a/tests/extension/repositorySearchRoots.test.ts b/tests/extension/repositorySearchRoots.test.ts new file mode 100644 index 00000000..03d52a79 --- /dev/null +++ b/tests/extension/repositorySearchRoots.test.ts @@ -0,0 +1,81 @@ +import * as path from "node:path"; + +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { + getRepositorySearchRoots, + registerRepositorySearchRootCommands +} from "@/extension/repositorySearchRoots"; + +const mock = vi.hoisted(() => { + let configuredRoots: string[] = []; + let workspaceRoots: string[] = []; + const commands = new Map unknown>(); + const update = vi.fn(); + + return { + ConfigurationTarget: { Global: 1 }, + Uri: { file: (fsPath: string) => ({ fsPath }) }, + commands: { + executeCommand: vi.fn(), + registerCommand: (id: string, command: (...args: unknown[]) => unknown) => { + commands.set(id, command); + return { dispose: vi.fn() }; + } + }, + workspace: { + get workspaceFolders() { + return workspaceRoots.map((fsPath) => ({ uri: { fsPath } })); + }, + getConfiguration: () => ({ + get: (key: string, defaultValue: unknown) => + key === "repositorySearchRoots" ? configuredRoots : defaultValue, + update + }) + }, + window: { showOpenDialog: vi.fn() }, + setConfiguredRoots(roots: string[]) { + configuredRoots = roots; + }, + setWorkspaceRoots(roots: string[]) { + workspaceRoots = roots; + }, + invoke(id: string) { + return commands.get(id)?.(); + }, + update + }; +}); + +vi.mock("vscode", () => mock); + +beforeEach(() => { + vi.clearAllMocks(); + mock.setConfiguredRoots([]); + mock.setWorkspaceRoots([]); +}); + +describe("repository search roots", () => { + it("combines workspace and configured roots without duplicates", () => { + const root = path.resolve("/repos"); + mock.setWorkspaceRoots([root]); + mock.setConfiguredRoots([root, "/archive"]); + + expect(getRepositorySearchRoots()).toEqual([root, path.resolve("/archive")]); + }); + + it("stores folders selected through the add-root command globally", async () => { + const ctx = { subscriptions: [] } as unknown as import("vscode").ExtensionContext; + mock.setConfiguredRoots(["/repos"]); + mock.window.showOpenDialog.mockResolvedValue([{ fsPath: "/archive" }]); + registerRepositorySearchRootCommands(ctx); + + await mock.invoke("git-fleet.addRepositorySearchRoot"); + + expect(mock.update).toHaveBeenCalledWith( + "repositorySearchRoots", + [path.resolve("/repos"), path.resolve("/archive")], + mock.ConfigurationTarget.Global + ); + }); +}); diff --git a/tests/extension/watchForRepos.test.ts b/tests/extension/watchForRepos.test.ts index fa72d5c8..15965b05 100644 --- a/tests/extension/watchForRepos.test.ts +++ b/tests/extension/watchForRepos.test.ts @@ -17,6 +17,7 @@ import { makeRepo } from "@tests/backend/helpers"; const mock = vi.hoisted(() => { let folders: Array<{ uri: { fsPath: string } }> = []; let maxDepthVal = 0; + let repositorySearchRoots: string[] = []; let onCreateCb: (() => void) | undefined; let onFolderChangeCb: (() => void) | undefined; @@ -31,9 +32,12 @@ const mock = vi.hoisted(() => { }, getConfiguration: (section: string) => ({ get: (key: string, def: unknown) => { - if (section === "neo-git-graph" && key === "maxDepthOfRepoSearch") { + if (section === "git-fleet" && key === "maxDepthOfRepoSearch") { return maxDepthVal; } + if (section === "git-fleet" && key === "repositorySearchRoots") { + return repositorySearchRoots; + } if (section === "git" && key === "path") { return null; // falls back to "git" } @@ -72,6 +76,9 @@ const mock = vi.hoisted(() => { setMaxDepth(d: number) { maxDepthVal = d; }, + setRepositorySearchRoots(paths: string[]) { + repositorySearchRoots = paths; + }, fireCreate() { onCreateCb?.(); }, @@ -119,6 +126,7 @@ beforeEach(() => { vi.clearAllMocks(); mock.setFolders([]); mock.setMaxDepth(0); + mock.setRepositorySearchRoots([]); onReposFound = vi.fn(); mockStatusBarItem = { refresh: vi.fn(), @@ -182,7 +190,7 @@ describe("watchForRepos", () => { mock.setMaxDepth(0); // same as the tracker's current value → maxDepthIncreased() = false watcher = watchForRepos(ctx, onReposFound, mockStatusBarItem); - mock.fireConfigChange("neo-git-graph.maxDepthOfRepoSearch"); + mock.fireConfigChange("git-fleet.maxDepthOfRepoSearch"); expect(onReposFound).not.toHaveBeenCalled(); }); @@ -192,7 +200,16 @@ describe("watchForRepos", () => { watcher = watchForRepos(ctx, onReposFound, mockStatusBarItem); // tracker initializes at 0 mock.setMaxDepth(5); // increase after tracker is created - mock.fireConfigChange("neo-git-graph.maxDepthOfRepoSearch"); + mock.fireConfigChange("git-fleet.maxDepthOfRepoSearch"); + + await vi.waitFor(() => expect(onReposFound).toHaveBeenCalledOnce()); + }); + + it("calls onReposFound when a configured search root is added", async () => { + watcher = watchForRepos(ctx, onReposFound, mockStatusBarItem); + mock.setRepositorySearchRoots([repoDir]); + + mock.fireConfigChange("git-fleet.repositorySearchRoots"); await vi.waitFor(() => expect(onReposFound).toHaveBeenCalledOnce()); }); @@ -201,7 +218,7 @@ describe("watchForRepos", () => { mock.setFolders([repoDir]); watcher = watchForRepos(ctx, onReposFound, mockStatusBarItem); - mock.fireConfigChange("neo-git-graph.graphStyle"); + mock.fireConfigChange("git-fleet.graphStyle"); expect(onReposFound).not.toHaveBeenCalled(); }); @@ -224,10 +241,10 @@ describe("watchForRepos", () => { }); describe("error commands (shown before any repo is found)", () => { - it("neo-git-graph.view shows a modal error", async () => { + it("git-fleet.view shows a modal error", async () => { watcher = watchForRepos(ctx, onReposFound, mockStatusBarItem); - await mock.invokeCommand("neo-git-graph.view"); + await mock.invokeCommand("git-fleet.view"); expect(mock.showErrorMessage).toHaveBeenCalledOnce(); expect(mock.showErrorMessage).toHaveBeenCalledWith( @@ -236,10 +253,10 @@ describe("watchForRepos", () => { ); }); - it("neo-git-graph.clearAvatarCache shows a modal error", async () => { + it("git-fleet.clearAvatarCache shows a modal error", async () => { watcher = watchForRepos(ctx, onReposFound, mockStatusBarItem); - await mock.invokeCommand("neo-git-graph.clearAvatarCache"); + await mock.invokeCommand("git-fleet.clearAvatarCache"); expect(mock.showErrorMessage).toHaveBeenCalledOnce(); expect(mock.showErrorMessage).toHaveBeenCalledWith( diff --git a/tests/webview/setup.ts b/tests/webview/setup.ts index 989b8478..c609d221 100644 --- a/tests/webview/setup.ts +++ b/tests/webview/setup.ts @@ -33,11 +33,16 @@ export function setupHtml(viewState: GG.GitGraphViewState) {
    Refresh
    -
    -
    -
    -
    - +
    +
    +
    +
    + + +
      diff --git a/tests/webview/workingTreeAndWorktrees.test.ts b/tests/webview/workingTreeAndWorktrees.test.ts new file mode 100644 index 00000000..61b911b0 --- /dev/null +++ b/tests/webview/workingTreeAndWorktrees.test.ts @@ -0,0 +1,100 @@ +import { beforeAll, describe, expect, it, vi } from "vitest"; + +import type { GitCommitNode, GitWorktree } from "@/backend/types"; +import type * as GG from "@/types"; + +import { createVscodeMock, receive, setupHtml } from "./setup"; + +const REPO = "/workspace/repo"; +const head = "abc123abc123abc123abc123abc123abc123abcd"; +const commits: GitCommitNode[] = [ + { + hash: "*", + parentHashes: [head], + author: "*", + email: "", + date: 1700000100, + message: "Uncommitted Changes (2)", + refs: [] + }, + { + hash: head, + parentHashes: [], + author: "Alice", + email: "alice@example.com", + date: 1700000000, + message: "Initial commit", + refs: [{ hash: head, name: "main", type: "head" }] + } +]; + +const viewState: GG.GitGraphViewState = { + autoCenterCommitDetailsView: true, + dateFormat: "Date & Time", + fetchAvatars: false, + graphColours: ["#0085d9"], + graphStyle: "rounded", + initialLoadCommits: 300, + lastActiveRepo: null, + loadMoreCommits: 75, + locale: "en", + repos: { [REPO]: { columnWidths: null } }, + showCurrentBranchByDefault: false +}; + +describe("working tree and worktree rendering", () => { + let vscodeMock: ReturnType; + + beforeAll(async () => { + vi.resetModules(); + vscodeMock = createVscodeMock(); + setupHtml(viewState); + await import("@/webview/main"); + receive({ + command: "loadBranches", + branches: ["main"], + head: "main", + hard: true, + isRepo: true + }); + receive({ command: "loadCommits", commits, head, moreCommitsAvailable: false, hard: true }); + }); + + it("makes the Uncommitted Changes row request the shared details view", () => { + vscodeMock.clearMessages(); + const row = document.querySelector('tr[data-hash="*"]'); + expect(row).not.toBeNull(); + expect(row!.classList.contains("commit")).toBe(true); + + row!.dispatchEvent(new MouseEvent("click", { bubbles: true })); + + expect(vscodeMock.sentMessages).toContainEqual({ + command: "commitDetails", + repo: REPO, + commitHash: "*" + }); + }); + + it("renders the right-side worktree rail from repository worktree data", () => { + const worktrees: GitWorktree[] = [ + { + path: REPO, + head, + branch: "main", + current: true, + detached: false, + locked: null, + prunable: null, + dirtyCount: 2, + baseSha: head, + ahead: 0, + behind: 0 + } + ]; + receive({ command: "loadWorktrees", worktrees, baselineRef: "main" }); + + expect(document.getElementById("worktreeRail")!.hidden).toBe(false); + expect(document.querySelector(".worktreeItem")!.textContent).toContain("main"); + expect(document.body.classList.contains("worktreesVisible")).toBe(true); + }); +});
      '; - html += - ''; - html += detailRowHtml(l10n.detailCommit, escapeHtml(commitDetails.hash)) + "
      "; - html += detailRowHtml(l10n.detailParents, commitDetails.parents.join(", ")) + "
      "; - html += - detailRowHtml( - l10n.detailAuthor, - escapeHtml(commitDetails.author) + - ' <
      ' + - escapeHtml(commitDetails.email) + - ">" - ) + "
      "; - html += detailRowHtml(l10n.detailDate, new Date(commitDetails.date * 1000).toString()) + "
      "; - html += detailRowHtml(l10n.detailCommitter, escapeHtml(commitDetails.committer)) + ""; - if (typeof this.avatars[commitDetails.email] === "string") { + if (commitDetails.hash === "*") { + html += + "

      " + + escapeHtml(l10n.workingTree) + + "

      " + + escapeHtml(l10n.workingTreeHelp) + + "