/** * Pure helpers for building one-shot HTTPS push URLs with a GitHub token. * Used by git-push.ts; covered by tests/git-push-auth-url.test.ts. */ /** Remove embedded credentials from an HTTPS URL so we can attach a fresh token. */ export function stripHttpsUserinfo(url: string): string { if (!url.startsWith('https://')) return url; try { const u = new URL(url); u.username = ''; u.password = ''; return u.href; } catch { return url.replace(/^https:\/\/[^/@]+@/, 'https://'); } } export function httpsRemoteHasUserinfo(url: string): boolean { if (!url.startsWith('https://')) return false; try { const u = new URL(url); return u.username !== '' || u.password !== ''; } catch { return url.includes('@'); } } /** * Build a push URL with the token embedded as credentials. * * WHY x-access-token: GitHub installation tokens (ghs_*) and fine-grained PATs * require `x-access-token:` (username:password). Classic PATs (ghp_*) also * accept this format. Using token-as-username-only (`@`) causes git to prompt * for a password in CI (`fatal: could not read Password … terminal prompts disabled`). */ export function buildHttpsPushUrlWithToken(cleanHttpsUrl: string, token: string): string { const u = new URL(cleanHttpsUrl); u.username = 'x-access-token'; u.password = token; return u.href; }