# [ git.eclass ] come si fa un fetch git? [risolto]

## cloc3

mi serve una lezione per creare un ebuild x-9999.ebuild che scarica i sorgenti con git.

una prima versione ha utilizzato direttamente il comando  git clone ${EGIT_REPO_URI} e funziona a meraviglia.

ma non si comporta correttamente, perché scarica direttamente i sorgenti in /var/tmp/portage, anziche usare la ${DISTDIR}.

allora ho provato a cucare in /usr/portage/eclass/git.eclass e ad usare funzioni come git_src_unpack.

purtroppo mi sono accorto che il fetch ottenuto ha un contenuto diverso da quello di git clone.

per la precisione, il contenuto di git_src_unpack è identico a quello della cartella .git scaricata dal comando clone.

inoltre, non ho ancora capito quale sia la procedura corretta per spostare i sorgenti dalla ${DISTDIR} alla workdir.

----------

## Enrico Tagliavini

1) installa app-portage/eclass-manpages e leggi il man git.eclass ti sarà utile.

2) normalmente si deve ereditare la eclass git con inherit git e si settano le variabili per l'URI e il branch (se non fissi l'ultima viene usato il master di default). Come esempio cito l'ebuild di quassel-9999 che puoi guardare a titolo di esempio.

EGIT_REPO_URI="git://git.quassel-irc.org/quassel.git"

EGIT_BRANCH="master"

Di solito non c'è altro da fare per quanto riguarda git. La eclass si occuperà di clonare il branch nella distdir e di copiarlo nella workdir (sempre che tu non abbia definito un src_unpack() custom nell'ebuild, allora in quel caso devi chiamare a mano git_src_unpack nel tuo src_unpack() )

----------

## oRDeX

 *Quote:*   

> eclass-manpages

 

 :Shocked:   :Shocked:  non lo conoscevo per niente!

----------

## cloc3

effettivamente, man git.eclass è molto più comodo che fare un less della classe.

soprattutto per uno che, il codice, non lo sa leggere   :Rolling Eyes:  .

le informazioni che si ricavano, però, non sono molto più estese di quelle che avevo trovato io.

tuttavia, sono arrivato, un po' grazie a voi e un po' grazie alla lettura della documentazione ufficiale, a estrarre le informazioni che mi servivano.

nel mio caso, ero costretto a creare una sezione src_unpack per eseguire le istruzioni eaclocal ed eautoconf.

questo, però implica un uso corretto della variabile ${S}.

la variabile EGIT_BRANCH è superflua, perché la devo impostare al valore di default.

il codice che risolve il mio problema è:

```

src_unpack() {

    git_src_unpack

    cd $S

    eaclocal

    eautoconf

}

```

tuttavia, mi sfugge ancora il modo in cui lavora il fetch.

nella DISTDIR, infatti, vengono scaricati esclusivamente i contenuti della cartella .git.

i sorgenti veri propri, invece, vanno nella cartella ${S}.

tuttavia, la cartella ${S} è destinata ad una completa pulizia alla fine della compilazione (tra l'altro, io compilo in ram).

se desidero ricompilare il pacchetto, quindi, sarò costretto a ripetere completamente il fetch dei sorgenti, anziché eseguire un aggiornamento per differenze.

che senso ha tutto cio?

----------

## oRDeX

non vorrei dire una cretinata, ma questo è il normale comportamento che assume portage con gli ebuild *-9999....non so bene perchè

----------

## Onip

premetto che il contenuto della cartella .git è l'insieme dei sorgenti: i repository remoti sono --bare e sono costituiti solamente dalla directory .git.

con gli ebuild -9999 con cui ho avuto a che fare i sorgenti vengono scaricati in una apposita directory in ${DISTDIR}, del tipo cvs-src, svn-src, git-src: hai provato a guardare lì dentro?

Nelle successive installazioni (anche da git) ho sempre visto fare a portage un aggiornamento dei sorgenti e non un nuovo fetch.

----------

## cloc3

 *Onip wrote:*   

> Nelle successive installazioni (anche da git) ho sempre visto fare a portage un aggiornamento dei sorgenti e non un nuovo fetch.

 

```

>>> Unpacking source...

 * GIT update -->

 *    repository:       git://github.com/abstrakraft/cwiid.git

 *    at the commit:       fadf11e89b579bcc0336a0692ac15c93785f3f82

 *    branch:          master

 *    storage directory:    "/var/gentoo-var/distfiles/git-src/cwiid"

Initialized empty Git repository in /var/tmp/portage/app-misc/cwiid-9999/work/cwiid-9999/.git/

>>> Unpacked to /var/tmp/portage/app-misc/cwiid-9999/work/cwiid-9999

...

s939 ~ # ls /var/gentoo-var/distfiles/git-src/cwiid/

config  description  FETCH_HEAD  HEAD  hooks  info  objects  packed-refs  refs

```

nella mia cartella distfiles non trovo altro che questo. cioè il repository, non i sorgenti.

le cartelle ${DISTDIR}/{svn,cvs}-src/ non contengono materiale attinente.

modificare la variabile EGIT_STORE_DIR non serve a nulla.

se lancio due volte /var/tmp/portage/app-misc/cwiid-9999 e ripulisco la cartella /var/tmp/portage (operazione obbligatoria, nel mio sistema), il fetch viene ripetuto.

----------

## Enrico Tagliavini

come ha detto onip il clone dell'URI git viene fatto di default nella cartella /usr/portage/distfiles/git-src/nomepacchetto e ogni volta che ricompili il pacchetto viene lanciato l'aggiornamento tramite git pull e non viene fatto un nuovo fetch.

Per quanto riguarda eaclocal e eautoconf vanno lanciati nel src_prepare() (ma solo con EAPI=2 o superiore ed è consigliabile imho). Comunque credo che sia meglio usare solo eautoreconf.

Ti consiglio anche di usare repoman full nella directory dove hai fatto l'ebuild e di leggere il suo output. repoman è un tool che controlla la qualità dell'ebuild e ti avvisa se ci sono alcuni comportamenti scorretti (anche se non li rileva tutti).

----------

## cloc3

```

s939 cwiid # !re

repoman full

RepoMan scours the neighborhood...

  RDEPEND.suspect               2

   app-misc/cwiid/cwiid-9999.ebuild: 'sys-devel/bison'

   app-misc/cwiid/cwiid-9999.ebuild: '>=sys-devel/flex-2.5.33'

  metadata.missing              1

   app-misc/cwiid/metadata.xml

  ebuild.allmasked              1

   app-misc/cwiid

  changelog.missing             1

   app-misc/cwiid/ChangeLog

  IUSE.invalid                  1

   app-misc/cwiid/cwiid-9999.ebuild: old-bluez-libs

  ebuild.badheader              1

   app-misc/cwiid/cwiid-9999.ebuild: Malformed CVS Header on line: 3

Please fix these important QA issues first.

RepoMan sez: "Make your QA payment on time and you'll never see the likes of me."

```

questo è il migliore repoman full che sono riuscito ad ottenere.

il problema di RDEPEND non si può toccare, perché è affare dello sviluppatore ufficiale, non mio.

la use flag old-bluez-libs è una mia invenzione, per chi vuole compilare con i pacchetti mascherati.

la linea 3 non ho idea come fargliela bere, ma non la trovo così importante...

il numero degli errori aumenta se creo un file cwiid-0.6.00.ebuild, ma proprio per l'effetto delle dipendenze mascherate.

il tuo consiglio sull'uso di eaclocal lo proverò a sistemare dopo (sistemato).

intanto grazie.

p.s.: il codice.

----------

## Enrico Tagliavini

Si l'unico warning serio di repoman è il primo e ha perfettamente ragione. Manca totalmente l'RDEPEND (che sicuramente serve), leggi questa quida per sapere come modificare http://devmanual.gentoo.org/general-concepts/dependencies/index.html. Davvero sistemala questa cosa perché così è decisamente sbagliata (non ti preoccupare è perfettamente normale le prime volte eheheh)

tra l'altro la parte di codice 

```

if [[ ${PV} == "9999" ]]; then

    DEPEND="${DEPEND}

          dev-vcs/git"

fi

```

è inutile visto che la eclass di git dovrebbe aggiungere da sola la DEPEND corretta.

A mi raccomando le keyword, se non hai testato il software direttamente su tutte le architetture presenti non aggiungerle (ovviamente se qualcuno le ha testate in precedenza lasciale pure).

----------

## Enrico Tagliavini

A dimenticavo per quanto riguarda la USE credo che basti aggiungere una entry al metadata.xml con tanto di descrizione su cosa fa. È una cosa che devi mettere se intendi distribuire l'ebuild in un overlay o chiedere che sia incluso nel tree di portage. In sostanza è solo una questione di forma e informazione non è sbagliata in se.

----------

## cloc3

fantastico:

```

s939 cwiid # repoman full

RepoMan scours the neighborhood...

  ebuild.allmasked              1

   app-misc/cwiid

  changelog.missing             1

   app-misc/cwiid/ChangeLog

  ebuild.badheader              1

   app-misc/cwiid/cwiid-9999.ebuild: Malformed CVS Header on line: 3

  KEYWORDS.missing              1

   app-misc/cwiid/cwiid-9999.ebuild

RepoMan sez: "You're only giving me a partial QA payment?

              I'll take it this time, but I'm not happy."

```

mai avrei pensato di arrivare a tal punto.

ma con simili dritte è stato un giochetto.

 :Smile: 

----------

