Krótki opis distfiles

Co to?
Nowy sposób trzymania tarballi. Zamiast być trzymane w CVS w module SOURCES/ są trzymane na osobnym serwerze tp://distfiles.pld-linux.org (oraz http://).

Żeby uniknąć problemów z powtarzającymi się nazwami plików (z inną zawartością) pliki są identyfikowalne po sumie md5 ich zawartości. Sumy md5 są trzymane bezpośrednio w specach.

Po co to to?
Żeby odciążyć serwer CVS, żeby nie wisiały locki na SOURCES, żeby umożliwić refetch tarballi i podglądanie postępów w ściąganiu.

Jak to wygląda?
W specu, pod linią:

SourceN: ...

należy umieścić komentarz

# SourceN-md5: ...

w ten sposób:

Source3: ftp://foo.com/%{name}/%{name}-%{version}.tar.gz
# Source3-md5: 25eb747fa7dd5ac3e693078f2ff56492

Od tej chwili SPECS/builder będzie szukał pliku na distfiles.

Po wykonaniu commitu automat chodzący na distfiles sam sobie dociągnie plik z podanego URL-a i umieści go na serwerze distfiles. Następnie wyśle raport osobie dokonującej commita.

Uwaga: dotyczy to tylko źródeł dystrybuowalnych; niedystrybuowalnym, oznaczonym przez "NoSource: numer" _nie_ dodajemy znacznika SourceN-md5.

Chyba zwariowałeś! Nie będę tyle pisał.
Pewnie, że nie :-) SPECS/builder dorobił się kilku nowych opcji:

-nd

No distfiles -- nie korzystaj z distfiles.

-5, --update-md5

Przeszukuje speca i poprawia istniejące wpisy # SourceK-md5:.
Nie dodaje nowych wpisów. Ta opcja implikuje -nd (jeśli nie ma źródeł, będą ściągnięte z src-urli).

-a5, --add-md5

Dodaj # Source-md5:
do wszystkich Source: które są URL-ami. Poza tym podobnie jak -5.

-U, --update

Jak -5, ale dodatkowo próbuje dociągać wszystkie pliki z podanych URL-i.

Yyy? W skrócie.

Uaktualniamy pakiet foo do wersji 1.2.
a) nie mamy jeszcze ściągniętych źródeł:
1. cvs up foo.spec lub ./builder -g foo.spec
2. vi foo.spec [poprawiamy wersję na 1.2]
3. ./builder -U foo.spec # źródła się dociągają

3a. jeśli spec nie miał jeszcze source-md5, to:
./builder -a5 foo.spec
4. rpmbuild -bb ...; poprawianie patchy, takie tama
5. cvs diff -u foo.spec # i oglądamy sobie :-)
6. cvs commit foo.spec

b) mamy już źródła i poprawionego speca
1. ./builder -5 foo.spec
2. cvs commit foo.spec

c) dodajemy nowy pakiet
1. ściągamy źródła, piszemy speca bez source-md5
2. ./builder -a5 foo.spec
3. cvs commit foo.spec

Widać tutaj kilka zalet tego podejścia:

1. URL-e są sprawdzane
2. Nie trzeba przepychać źródeł do serwera CVS (idealne dla łączy asymetrycznych)
3. Nie trzeba kasować starych źródeł (zajmie się tym automat na distfiles)

Co trzymać w distfiles, a czego nie?
Trzymać:
1. Wszystkie dystrybuowalne pliki binarne które są dostępne pod zewnętrznymi URL-ami Jako wyjątek można sobie darować bardzo małe pliki, jak np. ikonki.
2. Snapshoty z CVS programów.

Nie trzymać:
1. Rzeczy które zostały zmodyfikowane przez pakowacza, i nie wystawił ich on pod zewnętrznym URL-em. Np. większość patchy na kernel. *Bez względu na rozmiar*.
2. patchy, init-scriptów i innych rzeczy pisanych przez pakowacza.

Czyli to co "Nie trzymać" w distfiles - trafia normalnie do SOURCES.


Jak wrzucać pliki bez URL-i?
Jak widać wyżej dotyczy to tylko snapshotów. Metoda z wystawianiem pod tymczasowym URL jest już nieaktualna.

Jeśli mamy spec foo.spec oraz plik foo-1.2.tar.gz należy:

1. poprawić md5 w specu (./builder -5 foo.spec), spec powinien wyglądać
tak:

Source0: foo-1.2.tar.gz
# Source0-md5: 132c2c85b15a573786078311f77f613d

2. wrzucić foo-1.2.tar.gz pod adres
ftp://<login>@dropin.pld-linux.org/foo-1.2.tar.gz
gdzie <login> to login z CVS, hasło jest takie samo jak w CVS.

3. commitnąć speca, spowoduje to automagiczne przeniesienie pliku ze skrzynki wrzutowej do odpowiedniego katalogu na distfiles.

Skrzynki wrzutowe służą tylko do pisania, nie można z nich czytać.

Dodatkowo, jeśli źródła nie są tajne (np. snapshoty z ktown), można podać URL na distfiles/src, np:

Source0: ftp://distfiles.pld-linux.org/src/foo-1.2.tar.gz
# Source0-md5: 132c2c85b15a573786078311f77f613d

Reszta procedury jest w tym wypadku taka sama jak przy braku URL.


Co zrobić jak automat nie dociągnął źródeł?
Jeśli jest to tymczasowy problem z osiągnięciem hosta lub domeny, należy użyć SPECS/fetchsrc_request foo.spec, aby zlecić automatowi ponowne ściąganie plików z URL.

W przypadku, gdy źródła są na branchu, podajesz brancha jako parametr za spec:
./fetchsrc_request foo.spec FOO


Makra w nazwach plików
Automat rozpoznaje makra w postaci %{makro}. Nie rozpoznaje w ogóle %makro.

Makra %(echo foo | sed -e ...) również nie są rozpoznawane z jednym małym wyjątkiem:

%(echo ... | tr ABC abc)
%(echo ... | tr -d abc)

gdzie abc to dowlne ciągi znaków. Np. zamiast :

%(echo %{version} | sed -e 's/\\.//g')

należy użyć:

%(echo %{version} | tr -d .)

Pełne wsparcie dla %(shell code) jest niemożliwe ze względów bezpieczeństwa.