mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Merge #3295
3295: Refactoring fetchArtifactReleaseInfo() r=matklad a=Veetaha https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unnecessary-type-assertion.md I fact this rule doesn't work when you put an unnecessary non-null assertion in an expression (as we had `(awat f())!`, but it is useful in other cases... Closes #3295, i guess... Co-authored-by: Veetaha <gerzoh1@gmail.com>
This commit is contained in:
commit
c4c15363fb
3 changed files with 42 additions and 21 deletions
|
@ -32,6 +32,7 @@ module.exports = {
|
||||||
"@typescript-eslint/semi": [
|
"@typescript-eslint/semi": [
|
||||||
"error",
|
"error",
|
||||||
"always"
|
"always"
|
||||||
]
|
],
|
||||||
|
"@typescript-eslint/no-unnecessary-type-assertion": "error"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,41 +4,61 @@ import { log } from "../util";
|
||||||
|
|
||||||
const GITHUB_API_ENDPOINT_URL = "https://api.github.com";
|
const GITHUB_API_ENDPOINT_URL = "https://api.github.com";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the release with `releaseTag` (or just latest release when not specified)
|
* Fetches the release with `releaseTag` from GitHub `repo` and
|
||||||
* from GitHub `repo` and returns metadata about `artifactFileName` shipped with
|
* returns metadata about `artifactFileName` shipped with
|
||||||
* this release or `null` if no such artifact was published.
|
* this release.
|
||||||
|
*
|
||||||
|
* @throws Error upon network failure or if no such repository, release, or artifact exists.
|
||||||
*/
|
*/
|
||||||
export async function fetchArtifactReleaseInfo(
|
export async function fetchArtifactReleaseInfo(
|
||||||
repo: GithubRepo, artifactFileName: string, releaseTag?: string
|
repo: GithubRepo,
|
||||||
): Promise<null | ArtifactReleaseInfo> {
|
artifactFileName: string,
|
||||||
|
releaseTag: string
|
||||||
|
): Promise<ArtifactReleaseInfo> {
|
||||||
|
|
||||||
const repoOwner = encodeURIComponent(repo.owner);
|
const repoOwner = encodeURIComponent(repo.owner);
|
||||||
const repoName = encodeURIComponent(repo.name);
|
const repoName = encodeURIComponent(repo.name);
|
||||||
|
|
||||||
const apiEndpointPath = releaseTag
|
const apiEndpointPath = `/repos/${repoOwner}/${repoName}/releases/tags/${releaseTag}`;
|
||||||
? `/repos/${repoOwner}/${repoName}/releases/tags/${releaseTag}`
|
|
||||||
: `/repos/${repoOwner}/${repoName}/releases/latest`;
|
|
||||||
|
|
||||||
const requestUrl = GITHUB_API_ENDPOINT_URL + apiEndpointPath;
|
const requestUrl = GITHUB_API_ENDPOINT_URL + apiEndpointPath;
|
||||||
|
|
||||||
// We skip runtime type checks for simplicity (here we cast from `any` to `GithubRelease`)
|
|
||||||
|
|
||||||
log.debug("Issuing request for released artifacts metadata to", requestUrl);
|
log.debug("Issuing request for released artifacts metadata to", requestUrl);
|
||||||
|
|
||||||
// FIXME: handle non-ok response
|
const response = await fetch(requestUrl, { headers: { Accept: "application/vnd.github.v3+json" } });
|
||||||
const response: GithubRelease = await fetch(requestUrl, {
|
|
||||||
headers: { Accept: "application/vnd.github.v3+json" }
|
|
||||||
})
|
|
||||||
.then(res => res.json());
|
|
||||||
|
|
||||||
const artifact = response.assets.find(artifact => artifact.name === artifactFileName);
|
if (!response.ok) {
|
||||||
|
log.error("Error fetching artifact release info", {
|
||||||
|
requestUrl,
|
||||||
|
releaseTag,
|
||||||
|
artifactFileName,
|
||||||
|
response: {
|
||||||
|
headers: response.headers,
|
||||||
|
status: response.status,
|
||||||
|
body: await response.text(),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (!artifact) return null;
|
throw new Error(
|
||||||
|
`Got response ${response.status} when trying to fetch ` +
|
||||||
|
`"${artifactFileName}" artifact release info for ${releaseTag} release`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We skip runtime type checks for simplicity (here we cast from `any` to `GithubRelease`)
|
||||||
|
const release: GithubRelease = await response.json();
|
||||||
|
|
||||||
|
const artifact = release.assets.find(artifact => artifact.name === artifactFileName);
|
||||||
|
|
||||||
|
if (!artifact) {
|
||||||
|
throw new Error(
|
||||||
|
`Artifact ${artifactFileName} was not found in ${release.name} release!`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
releaseName: response.name,
|
releaseName: release.name,
|
||||||
downloadUrl: artifact.browser_download_url
|
downloadUrl: artifact.browser_download_url
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
|
||||||
|
|
||||||
async function downloadServer(source: BinarySource.GithubRelease): Promise<boolean> {
|
async function downloadServer(source: BinarySource.GithubRelease): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
const releaseInfo = (await fetchArtifactReleaseInfo(source.repo, source.file, source.version))!;
|
const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.version);
|
||||||
|
|
||||||
await downloadArtifact(releaseInfo, source.file, source.dir, "language server");
|
await downloadArtifact(releaseInfo, source.file, source.dir, "language server");
|
||||||
await setServerVersion(source.storage, releaseInfo.releaseName);
|
await setServerVersion(source.storage, releaseInfo.releaseName);
|
||||||
|
|
Loading…
Reference in a new issue