¿Cómo modificar un PKGBUILD que usa fuentes git para extraer solo un clon superficial?

18

El otro día intenté instalar opencv-gitdesde el AUR con makepkgen Arch Linux. Por supuesto que tira del git repositorio como su nombre lo indica. Esto tira 1Gb. Estoy leyendo sobre hacer un clon superficial con git. Cuando miro el PKGBUILDarchivo, usando grep git PKGBUILD, veo:

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"

¿Hay una manera de modificar la receta o la makepkgorden de tirar solamente un clon sin profundidad (la última versión de la fuente es lo que quiero) y no el depósito completo para ahorrar espacio y ancho de banda? La lectura man 5 PKGBUILDno proporciona la información que estoy buscando. También revisé rápidamente las páginas de manualmakepkg y - parece que no puedo encontrar cómo hacerlo.pacman

HalosGhost
fuente
"Al final no pude construir con éxito la receta". ¿Qué hiciste exactamente y qué salió mal? Proporcione más detalles, por favor. Como alguien me dijo una vez en IRC, desafortunadamente dejamos nuestras bolas de cristal en casa. Suena, leyendo entre líneas, como si los repositorios de git no pudieran clonarse con éxito, posiblemente debido a problemas de red. Pero solo estoy adivinando. Sé explícito, por favor.
Faheem Mitha
Una suposición educada es que puede dividir el proceso en dos partes. Primero clone los repositorios git como un clon superficial o lo que sea. Luego aplique la receta. Supongo que podría reemplazar la dirección de red git+http://github.com/Itseez/opencv.giten la receta de AUR con un nombre de ruta local. ¿Has intentado eso? Si este sistema de compilación te obliga a clonar un repositorio incluso si lo tienes disponible localmente, entonces es bastante loco.
Faheem Mitha
@FaheemMitha Gracias, he eliminado la referencia a fallar en la compilación, no me importa. Estoy buscando una solución integrada que pueda basarse en algo como lo que usted describe. Creo que podría haber una opción para no descargar si hay contenido local ...
Si su razón principal para hacer esta pregunta es evitar el uso de ancho de banda / espacio innecesario, entonces no estaría de más decirlo explícitamente. Como dije, intente simplemente usar la ruta local; esto probablemente funcionará según el principio de menor sorpresa. Si la opción para especificar un clon superficial no se proporciona en la página del manual, es posible que la funcionalidad no esté disponible. Sugiero preguntar en un foro de Arch apropiado, tal vez una lista de correo dedicada a ese sistema de compilación. Primero aclare si esa funcionalidad existe; si no, puede presentar un error en la lista de deseos.
Faheem Mitha

Respuestas:

13

Esto se puede hacer usando un agente personalizado . Realmente no entiendo el empaque Arch o cómo funcionan los dlagents, por lo que solo tengo una respuesta de pirateo, pero hace el trabajo.

La idea es modificar el PKGBUILD para usar un agente de descarga personalizado. Modifiqué la fuente

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

dentro

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

y luego definió un nuevo dlagent llamado mygitque hace un clon superficial. Lo hice agregando a la DLAGENTSmatriz en /etc/makepkg.confel siguiente dlagent:

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

Mi conjetura es que probablemente se podría definir este agente de descarga en otro lugar, pero no sé cómo. Observe también que el repositorio que está siendo clonado está codificado en el comando. De nuevo, esto probablemente se puede evitar. Finalmente, la ubicación de descarga no es lo que PKGBUILD espera. Para evitar esto, simplemente muevo el repositorio después de descargarlo. Hago esto agregando

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

Al comienzo de la pkgverfunción.

Creo que la solución más limpia sería descubrir qué git+httpestá haciendo el agente y redifinarlo temporalmente. Esto debería evitar todos los aspectos de pirateo de la solución.

Fuerte
fuente
Gracias, esto funciona. Sí, necesitaría algo de trabajo para abstraerlo para que funcione en otros casos además de este. Pero vale la pena investigar y su respuesta es una prueba de concepto válida. He cambiado de acuerdo con la respuesta seleccionada a la suya.
11

Personalmente modifiqué el script makepkg y funciona de maravilla:

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

Agregar "--mirror --single-branch --depth 1" al 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"

Aquí está una vista 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
fuente
Instalar softethervpn-git ahora descarga 100M solo en lugar de 468M antes del hack.
amized
¡Brillante! ¡Gracias una tonelada! Este debería ser el valor por defecto.
ccpizza
Nota: esto fallará con PKGBUILD dependiendo de una etiqueta, por ejemplo. Ver esta discusión . Sin embargo es probable que se puede fijar mediante el uso de los fragmentos de allí ( branch, tag, commitetc.).
BenC
77
Nota: ahora /usr/share/makepkg/source/git.shdebería ser parcheado en su lugar
nponeccop
6

Según https://bugs.archlinux.org/task/23065 (crédito a jasonwryan), agregar una funcionalidad de clonación superficial a AUR PKGBUILD fue un elemento de la lista de deseos que se cerró el sábado 05 de marzo de 2011 con el comentario:

Motivo de cierre: no se implementará

Esto sugiere que no va a suceder a menos que alguien envía un parche.

Como le sugerí al afiche en los comentarios, lo que él está tratando de hacer casi con seguridad se puede lograr dividiendo el proceso en dos pasos:

  1. Clonar el repositorio git usando clon de poca profundidad
  2. Ejecutar la receta PKGBUILD, pero lo señala en el clon local. No soy un usuario de Arco, así que no sé si este es el caso, pero estaría muy sorprendido por un sistema de construcción de paquetes que los usuarios a los repositorios clon obligado a dejar el mando a distancia con el fin de construir paquetes.
Faheem Mitha
fuente
Gracias. En los comentarios en el enlace, hay una discusión sobre cómo esta modificación podría haber traído consecuencias inesperadas al flujo de trabajo del script. El problema es cómo puebla git y vincula los objetos faltantes, etc. - el uso del disco no sería un beneficio si lo entiendo correctamente De hecho, intenté hacer un clon superficial en el directorio de recetas que terminó siendo 1GB + igual pero que fue recogido por makepkg(pkgver se queja un poco, pero aún así) ¡y también funciona!
2

Si crea un espejo poco profundo del repositorio en el mismo directorio que PKGBUILD, puede usar makepkg --holdverpara evitar la makepkgactualización del resto del repositorio. Esto elimina la necesidad de modificar el PKGBUILD, makepkg.confo makepkgen sí; sin embargo, la clonación / actualización del repositorio debe hacerse manualmente.

Como ejemplo con cling-git, que normalmente clonaría la totalidad de llvmy 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

Desde las páginas de manual de makepkg:

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

Tenga en cuenta que makepkg seguirá clonando repos que todavía no están presentes, lo que significa que podría haber omitido clonar manualmente el clingrepositorio en el ejemplo anterior ya que no es tan grande.

verstatx
fuente
1

Si no desea modificar los scripts makepkg.

como se describe aquí , el punto DEVELSRCDIRen /etc/yaourtrco ~/.yaourtrcarchivo en alguna carpeta persistente. Luego, todos los pagos del repositorio (git / svn / ...) sucederán en esta carpeta. Una vez que se clona el repositorio, solo se realizará una búsqueda rápida con las revisiones más recientes en lugar del clon completo cada vez.

mzzzzb
fuente