Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,42 @@ No changes yet.

---

## [1.2.0] - 2026-03-26

### Added

- **Improved Changelist Indicators**
- Clear staged and partially staged status shown in changelist tree view
- Consistent badge display for files across all changelists
- Enhanced tooltips including staging information

### Changed

- **Stable File Decorations**
- Explorer file decorations are now stable and no longer change color during updates
- Changelist membership is now visually separated from Git staging state
- Simplified decoration logic to avoid conflicts with built-in Git visuals

- **Refresh & State Handling**
- Introduced snapshot-based updates for decoration provider
- Reduced redundant refresh cycles for smoother UI behavior
- Improved synchronization between Git state and changelist state

### Fixed

- **Explorer Flickering**
- Fixed blinking file colors (e.g. red/blue/green transitions) when staging files
- Eliminated inconsistent decoration updates during rapid state changes

- **Decoration Consistency**
- Fixed stale or incorrect file colors after staging and untracking operations
- Fixed race conditions caused by async state loading in decoration provider

- **Commit View Accuracy**
- Fixed incorrect staged file count calculation

---

## [1.1.0] - 2026-03-25

### Added
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "git-worklists",
"displayName": "Git Worklists",
"description": "IntelliJ-style changelists for VS Code. Organize changes into work units, stage selectively, and commit with full control.",
"description": "IntelliJ-style changelists, diff, bookmarks, and stash for VS Code. Organize changes, review diffs, and stage changes with precision using partial staging.",
"publisher": "ozgen",
"version": "1.1.0",
"icon": "media/icon.png",
Expand Down
17 changes: 12 additions & 5 deletions src/app/deps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ import { ReconcileWithGitStatus } from "../usecases/reconcileWithGitStatus";
import { RenameChangelist } from "../usecases/renameChangelist";
import { RestageAlreadyStaged } from "../usecases/restageAlreadyStaged";
import { RestoreFilesToChangelist } from "../usecases/stash/restoreFilesToChangelist";
import { BookmarkDecorationProvider } from "../views/bookmark/bookmarkDecorationProvider";
import { ChangelistDragDrop } from "../views/changelistDragDrop";
import { ChangelistTreeProvider } from "../views/changelistTreeProvider";
import { StashesTreeProvider } from "../views/stash/stashesTreeProvider";
import { WorklistDecorationProvider } from "../views/worklistDecorationProvider";
import { Deps } from "./types";
import { BookmarkDecorationProvider } from "../views/bookmark/bookmarkDecorationProvider";

function sortRepoRoots(repoRoots: string[]): string[] {
return [...new Set(repoRoots)].sort((a, b) => a.localeCompare(b));
Expand Down Expand Up @@ -116,21 +116,28 @@ export async function createDeps(
await loadOrInit.run(deps.repoRoot);
await reconcile.run(deps.repoRoot);

const state = await store.load(deps.repoRoot);
const fileStageStates = await git.getFileStageStates(deps.repoRoot);

treeProvider.setFileStageStates(fileStageStates);
deco.setFileStageStates(fileStageStates);
deco.updateSnapshot({
state,
fileStageStates,
});

treeProvider.refresh();
deco.refreshAll();

if (deps.commitView) {
const stagedCount = [...fileStageStates.values()].filter(
(s) => s === "all" || s === "partial",
).length;

deps.commitView.updateState({
stagedCount: fileStageStates.size,
stagedCount,
lastError: undefined,
});
}

const state = await store.load(deps.repoRoot);
const totalFiles =
state?.version === 1
? state.lists.reduce((sum, l) => sum + l.files.length, 0)
Expand Down
26 changes: 17 additions & 9 deletions src/registration/registerRefresh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,32 @@ export function registerRefresh(deps: Deps) {
title: "Git Worklists: syncing with Git…",
},
async () => {
await deps.loadOrInit.run(deps.repoRoot);
await deps.reconcile.run(deps.repoRoot);

const fileStageStates = await deps.git.getFileStageStates(deps.repoRoot);
const state = (await deps.store.load(deps.repoRoot)) as
| PersistedState
| undefined;
const fileStageStates = await deps.git.getFileStageStates(
deps.repoRoot,
);

deps.treeProvider.setFileStageStates(fileStageStates);
deps.deco.setFileStageStates(fileStageStates);
deps.deco.updateSnapshot({
state,
fileStageStates,
});

deps.treeProvider.refresh();
deps.deco.refreshAll();

deps.commitView.updateState({
stagedCount: fileStageStates.size,
deps.commitView?.updateState({
stagedCount: [...fileStageStates.values()].filter(
(s) => s === "all" || s === "partial",
).length,
lastError: undefined,
});

const state = await deps.store.load(deps.repoRoot);
const count = computeTotalWorklistCount(
state as PersistedState | undefined,
);
const count = computeTotalWorklistCount(state);

deps.treeView.badge =
count > 0
Expand Down
Loading
Loading