Skip to content

Commit 117501c

Browse files
improve Swiftly installation progress notification (#1901)
1 parent 7975021 commit 117501c

File tree

3 files changed

+43
-28
lines changed

3 files changed

+43
-28
lines changed

src/commands/installSwiftlyToolchain.ts

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,31 +49,36 @@ export async function installSwiftlyToolchainWithProgress(
4949
await Swiftly.installToolchain(
5050
version,
5151
(progressData: SwiftlyProgressData) => {
52-
if (
53-
progressData.step?.percent !== undefined &&
54-
progressData.step.percent > lastProgress
55-
) {
56-
const increment = progressData.step.percent - lastProgress;
52+
if (progressData.complete) {
53+
// Swiftly will also verify the signature and extract the toolchain after the
54+
// "complete" message has been sent, but does not report progress for this.
55+
// Provide a suitable message in this case and reset the progress back to an
56+
// indeterminate state (0) since we don't know how long it will take.
5757
progress.report({
58-
increment,
59-
message:
60-
progressData.step.text ??
61-
`${progressData.step.percent}% complete`,
58+
message: "Verifying signature and extracting...",
59+
increment: -lastProgress,
6260
});
63-
lastProgress = progressData.step.percent;
61+
return;
6462
}
63+
if (!progressData.step) {
64+
return;
65+
}
66+
const increment = progressData.step.percent - lastProgress;
67+
progress.report({
68+
increment,
69+
message:
70+
progressData.step.text ?? `${progressData.step.percent}% complete`,
71+
});
72+
lastProgress = progressData.step.percent;
6573
},
6674
logger,
6775
token
6876
);
69-
70-
progress.report({
71-
increment: 100 - lastProgress,
72-
message: "Installation complete",
73-
});
7477
}
7578
);
7679

80+
void vscode.window.showInformationMessage(`Successfully installed Swift ${version}`);
81+
7782
return true;
7883
} catch (error) {
7984
const errorMessage = (error as Error).message;
@@ -83,7 +88,7 @@ export async function installSwiftlyToolchainWithProgress(
8388
return false;
8489
}
8590

86-
logger?.error(`Failed to install Swift ${version}: ${error}`);
91+
logger?.error(new Error(`Failed to install Swift ${version}`, { cause: error }));
8792
void vscode.window.showErrorMessage(`Failed to install Swift ${version}: ${error}`);
8893
return false;
8994
}

src/toolchain/swiftly.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,21 @@ const InUseVersionResult = z.object({
104104
version: z.string(),
105105
});
106106

107-
export interface SwiftlyProgressData {
108-
step?: {
109-
text?: string;
110-
timestamp?: number;
111-
percent?: number;
112-
};
113-
}
107+
const SwiftlyProgressData = z.object({
108+
complete: z.optional(
109+
z.object({
110+
success: z.boolean(),
111+
})
112+
),
113+
step: z.optional(
114+
z.object({
115+
text: z.string(),
116+
percent: z.number(),
117+
})
118+
),
119+
});
120+
121+
export type SwiftlyProgressData = z.infer<typeof SwiftlyProgressData>;
114122

115123
export interface PostInstallValidationResult {
116124
isValid: boolean;
@@ -510,10 +518,12 @@ export class Swiftly {
510518
}
511519

512520
try {
513-
const progressData = JSON.parse(line.trim()) as SwiftlyProgressData;
521+
const progressData = SwiftlyProgressData.parse(JSON.parse(line));
514522
progressCallback(progressData);
515-
} catch (err) {
516-
logger?.error(`Failed to parse progress line: ${err}`);
523+
} catch (error) {
524+
logger?.error(
525+
new Error(`Failed to parse Swiftly progress: ${line}`, { cause: error })
526+
);
517527
}
518528
});
519529

tsconfig-base.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"rootDir": ".",
66
"outDir": "dist",
77

8-
"lib": ["ES2021"],
9-
"target": "ES2020",
8+
"lib": ["ES2022"],
9+
"target": "ES2022",
1010
"module": "commonjs",
1111

1212
"strict": true,

0 commit comments

Comments
 (0)