@@ -66,17 +66,11 @@ original_home="$HOME"
6666cache_root=" ${XDG_CACHE_HOME:- $original_home / .cache} "
6767pr_home=" ${VP_PKG_PR_NEW_HOME:- $cache_root / vite-plus/ pkg-pr-new/ $pr_ref } "
6868installer_home=" $( mktemp -d " ${TMPDIR:-/ tmp} /vite-plus-pr-installer.XXXXXX" ) "
69- cached_version_dir=" $pr_home /pkg-pr-new-$pr_ref "
70- vp_bin=" $pr_home /bin/vp"
71- vite_plus_package_json=" $pr_home /current/node_modules/vite-plus/package.json"
72- global_cli_entry=" $pr_home /current/node_modules/vite-plus/dist/bin.js"
73- commit_marker=" $cached_version_dir /.pkg-pr-new-commit"
7469pkg_pr_new_base=" https://pkg.pr.new/voidzero-dev/vite-plus"
75- vite_plus_spec=" $pkg_pr_new_base @$pr_ref "
76- vite_plus_core_spec=" $pkg_pr_new_base /@voidzero-dev/vite-plus-core@$pr_ref "
70+ requested_vite_plus_spec=" $pkg_pr_new_base @$pr_ref "
7771
7872resolve_pkg_pr_new_commit () {
79- curl -fsSIL " $vite_plus_spec " | tr -d ' \r' | awk -F ' : ' '
73+ curl -fsSIL " $requested_vite_plus_spec " | tr -d ' \r' | awk -F ' : ' '
8074 tolower($1) == "x-commit-key" {
8175 count = split($2, parts, ":")
8276 print parts[count]
@@ -85,6 +79,32 @@ resolve_pkg_pr_new_commit() {
8579 '
8680}
8781
82+ available_commit=" $( resolve_pkg_pr_new_commit || true) "
83+ case " $available_commit " in
84+ ' ' | * [!0-9a-fA-F]* )
85+ echo " error: could not resolve an immutable pkg.pr.new commit for $pr_ref " >&2
86+ exit 1
87+ ;;
88+ esac
89+ if [ " ${# available_commit} " -ne 40 ]; then
90+ echo " error: pkg.pr.new returned an invalid commit for $pr_ref : $available_commit " >&2
91+ exit 1
92+ fi
93+
94+ # PR-number URLs are mutable and pkg.pr.new packages reference their internal
95+ # workspace dependencies by commit SHA. Persisting the PR URL alongside those
96+ # SHA URLs makes package managers install duplicate copies of the same package.
97+ # Resolve once, then use the immutable SHA for the global install and every
98+ # dependency spec written by migration.
99+ resolved_ref=" $available_commit "
100+ cached_version_dir=" $pr_home /pkg-pr-new-$resolved_ref "
101+ vp_bin=" $pr_home /bin/vp"
102+ vite_plus_package_json=" $pr_home /current/node_modules/vite-plus/package.json"
103+ global_cli_entry=" $pr_home /current/node_modules/vite-plus/dist/bin.js"
104+ commit_marker=" $cached_version_dir /.pkg-pr-new-commit"
105+ vite_plus_spec=" $pkg_pr_new_base @$resolved_ref "
106+ vite_plus_core_spec=" $pkg_pr_new_base /@voidzero-dev/vite-plus-core@$resolved_ref "
107+
88108read_installed_commit () {
89109 if [ -f " $commit_marker " ]; then
90110 head -n 1 " $commit_marker "
@@ -103,14 +123,12 @@ read_installed_commit() {
103123 fi
104124}
105125
106- available_commit=" $( resolve_pkg_pr_new_commit || true) "
107126installed_commit=" $( read_installed_commit || true) "
108127current_target=" $( readlink " $pr_home /current" 2> /dev/null || true) "
109128reuse_install=0
110129
111- if [ -n " $available_commit " ] &&
112- [ " $installed_commit " = " $available_commit " ] &&
113- [ " $current_target " = " pkg-pr-new-$pr_ref " ] &&
130+ if [ " $installed_commit " = " $resolved_ref " ] &&
131+ [ " $current_target " = " pkg-pr-new-$resolved_ref " ] &&
114132 [ -x " $vp_bin " ] &&
115133 [ -f " $vite_plus_package_json " ] &&
116134 [ -f " $global_cli_entry " ]; then
@@ -123,38 +141,36 @@ cleanup() {
123141trap cleanup EXIT
124142
125143if [ " $reuse_install " -eq 1 ]; then
126- printf ' %s\n' " $available_commit " > " $commit_marker "
127- echo " Reusing installed Vite+ pkg.pr.new build $pr_ref ( $available_commit ) from $pr_home "
144+ printf ' %s\n' " $resolved_ref " > " $commit_marker "
145+ echo " Reusing installed Vite+ pkg.pr.new build $resolved_ref (requested $pr_ref ) from $pr_home "
128146else
129- if [ -z " $available_commit " ]; then
130- echo " Could not verify the current pkg.pr.new commit; reinstalling $pr_ref . "
147+ if [ -n " $installed_commit " ] && [ " $installed_commit " != " $resolved_ref " ]; then
148+ echo " pkg.pr.new build changed: $installed_commit -> $resolved_ref "
131149 elif [ -n " $installed_commit " ]; then
132- echo " pkg.pr.new build changed: $installed_commit -> $available_commit "
150+ echo " Reinstalling pkg.pr.new build $resolved_ref with an immutable cache key"
151+ fi
152+
153+ # This helper owns a dedicated VP_HOME for each requested PR/ref. Remember
154+ # the previous immutable install so it can be removed only after the new one
155+ # succeeds, while retaining shared runtime and package-manager caches.
156+ previous_target=" "
157+ if [ -n " $current_target " ] && [ " $current_target " != " pkg-pr-new-$resolved_ref " ]; then
158+ case " $current_target " in
159+ pkg-pr-new-* ) previous_target=" $current_target " ;;
160+ esac
133161 fi
134162
135- # Numeric pkg.pr.new references are mutable PR aliases. If the published
136- # commit changed, the reused lockfile can retain the checksum from the older
137- # tarball and fail with ERR_PNPM_TARBALL_INTEGRITY. Keep the downloaded
138- # runtime/package-manager cache, but force the wrapper dependency to resolve
139- # again. Commit SHA references are immutable and use their own cache path.
140- case " $pr_ref " in
141- * [!0-9]* ) ;;
142- * )
143- rm -rf " $cached_version_dir /node_modules"
144- rm -f " $cached_version_dir /pnpm-lock.yaml"
145- ;;
146- esac
147-
148- echo " Installing Vite+ pkg.pr.new build $pr_ref into $pr_home "
163+ echo " Installing Vite+ pkg.pr.new build $resolved_ref (requested $pr_ref ) into $pr_home "
149164 HOME=" $installer_home " \
150165 VP_HOME=" $pr_home " \
151- VP_PR_VERSION=" $pr_ref " \
166+ VP_PR_VERSION=" $resolved_ref " \
152167 VP_NODE_MANAGER=no \
153168 bash " $installer "
154169
155- if [ -n " $available_commit " ]; then
156- printf ' %s\n ' " $available_commit " > " $commit_marker "
170+ if [ -n " $previous_target " ]; then
171+ rm -rf " $pr_home / $previous_target "
157172 fi
173+ printf ' %s\n' " $resolved_ref " > " $commit_marker "
158174fi
159175
160176if [ ! -x " $vp_bin " ]; then
@@ -195,6 +211,8 @@ hash -r
195211
196212echo
197213echo " Using isolated global CLI:"
214+ echo " requested ref: $pr_ref "
215+ echo " resolved commit: $resolved_ref "
198216echo " executable: $vp_bin "
199217echo " installation: $( readlink " $pr_home /current" 2> /dev/null || echo unknown) "
200218echo " vite-plus spec: $VP_VERSION "
0 commit comments