UNPKG

@alauda/doom

Version:

Doctor Doom making docs.

74 lines (73 loc) 2.58 kB
import fs from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; import { logger } from '@rspress/core'; import { simpleGit } from 'simple-git'; import { cyan, red } from 'yoctocolors'; const remotesFolder = path.resolve(os.homedir(), '.doom/remotes'); const DEFAULT_USERNAME = 'oauth2'; const { GITHUB_USERNAME = DEFAULT_USERNAME, GITHUB_TOKEN, GITLAB_USERNAME = DEFAULT_USERNAME, GITLAB_TOKEN, } = process.env; export const resolveRepo = async (repo, force, branch) => { const url = new URL(repo, 'https://gitlab-ce.alauda.cn'); const slug = url.pathname.slice(1); if (!slug) { logger.error(`Invalid repository URL: ${red(repo)}`); return; } const repoFolder = path.resolve(remotesFolder, slug); let created = false; try { const stat = await fs.stat(path.resolve(repoFolder, '.git')); if (stat.isDirectory()) { created = true; } } catch { // ignore } if (!created) { await fs.mkdir(repoFolder, { recursive: true }); } const git = simpleGit(repoFolder); if (!created) { logger.info(`Cloning remote \`${cyan(slug)}\` repository...`); switch (url.hostname) { case 'github.com': { if (GITHUB_TOKEN) { url.username = GITHUB_USERNAME; url.password = GITHUB_TOKEN; } break; } case 'gitlab-ce.alauda.cn': { if (GITLAB_TOKEN) { url.username = GITLAB_USERNAME; url.password = GITLAB_TOKEN; } break; } default: { logger.warn(`Unsupported remote host: ${red(url.hostname)}, use on your own risk`); } } await git.clone(url.toString(), repoFolder, ['--depth', '1']); } const currentBranch = (await git.raw(['branch', '--show-current'])).trim(); const options = ['--depth', '1', '--force']; if (branch && branch !== currentBranch) { logger.info(`Switching to branch \`${cyan(branch)}\`...`); await git.fetch('origin', `${branch}:${branch}`, options); await git.checkout(branch); } else if (force) { logger.info(`Pulling latest changes for \`${cyan(slug)}\`...`); const pull = () => git.pull([...options, '--rebase', '--allow-unrelated-histories']); try { await pull(); } catch { await pull(); } } return repoFolder; };