UNPKG

@codefresh-io/cf-git-providers

Version:

An NPM module/CLI for interacting with various git providers

158 lines 6.49 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.handler = exports.builder = exports.desc = exports.aliases = exports.command = void 0; const lodash_1 = require("lodash"); const p_limit_1 = __importDefault(require("p-limit")); const helpers_1 = require("../../../helpers"); // tslint:disable-next-line: no-var-requires const logger = (0, helpers_1.createNewLogger)('codefresh:list:repos'); const MAX_REPOS_FETCHED_CONCURRENTLY = 4; exports.command = 'repos'; exports.aliases = ['rp']; exports.desc = 'Get a list of repos of a specified owner or with a specified affiliation to the authenticated user'; const builder = (yargs) => yargs .usage('Usage: $0 list repos [options]') .option('owner', { alias: ['o'], describe: 'The name of the owner of the git repository', type: 'string', conflicts: ['affiliation', 'organization'], }) .option('affiliation', { alias: ['a'], choices: ['owner', 'collaborator', 'organization_member', 'all'], describe: 'The user affiliation to the repo', defaultDescription: 'all', coerce: (affiliations) => { if ((0, lodash_1.isArray)(affiliations)) { return (0, lodash_1.flatMap)(affiliations, (aff) => aff.split(',')); } if (affiliations === 'all' || affiliations === true) { return ['owner', 'collaborator', 'organization_member']; } return affiliations.split(','); }, }) .option('organization', { alias: ['org'], describe: 'The name of the organization of the git repository', type: 'string', conflicts: ['affiliation', 'owner'], }) .option('repos', { describe: 'Comma-separated list, or a file with full repository names', type: 'string', conflicts: ['affiliation', 'organization', 'owner', 'sort', 'direction'], coerce: (repos) => repos.split(','), }) .option('sort', { choices: ['name', 'pushed', 'created'], describe: 'The property to order by', type: 'string', }) .option('direction', { choices: ['desc', 'asc'], describe: 'Sort order ascending / descending', type: 'string', }) .option('full', { describe: 'Return repositories in full format (and not just the name)', type: 'boolean', default: false, }) .example(`$0 list ${exports.command}`, 'Will list all repositories the authenticated user is affiliated with') .example(`$0 list ${exports.command} --affiliation owner`, 'Will list all repositories the authenticated user has "owner" affiliation with') .example(`$0 list ${exports.command} -o some-owner`, 'Will list all the repositories of "some-owner"') .example(`$0 list ${exports.command} -o some-owner -l 40`, 'Will list up to 40 repositories of "some-owner"'); exports.builder = builder; const handler = async (argv) => { const owner = argv.owner; const provider = argv.provider; const output = argv.output; const limit = argv.limit; const page = argv.page; const full = argv.full; const affiliations = (argv.affiliation || ['owner', 'collaborator', 'organization_member']); const organization = argv.organization; const sort = argv.sort; const direction = argv.direction; const repoNames = argv.repos; logger.debug(`owner=${owner}`); logger.debug(`output=${output}`); logger.debug(`limit=${limit}`); logger.debug(`page=${page}`); logger.debug(`full=${full}`); logger.debug(`affiliations=${affiliations}`); logger.debug(`sort=${sort}`); logger.debug(`direction=${direction}`); logger.debug(`organization=${organization}`); logger.debug(`repos=${repoNames && repoNames.length}`); let repos = []; if (owner) { repos = await getReposForOwner(provider, { owner, sort, direction, limit, page }); } else if (organization) { repos = await getReposForOrg(provider, { organization, sort, direction, limit, page }); } else if (repoNames) { repos = await getReposByListOfNames(provider, { repoNames }); } else { repos = await getAffiliatedRepos(provider, { affiliations, sort, direction, limit, page }); } logger.info(`found ${repos.length} relevant repositories`); let result = repos; if (!full) { result = repos.map((r) => r.name); } if (output) { await (0, helpers_1.writeResultsToFile)(output, JSON.stringify(result)); } else { console.log(JSON.stringify(result)); } }; exports.handler = handler; const getReposForOwner = async (provider, args) => { const { owner, sort, direction, limit, page } = args; const [listReposErr, repos] = await (0, helpers_1.to)(provider.listRepositoriesForOwner({ owner, limit, page, sort, direction })); if (listReposErr) { (0, helpers_1.exitWithError)(`failed to get the list of repositories of "${owner}", ${listReposErr}`); } return repos; }; const getAffiliatedRepos = async (provider, args) => { const { affiliations, sort, direction, limit, page } = args; const [listReposErr, repos] = await (0, helpers_1.to)(provider.listRepositoriesWithAffiliation({ affiliation: affiliations.join(','), ...(sort && { sort }), ...(direction && { direction }), limit, page, })); if (listReposErr) { (0, helpers_1.exitWithError)(`failed to get the list of repositories with affiliation: "${affiliations}", ${listReposErr}`); } return repos; }; const getReposByListOfNames = async (provider, args) => { const { repoNames } = args; const limitter = (0, p_limit_1.default)(MAX_REPOS_FETCHED_CONCURRENTLY); const repoPromises = repoNames.map((repoName) => { const [owner, repo] = repoName.split('/'); return limitter(provider.getRepository.bind(provider), { owner, repo }); }); return Promise.all(repoPromises); }; const getReposForOrg = async (provider, args) => { const { organization, sort, direction, limit, page } = args; const [listReposErr, repos] = await (0, helpers_1.to)(provider.listRepositoriesForOrganization({ organization, limit, page, sort, direction })); if (listReposErr) { (0, helpers_1.exitWithError)(`failed to get the list of repositories of organization: "${organization}", ${listReposErr}`); } return repos; }; //# sourceMappingURL=repos.cmd.js.map