Add a command-line script to create example repos (#155)
Summary: We’ll use this to create the repositories on disk and then push them to GitHub. Test Plan: Generate both kinds of repository, and check out the SHAs: ```shell $ yarn backend $ node bin/createExampleRepo.js /tmp/repo $ node bin/createExampleRepo.js --submodule /tmp/repo-submodule $ node bin/createExampleRepo.js --no-submodule /tmp/repo-no-submodule $ # (first and third lines do the same thing) $ git -C /tmp/repo rev-parse HEAD 677b340674bde17fdaac3b5f5eef929139ef2a52 $ git -C /tmp/repo-submodule rev-parse HEAD 29ef158bc982733e2ba429fcf73e2f7562244188 $ git -C /tmp/repo-no-submodule rev-parse HEAD 677b340674bde17fdaac3b5f5eef929139ef2a52 ``` Then, note that these SHAs are expected per the snapshot file in `exampleRepo.test.js.snap`. wchargin-branch: create-example-repo-command
This commit is contained in:
parent
ef7610a440
commit
d6e9b0a72b
|
@ -62,5 +62,6 @@ module.exports = {
|
||||||
fetchAndPrintGithubRepo: resolveApp(
|
fetchAndPrintGithubRepo: resolveApp(
|
||||||
"src/plugins/github/bin/fetchAndPrintGithubRepo.js"
|
"src/plugins/github/bin/fetchAndPrintGithubRepo.js"
|
||||||
),
|
),
|
||||||
|
createExampleRepo: resolveApp("src/plugins/git/bin/createExampleRepo.js"),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import fs from "fs";
|
||||||
|
|
||||||
|
import {
|
||||||
|
createExampleRepo,
|
||||||
|
createExampleSubmoduleRepo,
|
||||||
|
} from "../demoData/exampleRepo";
|
||||||
|
|
||||||
|
function parseArgs() {
|
||||||
|
const argv = process.argv.slice(2);
|
||||||
|
const fail = () => {
|
||||||
|
const invocation = process.argv.slice(0, 2).join(" ");
|
||||||
|
throw new Error(`Usage: ${invocation} [--[no-]submodule] TARGET_DIRECTORY`);
|
||||||
|
};
|
||||||
|
|
||||||
|
let submodule: boolean = false;
|
||||||
|
let target: ?string = null;
|
||||||
|
|
||||||
|
for (const arg of argv) {
|
||||||
|
if (arg === "--submodule") {
|
||||||
|
submodule = true;
|
||||||
|
} else if (arg === "--no-submodule") {
|
||||||
|
submodule = false;
|
||||||
|
} else {
|
||||||
|
if (target == null) {
|
||||||
|
target = arg;
|
||||||
|
} else {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target == null) {
|
||||||
|
fail();
|
||||||
|
throw new Error("Unreachable"); // for Flow
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
submodule,
|
||||||
|
target: (target: string),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureEmptyDirectoryOrNonexistent(target: string) {
|
||||||
|
const files = (() => {
|
||||||
|
try {
|
||||||
|
return fs.readdirSync(target);
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code === "ENOTDIR") {
|
||||||
|
throw new Error("Target exists, but is not a directory.");
|
||||||
|
} else if (e.code === "ENOENT") {
|
||||||
|
// No problem. We'll create it.
|
||||||
|
return [];
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
if (files.length > 0) {
|
||||||
|
throw new Error("Target directory exists, but is nonempty.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
const args = parseArgs();
|
||||||
|
ensureEmptyDirectoryOrNonexistent(args.target);
|
||||||
|
if (args.submodule) {
|
||||||
|
createExampleSubmoduleRepo(args.target);
|
||||||
|
} else {
|
||||||
|
createExampleRepo(args.target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
Loading…
Reference in New Issue