Skip to content

Commit

Permalink
feat: standalone GitHub Repo Search (listing) command
Browse files Browse the repository at this point in the history
  • Loading branch information
Debajyati committed Dec 14, 2024
1 parent 33ae8f3 commit edff497
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 4 deletions.
114 changes: 114 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -205,4 +205,118 @@ program
}
});

program
.command("ghs [TERM]")
.description("get a tabular list of GitHub repositories matching the given search term")
.option("--me", "show only repositories owned by the current user")
.option("-p, --private", "show only private repositories owned by the current user")
.option("-s, --starred", "show only starred repositories")
.option("-u, --user <USER>", "show only repositories owned by the given user")
.option("-l, --language <LANGUAGE>", "show only repositories written in the given language")
.option("-t, --topic", "show only repositories with the given topic")
.option("-r, --readme", "show only repositories with terms matching in the README")
.action(async (TERM, options) => {
const mapRepos = (repos) => {
if (!repos) {
console.error("No repositories found!");
process.exit(1);
}
return repos.map((repo) => {
let desc = repo.description;
if (desc) {
if (desc.length > 175) {
desc = desc.substring(0, 175) + "...";
}
}
return {
name: repo.full_name,
url: repo.html_url,
description: desc,
};
});
};

const {
login,
fetchRepos,
fetchStarredRepos,
fetchYourPrivateRepos,
fetchReposByUserName,
fetchReposBySearchingInReadme,
fetchReposBySearchingInTopics,
fetchReposBySearchingInLanguages,
} = await import("./src/gh/utils/authenticated/requests.js");
try {
if (options.me) {
const octokit = await login();
const response = await octokit.rest.users.getAuthenticated();
const userName = response.data.login;
const repos = await fetchReposByUserName(octokit, userName);
const mappedRepos = mapRepos(repos.items);
console.table(mappedRepos, ['name', 'description']);
}
if (options.user) {
const octokit = await login();
const userName = options.user;
const mappedRepos = mapRepos((await fetchReposByUserName(octokit, userName)).items);
console.table(mappedRepos, ['name', 'description']);
}

if (options.private) {
const octokit = await login();
const mappedRepos = mapRepos((await fetchYourPrivateRepos(octokit)).items);
console.table(mappedRepos, ['name', 'description']);
}

if (options.starred) {
const octokit = await login();
const mappedRepos = mapRepos((await fetchStarredRepos(octokit)).items);
console.table(mappedRepos, ['name', 'description']);
}

if (options.language) {
if (!TERM) {
console.error("No search term provided!");
process.exit(1);
}
const octokit = await login();
const mappedRepos = mapRepos((await fetchReposBySearchingInLanguages(octokit, TERM, options.language)).items);
console.table(mappedRepos, ['name', 'description']);
}

if (options.topic) {
if (!TERM) {
console.error("No search term provided!");
process.exit(1);
}
const octokit = await login();
const mappedRepos = mapRepos((await fetchReposBySearchingInTopics(octokit, TERM)).items);
console.table(mappedRepos, ['name', 'description']);
}

if (options.readme) {
if (!TERM) {
console.error("No search term provided!");
process.exit(1);
}
const octokit = await login();
const mappedRepos = mapRepos((await fetchReposBySearchingInReadme(octokit, TERM)).items);
console.table(mappedRepos, ['name', 'description']);
}

if (Object.keys(options).length === 0) {
if (!TERM) {
console.error("No search term provided!");
process.exit(1);
}
const octokit = await login();
const mappedRepos = mapRepos((await fetchRepos(octokit, TERM)).items);
console.table(mappedRepos, ['name', 'description']);
}
} catch (error) {
console.error(`error during command ${'`gitfm ghs`'}: ${error.message}`);
process.exit(1);
}
});

program.parseAsync();
9 changes: 5 additions & 4 deletions src/gh/utils/authenticated/requests.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const login = async (authType) => { // authType (optional) = "oauth" | "token"

if (storedToken !== null) {
if (await checkTokenValidity(storedToken)) {
console.log("\nUser is already authorized!\n");
console.log("User is already authorized!\n");
const { Octokit } = await import("@octokit/rest");
const octokit = new Octokit({ auth:storedToken });
return octokit;
Expand Down Expand Up @@ -101,7 +101,7 @@ const fetchReposByUserName = async (octokit, userName) => {

const fetchReposBySearchingInReadme = async (octokit, searchTerm) => {
const response = await octokit.rest.search.repos({
q: `q=${encodeURIComponent(`${searchTerm} in:readme`)}`,
q: `${searchTerm} in:readme`,
per_page: 100,
});
return {
Expand All @@ -112,7 +112,7 @@ const fetchReposBySearchingInReadme = async (octokit, searchTerm) => {

const fetchReposBySearchingInTopics = async (octokit, searchTerm) => {
const response = await octokit.rest.search.repos({
q: `q=${encodeURIComponent(`${searchTerm} in:topics`)}`,
q: `${searchTerm} in:topics`,
per_page: 100,
});
return {
Expand All @@ -123,7 +123,7 @@ const fetchReposBySearchingInTopics = async (octokit, searchTerm) => {

const fetchReposBySearchingInLanguages = async (octokit, searchTerm, language) => {
const response = await octokit.rest.search.repos({
q: `q=${encodeURIComponent(`${searchTerm} language:${language}`)}`,
q: `${searchTerm} language:${language}`,
per_page: 100,
});
return {
Expand Down Expand Up @@ -319,6 +319,7 @@ export {
getRepoFolderContents,
promptFolderSelectionFromRoot,
promptFolderSelectionFromSubFolder,
mapRepos,
filterMapRepoContents,
getCurrentRateLimits,
};

0 comments on commit edff497

Please sign in to comment.