mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-30 22:32:04 +00:00
- Added new scripts for server development and full application startup in package.json. - Enhanced project management by checking for existing projects to avoid duplicates. - Improved API integration with better error handling and connection checks in the Electron API. - Updated UI components to reflect changes in project and session management. - Refactored authentication status display to include more detailed information on methods used.
103 lines
2.8 KiB
TypeScript
103 lines
2.8 KiB
TypeScript
/**
|
|
* Git routes - HTTP API for git operations (non-worktree)
|
|
*/
|
|
|
|
import { Router, type Request, type Response } from "express";
|
|
import { exec } from "child_process";
|
|
import { promisify } from "util";
|
|
|
|
const execAsync = promisify(exec);
|
|
|
|
export function createGitRoutes(): Router {
|
|
const router = Router();
|
|
|
|
// Get diffs for the main project
|
|
router.post("/diffs", async (req: Request, res: Response) => {
|
|
try {
|
|
const { projectPath } = req.body as { projectPath: string };
|
|
|
|
if (!projectPath) {
|
|
res.status(400).json({ success: false, error: "projectPath required" });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const { stdout: diff } = await execAsync("git diff HEAD", {
|
|
cwd: projectPath,
|
|
maxBuffer: 10 * 1024 * 1024,
|
|
});
|
|
const { stdout: status } = await execAsync("git status --porcelain", {
|
|
cwd: projectPath,
|
|
});
|
|
|
|
const files = status
|
|
.split("\n")
|
|
.filter(Boolean)
|
|
.map((line) => {
|
|
const statusChar = line[0];
|
|
const filePath = line.slice(3);
|
|
const statusMap: Record<string, string> = {
|
|
M: "Modified",
|
|
A: "Added",
|
|
D: "Deleted",
|
|
R: "Renamed",
|
|
C: "Copied",
|
|
U: "Updated",
|
|
"?": "Untracked",
|
|
};
|
|
return {
|
|
status: statusChar,
|
|
path: filePath,
|
|
statusText: statusMap[statusChar] || "Unknown",
|
|
};
|
|
});
|
|
|
|
res.json({
|
|
success: true,
|
|
diff,
|
|
files,
|
|
hasChanges: files.length > 0,
|
|
});
|
|
} catch {
|
|
res.json({ success: true, diff: "", files: [], hasChanges: false });
|
|
}
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
res.status(500).json({ success: false, error: message });
|
|
}
|
|
});
|
|
|
|
// Get diff for a specific file
|
|
router.post("/file-diff", async (req: Request, res: Response) => {
|
|
try {
|
|
const { projectPath, filePath } = req.body as {
|
|
projectPath: string;
|
|
filePath: string;
|
|
};
|
|
|
|
if (!projectPath || !filePath) {
|
|
res
|
|
.status(400)
|
|
.json({ success: false, error: "projectPath and filePath required" });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const { stdout: diff } = await execAsync(`git diff HEAD -- "${filePath}"`, {
|
|
cwd: projectPath,
|
|
maxBuffer: 10 * 1024 * 1024,
|
|
});
|
|
|
|
res.json({ success: true, diff, filePath });
|
|
} catch {
|
|
res.json({ success: true, diff: "", filePath });
|
|
}
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
res.status(500).json({ success: false, error: message });
|
|
}
|
|
});
|
|
|
|
return router;
|
|
}
|