-
Notifications
You must be signed in to change notification settings - Fork 61
/
Copy pathdeployctl.ts
executable file
·122 lines (111 loc) · 3.86 KB
/
deployctl.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env -S deno run --allow-read --allow-write --allow-env --allow-net --allow-run
// Copyright 2021 Deno Land Inc. All rights reserved. MIT license.
import { semverGreaterThanOrEquals } from "./deps.ts";
import { Args, parseArgs } from "./src/args.ts";
import { error } from "./src/error.ts";
import deploySubcommand from "./src/subcommands/deploy.ts";
import upgradeSubcommand from "./src/subcommands/upgrade.ts";
import logsSubcommand from "./src/subcommands/logs.ts";
import { MINIMUM_DENO_VERSION, VERSION } from "./src/version.ts";
import { fetchReleases, getConfigPaths } from "./src/utils/info.ts";
import configFile from "./src/config_file.ts";
import inferMissingConfig from "./src/config_inference.ts";
import { wait } from "./src/utils/spinner.ts";
const help = `deployctl ${VERSION}
Command line tool for Deno Deploy.
SUBCOMMANDS:
deploy Deploy a script with static files to Deno Deploy
upgrade Upgrade deployctl to the given version (defaults to latest)
logs View logs for the given project
Use 'deployctl <SUBCOMMAND> -h' for detailed help on each subcommand.
`;
if (!semverGreaterThanOrEquals(Deno.version.deno, MINIMUM_DENO_VERSION)) {
error(
`The Deno version you are using is too old. Please update to Deno ${MINIMUM_DENO_VERSION} or later. To do this run \`deno upgrade\`.`,
);
}
const args = parseArgs(Deno.args);
if (Deno.isatty(Deno.stdin.rid)) {
let latestVersion;
// Get the path to the update information json file.
const { updatePath } = getConfigPaths();
// Try to read the json file.
const updateInfoJson = await Deno.readTextFile(updatePath).catch((error) => {
if (error.name == "NotFound") return null;
console.error(error);
});
if (updateInfoJson) {
const updateInfo = JSON.parse(updateInfoJson) as {
lastFetched: number;
latest: number;
};
const moreThanADay =
Math.abs(Date.now() - updateInfo.lastFetched) > 24 * 60 * 60 * 1000;
// Fetch the latest release if it has been more than a day since the last
// time the information about new version is fetched.
if (moreThanADay) {
fetchReleases();
} else {
latestVersion = updateInfo.latest;
}
} else {
fetchReleases();
}
// If latestVersion is set we need to inform the user about a new release.
if (
latestVersion &&
!(semverGreaterThanOrEquals(VERSION, latestVersion.toString()))
) {
console.log(
[
`A new release of deployctl is available: ${VERSION} -> ${latestVersion}`,
"To upgrade, run `deployctl upgrade`",
`https://github.com/denoland/deployctl/releases/tag/${latestVersion}\n`,
].join("\n"),
);
}
}
const subcommand = args._.shift();
switch (subcommand) {
case "deploy":
await setDefaultsFromConfigFile(args);
await inferMissingConfig(args);
await deploySubcommand(args);
break;
case "upgrade":
await setDefaultsFromConfigFile(args);
await upgradeSubcommand(args);
break;
case "logs":
await setDefaultsFromConfigFile(args);
await logsSubcommand(args);
break;
default:
if (args.version) {
console.log(`deployctl ${VERSION}`);
Deno.exit(0);
}
if (args.help) {
console.log(help);
Deno.exit(0);
}
console.error(help);
Deno.exit(1);
}
async function setDefaultsFromConfigFile(args: Args) {
const loadFileConfig = !args.version && !args.help;
if (loadFileConfig) {
const config = await configFile.read(
args.config ?? configFile.cwdOrAncestors(),
);
if (config === null && args.config !== undefined && !args["save-config"]) {
error(`Could not find or read the config file '${args.config}'`);
}
if (config !== null) {
wait("").start().info(`Using config file '${config.path()}'`);
config.useAsDefaultFor(args);
// Set the effective config path for the rest of the execution
args.config = config.path();
}
}
}