@codefresh-io/cf-git-providers
Version:
An NPM module/CLI for interacting with various git providers
158 lines • 6.49 kB
JavaScript
;
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