Empacotando com Git

Esta página descreve como usar as ferramentas gbp (git-buildpackage) para configurar e manter pacotes-fonte Debian em um repositório git. Depois de configurar esse repositório git (conhecido como repositório de empacotamento git - git packaging repository), mais adiante neste artigo também discute-se como construir pacotes binários Debian diretamente a partir de repositórios de empacotamento git já existentes.

Note-se que este é apenas um guia introdutório muito geral. A documentação oficial completa pode ser encontrada no pacote git-buildpackage (consulte a documentação online).

Para obter ajuda na conversão de repositórios Subversion criados por svn-buildpackage para git, consulte a subpágina de conversão svn-buildpackage.

Você também deve ler sobre o suporte a pristine-tar abaixo.

Esta página descreve o fluxo de trabalho usando os comandos do pacote git-buildpackage. Alternativamente, há também git-dpm e gitpkg.

Nomes de branches Git

Existe um esquema de nomenclatura padronizado para os branches usados nos empacotamentos. O esquema está descrito em DEP-14: layout recomendado para repositórios de empacotamento Git. Esta página segue esse padrão, mas ainda há muitos pacotes que não o seguem. O padrão antigo mais comum é usar master em vez de debian/latest para o ramo de empacotamento principal, e upstream em vez de upstream/latest para o branch com o código upstream mais recente.

Métodos de importação do upstream

Existem duas maneiras principais de importar o código upstream para o repositório debianizado:

Há também uma terceira opção, que é uma combinação das duas: gbp import-orig --upstream-vcs-tag. Isso é útil principalmente quando o orig tarball não é idêntico à tag de lançamento upstream, o que pode acontecer se, por exemplo,

As várias vantagens e desvantagens são discutidas aqui:

Começando

Importando do(a) upstream como tarballs

É mais fácil primeiro criar a primeira versão de um pacote fora do Git. Uma vez feito, você deve importar o pacote usando o comando import-dsc da ferramenta gbp. Anteriormente, o comando era git-import-dsc. O diretório em que é chamado será o diretório pai do novo repositório Git.

$ gbp import-dsc /caminho/para/pacote_0.1-1.dsc

Isso exibirá os resultados de seu progresso e fará alguns commits. A seguir, você terá alguns novos arquivos e diretórios:

$ ls
pacote/
pacote_0.1-1.orig.tar.gz

Olhando no novo repositório, nota-se que git-buildpackage (vulgo gbp) fez o seguinte:

Usando o repositório do(a) upstream

Se o(a) upstream já estiver usando git, basta criar um branch para a debianização. As convenções para nomes de ramos e tags seguem os casos que acabamos de descrever, de modo que se pode ramificar debian/latest a partir do lançamento upstream/latest, e adicionar o diretório debian/ como um commit.

Fluxo de trabalho de empacotamento posterior

Agora você pode trabalhar no ramo debian/latest para editar o pacote. Faça um commit com:

$ git commit -a

e construa o pacote com:

$ gbp buildpackage

Depois de ter produzido um pacote pronto para lançamento, você deve etiquetá-lo, da seguinte maneira:

$ gbp buildpackage --git-tag

Certifique-se de que o seu arquivo debian/changelog está correto, pois é ele que será usado para criar a tag. A etiqueta será chamada debian/0.1-2, onde 0.1-2 é a versão Debian.

Lidando com patches debian

A ferramenta gbp-pq pode ser usada para rastrear patches no git e exportá-los/importá-los de/para a série quilt em debian/patches.

Atualizando para uma nova versão upstream

Importando do(a) upstream com tarballs

Quando uma nova versão upstream for lançada, use o comando import-orig para adicioná-lo ao repositório. Anteriormente, esse comando era git-import-orig.

Usando um arquivo debian/watch (recomendado)

$ gbp import-orig --uscan

Usando um arquivo tarball

$ gbp import-orig /caminho/para/novo-upstream.tar.gz -u 0.2

onde 0.2 é o novo número de versão upstream.

{i} Se o tarball upstream já estiver na forma nomepacote_versão.orig.tar.gz (por exemplo, pacote_0.2.orig.tar.gz), então a opção -u não é necessária.

Usando o repositório upstream

Se estivermos usando o repositório upstream, podemos fazer git fetch na nova tag de lançamento no repositório, para o branch upstream/latest. Precisamos unir com git merge este ramo em debian/latest, e fazer um commit do novo tarball com pristine-tar. Pode ser feito um rebase do patches com gbp-pq, e o próprio git pode ser usado para resolver quaisquer conflitos que tenham sido criados.

Combinando um branch debian/experimental em debian/latest para sid

Vamos assumir que você tenha os seguintes ramos::

upstream/latest

último upstream em desenvolvimento

upstream-1.5

série upstream 1.5, considerada estável

debian/latest

branch para construir pacotes para sid

debian/experimental

branch para construir pacotes para experimental

Em algum momento, você deseja mover o trabalho de debian/experimental para o ramo debian/latest, e liberá-lo para a instável (unstable).

Primeiro, é necessário certificar-se de que debian/experimental tem tudo correto em debian/* - talvez você tenha feito o commit de algo em debian/latest e não selecionou (cherry-pick) para debian/experimental. Você pode comparar as subárvores debian/ dessa forma:

git checkout debian/latest
git diff debian/experimental debian

Se necessário, selecione (cherry-pick) qualquer alteração em debian/experimental. A próxima mesclagem irá obliterar tudo em debian/latest e substituirá pelo conteúdo do ramo debian/experimental. A única coisa que é mantida é debian/changelog, porque precisa refletir o histórico de mudanças dentro do sid e não precisa conter detalhes de lançamentos individuais para a experimental. Veja como fazemos isso (certifique-se de que debian/latest é um espaço de trabalho limpo):

git checkout debian/latest
git clean -fd && git checkout .
git merge -s ours debian/experimental
git diff --binary debian/experimental | git apply -R --index
git reset debian/changelog
git checkout debian/changelog
git commit -m 'Merge 1.6.0~rc1 from debian/experimental' --amend

Depois de fazer isso, é fortemente sugerido que você inspecione o merge com gitk e com git diff antes de fazer push para salsa ou para qualquer outro(a) desenvolvedor(a). Por exemplo,

git diff debian/experimental

chamado em debian/latest deve somente exibir o changelog, porque tudo mais em debian/latest deve agora ser idêntico a debian/experimental.

Conclusão

Isso é tudo sobre o básico para manter pacotes-fonte e construir pacotes binários com o Git! Eu recomendaria fazer cópias de pacotes e experimentar as ferramentas em repositórios temporários, para começar. Uma vez que você sinta que as dominou, existem outras opções que devem ser analisadas.

Mais opções

pbuilder

Para usar o pbuilder para construções de pacotes binários, simplesmente altere builder em ~/.gbp.conf ou /etc/git-buildpackage/gbp.conf para /usr/bin/git-pbuilder

{i} /usr/bin/git-pbuilder pode ser editado para usar opções adicionais, tais como --builddir e --debsign-k...

Assinando etiquetas

Ao chamar ambas as ferramentas git-import-dsc ou git-import-orig, as seguintes opções podem ser usadas:

--sign-tags

Para assinar tags

--keyid=openpgp-keyid

Com qual chave OpenPGP assinar as tags

pristine-tar

git-buildpackage também suporta o uso de pristine-tar, uma nova ferramenta desenvolvida por Joey Hess para recriar tarballs idênticos de um pequeno arquivo delta e os arquivos no diretório atual.

Se você ativar pristine-tar, é feito um commit de arquivos delta para o ramo pristine-tar se você chamar git-import-dsc ou git-import-orig. Quando você constrói o pacote usando gbp buildpackage, o tarball exato é regenerado usando pristine-tar.

Ao chamar qualquer uma das ferramentas git-import-dsc ou git-import-orig, a opção --pristine-tar pode ser usada. Ao chamar gbp buildpackage, a opção --git-pristine-tar pode ser usada. Você também pode ativar a opção --pristine-tar em /etc/git-buildpackage/gbp.conf.

executando lintian após a construção

Adicione isto a ~/.gbp.conf :

postbuild = lintian -I $GBP_CHANGES_FILE && echo "Lintian OK"

executando autopkgtest após a construção

Primeiro configure um ambiente para adt (veja a documentação do autopkgtest, man adt-run). Em seguida, adicione isso ao seu ~/.gbp.conf:

postbuild = adt-run --changes $GBP_CHANGES_FILE --- schroot sid-amd64-sbuild; [ $? -eq 0 -o $? -eq 8 ]

A última verificação está lá para evitar falhas quando não há testes para executar.

Um arquivo gbp.conf de exemplo

[DEFAULT]
builder = git-pbuilder
cleaner = fakeroot debian/rules clean
# Cria pristine-tar na importação
pristine-tar = True
# Executa lintian para verificar um pacote após a construção
postbuild = lintian -iIE --pedantic $GBP_CHANGES_FILE && echo "Lintian OK"""

[buildpackage]
export-dir = ../build-area/

[import-orig]
# Filtra arquivos/diretórios não desejados do(a) upstream
filter = [
    '*egg.info',
    '.bzr',
    '.hg',
    '.hgtags',
    '.svn',
    'CVS',
    '*/debian/*',
    'debian/*'
    ]
# Filtra arquivos do tarball passados para pristine-tar
filter-pristine-tar = True

[import-dsc]
filter = [
    'CVS',
    '.cvsignore',
    '.hg',
    '.hgignore',
    '.bzr',
    '.bzrignore',
    '.gitignore'
    ]

[dch]
# Ignora mensagens merge nos commits
git-log = --no-merges

Veja também