Replace native Git with Dugite to support users without Git installed (#1760)
I moved all isomorphic-git usage into a single git_utils.ts file and added Dugite as an alternative Git provider. The app now checks the user’s settings and uses dugite when user enabled native git for all isomorphic-git commands. This makes it easy to fully remove isomorphic-git in the future by updating only git_utils.ts. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Adds Dugite-based native Git (bundled binary) and refactors all Git calls to a unified git_utils API, replacing direct isomorphic-git usage across the app. > > - **Git Platform Abstraction**: > - Introduces `dugite` and bundles Git via Electron Forge (`extraResource`) with `LOCAL_GIT_DIRECTORY` setup in `src/main.ts`. > - Adds `src/ipc/git_types.ts` and a comprehensive `src/ipc/utils/git_utils.ts` wrapper supporting both Dugite (native) and `isomorphic-git` (fallback): `commit`, `add`/`addAll`, `remove`, `init`, `clone`, `push`, `setRemoteUrl`, `currentBranch`, `listBranches`, `renameBranch`, `log`, `isIgnored`, `getCurrentCommitHash`, `getGitUncommittedFiles`, `getFileAtCommit`, `checkout`, `stageToRevert`. > - **Refactors (switch to git_utils)**: > - Replaces direct `isomorphic-git` imports in handlers and processors: `app_handlers`, `chat_handlers`, `createFromTemplate`, `github_handlers`, `import_handlers`, `portal_handlers`, `version_handlers`, `response_processor`, `neon_timestamp_utils`, `utils/codebase`. > - Updates tests to mock `git_utils` (`src/__tests__/chat_stream_handlers.test.ts`). > - **Behavioral/Feature Updates**: > - `createFromTemplate` uses `fetch` for GitHub API and `gitClone` for cloning with cache validation. > - GitHub integration uses `gitSetRemoteUrl`/`gitPush`/`gitClone`, handling public vs token URLs and directory creation when native Git is disabled. > - Versioning, imports, app file edits, migrations now stage/commit via `git_utils`. > - **UI/Copy**: > - Updates Settings description for “Enable Native Git”. > - **Config/Version**: > - Bumps version to `0.29.0-beta.1`; adds `dugite` dependency. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit ba098f7f25d85fc6330a41dc718fbfd43fff2d6c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Will Chen <willchen90@gmail.com>
This commit is contained in:
committed by
GitHub
parent
a7bcec220a
commit
d3f3ac3ae1
@@ -7,15 +7,23 @@ import type {
|
||||
RevertVersionParams,
|
||||
RevertVersionResponse,
|
||||
} from "../ipc_types";
|
||||
import type { GitCommit } from "../git_types";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { getDyadAppPath } from "../../paths/paths";
|
||||
import git, { type ReadCommitResult } from "isomorphic-git";
|
||||
import { withLock } from "../utils/lock_utils";
|
||||
import log from "electron-log";
|
||||
import { createLoggedHandler } from "./safe_handle";
|
||||
import { gitCheckout, gitCommit, gitStageToRevert } from "../utils/git_utils";
|
||||
|
||||
import { deployAllSupabaseFunctions } from "../../supabase_admin/supabase_utils";
|
||||
import {
|
||||
gitCheckout,
|
||||
gitCommit,
|
||||
gitStageToRevert,
|
||||
getCurrentCommitHash,
|
||||
gitCurrentBranch,
|
||||
gitLog,
|
||||
} from "../utils/git_utils";
|
||||
|
||||
import {
|
||||
getNeonClient,
|
||||
@@ -80,11 +88,9 @@ export function registerVersionHandlers() {
|
||||
return [];
|
||||
}
|
||||
|
||||
const commits = await git.log({
|
||||
fs,
|
||||
dir: appPath,
|
||||
// KEEP UP TO DATE WITH ChatHeader.tsx
|
||||
depth: 100_000, // Limit to last 100_000 commits for performance
|
||||
const commits = await gitLog({
|
||||
path: appPath,
|
||||
depth: 100_000, // KEEP UP TO DATE WITH ChatHeader.tsx
|
||||
});
|
||||
|
||||
// Get all snapshots for this app to match with commits
|
||||
@@ -104,7 +110,7 @@ export function registerVersionHandlers() {
|
||||
});
|
||||
}
|
||||
|
||||
return commits.map((commit: ReadCommitResult) => {
|
||||
return commits.map((commit: GitCommit) => {
|
||||
const snapshotInfo = snapshotMap.get(commit.oid);
|
||||
return {
|
||||
oid: commit.oid,
|
||||
@@ -134,11 +140,7 @@ export function registerVersionHandlers() {
|
||||
}
|
||||
|
||||
try {
|
||||
const currentBranch = await git.currentBranch({
|
||||
fs,
|
||||
dir: appPath,
|
||||
fullname: false,
|
||||
});
|
||||
const currentBranch = await gitCurrentBranch({ path: appPath });
|
||||
|
||||
return {
|
||||
branch: currentBranch || "<no-branch>",
|
||||
@@ -169,9 +171,8 @@ export function registerVersionHandlers() {
|
||||
|
||||
const appPath = getDyadAppPath(app.path);
|
||||
// Get the current commit hash before reverting
|
||||
const currentCommitHash = await git.resolveRef({
|
||||
fs,
|
||||
dir: appPath,
|
||||
const currentCommitHash = await getCurrentCommitHash({
|
||||
path: appPath,
|
||||
ref: "main",
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user