UNPKG

gitfm

Version:

A CLI App for searching GitHub/GitLab repos, fetching as filesystem and cloning

142 lines (129 loc) 4.88 kB
const { promisify } = await import("node:util"); const sleep = promisify(setTimeout); import { cloningOptions, partialCloningOptions, } from "../../../../cloneOpts.js"; import { runShallowClone, runSparseCheckout, runBloblessClone, runTreelessClone, normalClone, } from "../../../../cloning.js"; import { fetchRepos, promptRepoSelection, promptFolderSelectionFromSubFolder, promptFolderSelectionFromRoot, getCurrentRateLimits, repoInfo, } from "./requests.js"; import input from "../input.js"; import search from "@inquirer/search"; import chalk from "chalk"; import { headerText } from "../headerText.js"; const interactiveClone = async (octokit) => { console.log(headerText); const searchTerm = await input(chalk.greenBright("Enter the term to search repositories: ")); const repos = (await getCurrentRateLimits(octokit)).search.remaining > 0 ? await fetchRepos(octokit, searchTerm) : ''; if ( typeof(repos) === 'string' ) { console.log( chalk.yellow( "\nYou ran out of search queries!\nTry again after some minutes!!\n", ), ); console.log( `Visit - https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api to learn more about GitHub API rate limits`, ); process.exit(1); } if (repos.length < 1) { console.log(`${chalk.red(`${repos.length} Repositories found!`)} `); console.log("Nothing to show"); process.exit(1); } const selectedRepo = await promptRepoSelection(repos.items); await repoInfo(selectedRepo); const cloningPreference = await search({ message: "Choose your prefered way to clone the repository", source: async (_input, { signal }) => { if (signal.aborted) { console.log(chalk.yellow("Aborted!")); process.exit(1); } return cloningOptions; }, }); if (cloningPreference === "partial") { const partialCloningPreference = await search({ message: "Choose your preferred way to partially clone the repository", source: async (input, { signal }) => { if (signal.aborted) { console.log(chalk.yellow("Aborted!")); process.exit(1); } if (!input) { return partialCloningOptions; } else { const filteredChoices = partialCloningOptions.filter((choice) => choice.name.includes(input)); return filteredChoices; } }, }); if (partialCloningPreference === "shallow") { await runShallowClone(selectedRepo.html_url); } else if (partialCloningPreference === "treeless") { await runTreelessClone(selectedRepo.html_url); } else if (partialCloningPreference === "sparse") { let selectedFolder = await promptFolderSelectionFromRoot(octokit, selectedRepo.full_name); // yes I've changed this to let from const if (selectedFolder === null) { console.log(`${chalk.red(`No Folders found!`)} `); console.log("Exiting..."); process.exit(1); } const yesOrNo = await input(chalk.greenBright("Partially clone this selected folder? [Y/N]")); if (yesOrNo.toLowerCase() === "y") { await runSparseCheckout(selectedRepo.html_url, '', '', selectedFolder, true); } else { await sleep(1000); console.log('Entering into this directory'); let pathToNextFolder; while (pathToNextFolder !== "" || pathToNextFolder !== null) { try { await sleep(2000); pathToNextFolder = (await promptFolderSelectionFromSubFolder(octokit, selectedRepo.full_name, selectedFolder)) || ""; if (pathToNextFolder) { console.log('path to selected Folder is -> ' + pathToNextFolder); const yesOrNo = await input(chalk.greenBright("Partially clone this selected folder? [Y/N]")); if (yesOrNo.toLowerCase() === "y") { await runSparseCheckout(selectedRepo.html_url, '', '', pathToNextFolder); break; } else { selectedFolder = pathToNextFolder; } } else { console.log('No folders found further down'); const yesOrNo = await input(chalk.greenBright("Still don't want to partially clone last selected folder? [Y/N]")); if (yesOrNo.toLowerCase() === "y") { await runSparseCheckout(selectedRepo.html_url, '', '', selectedFolder); break; } else { console.log('Exiting...'); process.exit(0); } } } catch (error) { console.error(error.message); process.exit(1); } } } } else { await runBloblessClone(selectedRepo.html_url); } } else { await normalClone(selectedRepo.html_url); } } export { interactiveClone };