From 0d60f42ddc8d8c19f141bfe243e6526165cac5d5 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 13 Oct 2025 17:09:00 +0200 Subject: [PATCH 1/4] fix(cli-repl): add best guess about installation method to `buildInfo()` --- packages/build/src/build-info.ts | 18 +++++++++++--- packages/cli-repl/src/build-info.ts | 38 +++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/packages/build/src/build-info.ts b/packages/build/src/build-info.ts index e6109e1857..1ef5421661 100644 --- a/packages/build/src/build-info.ts +++ b/packages/build/src/build-info.ts @@ -1,6 +1,6 @@ import type { Config } from './config'; import { promises as fs } from 'fs'; -import os from 'os'; +import type { BuildInfo } from '../../cli-repl/src/build-info'; /** * Write data into a build config that is included in the executable but @@ -18,12 +18,22 @@ export async function writeBuildInfo( throw new Error('Segment key is required'); } - const info = { + const info: Omit< + BuildInfo, + | 'deps' + | 'installationMethod' + | 'runtimeArch' + | 'runtimePlatform' + | 'nodeVersion' + | 'opensslVersion' + | 'sharedOpenssl' + | 'runtimeGlibcVersion' + > = { segmentApiKey: config.segmentKey, version: config.version, distributionKind, - buildArch: os.arch(), - buildPlatform: os.platform(), + buildArch: process.arch, + buildPlatform: process.platform, buildTarget: config.executableOsId ?? 'unknown', buildTime: new Date().toISOString(), gitVersion: config.revision ?? null, diff --git a/packages/cli-repl/src/build-info.ts b/packages/cli-repl/src/build-info.ts index 99c138a4c9..559a147846 100644 --- a/packages/cli-repl/src/build-info.ts +++ b/packages/cli-repl/src/build-info.ts @@ -1,10 +1,12 @@ import os from 'os'; import { NodeDriverServiceProvider } from '@mongosh/service-provider-node-driver'; +import { promises as fs } from 'fs'; export interface BuildInfo { version: string; nodeVersion: string; distributionKind: 'unpackaged' | 'packaged' | 'compiled'; + installationMethod: 'npx' | 'homebrew' | 'linux-system-wide' | 'other'; runtimeArch: (typeof process)['arch']; runtimePlatform: (typeof process)['platform']; buildArch: (typeof process)['arch']; @@ -34,7 +36,36 @@ function getSystemArch(): (typeof process)['arch'] { : process.arch; } -export function baseBuildInfo(): Omit { +async function getInstallationMethod( + info: Pick +): Promise { + if (info.distributionKind !== 'compiled') { + if ( + process.env.npm_lifecycle_event === 'npx' && + process.env.npm_lifecycle_script?.includes('mongosh') + ) + return 'npx'; + if ( + __filename.match(/\bhomebrew\b/i) && + process.execPath.match(/\bhomebrew\b/) + ) + return 'homebrew'; + } else { + if ( + info.buildPlatform === 'linux' && + process.execPath.startsWith('/usr/bin/') && + (await fs.stat(process.execPath)).uid === 0 + ) { + return 'linux-system-wide'; // e.g. deb or rpm + } + } + return 'other'; +} + +export function baseBuildInfo(): Omit< + BuildInfo, + 'deps' | 'installationMethod' +> { const runtimeData = { nodeVersion: process.version, opensslVersion: process.versions.openssl, @@ -86,7 +117,10 @@ export async function buildInfo({ if (!withSegmentApiKey) { delete buildInfo.segmentApiKey; } - return buildInfo; + return { + installationMethod: await getInstallationMethod(buildInfo), + ...buildInfo, + }; } let cachedGlibcVersion: string | undefined | null = null; From 39744f88f44a5db419e938039c4eabf2c6f7875d Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Tue, 14 Oct 2025 16:12:05 +0200 Subject: [PATCH 2/4] fixup! fix(cli-repl): add best guess about installation method to `buildInfo()` --- packages/cli-repl/src/build-info.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli-repl/src/build-info.ts b/packages/cli-repl/src/build-info.ts index 559a147846..5d93e518c4 100644 --- a/packages/cli-repl/src/build-info.ts +++ b/packages/cli-repl/src/build-info.ts @@ -47,7 +47,7 @@ async function getInstallationMethod( return 'npx'; if ( __filename.match(/\bhomebrew\b/i) && - process.execPath.match(/\bhomebrew\b/) + process.execPath.match(/\bhomebrew\b/i) ) return 'homebrew'; } else { From 85769e333cd4209795a43843f5816c3403319eff Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 20 Oct 2025 12:18:32 +0200 Subject: [PATCH 3/4] fixup: revert build package changes due to circular dependency --- packages/build/src/build-info.ts | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/packages/build/src/build-info.ts b/packages/build/src/build-info.ts index 1ef5421661..e6109e1857 100644 --- a/packages/build/src/build-info.ts +++ b/packages/build/src/build-info.ts @@ -1,6 +1,6 @@ import type { Config } from './config'; import { promises as fs } from 'fs'; -import type { BuildInfo } from '../../cli-repl/src/build-info'; +import os from 'os'; /** * Write data into a build config that is included in the executable but @@ -18,22 +18,12 @@ export async function writeBuildInfo( throw new Error('Segment key is required'); } - const info: Omit< - BuildInfo, - | 'deps' - | 'installationMethod' - | 'runtimeArch' - | 'runtimePlatform' - | 'nodeVersion' - | 'opensslVersion' - | 'sharedOpenssl' - | 'runtimeGlibcVersion' - > = { + const info = { segmentApiKey: config.segmentKey, version: config.version, distributionKind, - buildArch: process.arch, - buildPlatform: process.platform, + buildArch: os.arch(), + buildPlatform: os.platform(), buildTarget: config.executableOsId ?? 'unknown', buildTime: new Date().toISOString(), gitVersion: config.revision ?? null, From 436d30841d94a117d88a088ab0e51edb6232f58a Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 20 Oct 2025 13:52:31 +0200 Subject: [PATCH 4/4] fixup: e2e test update --- packages/e2e-tests/test/e2e.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/e2e-tests/test/e2e.spec.ts b/packages/e2e-tests/test/e2e.spec.ts index 4d5d5405eb..c6029f2480 100644 --- a/packages/e2e-tests/test/e2e.spec.ts +++ b/packages/e2e-tests/test/e2e.spec.ts @@ -68,6 +68,7 @@ describe('e2e', function () { const data = JSON.parse(shell.output); expect(Object.keys(data)).to.deep.equal([ + 'installationMethod', 'version', 'distributionKind', 'buildArch',