Add non-Git projects across filesystem mounts (#2187)
* fix(projects): allow non-git folders across mounts Treat failed Git worktree discovery as non-Git so ordinary directories remain addable. Preserve the underlying diagnostic as a structured warning instead of failing project creation. * fix(projects): preserve discovery warnings Propagate checkout context through the remaining worktree discovery calls so fail-open classification retains its structured warning.
This commit is contained in:
@@ -780,7 +780,7 @@ export interface MergeFromBaseOptions {
|
||||
export interface CheckoutContext {
|
||||
paseoHome?: string;
|
||||
worktreesRoot?: string;
|
||||
logger?: Pick<Logger, "trace">;
|
||||
logger?: Pick<Logger, "trace" | "warn">;
|
||||
facts?: CheckoutSnapshotFacts | null;
|
||||
}
|
||||
|
||||
@@ -805,13 +805,6 @@ export type CheckoutSnapshotFacts =
|
||||
pullRequestLookupTarget: PullRequestStatusLookupTarget | null;
|
||||
};
|
||||
|
||||
function isNotGitRepositoryError(error: unknown): boolean {
|
||||
if (!(error instanceof Error)) {
|
||||
return false;
|
||||
}
|
||||
return /not a git repository \(or any of the parent directories\): \.git/i.test(error.message);
|
||||
}
|
||||
|
||||
async function requireGitRepo(cwd: string): Promise<void> {
|
||||
try {
|
||||
await runGitCommand(["rev-parse", "--git-dir"], { cwd, envOverlay: READ_ONLY_GIT_ENV });
|
||||
@@ -867,10 +860,12 @@ async function getWorktreeRoot(cwd: string, context?: CheckoutContext): Promise<
|
||||
});
|
||||
return parseGitRevParsePath(stdout);
|
||||
} catch (error) {
|
||||
if (isNotGitRepositoryError(error)) {
|
||||
return null;
|
||||
}
|
||||
throw error;
|
||||
// Git discovery is fail-open: keep the directory usable as non-Git and retain the diagnostic.
|
||||
context?.logger?.warn(
|
||||
{ err: error, cwd },
|
||||
"Git worktree discovery failed; treating directory as non-Git",
|
||||
);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1035,7 +1030,7 @@ async function getPaseoWorktreeForCwd(
|
||||
|
||||
return {
|
||||
isPaseoOwnedWorktree: true,
|
||||
worktreeRoot: knownWorktreeRoot ?? (await getWorktreeRoot(cwd)) ?? cwd,
|
||||
worktreeRoot: knownWorktreeRoot ?? (await getWorktreeRoot(cwd, context)) ?? cwd,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2972,7 +2967,7 @@ export async function mergeToBase(
|
||||
}
|
||||
let normalizedBaseRef = baseRef;
|
||||
normalizedBaseRef = normalizeLocalBranchRefName(normalizedBaseRef);
|
||||
const currentWorktreeRoot = (await getWorktreeRoot(cwd)) ?? cwd;
|
||||
const currentWorktreeRoot = (await getWorktreeRoot(cwd, context)) ?? cwd;
|
||||
if (normalizedBaseRef === currentBranch) {
|
||||
return currentWorktreeRoot;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user