From b7d4d9e8a15a3b74bf3f9902f7187baf5f42a43a Mon Sep 17 00:00:00 2001 From: MangoFanFanw Date: Mon, 30 Mar 2026 23:27:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BB=E5=8F=96=20git=20=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=88=E5=A6=82=E6=9C=89=EF=BC=89=E5=B9=B6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/code-launchpad/project-git.ts | 29 ++++++++++ src/main/index.ts | 4 ++ src/my-type/ide-projects.d.ts | 10 ++++ src/preload/index.d.ts | 13 ++--- src/preload/index.ts | 3 +- src/renderer/components.d.ts | 1 + .../components-code-launchpad/ProjectCard.vue | 2 + .../components-code-launchpad/ProjectGit.vue | 54 +++++++++++++++++++ .../ProjectGitIconWidget.vue | 39 ++++++++++++++ 9 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 src/main/code-launchpad/project-git.ts create mode 100644 src/renderer/src/components-code-launchpad/ProjectGit.vue create mode 100644 src/renderer/src/components-code-launchpad/ProjectGitIconWidget.vue diff --git a/src/main/code-launchpad/project-git.ts b/src/main/code-launchpad/project-git.ts new file mode 100644 index 0000000..89806d2 --- /dev/null +++ b/src/main/code-launchpad/project-git.ts @@ -0,0 +1,29 @@ +import { ProjectGitDto } from '@my-type/ide-projects' +import simpleGit from 'simple-git' + +/** + * 获取指定项目的 git 数据(如有) + * @param path 项目路径,应该是 {@link IdeProjectDto.path} + */ +export async function getProjectGitInfo(path: string): Promise { + try { + const git = simpleGit(path) + if (!(await git.checkIsRepo())) { + console.log(`路径 ${path} 的项目不存在 git 仓库。`) + return null + } + const status = await git.status() + return { + current: status.current, + tracking: status.tracking, + created: status.created.length, + deleted: status.deleted.length, + modified: status.modified.length, + renamed: status.renamed.length, + staged: status.staged.length + } + } catch (error) { + console.error(error) + return null + } +} diff --git a/src/main/index.ts b/src/main/index.ts index 2b57c4c..bc33d4f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -13,6 +13,7 @@ import { getJetBrainsProjects, getVscodeProjects, openProject } from './code-lau import { createCodeLaunchpadTray, createCodeLaunchpadWindow } from './code-launchpad/code-launchpad' import type { IDECode } from '@my-type/settings' import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer' +import { getProjectGitInfo } from './code-launchpad/project-git' let mainWindow: BrowserWindow | null = null // @ts-ignore 保存引用,禁用报错 @@ -161,6 +162,9 @@ app.whenReady().then(async () => { ipcMain.handle('codeLaunchpad:openProject', (_, ide: IDECode, path: string) => { return openProject(ide, path) }) + ipcMain.handle('codeLaunchpad:getProjectGitInfo', (_, path: string) => { + return getProjectGitInfo(path) + }) await checkIDEs() await checkIDEsVersion() diff --git a/src/my-type/ide-projects.d.ts b/src/my-type/ide-projects.d.ts index f7485a7..8c68058 100644 --- a/src/my-type/ide-projects.d.ts +++ b/src/my-type/ide-projects.d.ts @@ -10,3 +10,13 @@ export interface IdeProjectDto { } export type IdeProjectsDto = IdeProjectDto[] + +export interface ProjectGitDto { + current: string | null + tracking: string | null + created: number + deleted: number + modified: number + renamed: number + staged: number +} diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index 1664dab..8b40427 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -1,13 +1,13 @@ -import { ElectronAPI } from '@electron-toolkit/preload' -import { settingsDto, checkIDEsResultDto } from '@my-type/settings' +import { ElectronAPI } from "@electron-toolkit/preload"; +import { settingsDto, checkIDEsResultDto } from "@my-type/settings"; import { checkIDEsVersionDto } from "../my-type/settings"; -import { IdeProjectsDto } from "../my-type/ide-projects"; +import { GitProjectDto, IdeProjectsDto } from "../my-type/ide-projects"; // 此处只有签名 declare global { interface Window { - electron: ElectronAPI + electron: ElectronAPI; api: { _saveSettings: (settings: settingsDto) => Promise _updateSettings: () => Promise @@ -17,7 +17,7 @@ declare global { _maximize: () => Promise _closeWindow: () => Promise _exit: () => Promise - } + }; codeLaunchpad: { _getIDEs: () => Promise _checkIDEs: () => Promise @@ -26,6 +26,7 @@ declare global { _getVSCodeProjects: () => Promise _getJetBrainsProjects: () => Promise _openProject: (ide: string, path: string) => Promise - } + _getProjectGitInfo: (path: string) => Promise + }; } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 5d2895b..90918a1 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -25,7 +25,8 @@ const codeLaunchpadApi = { _getVSCodeProjects: () => ipcRenderer.invoke('codeLaunchpad:getVSCodeProjects'), _getJetBrainsProjects: () => ipcRenderer.invoke('codeLaunchpad:getJetBrainsProjects'), _openProject: (ide: string, path: string) => - ipcRenderer.invoke('codeLaunchpad:openProject', ide, path) + ipcRenderer.invoke('codeLaunchpad:openProject', ide, path), + _getProjectGitInfo: (path: string) => ipcRenderer.invoke('codeLaunchpad:getProjectGitInfo', path) } // Use `contextBridge` APIs to expose Electron APIs to diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index a53c676..4a1a2cb 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -33,6 +33,7 @@ declare module 'vue' { NH2: typeof import('naive-ui')['NH2'] NH3: typeof import('naive-ui')['NH3'] NH4: typeof import('naive-ui')['NH4'] + NH5: typeof import('naive-ui')['NH5'] NIcon: typeof import('naive-ui')['NIcon'] NInput: typeof import('naive-ui')['NInput'] NInputNumber: typeof import('naive-ui')['NInputNumber'] diff --git a/src/renderer/src/components-code-launchpad/ProjectCard.vue b/src/renderer/src/components-code-launchpad/ProjectCard.vue index d33292f..3768b11 100644 --- a/src/renderer/src/components-code-launchpad/ProjectCard.vue +++ b/src/renderer/src/components-code-launchpad/ProjectCard.vue @@ -5,6 +5,7 @@ import type { IdeProjectDto } from '@my-type/ide-projects' import { toProductDisplayName } from '@my-type/jetbrains-state-tools' import { useMessage } from 'naive-ui' import { formatTimestamp } from '@my-type/dataFormatter' +import ProjectGit from '@renderer/components-code-launchpad/ProjectGit.vue' const message = useMessage() @@ -85,6 +86,7 @@ async function openWithIDE(ide: string): Promise { 上次打开于 {{ formatTimestamp(project.timestamp) }} + +import { onMounted, ref } from 'vue' +import { CreateOutline as CreatedIcon } from '@vicons/ionicons5' +import { + ChangeHistoryOutlined as ModifiedIcon, + DeleteOutlined as DeletedIcon, + DriveFileRenameOutlineSharp as RenamedIcon +} from '@vicons/material' +import { ProjectGitDto } from '@my-type/ide-projects' +import ProjectGitIconWidget from '@renderer/components-code-launchpad/ProjectGitIconWidget.vue' + +const info = ref(null) +const loading = ref(true) + +const props = defineProps<{ path: string }>() + +onMounted(async () => { + info.value = await window.codeLaunchpad._getProjectGitInfo(props.path) + loading.value = false +}) + + + + + diff --git a/src/renderer/src/components-code-launchpad/ProjectGitIconWidget.vue b/src/renderer/src/components-code-launchpad/ProjectGitIconWidget.vue new file mode 100644 index 0000000..d750907 --- /dev/null +++ b/src/renderer/src/components-code-launchpad/ProjectGitIconWidget.vue @@ -0,0 +1,39 @@ + + + + +