From 5e7e80da3d600791b3c9a2387105a64bbdc66ef4 Mon Sep 17 00:00:00 2001 From: Kevin Cui Date: Mon, 30 Dec 2024 15:54:45 +0800 Subject: [PATCH] fix(install): installed version is not the one specified by the user Signed-off-by: Kevin Cui --- src/cmd/install.test.ts | 78 +++++++++++++++++++ src/cmd/install.ts | 6 ++ .../entry/package.oo.yaml | 5 ++ .../remote_storage/a-0.0.1/package.oo.yaml | 2 + .../remote_storage/a-0.0.2/package.oo.yaml | 2 + .../remote_storage/b-0.0.1/package.oo.yaml | 2 + .../remote_storage/b-0.0.2/package.oo.yaml | 2 + 7 files changed, 97 insertions(+) create mode 100644 tests/fixtures/install_deps_priority/entry/package.oo.yaml create mode 100644 tests/fixtures/install_deps_priority/remote_storage/a-0.0.1/package.oo.yaml create mode 100644 tests/fixtures/install_deps_priority/remote_storage/a-0.0.2/package.oo.yaml create mode 100644 tests/fixtures/install_deps_priority/remote_storage/b-0.0.1/package.oo.yaml create mode 100644 tests/fixtures/install_deps_priority/remote_storage/b-0.0.2/package.oo.yaml diff --git a/src/cmd/install.test.ts b/src/cmd/install.test.ts index 7d9e541..d626ba3 100644 --- a/src/cmd/install.test.ts +++ b/src/cmd/install.test.ts @@ -316,6 +316,84 @@ describe.sequential("install deps", () => { "d-0.0.1/package.oo.yaml", ])); }); + + it("manually specifying the version should be the highest priority", async (ctx) => { + const p = fixture("install_deps_priority"); + + // Publish `remote_storage` to registry + { + const remoteStorage = path.join(p, "remote_storage"); + await Promise.all([ + publish(path.join(remoteStorage, "a-0.0.1"), ctx.registry.endpoint, "fake-token"), + publish(path.join(remoteStorage, "a-0.0.2"), ctx.registry.endpoint, "fake-token"), + publish(path.join(remoteStorage, "b-0.0.1"), ctx.registry.endpoint, "fake-token"), + publish(path.join(remoteStorage, "b-0.0.2"), ctx.registry.endpoint, "fake-token"), + ]); + } + + // Create distDir + const distDir = await tempDir(); + + // Copy `entry` to workdir + await copyDir(path.join(p, "entry"), ctx.workdir); + + const result = await install({ + deps: [ + { + name: "a", + version: "0.0.2", + }, + { + name: "b", + version: "0.0.1", + }, + ], + save: true, + token: "fake-token", + workdir: ctx.workdir, + distDir, + registry: ctx.registry.endpoint, + }); + + expect(new Set(result.primaryDepNames)).toEqual(new Set([ + "a-0.0.2", + "b-0.0.1", + ])); + + expect(result.deps).toStrictEqual({ + "a-0.0.2": { + name: "a", + version: "0.0.2", + isAlreadyExist: false, + target: expect.any(String), + meta: expect.any(Object), + }, + "b-0.0.1": { + name: "b", + version: "0.0.1", + isAlreadyExist: false, + target: expect.any(String), + meta: expect.any(Object), + }, + }); + + const deps = (await generatePackageJson(ctx.workdir, false)).dependencies; + expect(deps).toEqual({ + a: "0.0.2", + b: "0.0.1", + }); + + const fileList = await fg.glob(`**/${ooPackageName}`, { + cwd: distDir, + onlyFiles: true, + absolute: false, + }); + + expect(new Set(fileList)).toEqual(new Set([ + "a-0.0.2/package.oo.yaml", + "b-0.0.1/package.oo.yaml", + ])); + }); }); describe.sequential("unknown type", () => { diff --git a/src/cmd/install.ts b/src/cmd/install.ts index 16baf64..f75286f 100644 --- a/src/cmd/install.ts +++ b/src/cmd/install.ts @@ -140,6 +140,12 @@ export async function installPackage(options: InstallPackageOptions): Promise { + // If there is a dependency, skip it + // Because it is manually specified by the user, it has the highest priority + if (options.deps.some(dep => dep.name === key)) { + return; + } + p.push((async (key) => { const dep: Dep = { name: key, diff --git a/tests/fixtures/install_deps_priority/entry/package.oo.yaml b/tests/fixtures/install_deps_priority/entry/package.oo.yaml new file mode 100644 index 0000000..9f7fbc7 --- /dev/null +++ b/tests/fixtures/install_deps_priority/entry/package.oo.yaml @@ -0,0 +1,5 @@ +name: entry +version: 0.0.1 +dependencies: + a: 0.0.1 + b: 0.0.2 diff --git a/tests/fixtures/install_deps_priority/remote_storage/a-0.0.1/package.oo.yaml b/tests/fixtures/install_deps_priority/remote_storage/a-0.0.1/package.oo.yaml new file mode 100644 index 0000000..06868f3 --- /dev/null +++ b/tests/fixtures/install_deps_priority/remote_storage/a-0.0.1/package.oo.yaml @@ -0,0 +1,2 @@ +name: a +version: 0.0.1 diff --git a/tests/fixtures/install_deps_priority/remote_storage/a-0.0.2/package.oo.yaml b/tests/fixtures/install_deps_priority/remote_storage/a-0.0.2/package.oo.yaml new file mode 100644 index 0000000..64f3a13 --- /dev/null +++ b/tests/fixtures/install_deps_priority/remote_storage/a-0.0.2/package.oo.yaml @@ -0,0 +1,2 @@ +name: a +version: 0.0.2 diff --git a/tests/fixtures/install_deps_priority/remote_storage/b-0.0.1/package.oo.yaml b/tests/fixtures/install_deps_priority/remote_storage/b-0.0.1/package.oo.yaml new file mode 100644 index 0000000..02eef56 --- /dev/null +++ b/tests/fixtures/install_deps_priority/remote_storage/b-0.0.1/package.oo.yaml @@ -0,0 +1,2 @@ +name: b +version: 0.0.1 diff --git a/tests/fixtures/install_deps_priority/remote_storage/b-0.0.2/package.oo.yaml b/tests/fixtures/install_deps_priority/remote_storage/b-0.0.2/package.oo.yaml new file mode 100644 index 0000000..02dbf56 --- /dev/null +++ b/tests/fixtures/install_deps_priority/remote_storage/b-0.0.2/package.oo.yaml @@ -0,0 +1,2 @@ +name: b +version: 0.0.2