From 2fb3a730a2529d087dd02f579c53c3f092bf405d Mon Sep 17 00:00:00 2001 From: vltbaudbot <264001112+vltbaudbot@users.noreply.github.com> Date: Mon, 28 Sep 2026 06:09:36 +0000 Subject: [PATCH 1/2] feat: add upm as a new package manager to benchmarks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add upm (https://upm.sh/) — a fast, tiny package manager for the npm registry written in TypeScript — to the benchmark suite. Changes: - scripts/setup.sh: install upm globally via npm, log its version - scripts/variations/common.sh: add BENCH_INCLUDE/SETUP/INSTALL/COMMAND variables for upm - scripts/variations/*.sh: add upm entries to all 14 variation scripts (clean, cache, lockfile, ci, build, run, etc.) - scripts/clean-helpers.sh: add clean_upm_cache (wipes ~/.upm/), add upm.lock to lockfile cleanup - scripts/package-count.sh: detect upm.lock for PM inference, handle node_modules/.upm/ layout - scripts/generate-chart.js: add upm color (#18b583) - bench: add upm to AVAILABLE_PMS list - .github/workflows/benchmark.yaml: add upm to CI matrix defaults - app/src/types/chart-data.ts: add upm to all type unions and interfaces - app/src/components/icons/upm.tsx: new icon component - app/src/components/icons/index.ts: export upm icon - app/src/lib/get-icons.ts: map upm to its icon - app/src/lib/utils.ts: include upm in PM filter list - app/src/hooks/use-history-data.ts: include upm in history PM list - README.md: mention upm in supported tools Co-authored-by: Darcy Clarke --- .github/workflows/benchmark.yaml | 6 +- README.md | 4 +- app/src/components/icons/index.ts | 1 + app/src/components/icons/upm.tsx | 70 +++++++++++++++++++ app/src/hooks/use-history-data.ts | 1 + app/src/lib/get-icons.ts | 2 + app/src/lib/utils.ts | 1 + app/src/types/chart-data.ts | 9 +++ bench | 1 + scripts/clean-helpers.sh | 14 ++++ scripts/generate-chart.js | 1 + scripts/package-count.sh | 14 +++- scripts/setup.sh | 9 ++- scripts/variations/build-cache.sh | 6 ++ scripts/variations/build.sh | 5 ++ .../variations/cache+lockfile+node_modules.sh | 4 +- scripts/variations/cache+lockfile.sh | 4 +- scripts/variations/cache+node_modules.sh | 4 +- scripts/variations/cache.sh | 4 +- scripts/variations/ci.sh | 8 ++- scripts/variations/clean.sh | 4 +- scripts/variations/common.sh | 14 ++-- scripts/variations/lockfile+node_modules.sh | 4 +- scripts/variations/lockfile.sh | 4 +- scripts/variations/node_modules.sh | 4 +- scripts/variations/run.sh | 5 ++ 26 files changed, 184 insertions(+), 19 deletions(-) create mode 100644 app/src/components/icons/upm.tsx diff --git a/.github/workflows/benchmark.yaml b/.github/workflows/benchmark.yaml index f9b6e595ca..07f4320f99 100644 --- a/.github/workflows/benchmark.yaml +++ b/.github/workflows/benchmark.yaml @@ -11,7 +11,7 @@ on: default: '["clean", "node_modules", "cache", "cache+node_modules", "cache+lockfile", "cache+lockfile+node_modules", "ci", "lockfile", "lockfile+node_modules", "registry-clean", "registry-lockfile"]' binaries: description: "The binaries to run the benchmarks on" - default: '"npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,nx,turbo,vp,node"' + default: '"npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,upm,nx,turbo,vp,node"' warmup: description: "The number of warmup runs on each benchmark" default: "2" @@ -94,7 +94,7 @@ jobs: if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then [[ "$IN_FIXTURES" == '["next", "astro", "vue", "svelte", "large", "babylon"]' ]] || partial=true [[ "$IN_VARIATIONS" == '["clean", "node_modules", "cache", "cache+node_modules", "cache+lockfile", "cache+lockfile+node_modules", "ci", "lockfile", "lockfile+node_modules", "registry-clean", "registry-lockfile"]' ]] || partial=true - [[ "$IN_BINARIES" == '"npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,nx,turbo,vp,node"' ]] || partial=true + [[ "$IN_BINARIES" == '"npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,upm,nx,turbo,vp,node"' ]] || partial=true [[ "$IN_WARMUP" == "2" ]] || partial=true [[ "$IN_RUNS" == "5" ]] || partial=true fi @@ -128,7 +128,7 @@ jobs: env: # rc.21 is advertised by the canary channel but its Linux ARM64 npm binary is missing. BENCH_ZPM_VERSION: "6.0.0-rc.20" - BENCH_INCLUDE: ${{ fromJson(inputs.binaries || '"npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,nx,turbo,vp,node"') }} + BENCH_INCLUDE: ${{ fromJson(inputs.binaries || '"npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,upm,nx,turbo,vp,node"') }} BENCH_WARMUP: ${{ (github.event_name == 'push' && github.ref != 'refs/heads/main') && '1' || (inputs.warmup || '2') }} BENCH_RUNS: ${{ (github.event_name == 'push' && github.ref != 'refs/heads/main') && '1' || (inputs.runs || '5') }} steps: diff --git a/README.md b/README.md index b4dc5610e0..8bdbad9dfd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Package Manager Benchmarks -This repo contains a suite of fixtures & tools to track the performance of package managers. We benchmark various Node.js package managers (npm, yarn, pnpm, berry, deno, bun, vlt, aube, nx, turbo) across different project types and scenarios. +This repo contains a suite of fixtures & tools to track the performance of package managers. We benchmark various Node.js package managers (npm, yarn, pnpm, berry, deno, bun, vlt, aube, upm, nx, turbo) across different project types and scenarios. ## Environment @@ -68,6 +68,7 @@ The installation tests we run today mimic a matrix of different variations (cold - `deno` - `bun` - `aube` +- `upm` #### Supported Registries @@ -110,6 +111,7 @@ This suite also tests the performance of basic script execution (ex. `npm run fo - `deno` - `bun` - `aube` +- `upm` - `node` - `turborepo` - `nx` diff --git a/app/src/components/icons/index.ts b/app/src/components/icons/index.ts index 86e76885db..9f5119d8be 100644 --- a/app/src/components/icons/index.ts +++ b/app/src/components/icons/index.ts @@ -29,5 +29,6 @@ export * from "./svelte.tsx"; export * from "./turbo.tsx"; export * from "./vue.tsx"; export * from "./yarn.tsx"; +export * from "./upm.tsx"; export * from "./vp.tsx"; export * from "./zpm.tsx"; diff --git a/app/src/components/icons/upm.tsx b/app/src/components/icons/upm.tsx new file mode 100644 index 0000000000..9ab2f69083 --- /dev/null +++ b/app/src/components/icons/upm.tsx @@ -0,0 +1,70 @@ +import React, { forwardRef } from "react"; +import type { LucideProps } from "lucide-react"; + +// upm icon — dark version for light mode backgrounds +const UpmDark = forwardRef( + ({ size = 24, className, ...props }, ref) => ( + + + + + ), +); +UpmDark.displayName = "UpmDark"; + +// upm icon — light version for dark mode backgrounds +const UpmLight = forwardRef( + ({ size = 24, className, ...props }, ref) => ( + + + + + ), +); +UpmLight.displayName = "UpmLight"; + +// Combined upm icon that switches between light/dark variants +export const Upm = forwardRef( + ({ size = 24, className, ...props }, ref) => ( + } className="inline-flex"> + + + + ), +); + +Upm.displayName = "Upm"; diff --git a/app/src/hooks/use-history-data.ts b/app/src/hooks/use-history-data.ts index 7a19274f68..b546583e9c 100644 --- a/app/src/hooks/use-history-data.ts +++ b/app/src/hooks/use-history-data.ts @@ -18,6 +18,7 @@ const PACKAGE_MANAGERS = [ "bun", "vlt", "aube", + "upm", "nx", "turbo", "vp", diff --git a/app/src/lib/get-icons.ts b/app/src/lib/get-icons.ts index f2e4e01a2a..6f8e26abde 100644 --- a/app/src/lib/get-icons.ts +++ b/app/src/lib/get-icons.ts @@ -17,6 +17,7 @@ import { Pnpm, Svelte, Turbo, + Upm, Vp, Vue, Yarn, @@ -40,6 +41,7 @@ const packageManagerMap: Partial> = { pnpm: Pnpm, pacquet: Pnpm, turbo: Turbo, + upm: Upm, vp: Vp, yarn: Yarn, berry: Berry, diff --git a/app/src/lib/utils.ts b/app/src/lib/utils.ts index 1e615c0b82..ae9ab102de 100644 --- a/app/src/lib/utils.ts +++ b/app/src/lib/utils.ts @@ -259,6 +259,7 @@ export const calculateLeaderboard = ( "deno", "vlt", "aube", + "upm", ].includes(pm), ); diff --git a/app/src/types/chart-data.ts b/app/src/types/chart-data.ts index b2474f337b..4a42e321c9 100644 --- a/app/src/types/chart-data.ts +++ b/app/src/types/chart-data.ts @@ -9,6 +9,7 @@ export type PackageManager = | "bun" | "vlt" | "aube" + | "upm" | "nx" | "turbo" | "vp" @@ -57,6 +58,7 @@ export interface PackageManagerVersions { bun?: string; vlt?: string; aube?: string; + upm?: string; nx?: string; turbo?: string; vp?: string; @@ -82,6 +84,7 @@ export interface PackageManagerData { bun?: number; vlt?: number; aube?: number; + upm?: number; nx?: number; turbo?: number; vp?: number; @@ -101,6 +104,7 @@ export interface PackageManagerData { bun_stddev?: number; vlt_stddev?: number; aube_stddev?: number; + upm_stddev?: number; nx_stddev?: number; turbo_stddev?: number; vp_stddev?: number; @@ -120,6 +124,7 @@ export interface PackageManagerData { bun_fill?: string; vlt_fill?: string; aube_fill?: string; + upm_fill?: string; nx_fill?: string; turbo_fill?: string; vp_fill?: string; @@ -139,6 +144,7 @@ export interface PackageManagerData { bun_count?: number; vlt_count?: number; aube_count?: number; + upm_count?: number; nx_count?: number; turbo_count?: number; vp_count?: number; @@ -158,6 +164,7 @@ export interface PackageManagerData { bun_dnf?: boolean; vlt_dnf?: boolean; aube_dnf?: boolean; + upm_dnf?: boolean; nx_dnf?: boolean; turbo_dnf?: boolean; vp_dnf?: boolean; @@ -208,6 +215,7 @@ export interface PackageCountData { bun?: PackageCountEntry; vlt?: PackageCountEntry; aube?: PackageCountEntry; + upm?: PackageCountEntry; nx?: PackageCountEntry; turbo?: PackageCountEntry; vp?: PackageCountEntry; @@ -235,6 +243,7 @@ export interface ProcessCountData { bun?: PackageCountEntry; vlt?: PackageCountEntry; aube?: PackageCountEntry; + upm?: PackageCountEntry; nx?: PackageCountEntry; turbo?: PackageCountEntry; vp?: PackageCountEntry; diff --git a/bench b/bench index 48fb6049d3..561e9b82cd 100755 --- a/bench +++ b/bench @@ -36,6 +36,7 @@ AVAILABLE_PMS=( bun deno aube + upm nx turbo node diff --git a/scripts/clean-helpers.sh b/scripts/clean-helpers.sh index dae9fcd1a9..54e2f73d1e 100644 --- a/scripts/clean-helpers.sh +++ b/scripts/clean-helpers.sh @@ -112,6 +112,14 @@ clean_aube_metadata_cache() { fi } +# Function to safely clean upm cache (shared store and metadata). +# upm stores content-addressable files in ~/.upm/store and metadata in +# ~/.upm/store/metadata. `upm prune` only removes unreferenced entries, so we +# wipe the entire store directory for a clean benchmark. +clean_upm_cache() { + safe_remove "$HOME/.upm" +} + # Function to safely clean ALL aube caches, including the configured store. # Current releases put content and package indexes under the XDG data directory; # metadata and the global virtual store live under the XDG cache directory. @@ -140,6 +148,7 @@ clean_lockfiles() { safe_remove "bun.lock" safe_remove "deno.lock" safe_remove "aube-lock.yaml" + safe_remove "upm.lock" } # Function to clean package manager field from package.json @@ -203,6 +212,7 @@ clean_all_cache() { clean_deno_cache clean_vp_cache clean_aube_cache + clean_upm_cache } clean_build_files() { @@ -267,6 +277,7 @@ show_help() { echo " clean_deno_cache" echo " clean_aube_cache" echo " clean_aube_metadata_cache" + echo " clean_upm_cache" echo " clean_lockfiles" echo " clean_package_manager_field" echo " clean_package_manager_files" @@ -324,6 +335,9 @@ else clean_aube_metadata_cache) clean_aube_metadata_cache ;; + clean_upm_cache) + clean_upm_cache + ;; clean_lockfiles) clean_lockfiles ;; diff --git a/scripts/generate-chart.js b/scripts/generate-chart.js index faa4e9335c..49b2b55a8f 100644 --- a/scripts/generate-chart.js +++ b/scripts/generate-chart.js @@ -30,6 +30,7 @@ const COLORS = { turbo: "#ff1e56", vp: "#4f30e8", aube: "#FFB13B", + upm: "#18b583", node: "#84ba64", }; diff --git a/scripts/package-count.sh b/scripts/package-count.sh index 4fa7057195..ce0bad186f 100644 --- a/scripts/package-count.sh +++ b/scripts/package-count.sh @@ -9,7 +9,9 @@ else fi infer_package_manager() { - if [[ -f "aube-lock.yaml" ]]; then + if [[ -f "upm.lock" ]]; then + echo "upm" + elif [[ -f "aube-lock.yaml" ]]; then echo "aube" elif [[ -f "deno.lock" ]]; then echo "deno" @@ -54,6 +56,16 @@ infer_package_manager() { # If the node_modules directory exists, count the number of packages if [ -d "node_modules" ]; then + # upm stores packages via hardlinks inside node_modules/.upm/. The + # standard find traverses hardlinks correctly. + if [ -d "node_modules/.upm" ]; then + BENCH_PACKAGE_COUNT=$( + find node_modules -name package.json -type f \ + | grep -E 'node_modules/([a-zA-Z0-9_-]+)/package\.json$|node_modules/@[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+/package\.json$' \ + | sort -u \ + | wc -l \ + | xargs + ) || true # aube uses symlinks inside node_modules/.aube/ (unlike pnpm which uses # hard links inside .pnpm/), so the standard `find -type f` cannot # traverse them. When .aube/ is present, use `find -L` scoped to diff --git a/scripts/setup.sh b/scripts/setup.sh index dc88c4fe03..ec4af0a054 100644 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -66,11 +66,15 @@ if ! npm install -g --allow-scripts=@endevco/aube @endevco/aube@latest; then echo "Warning: aube installation failed (may not support this platform) — skipping aube benchmarks" fi +# Install upm via npm. upm is a pure TypeScript package manager (~230 KB), +# so it installs quickly and works on all platforms. +npm install -g upm@latest + # Verify aube binary is actually available (install may succeed but produce no binary) if ! command -v aube &>/dev/null; then echo "Warning: aube binary not available after installation — excluding from benchmarks" if [ -n "${GITHUB_ENV:-}" ]; then - BENCH_INCLUDE="${BENCH_INCLUDE:-npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,nx,turbo,vp,node}" + BENCH_INCLUDE="${BENCH_INCLUDE:-npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,upm,nx,turbo,vp,node}" BENCH_INCLUDE="${BENCH_INCLUDE//,aube/}" BENCH_INCLUDE="${BENCH_INCLUDE//aube,/}" echo "BENCH_INCLUDE=$BENCH_INCLUDE" >> "$GITHUB_ENV" @@ -105,6 +109,7 @@ NX_VERSION="$(npm view nx@latest version)" TURBO_VERSION="$(npm view turbo@latest version)" VP_VERSION="$(npm view vite-plus@latest version 2>/dev/null || echo "unknown")" AUBE_VERSION="$(aube --version 2>/dev/null | head -1 | grep -Eo '[0-9]+[.][0-9]+[.][0-9]+([-+][0-9A-Za-z.-]+)?' | head -1 || true)" +UPM_VERSION="$(upm --version 2>/dev/null | grep -Eo '[0-9]+[.][0-9]+[.][0-9]+([-+][0-9A-Za-z.-]+)?' | head -1 || true)" NODE_VERSION=$(node -v) # Output versions @@ -121,6 +126,7 @@ echo "nx: $NX_VERSION" echo "turbo: $TURBO_VERSION" echo "vp: $VP_VERSION" echo "aube: $AUBE_VERSION" +echo "upm: $UPM_VERSION" echo "node: $NODE_VERSION" # Save versions to JSON file @@ -138,6 +144,7 @@ echo "{ \"turbo\": \"$TURBO_VERSION\", \"vp\": \"$VP_VERSION\", \"aube\": \"$AUBE_VERSION\", + \"upm\": \"$UPM_VERSION\", \"node\": \"$NODE_VERSION\" }" > ./results/versions.json diff --git a/scripts/variations/build-cache.sh b/scripts/variations/build-cache.sh index cf52073a82..016c16d032 100644 --- a/scripts/variations/build-cache.sh +++ b/scripts/variations/build-cache.sh @@ -20,6 +20,7 @@ BENCH_INSTALL_COMMAND_VLT="${BENCH_COMMAND_VLT//\$\{HYPERFINE_ITERATION\}/build- BENCH_INSTALL_COMMAND_BUN="${BENCH_COMMAND_BUN//\$\{HYPERFINE_ITERATION\}/build-cache}" BENCH_INSTALL_COMMAND_DENO="${BENCH_COMMAND_DENO//\$\{HYPERFINE_ITERATION\}/build-cache}" BENCH_INSTALL_COMMAND_AUBE="${BENCH_COMMAND_AUBE//\$\{HYPERFINE_ITERATION\}/build-cache}" +BENCH_INSTALL_COMMAND_UPM="${BENCH_COMMAND_UPM//\$\{HYPERFINE_ITERATION\}/build-cache}" BENCH_INSTALL_PREPARE_NPM="$(prepend_setup "$BENCH_INSTALL_COMMAND_NPM" "$BENCH_SETUP_NPM")" BENCH_INSTALL_PREPARE_YARN="$(prepend_setup "$BENCH_INSTALL_COMMAND_YARN" "$BENCH_SETUP_YARN")" @@ -31,6 +32,7 @@ BENCH_INSTALL_PREPARE_VLT="$(prepend_setup "$BENCH_INSTALL_COMMAND_VLT" "$BENCH_ BENCH_INSTALL_PREPARE_BUN="$(prepend_setup "$BENCH_INSTALL_COMMAND_BUN" "$BENCH_SETUP_BUN")" BENCH_INSTALL_PREPARE_DENO="$(prepend_setup "$BENCH_INSTALL_COMMAND_DENO" "$BENCH_SETUP_DENO")" BENCH_INSTALL_PREPARE_AUBE="$(prepend_setup "$BENCH_INSTALL_COMMAND_AUBE" "$BENCH_SETUP_AUBE")" +BENCH_INSTALL_PREPARE_UPM="$(prepend_setup "$BENCH_INSTALL_COMMAND_UPM" "$BENCH_SETUP_UPM")" # Warm build commands (run once in prepare to populate the .next/ cache). BENCH_WARM_BUILD_NPM="timeout $BENCH_TIMEOUT npm run build > $BENCH_OUTPUT_FOLDER/npm-warm-build-output.log 2>&1" @@ -43,6 +45,7 @@ BENCH_WARM_BUILD_VLT="timeout $BENCH_TIMEOUT vlt run build --view=human > $BENCH BENCH_WARM_BUILD_BUN="timeout $BENCH_TIMEOUT bun run build > $BENCH_OUTPUT_FOLDER/bun-warm-build-output.log 2>&1" BENCH_WARM_BUILD_DENO="timeout $BENCH_TIMEOUT deno run build > $BENCH_OUTPUT_FOLDER/deno-warm-build-output.log 2>&1" BENCH_WARM_BUILD_AUBE="timeout $BENCH_TIMEOUT aube run build > $BENCH_OUTPUT_FOLDER/aube-warm-build-output.log 2>&1" +BENCH_WARM_BUILD_UPM="timeout $BENCH_TIMEOUT upm run build > $BENCH_OUTPUT_FOLDER/upm-warm-build-output.log 2>&1" BENCH_WARM_BUILD_NX="timeout $BENCH_TIMEOUT nx run build > $BENCH_OUTPUT_FOLDER/nx-warm-build-output.log 2>&1" BENCH_WARM_BUILD_TURBO="timeout $BENCH_TIMEOUT turbo run build --dangerously-disable-package-manager-check --cache-dir=.cache --no-cache > $BENCH_OUTPUT_FOLDER/turbo-warm-build-output.log 2>&1" BENCH_WARM_BUILD_NODE="timeout $BENCH_TIMEOUT node --run build > $BENCH_OUTPUT_FOLDER/node-warm-build-output.log 2>&1" @@ -58,6 +61,7 @@ BENCH_COMMAND_VLT="timeout $BENCH_TIMEOUT vlt run build --view=human > $BENCH_OU BENCH_COMMAND_BUN="timeout $BENCH_TIMEOUT bun run build > $BENCH_OUTPUT_FOLDER/bun-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_DENO="timeout $BENCH_TIMEOUT deno run build > $BENCH_OUTPUT_FOLDER/deno-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_AUBE="timeout $BENCH_TIMEOUT aube run build > $BENCH_OUTPUT_FOLDER/aube-build-output-\${HYPERFINE_ITERATION}.log 2>&1" +BENCH_COMMAND_UPM="timeout $BENCH_TIMEOUT upm run build > $BENCH_OUTPUT_FOLDER/upm-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_NX="timeout $BENCH_TIMEOUT nx run build > $BENCH_OUTPUT_FOLDER/nx-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_TURBO="timeout $BENCH_TIMEOUT turbo run build --dangerously-disable-package-manager-check --cache-dir=.cache --no-cache > $BENCH_OUTPUT_FOLDER/turbo-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_NODE="timeout $BENCH_TIMEOUT node --run build > $BENCH_OUTPUT_FOLDER/node-build-output-\${HYPERFINE_ITERATION}.log 2>&1" @@ -91,6 +95,8 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$BENCH_INSTALL_PREPARE_AUBE || true; bash $BENCH_SCRIPTS/clean-helpers.sh clean_build_output; $BENCH_WARM_BUILD_AUBE || true"} \ ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$BENCH_INSTALL_PREPARE_UPM || true; bash $BENCH_SCRIPTS/clean-helpers.sh clean_build_output; $BENCH_WARM_BUILD_UPM || true"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} \ ${BENCH_INCLUDE_NX:+--prepare="$BENCH_INSTALL_PREPARE_NPM || true; bash $BENCH_SCRIPTS/clean-helpers.sh clean_build_output; $BENCH_WARM_BUILD_NX || true"} \ ${BENCH_INCLUDE_NX:+--command-name="nx" "$BENCH_COMMAND_NX"} \ ${BENCH_INCLUDE_TURBO:+--prepare="$BENCH_INSTALL_PREPARE_NPM || true; bash $BENCH_SCRIPTS/clean-helpers.sh clean_build_output; $BENCH_WARM_BUILD_TURBO || true"} \ diff --git a/scripts/variations/build.sh b/scripts/variations/build.sh index d23fc8ed03..d158fdc4a2 100644 --- a/scripts/variations/build.sh +++ b/scripts/variations/build.sh @@ -20,6 +20,7 @@ BENCH_INSTALL_COMMAND_VLT="${BENCH_COMMAND_VLT//\$\{HYPERFINE_ITERATION\}/build} BENCH_INSTALL_COMMAND_BUN="${BENCH_COMMAND_BUN//\$\{HYPERFINE_ITERATION\}/build}" BENCH_INSTALL_COMMAND_DENO="${BENCH_COMMAND_DENO//\$\{HYPERFINE_ITERATION\}/build}" BENCH_INSTALL_COMMAND_AUBE="${BENCH_COMMAND_AUBE//\$\{HYPERFINE_ITERATION\}/build}" +BENCH_INSTALL_COMMAND_UPM="${BENCH_COMMAND_UPM//\$\{HYPERFINE_ITERATION\}/build}" BENCH_INSTALL_PREPARE_NPM="$(prepend_setup "$BENCH_INSTALL_COMMAND_NPM" "$BENCH_SETUP_NPM")" BENCH_INSTALL_PREPARE_YARN="$(prepend_setup "$BENCH_INSTALL_COMMAND_YARN" "$BENCH_SETUP_YARN")" @@ -31,6 +32,7 @@ BENCH_INSTALL_PREPARE_VLT="$(prepend_setup "$BENCH_INSTALL_COMMAND_VLT" "$BENCH_ BENCH_INSTALL_PREPARE_BUN="$(prepend_setup "$BENCH_INSTALL_COMMAND_BUN" "$BENCH_SETUP_BUN")" BENCH_INSTALL_PREPARE_DENO="$(prepend_setup "$BENCH_INSTALL_COMMAND_DENO" "$BENCH_SETUP_DENO")" BENCH_INSTALL_PREPARE_AUBE="$(prepend_setup "$BENCH_INSTALL_COMMAND_AUBE" "$BENCH_SETUP_AUBE")" +BENCH_INSTALL_PREPARE_UPM="$(prepend_setup "$BENCH_INSTALL_COMMAND_UPM" "$BENCH_SETUP_UPM")" # Build commands — run ` run build` and log output. # Each prepare also removes .next/ so every iteration is a cold build. @@ -44,6 +46,7 @@ BENCH_COMMAND_VLT="timeout $BENCH_TIMEOUT vlt run build --view=human > $BENCH_OU BENCH_COMMAND_BUN="timeout $BENCH_TIMEOUT bun run build > $BENCH_OUTPUT_FOLDER/bun-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_DENO="timeout $BENCH_TIMEOUT deno run build > $BENCH_OUTPUT_FOLDER/deno-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_AUBE="timeout $BENCH_TIMEOUT aube run build > $BENCH_OUTPUT_FOLDER/aube-build-output-\${HYPERFINE_ITERATION}.log 2>&1" +BENCH_COMMAND_UPM="timeout $BENCH_TIMEOUT upm run build > $BENCH_OUTPUT_FOLDER/upm-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_NX="timeout $BENCH_TIMEOUT nx run build > $BENCH_OUTPUT_FOLDER/nx-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_TURBO="timeout $BENCH_TIMEOUT turbo run build --dangerously-disable-package-manager-check --cache-dir=.cache --no-cache > $BENCH_OUTPUT_FOLDER/turbo-build-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_NODE="timeout $BENCH_TIMEOUT node --run build > $BENCH_OUTPUT_FOLDER/node-build-output-\${HYPERFINE_ITERATION}.log 2>&1" @@ -78,6 +81,8 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$BENCH_INSTALL_PREPARE_AUBE || true; bash $BENCH_SCRIPTS/clean-helpers.sh clean_build_output"} \ ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$BENCH_INSTALL_PREPARE_UPM || true; bash $BENCH_SCRIPTS/clean-helpers.sh clean_build_output"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} \ ${BENCH_INCLUDE_NX:+--prepare="$BENCH_INSTALL_PREPARE_NPM || true; bash $BENCH_SCRIPTS/clean-helpers.sh clean_build_output"} \ ${BENCH_INCLUDE_NX:+--command-name="nx" "$BENCH_COMMAND_NX"} \ ${BENCH_INCLUDE_TURBO:+--prepare="$BENCH_INSTALL_PREPARE_NPM || true; bash $BENCH_SCRIPTS/clean-helpers.sh clean_build_output"} \ diff --git a/scripts/variations/cache+lockfile+node_modules.sh b/scripts/variations/cache+lockfile+node_modules.sh index 53ab8fa99a..16ee6e0c67 100644 --- a/scripts/variations/cache+lockfile+node_modules.sh +++ b/scripts/variations/cache+lockfile+node_modules.sh @@ -37,7 +37,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_DENO")"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_AUBE")"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_UPM")"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count collect_process_count diff --git a/scripts/variations/cache+lockfile.sh b/scripts/variations/cache+lockfile.sh index 7e82e0d0f5..665905c3c5 100644 --- a/scripts/variations/cache+lockfile.sh +++ b/scripts/variations/cache+lockfile.sh @@ -37,7 +37,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_DENO")"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_AUBE")"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_UPM")"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count collect_process_count diff --git a/scripts/variations/cache+node_modules.sh b/scripts/variations/cache+node_modules.sh index 7c4c65c25e..b009d3ac93 100644 --- a/scripts/variations/cache+node_modules.sh +++ b/scripts/variations/cache+node_modules.sh @@ -37,7 +37,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_DENO")"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_AUBE")"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_UPM")"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count collect_process_count diff --git a/scripts/variations/cache.sh b/scripts/variations/cache.sh index 74d662883a..62f361e251 100644 --- a/scripts/variations/cache.sh +++ b/scripts/variations/cache.sh @@ -37,7 +37,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_DENO")"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_AUBE")"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_UPM")"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count collect_process_count diff --git a/scripts/variations/ci.sh b/scripts/variations/ci.sh index 71df5cc3fd..2284bdfeef 100644 --- a/scripts/variations/ci.sh +++ b/scripts/variations/ci.sh @@ -28,6 +28,7 @@ BENCH_CI_VLT="vlt ci --view=silent" BENCH_CI_BUN="bun install --frozen-lockfile --ignore-scripts --silent" BENCH_CI_DENO="deno install --frozen --quiet" BENCH_CI_AUBE="aube ci --ignore-scripts --silent" +BENCH_CI_UPM="upm install --frozen-lockfile --silent" # Override BENCH_COMMAND_* with CI commands + log redirection BENCH_COMMAND_NPM="timeout $BENCH_TIMEOUT $BENCH_CI_NPM >> $BENCH_OUTPUT_FOLDER/npm-output-\${HYPERFINE_ITERATION}.log 2>&1" @@ -40,6 +41,7 @@ BENCH_COMMAND_VLT="timeout $BENCH_TIMEOUT $BENCH_CI_VLT > $BENCH_OUTPUT_FOLDER/v BENCH_COMMAND_BUN="timeout $BENCH_TIMEOUT $BENCH_CI_BUN > $BENCH_OUTPUT_FOLDER/bun-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_DENO="timeout $BENCH_TIMEOUT $BENCH_CI_DENO > $BENCH_OUTPUT_FOLDER/deno-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_AUBE="timeout $BENCH_TIMEOUT $BENCH_CI_AUBE > $BENCH_OUTPUT_FOLDER/aube-output-\${HYPERFINE_ITERATION}.log 2>&1" +BENCH_COMMAND_UPM="timeout $BENCH_TIMEOUT $BENCH_CI_UPM > $BENCH_OUTPUT_FOLDER/upm-output-\${HYPERFINE_ITERATION}.log 2>&1" # Override bare install commands for strace process counting BENCH_INSTALL_NPM="$BENCH_CI_NPM" @@ -52,6 +54,7 @@ BENCH_INSTALL_VLT="$BENCH_CI_VLT" BENCH_INSTALL_BUN="$BENCH_CI_BUN" BENCH_INSTALL_DENO="$BENCH_CI_DENO" BENCH_INSTALL_AUBE="$BENCH_CI_AUBE" +BENCH_INSTALL_UPM="$BENCH_CI_UPM" # --- Prepare commands --- # CI commands require a lockfile to exist. Each PM's prepare step: @@ -94,6 +97,7 @@ BENCH_PREPARE_VLT="$(ci_prepare "$BENCH_SETUP_VLT" "vlt install --view=silent")" BENCH_PREPARE_BUN="$(ci_prepare "$BENCH_SETUP_BUN" "bun install --ignore-scripts --silent")" BENCH_PREPARE_DENO="$(ci_prepare "$BENCH_SETUP_DENO" "deno install --quiet")" BENCH_PREPARE_AUBE="$(ci_prepare "$BENCH_SETUP_AUBE" "aube install --ignore-scripts --silent")" +BENCH_PREPARE_UPM="$(ci_prepare "$BENCH_SETUP_UPM" "upm install --silent")" # Run the benchmark suite hyperfine --ignore-failure \ @@ -122,7 +126,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$BENCH_PREPARE_DENO"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$BENCH_PREPARE_AUBE"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$BENCH_PREPARE_UPM"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count diff --git a/scripts/variations/clean.sh b/scripts/variations/clean.sh index 3561ccf58f..2737666c34 100644 --- a/scripts/variations/clean.sh +++ b/scripts/variations/clean.sh @@ -37,7 +37,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_DENO")"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_AUBE")"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_UPM")"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count collect_process_count diff --git a/scripts/variations/common.sh b/scripts/variations/common.sh index da7a2cdfb1..fa846b0b24 100644 --- a/scripts/variations/common.sh +++ b/scripts/variations/common.sh @@ -31,14 +31,14 @@ else fi # Defines configurable values for the benchmark -BENCH_INCLUDE="${BENCH_INCLUDE:=npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,nx,turbo,vp,node}" +BENCH_INCLUDE="${BENCH_INCLUDE:=npm,yarn,berry,zpm,pnpm,pacquet,vlt,bun,deno,aube,upm,nx,turbo,vp,node}" BENCH_WARMUP="${BENCH_WARMUP:=2}" BENCH_RUNS="${BENCH_RUNS:=5}" # Per-command timeout in seconds (default: 5 minutes). # If a single install exceeds this, it is killed. hyperfine --ignore-failure # lets the suite continue; the timed-out run records as a failure. BENCH_TIMEOUT="${BENCH_TIMEOUT:=300}" -for pm in npm yarn berry zpm pnpm pacquet vlt bun deno aube nx turbo vp node; do +for pm in npm yarn berry zpm pnpm pacquet vlt bun deno aube upm nx turbo vp node; do CHOICE=$(echo "$pm" | tr '[:lower:]' '[:upper:]') if echo "$BENCH_INCLUDE" | grep -qw "$pm"; then # Only allow nx, turbo, vp, node for task-runner variations (run, build, build-cache) @@ -77,6 +77,7 @@ BENCH_SETUP_VLT="node $BENCH_SCRIPTS/add-workspace-protocol.js . >> $BENCH_OUTPU BENCH_SETUP_BUN="" BENCH_SETUP_DENO="" BENCH_SETUP_AUBE="npm pkg delete packageManager >/dev/null 2>&1 || true" +BENCH_SETUP_UPM="" BENCH_SETUP_NX="" BENCH_SETUP_TURBO="" BENCH_SETUP_VP="" @@ -105,6 +106,7 @@ BENCH_INSTALL_VLT="vlt install --view=silent" BENCH_INSTALL_BUN="bun install --ignore-scripts --silent" BENCH_INSTALL_DENO="deno install --quiet" BENCH_INSTALL_AUBE="aube install --ignore-scripts --silent" +BENCH_INSTALL_UPM="upm install --silent" BENCH_COMMAND_NPM="timeout $BENCH_TIMEOUT $BENCH_INSTALL_NPM >> $BENCH_OUTPUT_FOLDER/npm-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_YARN="timeout $BENCH_TIMEOUT $BENCH_INSTALL_YARN > $BENCH_OUTPUT_FOLDER/yarn-output-\${HYPERFINE_ITERATION}.log 2>&1" @@ -116,6 +118,7 @@ BENCH_COMMAND_VLT="timeout $BENCH_TIMEOUT $BENCH_INSTALL_VLT > $BENCH_OUTPUT_FOL BENCH_COMMAND_BUN="timeout $BENCH_TIMEOUT $BENCH_INSTALL_BUN > $BENCH_OUTPUT_FOLDER/bun-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_DENO="timeout $BENCH_TIMEOUT $BENCH_INSTALL_DENO > $BENCH_OUTPUT_FOLDER/deno-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_AUBE="timeout $BENCH_TIMEOUT $BENCH_INSTALL_AUBE > $BENCH_OUTPUT_FOLDER/aube-output-\${HYPERFINE_ITERATION}.log 2>&1" +BENCH_COMMAND_UPM="timeout $BENCH_TIMEOUT $BENCH_INSTALL_UPM > $BENCH_OUTPUT_FOLDER/upm-output-\${HYPERFINE_ITERATION}.log 2>&1" # Clean up & create the results directory rm -rf "$BENCH_OUTPUT_FOLDER" @@ -148,7 +151,7 @@ collect_package_count() { ls -la "$BENCH_OUTPUT_FOLDER" # Prints the output of each install - for pm in npm yarn berry zpm pnpm pacquet vlt bun deno aube nx turbo vp node; do + for pm in npm yarn berry zpm pnpm pacquet vlt bun deno aube upm nx turbo vp node; do if echo "$BENCH_INCLUDE" | grep -qw "$pm"; then for i in {0..9}; do echo "-- Reading output of $pm install $i ---" @@ -190,6 +193,7 @@ collect_process_count() { [bun]="$BENCH_SETUP_BUN" [deno]="$BENCH_SETUP_DENO" [aube]="$BENCH_SETUP_AUBE" + [upm]="$BENCH_SETUP_UPM" ) local -A PM_INSTALL=( [npm]="$BENCH_INSTALL_NPM" @@ -202,6 +206,7 @@ collect_process_count() { [bun]="$BENCH_INSTALL_BUN" [deno]="$BENCH_INSTALL_DENO" [aube]="$BENCH_INSTALL_AUBE" + [upm]="$BENCH_INSTALL_UPM" ) local -A PM_INCLUDE=( [npm]="$BENCH_INCLUDE_NPM" @@ -214,9 +219,10 @@ collect_process_count() { [bun]="$BENCH_INCLUDE_BUN" [deno]="$BENCH_INCLUDE_DENO" [aube]="$BENCH_INCLUDE_AUBE" + [upm]="$BENCH_INCLUDE_UPM" ) - for pm in npm yarn berry zpm pnpm pacquet vlt bun deno aube; do + for pm in npm yarn berry zpm pnpm pacquet vlt bun deno aube upm; do if [ -n "${PM_INCLUDE[$pm]:-}" ]; then local prepare_cmd="$BENCH_PREPARE_BASE" local setup="${PM_SETUP[$pm]:-}" diff --git a/scripts/variations/lockfile+node_modules.sh b/scripts/variations/lockfile+node_modules.sh index c86c72cf07..18c4bc9742 100644 --- a/scripts/variations/lockfile+node_modules.sh +++ b/scripts/variations/lockfile+node_modules.sh @@ -40,7 +40,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_DENO")"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_AUBE")"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_UPM")"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count collect_process_count diff --git a/scripts/variations/lockfile.sh b/scripts/variations/lockfile.sh index c06d61a104..55fa2eb9c4 100644 --- a/scripts/variations/lockfile.sh +++ b/scripts/variations/lockfile.sh @@ -40,7 +40,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_DENO")"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_AUBE")"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_UPM")"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count collect_process_count diff --git a/scripts/variations/node_modules.sh b/scripts/variations/node_modules.sh index 8cedd44859..c77d86452c 100644 --- a/scripts/variations/node_modules.sh +++ b/scripts/variations/node_modules.sh @@ -40,7 +40,9 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_DENO")"} \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_AUBE")"} \ - ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} + ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$(append_setup "$BENCH_PREPARE_BASE" "$BENCH_SETUP_UPM")"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} collect_package_count collect_process_count diff --git a/scripts/variations/run.sh b/scripts/variations/run.sh index d662427e55..45f611853f 100644 --- a/scripts/variations/run.sh +++ b/scripts/variations/run.sh @@ -20,6 +20,7 @@ BENCH_INSTALL_COMMAND_VLT="${BENCH_COMMAND_VLT//\$\{HYPERFINE_ITERATION\}/run}" BENCH_INSTALL_COMMAND_BUN="${BENCH_COMMAND_BUN//\$\{HYPERFINE_ITERATION\}/run}" BENCH_INSTALL_COMMAND_DENO="${BENCH_COMMAND_DENO//\$\{HYPERFINE_ITERATION\}/run}" BENCH_INSTALL_COMMAND_AUBE="${BENCH_COMMAND_AUBE//\$\{HYPERFINE_ITERATION\}/run}" +BENCH_INSTALL_COMMAND_UPM="${BENCH_COMMAND_UPM//\$\{HYPERFINE_ITERATION\}/run}" BENCH_INSTALL_COMMAND_VP="timeout $BENCH_TIMEOUT vp install > $BENCH_OUTPUT_FOLDER/vp-output-run.log 2>&1" BENCH_INSTALL_PREPARE_NPM="$(prepend_setup "$BENCH_INSTALL_COMMAND_NPM" "$BENCH_SETUP_NPM")" BENCH_INSTALL_PREPARE_YARN="$(prepend_setup "$BENCH_INSTALL_COMMAND_YARN" "$BENCH_SETUP_YARN")" @@ -31,6 +32,7 @@ BENCH_INSTALL_PREPARE_VLT="$(prepend_setup "$BENCH_INSTALL_COMMAND_VLT" "$BENCH_ BENCH_INSTALL_PREPARE_BUN="$(prepend_setup "$BENCH_INSTALL_COMMAND_BUN" "$BENCH_SETUP_BUN")" BENCH_INSTALL_PREPARE_DENO="$(prepend_setup "$BENCH_INSTALL_COMMAND_DENO" "$BENCH_SETUP_DENO")" BENCH_INSTALL_PREPARE_AUBE="$(prepend_setup "$BENCH_INSTALL_COMMAND_AUBE" "$BENCH_SETUP_AUBE")" +BENCH_INSTALL_PREPARE_UPM="$(prepend_setup "$BENCH_INSTALL_COMMAND_UPM" "$BENCH_SETUP_UPM")" BENCH_INSTALL_PREPARE_VP="$(prepend_setup "$BENCH_INSTALL_COMMAND_VP" "$BENCH_SETUP_VP")" # Run defines its own command scripts to actually run a test @@ -45,6 +47,7 @@ BENCH_COMMAND_VLT="timeout $BENCH_TIMEOUT vlt run test --view=human > $BENCH_OUT BENCH_COMMAND_BUN="timeout $BENCH_TIMEOUT bun run test > $BENCH_OUTPUT_FOLDER/bun-run-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_DENO="timeout $BENCH_TIMEOUT deno run test > $BENCH_OUTPUT_FOLDER/deno-run-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_AUBE="timeout $BENCH_TIMEOUT aube run test > $BENCH_OUTPUT_FOLDER/aube-run-output-\${HYPERFINE_ITERATION}.log 2>&1" +BENCH_COMMAND_UPM="timeout $BENCH_TIMEOUT upm run test > $BENCH_OUTPUT_FOLDER/upm-run-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_VP="timeout $BENCH_TIMEOUT vp run test > $BENCH_OUTPUT_FOLDER/vp-run-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_NX="timeout $BENCH_TIMEOUT nx run test > $BENCH_OUTPUT_FOLDER/nx-run-output-\${HYPERFINE_ITERATION}.log 2>&1" BENCH_COMMAND_TURBO="timeout $BENCH_TIMEOUT turbo run test --dangerously-disable-package-manager-check --cache-dir=.cache --no-cache > $BENCH_OUTPUT_FOLDER/turbo-run-output-\${HYPERFINE_ITERATION}.log 2>&1" @@ -79,6 +82,8 @@ hyperfine --ignore-failure \ ${BENCH_INCLUDE_DENO:+--command-name="deno" "$BENCH_COMMAND_DENO"} \ ${BENCH_INCLUDE_AUBE:+--prepare="$BENCH_INSTALL_PREPARE_AUBE || true"} \ ${BENCH_INCLUDE_AUBE:+--command-name="aube" "$BENCH_COMMAND_AUBE"} \ + ${BENCH_INCLUDE_UPM:+--prepare="$BENCH_INSTALL_PREPARE_UPM || true"} \ + ${BENCH_INCLUDE_UPM:+--command-name="upm" "$BENCH_COMMAND_UPM"} \ ${BENCH_INCLUDE_VP:+--prepare="$BENCH_INSTALL_PREPARE_VP"} \ ${BENCH_INCLUDE_VP:+--command-name="vp" "$BENCH_COMMAND_VP"} \ ${BENCH_INCLUDE_NX:+--prepare="$BENCH_INSTALL_PREPARE_NPM || true"} \ From 2af48ee1471680a630102a8f8fd5ffffb9d1fceb Mon Sep 17 00:00:00 2001 From: vltbaudbot <264001112+vltbaudbot@users.noreply.github.com> Date: Mon, 28 Sep 2026 06:14:57 +0000 Subject: [PATCH 2/2] fix: correct if/elif structure in package-count.sh The upm node_modules detection block was followed by a nested 'if' instead of 'elif' for the aube block, causing a shell syntax error at runtime (missing fi). Co-authored-by: Darcy Clarke --- scripts/package-count.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/package-count.sh b/scripts/package-count.sh index ce0bad186f..63a9664c76 100644 --- a/scripts/package-count.sh +++ b/scripts/package-count.sh @@ -70,7 +70,7 @@ if [ -d "node_modules" ]; then # hard links inside .pnpm/), so the standard `find -type f` cannot # traverse them. When .aube/ is present, use `find -L` scoped to # node_modules/.aube to follow symlinks and extract unique package names. - if [ -d "node_modules/.aube" ]; then + elif [ -d "node_modules/.aube" ]; then BENCH_PACKAGE_COUNT=$( find -L node_modules/.aube -name package.json -type f \ | grep -E 'node_modules/([a-zA-Z0-9_-]+)/package\.json$|node_modules/@[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+/package\.json$' \