From 158db20b52b72f6861d2fbc0af3186b52d1fd337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8D=E3=82=80=E3=81=9D=E3=82=93?= Date: Sun, 2 Nov 2025 12:22:41 +0900 Subject: [PATCH] feat: Filter git revisions to show only base and current branches (#47) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Unify git revisions API to current-revisions endpoint - Add getCurrentRevisions to GitController returning base branch, current branch, head, and commits - Implement findBaseBranch in GitService to identify base branch from commit history - Add getCommitsBetweenBranches to get commits between base and target branch - Remove separate branches and commits API endpoints - Update frontend to use unified gitCurrentRevisionsQuery - Replace useGitBranches and useGitCommits with useGitCurrentRevisions hook 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * feat: Display current branch in session header - Move useGitCurrentRevisions hook to SessionPageMain level - Display current branch badge with GitBranchIcon in session header - Pass revisionsData from parent to DiffModal to avoid duplicate API calls - Update DiffModalProps to accept optional revisionsData parameter - Show current branch between project path and session ID badges 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --------- Co-authored-by: Claude --- .../components/SessionPageMain.tsx | 13 ++ .../components/diffModal/DiffModal.tsx | 64 ++++--- .../[sessionId]/components/diffModal/types.ts | 32 ++++ .../sessions/[sessionId]/hooks/useGit.ts | 19 +- src/lib/api/queries.ts | 32 +--- .../core/git/presentation/GitController.ts | 171 +++++++++++------- .../core/git/services/GitService.test.ts | 38 ++++ src/server/core/git/services/GitService.ts | 168 +++++++++++++++++ src/server/hono/route.ts | 16 +- 9 files changed, 406 insertions(+), 147 deletions(-) diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/SessionPageMain.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/SessionPageMain.tsx index 83f47b0..65e4763 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/SessionPageMain.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/SessionPageMain.tsx @@ -1,6 +1,7 @@ import { Trans } from "@lingui/react"; import { useMutation } from "@tanstack/react-query"; import { + GitBranchIcon, GitCompareIcon, LoaderIcon, MenuIcon, @@ -17,6 +18,7 @@ import { Badge } from "../../../../../../components/ui/badge"; import { honoClient } from "../../../../../../lib/api/client"; import { useProject } from "../../../hooks/useProject"; import { firstUserMessageToTitle } from "../../../services/firstCommandToTitle"; +import { useGitCurrentRevisions } from "../hooks/useGit"; import { useSession } from "../hooks/useSession"; import { useSessionProcess } from "../hooks/useSessionProcess"; import { ConversationList } from "./conversationList/ConversationList"; @@ -39,6 +41,7 @@ export const SessionPageMain: FC<{ const { currentPermissionRequest, isDialogOpen, onPermissionResponse } = usePermissionRequests(); const [isDiffModalOpen, setIsDiffModalOpen] = useState(false); + const { data: revisionsData } = useGitCurrentRevisions(projectId); const abortTask = useMutation({ mutationFn: async (sessionProcessId: string) => { @@ -122,6 +125,15 @@ export const SessionPageMain: FC<{ {project.meta.projectPath ?? project.claudeProjectPath} )} + {revisionsData?.success && revisionsData.data.currentBranch && ( + + + {revisionsData.data.currentBranch.name} + + )} {/* Permission Dialog */} diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/diffModal/DiffModal.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/diffModal/DiffModal.tsx index d4e3e7b..4ae65cd 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/diffModal/DiffModal.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/diffModal/DiffModal.tsx @@ -25,8 +25,7 @@ import { cn } from "@/lib/utils"; import { useCommitAndPush, useCommitFiles, - useGitBranches, - useGitCommits, + useGitCurrentRevisions, useGitDiff, usePushCommits, } from "../../hooks/useGit"; @@ -141,6 +140,7 @@ export const DiffModal: FC = ({ projectId, defaultCompareFrom = "HEAD", defaultCompareTo = "working", + revisionsData: parentRevisionsData, }) => { const { i18n } = useLingui(); const commitMessageId = useId(); @@ -158,11 +158,10 @@ export const DiffModal: FC = ({ // Commit section collapse state (default: collapsed) const [isCommitSectionExpanded, setIsCommitSectionExpanded] = useState(false); - // API hooks - const { data: branchesData, isLoading: isLoadingBranches } = - useGitBranches(projectId); - const { data: commitsData, isLoading: isLoadingCommits } = - useGitCommits(projectId); + // API hooks - use parent data if available, otherwise fetch + const { data: fetchedRevisionsData, isLoading: isLoadingRevisions } = + useGitCurrentRevisions(projectId); + const revisionsData = parentRevisionsData ?? fetchedRevisionsData; const { mutate: getDiff, data: diffData, @@ -173,9 +172,9 @@ export const DiffModal: FC = ({ const pushMutation = usePushCommits(projectId); const commitAndPushMutation = useCommitAndPush(projectId); - // Transform branches and commits data to GitRef format + // Transform revisions data to GitRef format const gitRefs: GitRef[] = - branchesData?.success && branchesData.data + revisionsData?.success && revisionsData.data ? [ { name: "working" as const, @@ -187,21 +186,35 @@ export const DiffModal: FC = ({ type: "commit" as const, displayName: "HEAD", }, - ...branchesData.data.map((branch) => ({ - name: `branch:${branch.name}` as const, - type: "branch" as const, - displayName: branch.name + (branch.current ? " (current)" : ""), - sha: branch.commit, - })), - // Add commits from current branch - ...(commitsData?.success && commitsData.data - ? commitsData.data.map((commit) => ({ - name: `commit:${commit.sha}` as const, - type: "commit" as const, - displayName: `${commit.message.substring(0, 50)}${commit.message.length > 50 ? "..." : ""}`, - sha: commit.sha, - })) + // Add base branch if exists + ...(revisionsData.data.baseBranch + ? [ + { + name: `branch:${revisionsData.data.baseBranch.name}` as const, + type: "branch" as const, + displayName: `${revisionsData.data.baseBranch.name} (base)`, + sha: revisionsData.data.baseBranch.commit, + }, + ] : []), + // Add current branch if exists + ...(revisionsData.data.currentBranch + ? [ + { + name: `branch:${revisionsData.data.currentBranch.name}` as const, + type: "branch" as const, + displayName: `${revisionsData.data.currentBranch.name} (current)`, + sha: revisionsData.data.currentBranch.commit, + }, + ] + : []), + // Add commits from current branch + ...revisionsData.data.commits.map((commit) => ({ + name: `commit:${commit.sha}` as const, + type: "commit" as const, + displayName: `${commit.message.substring(0, 50)}${commit.message.length > 50 ? "..." : ""}`, + sha: commit.sha, + })), ] : []; @@ -397,10 +410,7 @@ export const DiffModal: FC = ({