import { existsSync } from "fs"; import { join, relative } from "path"; import type { SubmoduleInfo } from "../types/index.ts"; import type { GitService } from "../services/git.ts"; import { bunGitService } from "../services/git.ts"; /** * Get submodule information for a path */ export async function getSubmoduleInfo( path: string, gitService: GitService = bunGitService ): Promise { const isSub = await gitService.isSubmodule(path); if (!isSub) return null; const parentPath = await gitService.getSubmoduleParent(path); if (!parentPath) return null; // Get configured commit from parent's submodule list const submodules = await gitService.listSubmodules(parentPath); const relativePath = relative(parentPath, path); const subInfo = submodules.find((s) => s.path === relativePath); return { parentPath, relativePath, configuredCommit: subInfo?.commit ?? "", currentCommit: subInfo?.commit ?? "", isInitialized: subInfo?.status !== "-", }; } /** * Find all submodules in a git repository */ export async function findSubmodules( repoPath: string, gitService: GitService = bunGitService ): Promise { // Check if .gitmodules exists if (!existsSync(join(repoPath, ".gitmodules"))) { return []; } const submodules = await gitService.listSubmodules(repoPath); return submodules.map((s) => join(repoPath, s.path)); } /** * Check if a path is a submodule of another repository */ export async function isSubmoduleOf( path: string, parentPath: string, gitService: GitService = bunGitService ): Promise { const submodules = await findSubmodules(parentPath, gitService); return submodules.includes(path); }