@@ -4,6 +4,7 @@ const graphql = require('./graphql')
4
4
const queries = require ( './queries' )
5
5
const csv = require ( 'csv-writer' ) . createArrayCsvStringifier
6
6
const exec = require ( 'child_process' ) . exec
7
+ const fs = require ( 'fs' )
7
8
8
9
//
9
10
// Shell Helpers
@@ -65,6 +66,9 @@ const verifyResultHasKey = (key, query) =>
65
66
}
66
67
}
67
68
69
+ //
70
+ // Config File Parsing
71
+
68
72
//
69
73
// API
70
74
//
@@ -76,14 +80,14 @@ const verifyResultHasKey = (key, query) =>
76
80
* @param before - only return contributions before this timestamp
77
81
* @param after - only return contributions after this timestamp
78
82
*/
79
- const repoContributors = (
80
- { token, user, repo, before, after, debug, dryRun, verbose} ) =>
83
+ const repoContributors =
84
+ ( { token, user, repo, before, after, debug, dryRun, verbose} ) =>
81
85
graphql . executequery ( {
82
86
token,
83
87
debug,
84
88
dryRun,
85
89
verbose,
86
- name : ' repoContributors' ,
90
+ name : ` repoContributors: ${ user } / ${ repo } ` ,
87
91
query : queries . repository ( repo , user , before , after )
88
92
} ) . then ( verifyResultHasKey ( 'repository' , user + '/' + repo ) )
89
93
. then ( json => {
@@ -106,7 +110,7 @@ const orgContributors = ({token, orgName, before, after, debug, dryRun, verbose}
106
110
debug,
107
111
dryRun,
108
112
verbose,
109
- name : ' orgContributors' ,
113
+ name : ` orgContributors: ${ orgName } ` ,
110
114
query : queries . orgRepos ( orgName , before , after )
111
115
} ) . then ( verifyResultHasKey ( 'organization' , orgName ) )
112
116
. then ( data => {
@@ -117,6 +121,60 @@ const orgContributors = ({token, orgName, before, after, debug, dryRun, verbose}
117
121
}
118
122
} )
119
123
124
+ /** Returns all contributions to repos and orgs specified in `file`
125
+ * @param token - GitHub auth token
126
+ * @param file - Config file path
127
+ */
128
+ const fromConfig = async ( { token, file, verbose, debug, dryRun} ) => {
129
+ const config = JSON . parse ( fs . readFileSync ( file ) )
130
+ const ght = config . token || token
131
+ if ( ! ght ) {
132
+ throw new Error ( 'No token specified in config or arguments. Aborting.' )
133
+ }
134
+ const repoResults = config . repos . map ( ( { login, repo, before, after} ) => {
135
+ const afterDate = after ? new Date ( after ) : new Date ( 0 )
136
+ const beforeDate = before ? new Date ( before ) : new Date ( )
137
+
138
+ return repoContributors ( {
139
+ token : ght ,
140
+ user : login ,
141
+ repo,
142
+ before : beforeDate ,
143
+ after : afterDate ,
144
+ debug,
145
+ dryRun,
146
+ verbose
147
+ } )
148
+ } )
149
+
150
+ const orgResults = config . orgs . map ( ( { login, before, after} ) => {
151
+ const afterDate = after ? new Date ( after ) : new Date ( 0 )
152
+ const beforeDate = before ? new Date ( before ) : new Date ( )
153
+ return orgContributors ( {
154
+ orgName : login ,
155
+ before : beforeDate ,
156
+ after : afterDate ,
157
+ token : ght ,
158
+ verbose,
159
+ debug,
160
+ dryRun
161
+ } )
162
+ } )
163
+
164
+ return {
165
+ repos : ( await Promise . all ( repoResults ) ) . map ( ( result , index ) => {
166
+ const repo = config . repos [ index ]
167
+ repo . contributions = result
168
+ return repo
169
+ } ) ,
170
+ orgs : ( await Promise . all ( orgResults ) ) . map ( ( result , index ) => {
171
+ const org = config . orgs [ index ]
172
+ org . contributions = result
173
+ return org
174
+ } )
175
+ }
176
+ }
177
+
120
178
/** Returns the login of the user to whom the given token is registered.
121
179
* @param token - GitHub Auth token
122
180
*/
@@ -128,6 +186,7 @@ const currentUser = token =>
128
186
129
187
module . exports = {
130
188
toCSV,
189
+ fromConfig,
131
190
parseGitURL,
132
191
getCurrentRepoInfo,
133
192
currentUser,
0 commit comments