Listar pacotes que estou perdendo rodando nix-env --delete-generations

0

Eu uso NixOS , versão 1.10 do Nix. nix-env , o comando de instalação do gerenciador de pacotes Nix, cria uma nova geração toda vez que você instala um pacote. Dessa forma, diferentes configurações de pacotes são armazenadas em gerações separadas, e você pode alternar entre elas para reverter para estados anteriores do sistema, onde você tinha diferentes pacotes instalados a partir de agora.

Suponha que eu instalei o pacote emacs , que criou uma nova geração:

$ nix-env --list-generations
1   2015-09-18 14:32:51   
2   2015-09-19 15:41:58   (current)

A geração 1 não contém emacs , a geração 2 sim. Se eu mudar para a geração 1 e excluir a geração 2, isso significa que eu perderei emacs :

$ nix-env --switch-generation 1
switching from generation 2 to 1
$ nix-env --delete-generations 2
removing generation 2

As informações da operação --delete-generations são muito escassas e a adição de --verbose ou --dry-run não especifica a lista de pacotes removidos. Mesmo -vvvvv não é útil.

$ nix-env --dry-run --delete-generations 14
(dry run; not doing anything)
would remove generation 14
$ nix-env --verbose --dry-run --delete-generations 14
(dry run; not doing anything)
evaluating file ‘/nix/store/13lmbyk148z95sp96gh0vr2b867ypl8g-nix-1.10/share/nix/corepkgs/derivation.nix’
would remove generation 14

Mas como sei que perco emacs ? Existe algum comando ou script muito simples para visualizar uma lista de pacotes que eu perderia se eu excluísse permanentemente uma geração? Ou existe uma maneira de ver uma diferença entre duas gerações? Eu me esforço para a solução idiomática mais simples.

    
por Mirzhan Irkegulov 07.11.2015 / 16:23

1 resposta

1

Isso depende do que você entende por "perder um pacote".

Supondo que você queira dizer:

won't be able to run the commands provided by the package after deleting the generation

Se você excluir um perfil não atual, todos os comandos ainda estarão lá. O perfil é autônomo.

Para ver o que o perfil atual contém:

nix-store --query --references /nix/var/nix/profiles/per-user/$USER/profile

Esse é o perfil do usuário . Para ver o perfil do sistema:

nix-store --query --references /nix/var/nix/profiles/system

Pode haver uma maneira mais simples, mas usando o acima, podemos encontrar a resposta:

# Replace $1 by previous profile number
nix-store --query --references /nix/var/nix/profiles/{system,per-user/$USER/profile} > /tmp/current-packages
nix-store --query --references /nix/var/nix/profiles/{system,per-user/$USER/profile-$1-link} > /tmp/prev-packages 
# The packages "lost" by changing profile from current to profile-$1-link is the set difference
comm -32 <(sort /tmp/current-packages) <(sort /tmp/prev-packages)

Se você quer dizer:

which packages will be "physically" deleted

Eu acho que é um pouco mais complicado. Um possível ponto de partida é usar nix-store --query --roots em cada pacote no perfil a ser excluído.

    
por 06.08.2016 / 17:12

Tags