diff --git a/tools/tsp-client/CHANGELOG.md b/tools/tsp-client/CHANGELOG.md index 6c738b3ddeb..3ef73ac6028 100644 --- a/tools/tsp-client/CHANGELOG.md +++ b/tools/tsp-client/CHANGELOG.md @@ -1,5 +1,9 @@ # Release +## 2024-05-29 - 0.8.0 + +- Create unique directories for sparse spec checkout. + ## 2024-05-20 - 0.7.1 - Added `--no-prompt` flag to skip the output directory confirmation prompt. diff --git a/tools/tsp-client/package-lock.json b/tools/tsp-client/package-lock.json index fd86269a929..d89d76321a1 100644 --- a/tools/tsp-client/package-lock.json +++ b/tools/tsp-client/package-lock.json @@ -1,12 +1,12 @@ { "name": "@azure-tools/typespec-client-generator-cli", - "version": "0.7.1", + "version": "0.8.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@azure-tools/typespec-client-generator-cli", - "version": "0.7.1", + "version": "0.8.0", "license": "MIT", "dependencies": { "@azure/core-rest-pipeline": "^1.12.0", @@ -1152,20 +1152,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", diff --git a/tools/tsp-client/package.json b/tools/tsp-client/package.json index 5b3259c06c3..ea28d42a856 100644 --- a/tools/tsp-client/package.json +++ b/tools/tsp-client/package.json @@ -1,6 +1,6 @@ { "name": "@azure-tools/typespec-client-generator-cli", - "version": "0.7.1", + "version": "0.8.0", "description": "A tool to generate Azure SDKs from TypeSpec", "main": "dist/index.js", "homepage": "https://github.com/Azure/azure-sdk-tools/tree/main/tools/tsp-client#readme", diff --git a/tools/tsp-client/src/index.ts b/tools/tsp-client/src/index.ts index 41bd5a6da38..452e9969871 100644 --- a/tools/tsp-client/src/index.ts +++ b/tools/tsp-client/src/index.ts @@ -3,12 +3,12 @@ import { createTempDirectory, removeDirectory, readTspLocation, getEmitterFromRe import { Logger, printBanner, enableDebug, printVersion } from "./log.js"; import { TspLocation, compileTsp, discoverMainFile, resolveTspConfigUrl } from "./typespec.js"; import { getOptions } from "./options.js"; -import { mkdir, writeFile, cp, readFile, access, stat, rename, unlink } from "node:fs/promises"; +import { mkdir, writeFile, cp, readFile, stat, rename, unlink } from "node:fs/promises"; import { addSpecFiles, checkoutCommit, cloneRepo, getRepoRoot, sparseCheckout } from "./git.js"; import { doesFileExist } from "./network.js"; import { parse as parseYaml } from "yaml"; import { joinPaths, normalizePath, resolvePath } from "@typespec/compiler"; -import { formatAdditionalDirectories, getAdditionalDirectoryName } from "./utils.js"; +import { formatAdditionalDirectories, getAdditionalDirectoryName, makeSparseSpecDir } from "./utils.js"; import { resolve } from "node:path"; import { config as dotenvConfig } from "dotenv"; @@ -33,8 +33,7 @@ async function sdkInit( // URL scenario const repoRoot = await getRepoRoot(outputDir); const resolvedConfigUrl = resolveTspConfigUrl(config); - const cloneDir = joinPaths(repoRoot, "..", "sparse-spec"); - await mkdir(cloneDir, { recursive: true }); + const cloneDir = await makeSparseSpecDir(repoRoot); Logger.debug(`Created temporary sparse-checkout directory ${cloneDir}`); Logger.debug(`Cloning repo to ${cloneDir}`); await cloneRepo(outputDir, cloneDir, `https://github.com/${resolvedConfigUrl.repo}.git`); @@ -152,8 +151,7 @@ async function syncTspFiles(outputDir: string, localSpecRepo?: string) { await cp(joinPaths(localSpecRepoRoot, dir), joinPaths(tempRoot, getAdditionalDirectoryName(dir)), { recursive: true, filter: filter }); } } else { - const cloneDir = joinPaths(repoRoot, "..", "sparse-spec"); - await mkdir(cloneDir, { recursive: true }); + const cloneDir = await makeSparseSpecDir(repoRoot); Logger.debug(`Created temporary sparse-checkout directory ${cloneDir}`); Logger.debug(`Cloning repo to ${cloneDir}`); await cloneRepo(tempRoot, cloneDir, `https://github.com/${tspLocation.repo}.git`); @@ -292,16 +290,6 @@ async function main() { } const repoRoot = await getRepoRoot(rootUrl); - try { - // FIXME: this is a workaround meanwhile we fix the issue with failing to delete the sparse-spec directory - // Tracking issue: https://github.com/Azure/azure-sdk-tools/issues/7636 - access(joinPaths(repoRoot, "..", "sparse-spec")).then(() => { - Logger.debug("Deleting existing sparse-spec directory"); - removeDirectory(joinPaths(repoRoot, "..", "sparse-spec")); - }).catch(() => {}); - } catch (err) { - Logger.debug(`Error occurred while attempting to remove sparse-spec directory: ${err}`); - } if (options.generateLockFile) { await generateLockFile(rootUrl, repoRoot); diff --git a/tools/tsp-client/src/utils.ts b/tools/tsp-client/src/utils.ts index 32d021c32aa..7633d12aba5 100644 --- a/tools/tsp-client/src/utils.ts +++ b/tools/tsp-client/src/utils.ts @@ -1,4 +1,6 @@ -import { normalizeSlashes } from "@typespec/compiler"; +import { joinPaths, normalizeSlashes } from "@typespec/compiler"; +import { randomUUID } from "node:crypto"; +import { mkdir } from "node:fs/promises"; export function formatAdditionalDirectories(additionalDirectories?: string[]): string { let additionalDirOutput = ""; @@ -19,3 +21,9 @@ export function getAdditionalDirectoryName(dir: string): string { } return finalDirName; } + +export async function makeSparseSpecDir(repoRoot: string): Promise { + const spareSpecPath = joinPaths(repoRoot, "..", `sparse-spec${randomUUID()}`); + await mkdir(spareSpecPath, { recursive: true }); + return spareSpecPath; +}