@glassnote/client 2.4.5 → 2.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/glassnote.js +51 -6
- package/package.json +1 -1
package/bin/glassnote.js
CHANGED
|
@@ -27,8 +27,15 @@ const MARK_B = '# <<< glassnote <<<';
|
|
|
27
27
|
// El PATH que se le da a npm lleva delante nuestro bin: si install.sh tuvo que bajar
|
|
28
28
|
// Node, sus enlaces viven ahí y de otro modo npm no existiría para este proceso.
|
|
29
29
|
function npmEnv() {
|
|
30
|
+
// El directorio del node va en el PATH, no solo BIN_DIR: npm lanza los scripts de
|
|
31
|
+
// instalacion por cmd.exe (`cmd /c node install.js`, el postinstall de electron) y
|
|
32
|
+
// esos hijos buscan `node` en el PATH. Sin esto la actualizacion moria a medias con
|
|
33
|
+
// «"node" no se reconoce como un comando», dejando el paquete sin binario.
|
|
34
|
+
const nodeBinary = mode.resolveNodeBinary(process.execPath);
|
|
35
|
+
const dirs = [mode.BIN_DIR];
|
|
36
|
+
if (nodeBinary) dirs.push(path.dirname(nodeBinary));
|
|
30
37
|
return Object.assign({}, process.env, {
|
|
31
|
-
PATH: `${
|
|
38
|
+
PATH: `${dirs.join(path.delimiter)}${path.delimiter}${process.env.PATH || ''}`,
|
|
32
39
|
// Cache propia, bajo ~/.glassnote. Un ~/.npm con archivos de root —herencia de
|
|
33
40
|
// cualquier `sudo npm` viejo— hace que npm muera con EACCES antes de bajar nada,
|
|
34
41
|
// y el usuario tiene que andar con chown. Se pisa a propósito el npm_config_cache
|
|
@@ -103,6 +110,24 @@ function sleepSync(ms) {
|
|
|
103
110
|
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
104
111
|
}
|
|
105
112
|
|
|
113
|
+
// Dormir un rato fijo no alcanzaba. En Windows npm no puede borrar el árbol mientras
|
|
114
|
+
// quede vivo UN proceso del cliente, y electron cierra media docena de procesos hijos:
|
|
115
|
+
// con los 4 segundos de antes npm entraba con la app a medio cerrar y salía con
|
|
116
|
+
// «EPERM: rmdir ...\node_modules\got\dist», dejando la instalación rota. Se espera a
|
|
117
|
+
// que el servidor local del cliente deje de responder, que es la señal de que ya no está.
|
|
118
|
+
function esperarAQueCierre(maxMs) {
|
|
119
|
+
const tope = Date.now() + Math.max(maxMs, 30000);
|
|
120
|
+
while (Date.now() < tope) {
|
|
121
|
+
if (!clienteEnMarcha()) {
|
|
122
|
+
sleepSync(1500); // margen para que el SO suelte los handles
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
sleepSync(1000);
|
|
126
|
+
}
|
|
127
|
+
console.error('glassnote: el cliente sigue en marcha; se actualiza igual y puede fallar.');
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
106
131
|
const log = (...args) => console.log(...args);
|
|
107
132
|
// Cada paso se dice EN CUANTO EMPIEZA: lo que hace que un instalador parezca colgado
|
|
108
133
|
// no es que tarde, es que tarde sin decir en qué está.
|
|
@@ -204,10 +229,10 @@ function addToPathUnix() {
|
|
|
204
229
|
return { touched, line };
|
|
205
230
|
}
|
|
206
231
|
|
|
207
|
-
function addToPathWindows() {
|
|
232
|
+
function addToPathWindows(dir = mode.BIN_DIR) {
|
|
208
233
|
// Nada de `setx`: trunca el PATH a 1024 caracteres y se come el de la gente.
|
|
209
234
|
const ps = [
|
|
210
|
-
"$dir = '" +
|
|
235
|
+
"$dir = '" + dir.replace(/'/g, "''") + "'",
|
|
211
236
|
"$cur = [Environment]::GetEnvironmentVariable('Path','User')",
|
|
212
237
|
"if ($null -eq $cur) { $cur = '' }",
|
|
213
238
|
"if (($cur -split ';') -notcontains $dir) {",
|
|
@@ -220,7 +245,22 @@ function addToPathWindows() {
|
|
|
220
245
|
encoding: 'utf8',
|
|
221
246
|
});
|
|
222
247
|
const added = res.status === 0 && String(res.stdout).includes('added');
|
|
223
|
-
return { touched: added ? ['PATH de usuario (sin administrador)'] : [], line:
|
|
248
|
+
return { touched: added ? ['PATH de usuario (sin administrador)'] : [], line: dir };
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// El shim `glassnote.cmd` que crea npm invoca `node` del PATH. Cuando el Node lo bajó el
|
|
252
|
+
// instalador a ~/.glassnote, ese directorio solo quedaba en el PATH de la sesión de
|
|
253
|
+
// PowerShell que corrió la instalación: en una terminal nueva —o en cualquier proceso
|
|
254
|
+
// posterior— `glassnote` moría con «"node" no se reconoce como un comando». Se agrega el
|
|
255
|
+
// directorio del node al PATH de usuario, igual que BIN_DIR.
|
|
256
|
+
function addNodeToPathWindows() {
|
|
257
|
+
if (!IS_WIN) return null;
|
|
258
|
+
const nodeBinary = mode.resolveNodeBinary(process.execPath);
|
|
259
|
+
// Solo el node que trajimos nosotros: el del sistema ya está donde tiene que estar.
|
|
260
|
+
if (!nodeBinary || !mode.isInside(nodeBinary, mode.HOME_DIR)) return null;
|
|
261
|
+
const dir = path.dirname(nodeBinary);
|
|
262
|
+
const res = addToPathWindows(dir);
|
|
263
|
+
return res.touched.length ? dir : null;
|
|
224
264
|
}
|
|
225
265
|
|
|
226
266
|
function removeFromPathUnix() {
|
|
@@ -253,7 +293,10 @@ function removeFromPathWindows() {
|
|
|
253
293
|
"$dir = '" + mode.BIN_DIR.replace(/'/g, "''") + "'",
|
|
254
294
|
"$cur = [Environment]::GetEnvironmentVariable('Path','User')",
|
|
255
295
|
"if ($null -eq $cur) { Write-Output 'absent'; exit }",
|
|
256
|
-
|
|
296
|
+
// Se quita cualquier entrada bajo ~/.glassnote, no solo BIN_DIR: el install tambien
|
|
297
|
+
// agrega el directorio del node que bajo, y dejarlo seria una ruta muerta.
|
|
298
|
+
"$home2 = '" + mode.HOME_DIR.replace(/'/g, "''") + "'",
|
|
299
|
+
"$new = (($cur -split ';') | Where-Object { $_ -ne '' -and $_ -ne $dir -and -not $_.StartsWith($home2, [StringComparison]::OrdinalIgnoreCase) }) -join ';'",
|
|
257
300
|
'if ($new -ne $cur) {',
|
|
258
301
|
" [Environment]::SetEnvironmentVariable('Path', $new, 'User')",
|
|
259
302
|
" Write-Output 'removed'",
|
|
@@ -457,6 +500,8 @@ function cmdInstall(args) {
|
|
|
457
500
|
if (!noPath) {
|
|
458
501
|
pathInfo = IS_WIN ? addToPathWindows() : addToPathUnix();
|
|
459
502
|
if (pathInfo.touched.length) step(`agregado al PATH en: ${pathInfo.touched.join(' ')}`);
|
|
503
|
+
const nodeDir = addNodeToPathWindows();
|
|
504
|
+
if (nodeDir) step(`agregado al PATH: ${nodeDir} (lo necesita el comando glassnote)`);
|
|
460
505
|
}
|
|
461
506
|
|
|
462
507
|
log('');
|
|
@@ -512,7 +557,7 @@ function cmdUpdate(args) {
|
|
|
512
557
|
);
|
|
513
558
|
const version = positional[0] || 'latest';
|
|
514
559
|
|
|
515
|
-
if (waitMs > 0)
|
|
560
|
+
if (waitMs > 0) esperarAQueCierre(waitMs);
|
|
516
561
|
|
|
517
562
|
// El cwd no puede estar dentro de lo que npm va a borrar: en Windows un directorio
|
|
518
563
|
// que es el cwd de un proceso vivo no se puede eliminar, y ese proceso es este.
|
package/package.json
CHANGED