Como modificar um PKGBUILD que usa fontes git para extrair apenas um clone superficial?

18

No outro dia eu tentei instalar opencv-gita partir do AUR com makepkgno Arch Linux. Obviamente, ele é extraído do repositório git como o nome indica. Isso puxa 1Gb. Estou lendo sobre como fazer um clone superficial com git. Quando olho para o PKGBUILDarquivo, usando grep git PKGBUILD, vejo:

pkgname="opencv-git"
makedepends=('git' 'cmake' 'python2-numpy' 'mesa' 'eigen2')
provides=("${pkgname%-git}")
conflicts=("${pkgname%-git}")
source=("${pkgname%-git}::git+http://github.com/Itseez/opencv.git"
    cd "${srcdir}/${pkgname%-git}"
    git describe --long | sed -r 's/([^-]*-g)/r\1/;s/-/./g'
    cd "${srcdir}/${pkgname%-git}"
    cd "${srcdir}/${pkgname%-git}"
    cd "${srcdir}/${pkgname%-git}"
    install -Dm644 "LICENSE" "${pkgdir}/usr/share/licenses/${pkgname%-git}/LICENSE"

Existe uma maneira de modificar a receita ou o makepkgcomando para obter apenas um clone superficial (a versão mais recente da fonte é o que eu quero) e não o repositório completo para economizar espaço e largura de banda? A leitura man 5 PKGBUILDnão fornece o insight que estou procurando. Também olhou rapidamente pelas páginasmakepkg e pacman man - parece que não consegue encontrar como fazer isso.

HalosGhost
fonte
"No final, falhei em criar a receita com sucesso". O que você fez exatamente e o que deu errado? Forneça mais detalhes, por favor. Como alguém me disse uma vez no IRC, infelizmente deixamos nossas bolas de cristal em casa. Parece, lendo nas entrelinhas, como se os repositórios git não tivessem sido clonados com êxito, possivelmente por causa de problemas de rede? Mas estou apenas adivinhando. Seja explícito, por favor.
Faheem Mitha 10/09
Um palpite é que você pode dividir o processo em duas partes. Primeiro clone o git repos como clone superficial ou o que seja. Em seguida, aplique a receita. Eu acho que você poderia substituir o endereço de rede git+http://github.com/Itseez/opencv.gitna receita do AUR por um nome de caminho local. Você já tentou isso? Se esse sistema de compilação obriga a clonar um repositório, mesmo que você o tenha disponível localmente, é um absurdo.
Faheem Mitha
@FaheemMitha Obrigado, removi a referência à falha na compilação - não me importo. Estou procurando uma solução integrada que possa se basear em algo como o que você descreve. Eu acho que pode haver uma opção para não fazer o download, se houver conteúdo local ...
Se o seu principal motivo para fazer esta pergunta for evitar o uso de largura de banda / espaço desnecessários, não seria demais dizer isso explicitamente. Como eu disse, tente apenas usar o caminho local - isso provavelmente funcionará pelo princípio da menor surpresa. Se a opção para especificar um clone superficial não for fornecida na página de manual, é possível que a funcionalidade não esteja disponível. Sugiro perguntar em um fórum apropriado do Arch, talvez uma lista de discussão dedicada a esse sistema de compilação. Primeiro esclareça se essa funcionalidade existe; Caso contrário, você pode registrar um bug na lista de desejos.
Faheem Mitha

Respostas:

13

Isso pode ser feito usando um dlagent personalizado . Eu realmente não entendo a embalagem do Arch ou como os dlagents funcionam, então só tenho uma resposta de hack, mas ele faz o trabalho.

A idéia é modificar o PKGBUILD para usar um agente de download personalizado. Eu modifiquei a fonte

"${pkgname%-git}::git+http://github.com/Itseez/opencv.git"

para dentro

"${pkgname%-git}::mygit://opencv.git"

e então definimos um novo dlagent chamado mygitque faz um clone superficial. Fiz isso adicionando à DLAGENTSmatriz no /etc/makepkg.confseguinte dlagent:

'mygit::/usr/bin/git clone --depth 1 http://github.com/Itseez/opencv.git'

Meu palpite é que você provavelmente poderia definir esse agente de download em outro lugar, mas não sei como. Observe também que o repositório que está sendo clonado está codificado no comando. Novamente, isso provavelmente pode ser evitado. Finalmente, o local do download não é o que o PKGBUILD espera. Para contornar isso, simplesmente movo o repositório após o download. Eu faço isso adicionando

mv "${srcdir}/../mygit:/opencv.git" "${srcdir}/../${pkgname%-git}"

no início da pkgverfunção.

Eu acho que a solução mais limpa seria descobrir o que o git+httpdlagent está fazendo e redefinir isso temporariamente. Isso deve evitar todos os aspectos de hack da solução.

StrongBad
fonte
Obrigado, isso funciona. Sim, seria necessário algum trabalho para abstraí-lo para funcionar em outros casos além deste. Mas vale a pena investigar e sua resposta é uma prova de conceito válida. Alterei a resposta selecionada para a sua.
11

Pessoalmente, modifiquei o script makepkg e ele está funcionando como um encanto:

# vim `which makepkg` +/clone
...
541         msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
542         if ! git clone --mirror "$url" "$dir"; then
543             error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
...

Anexando "--mirror - único ramo - profundidade 1" ao comando "git clone":

541         msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
542         if ! git clone --mirror --single-branch --depth 1 "$url" "$dir"; then
543             error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"

Aqui está uma visão diferencial:

--- makepkg ...
+++ makepkg-patched ...
@@ -539,7 +539,7 @@

    if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
        msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
-       if ! git clone --mirror "$url" "$dir"; then
+       if ! git clone --mirror --single-branch --depth 1 "$url" "$dir"; then
            error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
            plain "$(gettext "Aborting...")"
            exit 1
amized
fonte
A instalação do softethervpn-git agora baixa 100M somente em vez de 468M antes do hack.
alterado
Brilhante! Muito obrigado! Esse deve ser o padrão.
Ccpizza
Nota: isso falhará com PKGBUILDs, dependendo de uma tag, por exemplo. Veja esta discussão . No entanto, pode provavelmente ser fixada usando os fragmentos lá ( branch, tag, commitetc.).
BenC 23/01/16
7
Nota: agora /usr/share/makepkg/source/git.shdeve ser corrigido em vez disso
nponeccop 12/03
6

De acordo com https://bugs.archlinux.org/task/23065 (crédito a jasonwryan), adicionar funcionalidade de clonagem rasa ao AUR PKGBUILD era um item da lista de desejos que foi fechado no sábado, 5 de março de 2011 com o comentário:

Motivo do fechamento: não será implementado

Isso sugere que isso não acontecerá, a menos que alguém envie um patch.

Como sugeri ao pôster nos comentários, o que ele está tentando fazer quase certamente pode ser realizado dividindo o processo em duas etapas:

  1. Clone o repositório git usando o clone superficial
  2. Execute a receita PKGBUILD, mas aponte-a para o clone local. Eu não sou um usuário do Arch, então não sei se é esse o caso, mas ficaria muito surpreso com um sistema de criação de pacotes que forçava os usuários a clonar repositórios remotos para criar pacotes.
Faheem Mitha
fonte
Obrigado. Nos comentários no link, há uma discussão sobre como essa modificação pode ter trazido consequências inesperadas para o fluxo de trabalho do script. A questão é como o git preenche e vincula objetos ausentes etc. - o uso do disco não seria um benefício se eu entendi corretamente. Na verdade, eu tentei fazer um clone superficial no diretório de receitas, que acabou sendo 1 GB + o mesmo, mas foi captado por makepkg(pkgver reclama um pouco, mas ainda assim) e funciona também!
2

Se você criar um espelho superficial do repositório no mesmo diretório que o PKGBUILD, poderá usar makepkg --holdverpara impedir a makepkgatualização do restante do repositório. Isso elimina a necessidade de modificar o PKGBUILD, makepkg.confou makepkgem si; no entanto, a clonagem / atualização do repositório precisa ser feita manualmente.

Como um exemplo com cling-git, que normalmente clonaria a totalidade de llvme clang:

$ git clone --mirror --depth=1 --branch=cling-patches http://root.cern.ch/git/llvm.git llvm
$ git clone --mirror --depth=1 --branch=cling-patches http://root.cern.ch/git/clang.git clang
$ git clone --mirror --depth=1 http://root.cern.ch/git/cling.git cling

$ makepkg --holdver

Nas páginas de manual do makepkg:

--holdver
    When using VCS sources (PKGBUILD(5)) any currently checked out source
    will not be updated to the latest revision.

Observe que o makepkg ainda clonará clingrepositórios que ainda não estão presentes, o que significa que eu poderia ter omitido a clonagem manual do repositório no exemplo acima, pois ele não é tão grande.

verstatx
fonte
1

Se você não deseja modificar os scripts do makepkg.

conforme descrito aqui , o ponto DEVELSRCDIRem /etc/yaourtrcou ~/.yaourtrcarquivo para alguma pasta persistente. Todos os checkouts do repositório (git / svn / ...) acontecerão nesta pasta. Depois que o repositório é clonado, somente a busca rápida com as revisões mais recentes será executada em vez do clone completo a cada vez.

mzzzzb
fonte