73 lines
2.4 KiB
TypeScript
73 lines
2.4 KiB
TypeScript
// @generated — DO NOT EDIT. Source: packages/shared/repo.ts
|
|
export interface RepoInfo {
|
|
/** Display string (e.g., "backnotprop/plannotator" or "my-project") */
|
|
display: string;
|
|
/** Current git branch (if in a git repo) */
|
|
branch?: string;
|
|
/** Host of the git remote (e.g., "github.com", "gitlab.com"). Populated */
|
|
/** only when the remote URL is parseable; absent for directory-only fallbacks. */
|
|
host?: string;
|
|
}
|
|
|
|
/**
|
|
* Parse org/repo from a git remote URL
|
|
*
|
|
* Handles:
|
|
* - SSH: git@github.com:org/repo.git
|
|
* - HTTPS: https://github.com/org/repo.git
|
|
* - SSH with port: ssh://git@github.com:22/org/repo.git
|
|
* - GitLab subgroups: git@gitlab.com:group/subgroup/project.git
|
|
*/
|
|
export function parseRemoteUrl(url: string): string | null {
|
|
if (!url) return null;
|
|
|
|
// SSH with port: ssh://git@host:22/path.git — strip scheme+host+port
|
|
const sshPortMatch = url.match(/^ssh:\/\/[^/]+(?::\d+)?\/(.+?)(?:\.git)?$/);
|
|
if (sshPortMatch) return sshPortMatch[1];
|
|
|
|
// SSH format: git@host:path.git — capture full path after ':'
|
|
// Reject URLs with :// scheme (HTTPS with non-standard ports like :8443)
|
|
if (!url.includes("://")) {
|
|
const sshMatch = url.match(/:([^/][^:]*?)(?:\.git)?$/);
|
|
if (sshMatch) return sshMatch[1];
|
|
}
|
|
|
|
// HTTPS format: https://host/path.git — capture full path after host
|
|
const httpsMatch = url.match(/^https?:\/\/[^/]+\/(.+?)(?:\.git)?$/);
|
|
if (httpsMatch) return httpsMatch[1];
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Parse the host from a git remote URL. Returns null when the shape
|
|
* doesn't match a known remote form. Used to identify the forge
|
|
* (github.com, gitlab.com, self-hosted) so inline mention / issue
|
|
* refs can link to the correct destination instead of assuming GitHub.
|
|
*/
|
|
export function parseRemoteHost(url: string): string | null {
|
|
if (!url) return null;
|
|
// ssh://git@host:port/path
|
|
const sshPort = url.match(/^ssh:\/\/(?:[^@]+@)?([^:/]+)/i);
|
|
if (sshPort) return sshPort[1];
|
|
// git@host:path
|
|
if (!url.includes('://')) {
|
|
const ssh = url.match(/^[^@\s]+@([^:\s]+):/);
|
|
if (ssh) return ssh[1];
|
|
}
|
|
// https://host/path or http://host/path
|
|
const https = url.match(/^https?:\/\/([^/:]+)/i);
|
|
if (https) return https[1];
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Get directory name from path
|
|
*/
|
|
export function getDirName(path: string): string | null {
|
|
if (!path) return null;
|
|
const trimmed = path.trim().replace(/\/+$/, "");
|
|
const parts = trimmed.split("/");
|
|
return parts[parts.length - 1] || null;
|
|
}
|