Skip to content

Commit b4fffa5

Browse files
committed
refactor(programmatic-interface): extract logic to run script against a provided list of repositories
for #219
1 parent ecc8f5b commit b4fffa5

File tree

3 files changed

+92
-16
lines changed

3 files changed

+92
-16
lines changed

lib/run-script-against-repositories.js

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import enquirer from "enquirer";
22
import chalk from "chalk";
33

44
import { resolveRepositories } from "./resolve-repositories.js";
5+
import { runScriptAgainstRepositories as runScriptAgainstResolvedRepositories } from "./run-script-against-resolved-repositories.js";
56

67
export async function runScriptAgainstRepositories(state, octoherdRepos = []) {
78
if (!state.octoherdReposPassedAsFlag) {
@@ -51,22 +52,7 @@ export async function runScriptAgainstRepositories(state, octoherdRepos = []) {
5152
state.octokit.log.info("Loading repositories ...");
5253
const repositories = await resolveRepositories(state, octoherdRepos);
5354

54-
for (const repository of repositories) {
55-
state.octokit.log.info(
56-
{ octoherd: true },
57-
"Running on %s ...",
58-
repository.full_name
59-
);
60-
61-
try {
62-
const { id, owner, name } = repository;
63-
state.octokit.log.setContext({ repository: { id, owner, name } });
64-
await state.script(state.octokit, repository, state.userOptions);
65-
} catch (error) {
66-
if (!error.cancel) throw error;
67-
state.octokit.log.debug(error.message);
68-
}
69-
}
55+
await runScriptAgainstResolvedRepositories(state.octokit, repositories, state.script, state.userOptions);
7056
} catch (error) {
7157
state.octokit.log.error(error);
7258
process.exitCode = 1;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export async function runScriptAgainstRepositories(octokit, repositories, script, options) {
2+
for (const repository of repositories) {
3+
octokit.log.info(
4+
{ octoherd: true },
5+
"Running on %s ...",
6+
repository.full_name
7+
);
8+
9+
try {
10+
if (octokit.log.setContext) {
11+
const {id, owner, name} = repository;
12+
octokit.log.setContext({repository: {id, owner, name}});
13+
}
14+
15+
script(octokit, repository, options);
16+
} catch (error) {
17+
if (!error.cancel) throw error;
18+
octokit.log.debug(error.message);
19+
}
20+
}
21+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { suite } from "uvu";
2+
import { equal } from "uvu/assert";
3+
import simple from "simple-mock";
4+
5+
import { runScriptAgainstRepositories } from "../lib/run-script-against-resolved-repositories.js";
6+
7+
const runAgainstRepos = suite('run script against repositories');
8+
9+
const userOptions = {};
10+
const octoherdCliRepository = {id: 123, owner: {login: 'octoherd'}, name: 'cli', full_name: 'octoherd/cli'};
11+
12+
runAgainstRepos('run the script against the provided repositories', async () => {
13+
const octokitInfoLogger = simple.spy(() => undefined);
14+
const octokit = {log: {info: octokitInfoLogger}};
15+
const octokitCoreRepository = {id: 456, owner: {login: 'octokit'}, name: 'core.js', full_name: 'octokit/core.js'};
16+
const repositories = [octoherdCliRepository, octokitCoreRepository];
17+
const script = simple.spy(() => undefined);
18+
19+
await runScriptAgainstRepositories(octokit, repositories, script, userOptions);
20+
21+
repositories.forEach((repository, index) => {
22+
equal(script.calls[index].args, [octokit, repository, userOptions]);
23+
equal(octokitInfoLogger.calls[index].args, [{octoherd: true}, "Running on %s ...", repository.full_name]);
24+
});
25+
});
26+
27+
runAgainstRepos('set logger context when available', async () => {
28+
const octokitLoggerContextSetter = simple.spy(() => undefined);
29+
const octokit = {log: {info: () => undefined, setContext: octokitLoggerContextSetter}};
30+
const octokitCoreRepository = {id: 456, owner: {login: 'octokit'}, name: 'core.js', full_name: 'octokit/core.js'};
31+
const repositories = [octoherdCliRepository, octokitCoreRepository];
32+
const script = simple.spy(() => undefined);
33+
34+
await runScriptAgainstRepositories(octokit, repositories, script, userOptions);
35+
36+
repositories.forEach((repository, index) => equal(
37+
octokitLoggerContextSetter.calls[index].args,
38+
[{repository: {id: repository.id, owner: repository.owner, name: repository.name}}]
39+
));
40+
});
41+
42+
runAgainstRepos('log cancelled routes at debug level', async () => {
43+
const repositories = [octoherdCliRepository];
44+
const errorMessage = 'error message';
45+
const cancelledRouteError = new Error(errorMessage);
46+
cancelledRouteError.cancel = true;
47+
const octokitDebugLogger = simple.spy(() => undefined);
48+
const octokit = {log: {info: () => undefined, debug: octokitDebugLogger}};
49+
const script = simple.spy(() => undefined).throwWith(cancelledRouteError);
50+
51+
await runScriptAgainstRepositories(octokit, repositories, script, userOptions);
52+
53+
equal(octokitDebugLogger.calls[0].args, [errorMessage]);
54+
});
55+
56+
runAgainstRepos('throw other errors', async () => {
57+
const repositories = [octoherdCliRepository];
58+
const error = new Error();
59+
const octokit = {log: {info: () => undefined}};
60+
const script = simple.spy(() => undefined).throwWith(error);
61+
62+
try {
63+
await runScriptAgainstRepositories(octokit, repositories, script, userOptions);
64+
} catch (err) {
65+
equal(err, error);
66+
}
67+
});
68+
69+
runAgainstRepos.run();

0 commit comments

Comments
 (0)