Comment modifier un PKGBUILD qui utilise des sources git pour extraire uniquement un clone peu profond?

18

L'autre jour, j'ai essayé d'installer à opencv-gitpartir d' AUR avec makepkgsur Arch Linux. Bien sûr, il tire du référentiel git comme son nom l'indique. Cela tire 1 Go. Je lis comment faire un clone peu profond avec git. Quand je regarde le PKGBUILDfichier, en utilisant grep git PKGBUILD, je vois:

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-t-il un moyen de modifier la recette ou la makepkgcommande pour extraire uniquement un clone peu profond (la dernière version de la source est ce que je veux) et pas le référentiel complet pour économiser de l'espace et de la bande passante? La lecture man 5 PKGBUILDne fournit pas les informations que je recherche. J'ai également consulté rapidement les pages de manuelmakepkg et - pacman je n'arrive pas à trouver comment le faire.

HalosGhost
la source
"En fin de compte, je n'ai pas réussi à construire la recette avec succès." Qu'avez-vous fait exactement et qu'est-ce qui a mal tourné? Veuillez fournir plus de détails, s'il vous plaît. Comme quelqu'un me l'a dit une fois sur IRC, nous avons malheureusement laissé nos boules de cristal à la maison. Cela semble, en lisant entre les lignes, comme si le dépôt git n'a pas réussi à cloner avec succès, peut-être à cause de problèmes de réseau? Mais je devine. Soyez explicite, s'il vous plaît.
Faheem Mitha
Une supposition éclairée est que vous pouvez diviser le processus en deux parties. Clonez d'abord le git repos comme un clone peu profond ou autre. Appliquez ensuite la recette. Je suppose que vous pouvez remplacer l'adresse réseau git+http://github.com/Itseez/opencv.gitdans la recette AUR par un chemin d'accès local. As-tu essayé ça? Si ce système de build vous oblige à cloner un référentiel même si vous l'avez disponible localement, alors c'est assez fou.
Faheem Mitha
@FaheemMitha Merci, j'ai supprimé la référence à l'échec de la construction - je m'en fous. Je recherche une solution intégrée qui pourrait être basée sur quelque chose comme ce que vous décrivez. Je pense qu'il pourrait y avoir une option pour ne pas télécharger s'il y a du contenu local ...
Si votre principale raison de poser cette question est d'éviter d'utiliser une bande passante / espace inutile, il ne serait pas difficile de le dire explicitement. Comme je l'ai dit, essayez simplement d'utiliser le chemin local - cela fonctionnera probablement selon le principe de la moindre surprise. Si l'option de spécification d'un clone superficiel n'est pas indiquée dans la page de manuel, il est possible que la fonctionnalité ne soit pas disponible. Je suggère de demander dans un forum Arch approprié, peut-être une liste de diffusion dédiée à ce système de construction. Précisez d'abord si cette fonctionnalité existe; sinon, vous pouvez déposer un bogue de liste de souhaits.
Faheem Mitha

Réponses:

13

Cela peut être fait en utilisant un dlagent personnalisé . Je ne comprends pas vraiment l'emballage Arch ni le fonctionnement des dlagents, donc je n'ai qu'une réponse de piratage, mais cela fait le travail.

L'idée est de modifier le PKGBUILD pour utiliser un agent de téléchargement personnalisé. J'ai modifié la source

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

dans

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

puis défini un nouveau dlagent appelé mygitqui fait un clone peu profond. J'ai fait cela en ajoutant au DLAGENTStableau dans /etc/makepkg.confle dlagent suivant:

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

Je suppose que vous pourriez probablement définir cet agent de téléchargement ailleurs, mais je ne sais pas comment. Notez également que le référentiel en cours de clonage est codé en dur dans la commande. Encore une fois, cela peut probablement être évité. Enfin, l'emplacement de téléchargement n'est pas ce que le PKGBUILD attend. Pour contourner ce problème, je déplace simplement le référentiel après l'avoir téléchargé. Je le fais en ajoutant

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

au début de la pkgverfonction.

Je pense que la solution la plus propre serait de comprendre ce que fait le git+httpdlagent et de le redéfinir temporairement. Cela devrait éviter tous les aspects de piratage de la solution.

StrongBad
la source
Merci, cela fonctionne. Oui, il faudrait un peu de travail pour l'abstraire pour fonctionner dans d'autres cas que celui-ci. Mais cela vaut la peine d'être étudié et votre réponse est une preuve de concept valide. J'ai donc modifié la réponse sélectionnée en la vôtre.
11

Personnellement, j'ai modifié le script makepkg et cela fonctionne comme un charme:

# 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"
...

Ajout de "--mirror --single-branch --depth 1" à la commande "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"

Voici une vue diff:

--- 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
la source
L'installation de softethervpn-git télécharge désormais 100M uniquement au lieu de 468M avant le hack.
amised
Brillant! Merci beaucoup! Ce devrait être la valeur par défaut.
ccpizza
Remarque: cela échouera avec PKGBUILD en fonction d'une balise par exemple. Voir cette discussion . Cependant , il peut probablement être résolu en utilisant les fragments là ( branch, tag, commitetc.).
BenC
7
Remarque: maintenant /usr/share/makepkg/source/git.shdevrait être corrigé à la place
nponeccop
6

Selon https://bugs.archlinux.org/task/23065 (crédit à jasonwryan), l'ajout d'une fonctionnalité de clonage superficiel à AUR PKGBUILD était un élément de liste de souhaits qui a été fermé le samedi 05 mars 2011 avec le commentaire:

Raison de la fermeture: ne sera pas mise en œuvre

Cela suggère que cela ne se produira que si quelqu'un soumet un correctif.

Comme je l'ai suggéré à l'affiche dans ses commentaires, ce qu'il essaie de faire peut presque certainement être accompli en divisant le processus en deux étapes:

  1. Clonez le référentiel git en utilisant un clone peu profond
  2. Exécutez la recette PKGBUILD, mais pointez-la vers le clone local. Je ne suis pas un utilisateur Arch, donc je ne sais pas si c'est le cas, mais je serais très surpris d'un système de construction de packages qui obligerait les utilisateurs à cloner des référentiels à distance afin de construire des packages.
Faheem Mitha
la source
Je vous remercie. Dans les commentaires du lien, il y a cette discussion sur la façon dont cette modification a pu avoir des conséquences inattendues sur le workflow de script. Le problème est de savoir comment git remplit et relie les objets manquants, etc. - l'utilisation du disque ne serait pas un avantage si je comprends bien. En effet, j'ai essayé de faire un clone peu profond dans le répertoire de recettes qui a fini par être 1 Go + le même mais qui a été récupéré par makepkg(pkgver se plaint légèrement mais quand même) et fonctionne aussi!
2

Si vous créez un miroir superficiel du référentiel dans le même répertoire que le PKGBUILD, vous pouvez utiliser makepkg --holdverpour empêcher makepkgde mettre à jour le reste du référentiel. Cela supprime la nécessité de modifier le PKGBUILD, makepkg.confou makepkglui - même; cependant, le clonage / mise à jour du référentiel doit être effectué manuellement.

Par exemple avec cling-git, qui clonerait normalement l'intégralité de llvmet 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

Depuis les pages de manuel makepkg:

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

Notez que makepkg clonera toujours les dépôts qui ne sont pas déjà présents, ce qui signifie que j'aurais pu omettre le clonage manuel du clingréférentiel dans l'exemple ci-dessus car il n'est pas si grand.

verstatx
la source
1

Si vous ne souhaitez pas modifier les scripts makepkg.

comme indiqué ici , le point DEVELSRCDIRdans /etc/yaourtrcou ~/.yaourtrcfichier à un certain dossier persistant. Ensuite, toutes les extractions du référentiel (git / svn / ...) auront lieu dans ce dossier. Une fois le référentiel cloné, seule une extraction rapide avec les dernières révisions sera effectuée au lieu du clone complet à chaque fois.

mzzzzb
la source