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

15

Outro dia eu tentei instalar o opencv-git do AUR com makepkg no Arch Linux. Claro que puxa 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 arquivo PKGBUILD , 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/;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 comando makepkg para extrair 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 de man 5 PKGBUILD não fornece a percepção que estou procurando. Também olhou rapidamente através das páginas de manual makepkg e pacman - parece que não consegue encontrar como fazer isso.

    
por jus cogens prime 10.09.2014 / 23:09

5 respostas

12

Isso pode ser feito usando um dlagent personalizado. Eu realmente não entendo o empacotamento do Arch ou como os dlagents funcionam, então eu só tenho uma resposta de hackers, 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"

em

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

e, em seguida, definiu um novo dlagent chamado mygit , que faz um clone superficial. Fiz isso adicionando à matriz DLAGENTS em /etc/makepkg.conf o dlagent a seguir:

'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 eu não sei como. Observe também que o repositório que está sendo clonado é codificado no comando. Novamente, isso provavelmente pode ser evitado. Finalmente, o local de download não é o que o PKGBUILD espera. Para contornar isso, simplesmente movo o repositório depois de baixá-lo. Eu faço isso adicionando

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

no início da função pkgver .

Acho que a solução mais limpa seria descobrir o que o git+http dlagent está fazendo e redefinir isso temporariamente. Isso deve evitar todos os aspectos da solução.

    
por 11.09.2014 / 15:47
10

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 --single-branch --depth 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 visualização de diferenças:

--- 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
    
por 14.05.2015 / 10:18
5

De acordo com o link (crédito para jasonwryan), adicionar funcionalidade de clonagem superficial ao AUR PKGBUILD foi um item da lista de desejos que foi fechado no sábado, 05 de março de 2011 com o comentário:

Reason for closing: Won't implement

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

Como sugeri para o pôster em 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 do PKGBUILD, mas aponte para o clone local. eu sou não é um usuário do Arch, então não saiba se esse é o caso, mas eu estaria muito surpreso com um sistema de construção de pacotes que forçou os usuários a clonar repositórios do remoto para criar pacotes.
por 11.09.2014 / 02:00
2

Se você criar um espelho superficial do repositório no mesmo diretório que o PKGBUILD , poderá usar makepkg --holdver para impedir que makepkg atualize o restante do repositório. Isso elimina a necessidade de modificar o PKGBUILD , makepkg.conf ou makepkg em 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 llvm e 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 man do makepkg:

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

Note que o makepkg ainda clonará repos que ainda não estão presentes, o que significa que eu poderia ter omitido clonando manualmente o repositório cling no exemplo acima, já que não é tão grande.

    
por 04.10.2018 / 11:35
1

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

conforme descrito aqui , ponto DEVELSRCDIR em /etc/yaourtrc ou ~/.yaourtrc arquivo para alguma pasta persistente. Então todos os checkouts do repositório (git / svn / ...) acontecerão nesta pasta. Uma vez clonado o repositório, somente a busca rápida com as revisões mais recentes será executada em vez do clone completo a cada vez.

    
por 27.09.2017 / 17:33