gpo.zugaina.org

Search Portage & Overlays:

app-eselect/eselect-nodejs

Node.js eselect module

Screenshots

  • eselect-nodejs-2-r1
    ~amd64 ~arm ~arm64 ~loong ~ppc64 ~riscv ~x86

    View      Download      Browse     License: GPL-2   
    Overlay: bentoo

ChangeLog

commit 495e51c184329b0aa28c066c64a088c023be15dc
Author: lucascouts <lucascs@protonmail.com>
Date: Mon Aug 3 21:51:58 2026 -0300

up(app-eselect/eselect-nodejs-2 -> 2-r1), mod(scripts/test-eselect-nodejs.sh)

pkg_postinst reaplica a seleção ativa quando o módulo é instalado.

Os entry points não versionados são estado de runtime que o módulo gera; nenhum
pacote os registra em CONTENTS, então um merge deste pacote não regenera nada.
Isso era inofensivo enquanto o módulo só mudava de comportamento — mas a versão
2 mudou a FORMA do que escreve, de symlink para exec wrapper, e o upgrade
deixou os symlinks da v1 parados em /usr/bin.

Medido na máquina onde apareceu: /usr/bin/node foi escrito às 09:57 por um
merge de nodejs sem relação, e este pacote entrou às 10:03 — o módulo novo
ficou instalado e inerte por seis minutos, com o www-client/chromium falhando
a verificação readlink -f exatamente como antes e nada na saída do merge
sugerindo o porquê.

get_active_slot já reconhece o symlink da v1, então `show` responde certo
mesmo antes da primeira reescrita e a seleção sobrevive a ela. "Nada ativo" é
o estado normal numa instalação nova: o pkg_postinst do net-libs/nodejs faz a
seleção inicial, e repeti-la aqui competiria com ele. A falha não é fatal —
morrer no postinst reprovaria o merge por algo que o usuário refaz à mão.

Duas asserções novas no harness (17 no total), cobrindo a regressão de ponta a
ponta: (p) `show` ainda lê um symlink da v1, e (q) reaplicar converte para
wrapper preservando o mesmo slot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

commit d8b541d7874adffb0f8bb9935e8b3fbf330dfd55
Author: lucascouts <lucascs@protonmail.com>
Date: Mon Aug 3 09:59:45 2026 -0300

up(app-eselect/eselect-nodejs-1 -> 2), mod(net-libs/nodejs-)

O módulo passa a escrever exec wrappers em /usr/bin/{node,npm,npx} no lugar
de symlinks.

`readlink -f` canonicaliza a cadeia inteira, então com um symlink em
/usr/bin/node ele reporta /usr/lib64/node-26/bin/node. Um consumidor que cria
o próprio link para /usr/bin/node e depois verifica com `readlink -f` compara
duas strings diferentes e morre — www-client/chromium faz exatamente isso no
src_prepare (o loop restore_list que troca o node embutido pelo do sistema) e
falha com "Symlink verification failed". A verificação vem do ::gentoo e está
em 9 dos ebuilds de chromium de lá, então corrigir um ebuild fecharia um caso
e deixaria a classe aberta.

Um arquivo regular resolve para si mesmo sob `readlink -f`, então esses
consumidores passam sem mudança nenhuma do lado deles. O custo foi medido:
`exec` substitui a imagem do processo, logo /proc/self/exe — e portanto
process.execPath — continua sendo o interpretador real do slot, que é o que
mantém o prefixo global do npm isolado por slot; em 200 invocações wrapper e
binário direto ficam dentro do ruído um do outro.

- get_active_slot lê a seleção de uma linha-marcador no wrapper, que um
symlink carregava no alvo. A forma antiga segue reconhecida, senão um
sistema ainda não reswitchado leria como "nada ativo".
- find_dangling_links testa o alvo do exec: um wrapper não dangla como um
symlink (é arquivo regular e o kernel roda), e sem essa checagem o cleanup
reportaria uma árvore quebrada como sã.
- O wrapper é escrito em nome temporário e movido: rename é atômico, e sem
isso quem executasse /usr/bin/node durante um switch leria script pela metade.
- >=app-eselect/eselect-nodejs-2 nos dois slots impede que um downgrade do
módulo reintroduza a falha silenciosamente.

/usr/include/node, a manpage e o bash-completion seguem symlinks: nenhum é
exec'd, então o risco do readlink -f não se aplica a eles.

15/15 em scripts/test-eselect-nodejs.sh (o harness pegou as 4 regressões de
forma na primeira rodada). pkgcheck limpo em eselect-nodejs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

commit 7c8a92be307150de4158bc05fa5a44416d511479
Author: lucascouts <lucascs@protonmail.com>
Date: Sun Aug 2 01:08:32 2026 -0300

add(app-eselect/eselect-nodejs-1)

eselect module that owns every unversioned Node.js path, so that
net-libs/nodejs can be slotted by major version.

Slots are discovered from the filesystem (glob over /usr/lib*/node-[0-9]*,
gated on an executable bin/node), never from a version list in code, and
ordered with sort -V -u: lexicographically node10 precedes node9, and -u
collapses the duplicate a lib -> lib64 profile symlink would produce.

A real directory at /usr/include/node is removed explicitly before the
link is created. Verified on GNU coreutils 9.11 that neither ln -sf nor
ln -sfn replaces one -- both descend into it and create node/node, after
which node-gyp resolves the wrong headers with no message. ln -sfn is
still used everywhere, for the other case: re-pointing over a symlink to
a directory would otherwise be written inside the previously active slot.

/etc/npm and /etc/env.d/50npm move here from net-libs/nodejs: neither is
slot-specific, so two installed slots would own the same file and
FEATURES="protect-owned" would turn that into a merge failure. The strong
blocker against net-libs/nodejs:0 is what keeps the already-merged
unslotted package from colliding on that same file during migration.

scripts/test-eselect-nodejs.sh drives the module through the real eselect
binary against a fabricated root: 15 assertions, hermetic, no sudo and no
merge needed. It neutralises eselect's env update, which regenerates the
host's /etc/profile.env regardless of --root.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>