Last active
November 6, 2020 20:12
-
-
Save bryanroscoe/644156261b5da45924ce3bc041e862fa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; }) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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