75 lines
1.9 KiB
JavaScript
75 lines
1.9 KiB
JavaScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import os from 'os';
|
|
|
|
const GIT_CREDENTIALS_PATH = path.join(os.homedir(), '.git-credentials');
|
|
|
|
export function discoverGitCredentials() {
|
|
const credentials = [];
|
|
|
|
if (!fs.existsSync(GIT_CREDENTIALS_PATH)) {
|
|
return credentials;
|
|
}
|
|
|
|
try {
|
|
const content = fs.readFileSync(GIT_CREDENTIALS_PATH, 'utf8');
|
|
const lines = content.split('\n').filter(line => line.trim());
|
|
|
|
for (const line of lines) {
|
|
try {
|
|
const url = new URL(line.trim());
|
|
const hostname = url.hostname;
|
|
const pathname = url.pathname && url.pathname !== '/' ? url.pathname : '';
|
|
const host = hostname + pathname;
|
|
const username = url.username || '';
|
|
|
|
if (host && username) {
|
|
const exists = credentials.some(c => c.host === host && c.username === username);
|
|
if (!exists) {
|
|
credentials.push({ host, username });
|
|
}
|
|
}
|
|
} catch {
|
|
continue;
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to read .git-credentials:', error);
|
|
}
|
|
|
|
return credentials;
|
|
}
|
|
|
|
export function getCredentialForHost(host) {
|
|
if (!fs.existsSync(GIT_CREDENTIALS_PATH)) {
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
const content = fs.readFileSync(GIT_CREDENTIALS_PATH, 'utf8');
|
|
const lines = content.split('\n').filter(line => line.trim());
|
|
|
|
for (const line of lines) {
|
|
try {
|
|
const url = new URL(line.trim());
|
|
const hostname = url.hostname;
|
|
const pathname = url.pathname && url.pathname !== '/' ? url.pathname : '';
|
|
const credHost = hostname + pathname;
|
|
|
|
if (credHost === host) {
|
|
return {
|
|
username: url.username || '',
|
|
token: url.password || ''
|
|
};
|
|
}
|
|
} catch {
|
|
continue;
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to read .git-credentials for host lookup:', error);
|
|
}
|
|
|
|
return null;
|
|
}
|