-
Notifications
You must be signed in to change notification settings - Fork 308
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: Docker関連ファイルの削除とTyposのスクリプトの追加 (#2239)
* [add] #2206 typosのバイナリをダウンロードするスクリプトが必要なため * [fix] #2206 windowsにてTyposのバイナリデータがダウンロードと解凍・削除されない不具合を修正した * [fix] #2206 cross-envを使用しているためプラットフォームの違いを吸収するコマンドに修正した * [fix] #2206 ダウンロードしたいバイナリがすでにある時に再度ダウンロードされるのではなく、スキップされるように修正した * [fix] #2206 もしバイナリが既に存在する場合、ダウンロードをスキップするように修正した * [fix] #2206 macosのCPUアーキテクチャの違いを考慮し最適なバイナリをダウンロードするように修正した * [document] #2206 cargoを通したインストールではなくなったためそれに応じたドキュメントに修正した * [delete] #2206 Docker関連のファイルは使用しないため * [fix] #2206 バイナリをダウンロードする際に使用する渡すURLのオブジェクトを文字列にすることで無駄な処理を削減した * [fix] #2206 Github以外に公開している場合のバイナリにも対処し、かつ、ダウンロードする処理を共通化して冗長な部分を削除した * [fix] #2206 空行を入れていなかったため修正した * [delete] #2206 typosは手動で行うため削除する * [fix] #2206 linuxで.tar.gzファイルが解凍されない不具合を修正した * [fix] #2206 タイポがあったため修正した * [fix] #2206 定数であるのにコンスタントケースになっていないため修正した * [fix] #2206 条件を間違えていたため修正した * [fix] #2206 typosのCIが実行できていないため追加した * [fix] #2206 TYPOS_URLSがstringまたはobjectを返すことになるため、型ガードを追加しなければならないことを修正した * [fix] #2206 curlコマンドがない環境のためにnode-fetchを使用する方法に修正した * [fix] #2206 変数であるのに定数として定義していたため修正した * [fix] #2206 markdownlintのCIでエラーが出るため、typosのmarkdownファイルが存在するdocディレクトリとREADME.mdを削除するスクリプトを追加した * Apply suggestions from code review * Apply suggestions from code review --------- Co-authored-by: Hiroshiba <[email protected]>
- Loading branch information
Showing
9 changed files
with
206 additions
and
78 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -231,3 +231,4 @@ jobs: | |
- run: npm run typecheck | ||
- run: npm run lint | ||
- run: npm run markdownlint | ||
- run: npm run typos |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,197 @@ | ||
// @ts-check | ||
/** | ||
* OSに合ったtyposのバイナリをダウンロードするスクリプト。 | ||
*/ | ||
const { exec } = require("child_process"); | ||
const { promisify } = require("util"); | ||
const { platform, arch } = require("os"); | ||
const { join, resolve } = require("path"); | ||
const { | ||
mkdirSync, | ||
existsSync, | ||
unlinkSync, | ||
createWriteStream, | ||
rmSync, | ||
} = require("fs"); | ||
const fetch = require("node-fetch"); | ||
|
||
// OS名を定義するオブジェクト | ||
const OS = { | ||
LINUX: "linux", | ||
MACOS: "darwin", | ||
WINDOWS: "win32", | ||
}; | ||
// CPUアーキテクチャ名を定義するオブジェクト | ||
const CPU_ARCHITECTURE = { | ||
X86_64: "x86_64", | ||
ARM: "aarch64", | ||
}; | ||
// ダウンロードしたバイナリを格納するディレクトリ | ||
const BINARY_BASE_PATH = resolve(__dirname, "vendored"); | ||
// typosのバイナリのパス | ||
const TYPOS_BINARY_PATH = resolve(BINARY_BASE_PATH, "typos"); | ||
// 各OSとアーキテクチャに対応するtyposバイナリのダウンロードURL | ||
const TYPOS_URLS = { | ||
[OS.MACOS]: { | ||
[CPU_ARCHITECTURE.ARM]: | ||
"https://github.com/crate-ci/typos/releases/download/v1.21.0/typos-v1.21.0-aarch64-apple-darwin.tar.gz", | ||
[CPU_ARCHITECTURE.X86_64]: | ||
"https://github.com/crate-ci/typos/releases/download/v1.21.0/typos-v1.21.0-x86_64-apple-darwin.tar.gz", | ||
}, | ||
[OS.LINUX]: { | ||
[CPU_ARCHITECTURE.X86_64]: | ||
"https://github.com/crate-ci/typos/releases/download/v1.21.0/typos-v1.21.0-x86_64-unknown-linux-musl.tar.gz", | ||
}, | ||
[OS.WINDOWS]: { | ||
[CPU_ARCHITECTURE.X86_64]: | ||
"https://github.com/crate-ci/typos/releases/download/v1.21.0/typos-v1.21.0-x86_64-pc-windows-msvc.zip", | ||
}, | ||
}; | ||
|
||
// 動作環境でのOSとCPUアーキテクチャ | ||
const currentOS = platform(); | ||
const currentCpuArchitecture = | ||
arch() === "arm64" ? CPU_ARCHITECTURE.ARM : CPU_ARCHITECTURE.X86_64; | ||
// 7zバイナリのパス | ||
// WARNING: linuxとmacで異なるバイナリでないとエラーが出る | ||
const sevenZipBinaryName = | ||
currentOS === OS.WINDOWS | ||
? "7za.exe" | ||
: currentOS === OS.MACOS | ||
? "7zz" | ||
: "7zzs"; | ||
const sevenZipBinaryPath = join(BINARY_BASE_PATH, "7z", sevenZipBinaryName); | ||
// 非同期でOSコマンドを処理するための関数 | ||
const execAsync = promisify(exec); | ||
|
||
/** | ||
* コマンドを実行し、その進行状況を出力するヘルパー関数 | ||
* @param {Object} params - コマンド実行のパラメータ | ||
* @param {string} params.command - 実行するシェルコマンド | ||
* @param {string} params.description - コマンドの説明を表示するテキスト | ||
*/ | ||
async function runCommand({ command, description }) { | ||
console.log(`Running: ${description}`); | ||
try { | ||
await execAsync(command); | ||
} catch (error) { | ||
console.error(`An error occurred: ${error.message}`); | ||
throw error; | ||
} | ||
} | ||
|
||
/** | ||
* 現在のOSとアーキテクチャに基づいてバイナリのダウンロード先URLを定数のオブジェクトから取得する関数 | ||
* @returns {string} バイナリをダウンロードするためのURL | ||
*/ | ||
function getBinaryURL() { | ||
const url = TYPOS_URLS[currentOS][currentCpuArchitecture]; | ||
|
||
if (!url) { | ||
throw new Error( | ||
`Unsupported OS or architecture: ${currentOS}, ${currentCpuArchitecture}`, | ||
); | ||
} | ||
|
||
return url; | ||
} | ||
|
||
/** | ||
* バイナリをダウンロードして解凍し、実行権限を付与する関数 | ||
* @param {Object} params - バイナリの情報を含むオブジェクト | ||
* @param {string} params.url - ダウンロード先URL | ||
*/ | ||
async function downloadAndUnarchive({ url }) { | ||
const compressedFilePath = `${TYPOS_BINARY_PATH}/typos${currentOS === OS.WINDOWS ? ".zip" : ".tar.gz"}`; | ||
|
||
// バイナリディレクトリが存在する場合ダウンロードをスキップし、存在しない場合はディレクトリを作成する | ||
if (existsSync(TYPOS_BINARY_PATH)) { | ||
console.log(`typos already downloaded`); | ||
return; | ||
} else { | ||
mkdirSync(TYPOS_BINARY_PATH, { recursive: true }); | ||
} | ||
|
||
// node-fetchでバイナリをメモリ上にダウンロードした後、ローカルに保存する | ||
const response = await fetch(url); | ||
if (!response.ok) { | ||
throw new Error(`Failed to download binary: ${response.statusText}`); | ||
} | ||
|
||
const fileStream = createWriteStream(compressedFilePath); | ||
await new Promise((resolve, reject) => { | ||
response.body.pipe(fileStream); | ||
response.body.on("error", reject); | ||
fileStream.on("finish", resolve); | ||
}); | ||
|
||
if (currentOS === OS.WINDOWS) { | ||
// Windows用のZIPファイルを解凍 | ||
await runCommand({ | ||
command: `"${sevenZipBinaryPath}" x ${compressedFilePath} -o${TYPOS_BINARY_PATH}`, | ||
description: `Extracting typos binary`, | ||
}); | ||
} else { | ||
const archiveFilePath = `${TYPOS_BINARY_PATH}/typos.tar`; | ||
|
||
// .tar.gzファイルの解凍 | ||
await runCommand({ | ||
command: `"${sevenZipBinaryPath}" e ${compressedFilePath} -o${TYPOS_BINARY_PATH} -y`, | ||
description: `Extracting typos.tar.gz file`, | ||
}); | ||
|
||
// tarファイルの解凍 | ||
await runCommand({ | ||
command: `"${sevenZipBinaryPath}" x ${archiveFilePath} -o${TYPOS_BINARY_PATH} -y`, | ||
description: `Extracting typos.tar file`, | ||
}); | ||
|
||
// バイナリに実行権限を付与 | ||
await runCommand({ | ||
command: `chmod +x ${TYPOS_BINARY_PATH}/typos`, | ||
description: `Granting execute permissions to typos binary`, | ||
}); | ||
|
||
// 解凍後にアーカイブファイルを削除 | ||
unlinkSync(archiveFilePath); | ||
} | ||
|
||
// 解凍後に圧縮ファイルを削除 | ||
unlinkSync(compressedFilePath); | ||
} | ||
|
||
/** | ||
* /build/vendored/typos ディレクトリから不要なファイルとディレクトリを削除する関数 | ||
*/ | ||
function cleanupTyposDirectory() { | ||
const typosDocDirPath = join(TYPOS_BINARY_PATH, "doc"); | ||
const typosReadmeFilePath = join(TYPOS_BINARY_PATH, "README.md"); | ||
|
||
// doc ディレクトリの削除 | ||
if (existsSync(typosDocDirPath)) { | ||
rmSync(typosDocDirPath, { recursive: true }); | ||
console.log(`Deleted directory: ${typosDocDirPath}`); | ||
} | ||
|
||
// README.md ファイルの削除 | ||
if (existsSync(typosReadmeFilePath)) { | ||
unlinkSync(typosReadmeFilePath); | ||
console.log(`Deleted file: ${typosReadmeFilePath}`); | ||
} | ||
} | ||
|
||
/** | ||
* OSに応じてバイナリデータを処理する関数 | ||
*/ | ||
async function main() { | ||
const url = getBinaryURL(); | ||
await downloadAndUnarchive({ url }); | ||
|
||
// 不要なファイルとディレクトリを削除 | ||
cleanupTyposDirectory(); | ||
} | ||
|
||
// main関数実行 | ||
(async () => { | ||
await main(); | ||
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters