feat: resolve workspace path using git worktrees (#258)
This commit is contained in:
@@ -97,13 +97,48 @@ const resolveWorkspacePath = (targetPath, baseDirectory) => {
|
|||||||
return { ok: false, error: 'Path is outside of active workspace' };
|
return { ok: false, error: 'Path is outside of active workspace' };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const resolveWorkspacePathFromWorktrees = async (targetPath, baseDirectory) => {
|
||||||
|
const normalized = normalizeDirectoryPath(targetPath);
|
||||||
|
if (!normalized || typeof normalized !== 'string') {
|
||||||
|
return { ok: false, error: 'Path is required' };
|
||||||
|
}
|
||||||
|
|
||||||
|
const resolved = path.resolve(normalized);
|
||||||
|
const resolvedBase = path.resolve(baseDirectory || os.homedir());
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { getWorktrees } = await import('./lib/git-service.js');
|
||||||
|
const worktrees = await getWorktrees(resolvedBase);
|
||||||
|
|
||||||
|
for (const worktree of worktrees) {
|
||||||
|
const candidate = typeof worktree?.worktree === 'string' ? normalizeDirectoryPath(worktree.worktree) : '';
|
||||||
|
if (!candidate) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const candidateResolved = path.resolve(candidate);
|
||||||
|
if (isPathWithinRoot(resolved, candidateResolved)) {
|
||||||
|
return { ok: true, base: candidateResolved, resolved };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Failed to resolve worktree roots:', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { ok: false, error: 'Path is outside of active workspace' };
|
||||||
|
};
|
||||||
|
|
||||||
const resolveWorkspacePathFromContext = async (req, targetPath) => {
|
const resolveWorkspacePathFromContext = async (req, targetPath) => {
|
||||||
const resolvedProject = await resolveProjectDirectory(req);
|
const resolvedProject = await resolveProjectDirectory(req);
|
||||||
if (!resolvedProject.directory) {
|
if (!resolvedProject.directory) {
|
||||||
return { ok: false, error: resolvedProject.error || 'Active workspace is required' };
|
return { ok: false, error: resolvedProject.error || 'Active workspace is required' };
|
||||||
}
|
}
|
||||||
|
|
||||||
return resolveWorkspacePath(targetPath, resolvedProject.directory);
|
const resolved = resolveWorkspacePath(targetPath, resolvedProject.directory);
|
||||||
|
if (resolved.ok || resolved.error !== 'Path is outside of active workspace') {
|
||||||
|
return resolved;
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolveWorkspacePathFromWorktrees(targetPath, resolvedProject.directory);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user