Skip to content

Instantly share code, notes, and snippets.

@bryanroscoe
Last active November 6, 2020 20:12
Show Gist options
  • Select an option

  • Save bryanroscoe/644156261b5da45924ce3bc041e862fa to your computer and use it in GitHub Desktop.

Select an option

Save bryanroscoe/644156261b5da45924ce3bc041e862fa to your computer and use it in GitHub Desktop.
const { Octokit } = require("@octokit/rest");
const fs = require('fs');
var os = require("os");
let githubkey = 'secretkey'
const revOrg = 'revdotcom'
const usersCsvFileName = './users.csv'
const progressFilename = './progress.json'
const teamsFileName = './teams.json'
const teamsCsvFileName = './teams.csv'
const octokit = new Octokit({
auth: githubkey
});
const storeData = (data, path, stringify, mode) => {
try {
let dataToPrint = data;
if (stringify)
dataToPrint = JSON.stringify(data);
fs.writeFileSync(path, `${dataToPrint}${os.EOL}`, { flag: mode })
} catch (err) {
console.error(err)
}
}
const loadData = (path) => {
try {
return fs.readFileSync(path, 'utf8')
} catch (err) {
console.error(err)
return false
}
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function getMembers() {
// Make sure to use paginate to avoid having to worry about paging
const orgMembers = await octokit.paginate(octokit.orgs.listMembers, {
org: revOrg
});
let teamsWithMembers = loadData(teamsFileName);
if (teamsWithMembers) {
console.log('loading teams from file');
teamsWithMembers = JSON.parse(teamsWithMembers);
}
else {
console.log('loading teams from api');
const teams = await await octokit.paginate(octokit.teams.list, {
org: revOrg,
});
teamsWithMembers = []
for (team of teams) {
var teamMembers = await octokit.paginate(octokit.teams.listMembersInOrg, {
org: revOrg,
team_slug: team.slug,
});
teamsWithMembers.push({ slug: team.slug, members: teamMembers.map(m => m.login) })
}
storeData(teamsWithMembers, teamsFileName, 'yes', "w");
}
console.log(teamsWithMembers);
var currentProgress = loadData(progressFilename)
if (currentProgress) {
console.log('loading current progress from file');
currentProgress = JSON.parse(currentProgress);
console.log(currentProgress);
}
else {
console.log('No progress found, starting from scratch');
currentProgress = []
}
for (member of orgMembers) {
if (currentProgress.find(p => member.login == p.login)) {
console.log(`Skipping ${member.login} as we have already done it before`)
continue
}
const fullUser = (await octokit.users.getByUsername({
username: member.login,
})).data;
let userTeams = []
for (team of teamsWithMembers) {
if (team.members.find(m => m == fullUser.login)) {
console.log(`${fullUser.login} IS in ${team.slug}`)
userTeams.push(team.slug)
}
else {
console.log(`${fullUser.login} is not in ${team.slug}`);
}
// Github api is extremly finicky, sleep to avoid rate limiting
// await sleep(Math.random() * 200);
}
// failed attempt to search commits for email address
// todo: check in future to get email address
// var commits = await octokit.search.commits({
// q: `q=org:revdotcom+author:ahood12`,
// // per_page: 100,
// // page:1
// })
const userToStore = { login: fullUser.login, name: fullUser.name, teams: userTeams }
console.log(userToStore);
currentProgress.push(userToStore)
storeData(currentProgress, progressFilename, true, "w");
}
// store as csv
// var usersFrom = loadData(progressFilename)
console.log(`storing user results in ${usersCsvFileName}`)
let resultText = "login, name, teams"
for (user of currentProgress)
resultText += `${user.login}, ${user.name}, [${user.teams.join(" ")}]${os.EOL}`
storeData(resultText, usersCsvFileName, false, "w");
console.log(`storing user results in ${teamsCsvFileName}`)
let teamResult = "name/slug, members"
for (team of teamsWithMembers)
teamResult += `${team.slug}, [${team.members.join(" ")}]${os.EOL}`
storeData(teamResult, teamsCsvFileName, false, "w");
}
getMembers().catch(e => { throw e; })
{
"name": "checkgithubusers",
"version": "0.0.1",
"private": true,
"author": "bryan@rev.com",
"scripts": {
"start": "node checkusers.js"
},
"dependencies": {
"@octokit/rest": "^18.0.9"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment