Come modificare un PKGBUILD che utilizza i sorgenti git per estrarre solo un clone superficiale?


18

L'altro giorno ho provato a installare opencv-gitda AUR con makepkgsu Arch Linux. Naturalmente estrae dal repository git come indica il nome. Questo tira 1Gb. Sto leggendo di fare un clone superficiale con git. Quando guardo il PKGBUILDfile, usando grep git PKGBUILD, vedo:

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"

C'è un modo per modificare la ricetta o il makepkgcomando per estrarre solo un clone superficiale (l'ultima versione della fonte è quello che voglio) e non il repository completo per risparmiare spazio e larghezza di banda? La lettura man 5 PKGBUILDnon fornisce l'intuizione che sto cercando. Inoltre ho dato una rapida occhiata alle pagine manmakepkg e - non riesco a trovare il modo di farlo.pacman


"Alla fine non sono riuscito a costruire con successo la ricetta." Cosa hai fatto esattamente e cosa è andato storto? Fornisci maggiori dettagli, per favore. Come qualcuno mi ha detto una volta su IRC, purtroppo abbiamo lasciato le nostre sfere di cristallo a casa. Sembra, leggendo tra le righe, come se i repository git non riuscissero a clonare correttamente, probabilmente a causa di problemi di rete? Ma sto solo indovinando. Sii esplicito, per favore.
Faheem Mitha,

Un'ipotesi plausibile è che puoi dividere il processo in due parti. Prima clonare i repository git come un clone superficiale o altro. Quindi applicare la ricetta. Immagino che potresti sostituire l'indirizzo di rete git+http://github.com/Itseez/opencv.gitnella ricetta AUR con un nome di percorso locale. Ci hai provato? Se questo sistema di compilazione ti costringe a clonare un repository anche se lo hai disponibile localmente, allora è davvero pazzesco.
Faheem Mitha,

@FaheemMitha Grazie, ho rimosso il riferimento alla mancata creazione - non mi interessa. Sto cercando una soluzione integrata che potrebbe essere basata su qualcosa di simile a ciò che descrivi. Penso che potrebbe esserci un'opzione per non scaricare se ci sono contenuti locali ...

Se il motivo principale per cui si pone questa domanda è quello di evitare l'uso di larghezza di banda / spazio non necessari, non sarebbe male dirlo in modo esplicito. Come ho detto, prova a usare solo il percorso locale, probabilmente funzionerà secondo il principio della minima sorpresa. Se l'opzione per specificare un clone superficiale non è indicata nella pagina man, è possibile che la funzionalità non sia disponibile. Suggerisco di chiedere in un forum Arch appropriato, forse una mailing list dedicata a quel sistema di build. Innanzitutto chiarire se tale funzionalità esiste; in caso contrario, è possibile presentare un bug della lista dei desideri.
Faheem Mitha,

Risposte:


13

Questo può essere fatto usando un dlagent personalizzato . Non capisco davvero il packaging di Arch o come funzionano i dlagents, quindi ho solo una risposta hack, ma fa il lavoro.

L'idea è di modificare PKGBUILD per utilizzare un agente di download personalizzato. Ho modificato la fonte

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

in

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

e quindi definito un nuovo dlagent chiamato mygitche fa un clone superficiale. L'ho fatto aggiungendo DLAGENTSall'array nel /etc/makepkg.confseguente dlagent:

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

Suppongo che probabilmente potresti definire questo download agent da qualche altra parte, ma non so come. Si noti inoltre che il repository che viene clonato è codificato nel comando. Ancora una volta, questo può probabilmente essere evitato. Infine, il percorso di download non è quello che si aspetta PKGBUILD. Per aggirare questo problema, sposto semplicemente il repository dopo averlo scaricato. Lo faccio aggiungendo

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

all'inizio della pkgverfunzione.

Penso che la soluzione più pulita sarebbe quella di capire cosa git+httpsta facendo il dlagent e ridefinirlo temporaneamente. Ciò dovrebbe evitare tutti gli aspetti di hacking della soluzione.


Grazie, funziona. Sì, avrebbe bisogno di un po 'di lavoro per astrarlo per funzionare in casi diversi da questo. Ma vale la pena indagare e la tua risposta è una valida prova del concetto. Di conseguenza ho modificato la risposta selezionata alla tua.

11

Personalmente ho modificato lo script makepkg e funziona come un incantesimo:

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

Aggiungendo "--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"

Ecco 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

L'installazione di softethervpn-git ora scarica solo 100 M invece di 468 M prima dell'hacking.
Amized

Brillante! Grazie mille! Questo dovrebbe essere il valore predefinito.
ccpizza,

Nota: questo fallirà con PKGBUILD a seconda di un tag, ad esempio. Vedere questa discussione . Tuttavia può probabilmente essere fissato utilizzando frammenti lì ( branch, tag, commitecc).
BenC,

7
Nota: ora invece /usr/share/makepkg/source/git.shdovrebbe essere patchato
nponeccop

6

Secondo https://bugs.archlinux.org/task/23065 (credito a jasonwryan), l'aggiunta di funzionalità di clonazione superficiale ad AUR PKGBUILD è stata una voce della lista dei desideri chiusa sabato 05 marzo 2011 con il commento:

Motivo della chiusura: non implementare

Ciò suggerisce che non accadrà a meno che qualcuno non invii una patch.

Come ho suggerito al poster nei commenti, ciò che sta cercando di fare può quasi certamente essere realizzato suddividendo il processo in due fasi:

  1. Clonare il repository git usando un clone superficiale
  2. Esegui la ricetta PKGBUILD, ma puntala sul clone locale. Non sono un utente Arch, quindi non so se questo è il caso, ma sarei molto sorpreso da un sistema di creazione di pacchetti che ha costretto gli utenti a clonare repository da remoto per creare pacchetti.

Grazie. Nei commenti nel link, c'è questa discussione su come questa modifica potrebbe aver portato conseguenze inattese al flusso di lavoro degli script. Il problema è come git popola e collega oggetti mancanti ecc. - L'uso del disco non sarebbe un vantaggio se capissi correttamente. In effetti ho provato a fare un clone superficiale nella directory della ricetta che alla fine è stato 1 GB + lo stesso ma che è stato raccolto da makepkg(pkgver si lamenta leggermente ma ancora) e funziona anche!

2

Se si crea un mirroring superficiale del repository nella stessa directory di PKGBUILD, è possibile utilizzare makepkg --holdverper impedire l' makepkgaggiornamento del resto del repository. Ciò elimina la necessità di modificare il PKGBUILD, makepkg.confo makepkgper sé; tuttavia, la clonazione / l'aggiornamento del repository deve essere eseguita manualmente.

Ad esempio con cling-git, che normalmente clonerebbe la totalità di 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

Dalle pagine man di makepkg:

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

Nota che makepkg clonerà comunque i clingrepository che non sono già presenti, il che significa che avrei potuto omettere la clonazione manuale del repository nell'esempio sopra dato che non è così grande.


1

Se non vuoi modificare gli script di makepkg.

come descritto qui , il punto DEVELSRCDIRin /etc/yaourtrco ~/.yaourtrcfile in qualche cartella persistente. Quindi tutti i checkout del repository (git / svn / ...) avverranno in questa cartella. Una volta clonato il repository, ogni volta verrà eseguito solo il recupero rapido con le revisioni più recenti anziché il clone completo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.