Como extraio a versão do pacote do debian / changelog?

11

Qual é a maneira mais robusta de analisar o debian/changelogarquivo de um pacote de origem (ou debian/control?) Para obter o número da versão do pacote? Algo como:

pkgver=$(dpkg-parsechangelog | magic_goes_here)

Quero extrair o número da versão (e apenas o número da versão) para que eu possa manipulá-lo em um script.

Eu esperava encontrar um dpkg-*utilitário para esse fim, mas ainda não o encontrei.

Richard Hansen
fonte

Respostas:

18

Se você possui a versão 1.17.0 ou posterior, pode usar

dpkg-parsechangelog --show-field Version

Não há necessidade de processar a saída ainda mais. Esta versão está atualmente (fevereiro de 2014) disponível no Debian Testing.

Martin Geisler
fonte
1
@RichardHansen: Desculpe por isso, acontece que a bandeira não está disponível na versão presente no Debian Stable.
Martin Geisler 21/02
O mesmo para o Ubuntu 12.04. Está presente no Ubuntu 14.04.
Stefan
7

Existem inúmeras maneiras de fazer isso.

dpkg-parsechangelog | sed -n 's/^Version: //p'

ou alternativamente:

dpkg-parsechangelog | grep Version: | cut -d' ' -f2-

andrewsomething
fonte
Eu esperava algo mais robusto - a deb-control(5)página de manual não descreve claramente o formato e eu não quero fazer nenhuma suposição. Por exemplo, não deixa claro que os campos devem iniciar em uma linha ("Os campos são delimitados apenas por tags de campo"). Ele também diz que um campo pode abranger várias linhas e não diz nada sobre espaçamento entre a tag e o valor; portanto, talvez Version:123deva ser interpretado como uma continuação do campo anterior e não como um campo separado da versão (devido à falta de um espaço após o cólon).
Richard Hansen
Na prática, a saída de dpkg-parsechangelogserá semelhante. Version: 0.6.11-2Se você quiser algo para fazer uma análise mais robusta do debian/controlformato, poderá usar python-debianou libparse-debcontrol-perl.
andrewsomething
1

dpkg-parsechangelogfunciona, e a resposta anterior, canalizando a saída através de sed / grep deve ser totalmente robusta. Se você quiser saber detalhes precisos do formato da dpkg-parsechangelogsaída e a maioria dos outros arquivos de controle no estilo debian, consulte RFC 822 . Nunca é aceitável que uma versão do pacote deb contenha uma nova linha, espaço ou qualquer outro caractere especial ou de controle (consulte man deb-version" Version: blah" ), portanto, a linha " " na saída estará sempre presente e sempre será uma única linha em seu próprio.

No entanto, dpkg-parsechangelogé um programa muito pesado para ser executado apenas para obter o número da versão atual de um registro de alterações. Ele precisa executar o Perl e carregar um número impressionante de bibliotecas para fornecer um resultado, a maioria dos quais você não usará. Em plataformas mais lentas, ou com mídia de armazenamento lenta de arquivos, ou quando você precisar fazer esta versão analisando muitas vezes, será muito dolorosamente lento. Em vez disso, basta usar o que estiver dentro do primeiro conjunto de parênteses na primeira linha:

head -1 debian/changelog | awk -F'[()]' '{print $2}'

Isso fornecerá a versão correta do pacote atual com qualquer changelogarquivo válido usando o formato padrão (e debian/changelogformatos fora do padrão , para todos os efeitos práticos gerais, nunca são usados).

o paul
fonte
-1

como eu vi a versão do pacote consiste na parte do cabeçalho do arquivo changelog. então você pode fazer assim

pkgver=$(dpkg-parsechangelog | head

Eu tentei este comando para pacotes instalados, por exemplo

aptitude changelog shutter | head

&

jai@frank-Jai:~$ aptitude changelog shutter | head
Get: Changelog of shutter
shutter (0.89.0-0ubuntu1) quantal; urgency=low

  * New upstream release.
   - Adds an AppIndicator (LP: #805464).
  * debian/control: Recommend libgtk2-appindicator-perl

 -- Andrew Starr-Bochicchio <[email protected]>  Sat, 11 Aug 2012 17:36:18 -0400

shutter (0.88.3-1) unstable; urgency=low
jai@frank-Jai:~$ 
rɑːdʒɑ
fonte
1
Quero o número da versão e apenas o número da versão para que eu possa manipulá-lo em um script.
Richard Hansen