Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/src/command/update/cmd.ts
3583 views
1
/*
2
* cmd.ts
3
*
4
* Copyright (C) 2021-2022 Posit Software, PBC
5
*/
6
import { Command } from "cliffy/command/mod.ts";
7
import { initYamlIntelligenceResourcesFromFilesystem } from "../../core/schema/utils.ts";
8
import { createTempContext } from "../../core/temp.ts";
9
import { installExtension } from "../../extension/install.ts";
10
11
import { info } from "../../deno_ral/log.ts";
12
import {
13
loadTools,
14
selectTool,
15
updateOrInstallTool,
16
} from "../../tools/tools-console.ts";
17
import { resolveCompatibleArgs } from "../remove/cmd.ts";
18
19
export const updateCommand = new Command()
20
.name("update")
21
.arguments("[target...]")
22
.option(
23
"--no-prompt",
24
"Do not prompt to confirm actions",
25
)
26
.option(
27
"--embed <extensionId>",
28
"Embed this extension within another extension (used when authoring extensions).",
29
)
30
.description(
31
"Updates an extension or global dependency.",
32
)
33
.example(
34
"Update extension (Github)",
35
"quarto update extension <gh-org>/<gh-repo>",
36
)
37
.example(
38
"Update extension (file)",
39
"quarto update extension <path-to-zip>",
40
)
41
.example(
42
"Update extension (url)",
43
"quarto update extension <url>",
44
)
45
.example(
46
"Update TinyTeX",
47
"quarto update tool tinytex",
48
)
49
.example(
50
"Update Chromium",
51
"quarto update tool chromium",
52
)
53
.example(
54
"Choose tool to update",
55
"quarto update tool",
56
)
57
.action(
58
async (
59
options: { prompt?: boolean; embed?: string },
60
...target: string[]
61
) => {
62
await initYamlIntelligenceResourcesFromFilesystem();
63
const temp = createTempContext();
64
try {
65
const resolved = resolveCompatibleArgs(target, "extension");
66
67
if (resolved.action === "extension") {
68
// Install an extension
69
if (resolved.name) {
70
await installExtension(
71
resolved.name,
72
temp,
73
options.prompt !== false,
74
options.embed,
75
);
76
} else {
77
info("Please provide an extension name, url, or path.");
78
}
79
} else if (resolved.action === "tool") {
80
// Install a tool
81
if (resolved.name) {
82
// Use the tool name
83
await updateOrInstallTool(resolved.name, "update", options.prompt);
84
} else {
85
// Not provided, give the user a list to choose from
86
const allTools = await loadTools();
87
if (allTools.filter((tool) => !tool.installed).length === 0) {
88
info("All tools are already installed.");
89
} else {
90
// Select which tool should be installed
91
const toolTarget = await selectTool(allTools, "update");
92
if (toolTarget) {
93
info("");
94
await updateOrInstallTool(toolTarget, "update");
95
}
96
}
97
}
98
} else {
99
// This is an unrecognized type option
100
info(
101
`Unrecognized option '${resolved.action}' - please choose 'tool' or 'extension'.`,
102
);
103
}
104
} finally {
105
temp.cleanup();
106
}
107
},
108
);
109
110