Skip to content

Commit 35fc902

Browse files
committed
Merge staging worktree label into main
2 parents 4777956 + b1cadee commit 35fc902

3 files changed

Lines changed: 48 additions & 2 deletions

File tree

apps/web/src/components/Sidebar.logic.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
isContextMenuPointerDown,
1414
orderItemsByPreferredIds,
1515
resolveProjectStatusIndicator,
16+
resolveRunningWorktreeSlug,
1617
resolveSidebarNewThreadSeedContext,
1718
resolveSidebarNewThreadEnvMode,
1819
resolveThreadRowClassName,
@@ -37,6 +38,24 @@ import {
3738

3839
const localEnvironmentId = EnvironmentId.make("environment-local");
3940

41+
describe("resolveRunningWorktreeSlug", () => {
42+
it("returns the directory after .worktrees for POSIX paths", () => {
43+
expect(resolveRunningWorktreeSlug("/home/jgigg/code/t3code/.worktrees/staging")).toBe(
44+
"staging",
45+
);
46+
});
47+
48+
it("returns the directory after .worktrees for Windows paths", () => {
49+
expect(resolveRunningWorktreeSlug("C:\\Users\\jgigg\\code\\t3code\\.worktrees\\staging")).toBe(
50+
"staging",
51+
);
52+
});
53+
54+
it("returns null for a main checkout outside .worktrees", () => {
55+
expect(resolveRunningWorktreeSlug("/home/jgigg/code/t3code")).toBeNull();
56+
});
57+
});
58+
4059
function makeLatestTurn(overrides?: {
4160
completedAt?: string | null;
4261
startedAt?: string | null;

apps/web/src/components/Sidebar.logic.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,20 @@ type SidebarProject = {
2323
updatedAt?: string | undefined;
2424
};
2525

26+
export function resolveRunningWorktreeSlug(cwd: string | null | undefined): string | null {
27+
const segments = cwd
28+
?.trim()
29+
.split(/[\\/]+/)
30+
.filter((segment) => segment.length > 0);
31+
if (!segments || segments.length === 0) {
32+
return null;
33+
}
34+
35+
const worktreesIndex = segments.lastIndexOf(".worktrees");
36+
const slug = worktreesIndex >= 0 ? segments[worktreesIndex + 1] : undefined;
37+
return slug && slug.length > 0 ? slug : null;
38+
}
39+
2640
export type ThreadTraversalDirection = "previous" | "next";
2741

2842
export interface ThreadStatusPill {

apps/web/src/components/Sidebar.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ import {
167167
resolveProjectStatusIndicator,
168168
resolveSidebarNewThreadSeedContext,
169169
resolveSidebarNewThreadEnvMode,
170+
resolveRunningWorktreeSlug,
170171
resolveThreadRowClassName,
171172
resolveThreadStatusPill,
172173
orderItemsByPreferredIds,
@@ -181,7 +182,7 @@ import { useCopyToClipboard } from "~/hooks/useCopyToClipboard";
181182
import { CommandDialogTrigger } from "./ui/command";
182183
import { readEnvironmentApi } from "../environmentApi";
183184
import { useSettings, useUpdateSettings } from "~/hooks/useSettings";
184-
import { useServerKeybindings } from "../rpc/serverState";
185+
import { useServerConfig, useServerKeybindings } from "../rpc/serverState";
185186
import {
186187
derivePhysicalProjectKey,
187188
deriveProjectGroupingOverrideKey,
@@ -2511,6 +2512,8 @@ const SidebarChromeHeader = memo(function SidebarChromeHeader({
25112512
}: {
25122513
isElectron: boolean;
25132514
}) {
2515+
const serverConfig = useServerConfig();
2516+
const runningWorktreeSlug = resolveRunningWorktreeSlug(serverConfig?.cwd);
25142517
const wordmark = (
25152518
<div className="flex items-center gap-2">
25162519
<SidebarTrigger className="shrink-0 md:hidden" />
@@ -2529,11 +2532,21 @@ const SidebarChromeHeader = memo(function SidebarChromeHeader({
25292532
<span className="rounded-full bg-muted/50 px-1.5 py-0.5 text-[8px] font-medium uppercase tracking-[0.18em] text-muted-foreground/60">
25302533
{APP_STAGE_LABEL}
25312534
</span>
2535+
{runningWorktreeSlug ? (
2536+
<span className="max-w-24 truncate rounded-full bg-muted/70 px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground/70">
2537+
{runningWorktreeSlug}
2538+
</span>
2539+
) : null}
25322540
</Link>
25332541
}
25342542
/>
25352543
<TooltipPopup side="bottom" sideOffset={2}>
2536-
Version {APP_VERSION}
2544+
<span className="block">Version {APP_VERSION}</span>
2545+
{runningWorktreeSlug && serverConfig?.cwd ? (
2546+
<span className="block max-w-80 truncate text-muted-foreground">
2547+
Worktree: {serverConfig.cwd}
2548+
</span>
2549+
) : null}
25372550
</TooltipPopup>
25382551
</Tooltip>
25392552
</div>

0 commit comments

Comments
 (0)