parę sugestii dot. rpmmen

Paweł Gajda mis w k2.net.pl
Wto, 30 Mar 1999, 17:16:36 CEST


On Sat, 27 Mar 1999, Paweł Kołodziej wrote:

> [sobota, 27 marzec 1999], Paweł Gajda napisał(a):

> > 
> > 1. Uczytelnienie kodu 
> >  - ident -kr (wcięcia, spacje wokół operatorów, itd) 
> 
> dobra, ale postuluje indent -kr -i 8 

Ponieważ rpmmen jest osobnym pakietem, a kwestia wcięć 
jest natury ,,religijnej'', więc nic mi do tego :-)
 


> >  - myślę, że lepiej było by nie operować na statycznych zmiennych,
> >    tzn:
> >    zbiór funkcji operujących na TPkgSet i dopiero w osobnym
> >    module zrobić statyczne zmienne. Przede wszystkim ułatwia to 
> >    zrozumienie kodu => IMO ułatwia jego rozwijanie.           
> nierozumiem, poprostu nie rozumiem powyższego zdania. Naprawdę staram się
> zrozumieć, ale nie mogę... mógłbyś trochę przybliżyć (jakiś bardziej
> konkretny przykład)

ok, np. zamiast:  
 preparetoinstall() ->  preparetoinstall(TPkgSet *pkgs)
 void select_from_file(char *) -> TPkgSet *select_from_file(char *)

Dlaczego tak:
- po prototypie widać WE/WY funkcji => o wiele łatwiej
  analizować taki kod. 

  Jak chciałem zablokować czytanie coinst.rpm musiałem przyjrzeć się
  po drodze każdej wołanej funkcji, bo nie wiedziałem,
  która co(i czy w ogóle) modyfikuje w rpmmen_pkgs. 

  O ile Ty wiesz, jak to działa, to dla osób, które chciałyby
  w jakiś sposób to rozwijać IMHO przeszkodą będzie właśnie
  konieczność analizy całości, żeby prześledzić co się gdzie 
  dzieje z pkgset. 
 
- można tworzyć wiele pkgsetów
- można taki kod łatwo opakować w klasę C++  


Podsumowując, chodziło mi o zrobienie 2 modułów: 

- jeden (powiedzmy pkgset.c) bez żadnych statycznych zmiennych 
  z funkcjami typu:

jakaś_funcja(TPkg*, ...)
jakaś_funkcja(TPkgSet*,...)

- drugi, który do manipulowania pkgset'em używał by pierwszego
(i robił to co teraz: otwierałby bazę, czytał tocfile, itd)  

Mam nadzieję, że zbytnio nie zagmatwałem.

Aha, myślę, że trzeba jakoś informować usera o błędach podczas
instalacji. Obecnie jak ją puścimy to przeleci całość nie informując, 
że np. nic się nie zainstalowało(używam rpmmenUI_run()) 

   
> >  - funkcje inicjujące set_src, set_dst itd udostępniłbym pod 1:
> >    rpmmen_init(src, dest)   
> Właściwie to set_src będzie w iontf, więc IMHO możę pozostać rpmmen_set_dest

Pisząc 'itd' myślałem jeszcze o rpmmen_opendb(), czyli o udostępnieniu  
wszystkiego w 1 funkcji.  

Hmm, czy warto wyrzucać ,,obsługę'' src (rozumiem, że chcesz tak
zrobić) ? IMHO nie, bo narusza to spójność: dlaczego kto inny ma się
tym martwić? Podaję modułowi źródło,cel i każę instalować. 


W ogóle może docelowo warto zrobić strukturę kat. podobną do RH:

 -- RPMS
 -- inststuff
     - tocfile
     - grupy_pakietów_do_selektora
     - coś_tam_jeszcze 
   

> > - zauważyłem, że rpmen potrzebuje pkgsel i na odwrót, 
> >   IMHO nie powinno to mieć miejsca.
> tzn. rpmmenlib nie potrzebuje pkgssel'a, potrzebuje go jednynie rpmmenUI.c
> który jest używany jedynie w rpmmenExample.c. nie bardzo mam pomysł, co z
> tym zorbić, chyba jednym wyjsciem było by rozdzielenie rpmmenUI_run() na
> rpmmenUI_run1() i rpmmenUI_run2() i potem:
> rmpmenUI_run1();
> pkgsel()
> rpmmenUI_run2();
Pogubiłem się w powyższym ;-) 
IMHO po prostu: jeden przykład do liba, drugi przykład do pkgsel.   


[o coinst]
> 
> ta funkcja powstała raczej na użytek testów/jako przykład co trzeba zrobić,
> aby zaznaczyć pakiet do instalacji. To taki mój wszesny "selektor pakietów"
> i oczywiście nie musi być w wersji ostatecznej. Jednak i tak niektóre
> pakiety powinny być pre-zaznaczone, a skoro tak, to dlaczego nie użyć do
> tego tej funkcji ?

Hmm, do tego - o ile mówimy o tym samym - to miała być docelowo grupa
Base/Req w pakietach. 
 
Dopóki jej nie ma, to IMHO najprościej zrobić tak, jak jest 
teraz: osobny kat. z pakietami base. Wszystko z base/tocfile  
jest ,,zaznaczone'' (i nie może zostać przeż juzera ,,odznaczone'')

Jak się już pojawi ta grupa, to problem zniknie.      


> (nie wiem co maiłeś na myśłi pisząc o weryfikacji - ta funkcja nieczego nie
> weryfikuje, ona tylko zaznacza które pakiety mają być zainstalowane)

ops, racja, pomyliłem się.


> > - ponieważ inst korzysta też w innym miejscu z rpmliba(cpio.gz) to
> >   przekierowanie stderr robię wcześniej, czy na stdout rpmlib 
> >   też pisze ?   
> tylko jeśli w skryptach pakietów są jakeś echa na stdout. W wersji 0.1.7
> zarówno stderr jaki i stdout są "sprytnie" przekierowywane do pliku. Ale
> jeśli stderr są przekierowywane już wcześniej to proponuję zrobić funkcję
> redirect_out(int i); i jeśli i==1 to stdout jes przekierowywane do pliku, 
> i==-1 stdout z powrotem na konsole, a i==0 to zamknięcie pliku do którego
> było przelkierowywanie, coś jak redirect_out z rpmmenUI.c tylko że
> przekierwowyane będzie jedynie stdout. Jeśli się zgadzasz to IMHO tak
> funkcja powinna wlecieć do pldiliba.

Coś takiego trzeba zrobić. Może na razie przyjmijmy, 
że rpmmen wymaga przekierowania stdout, stderr i się tym 
nie przejmuje ?  


> > Zauważyłem, że instalacja base wymaga dosyć sporo pamięci
> > (zajętość skacze z 700 kB do prawie 3 MB), m.in. 
> > dlatego, że cały tocfile jest wczytywany do ramu. 
> > Dla base (100 pakietów) to jeszcze ujdzie, ale jak będzie ich 
> > 500-600 ? Zastanawiam się, czy nie warto robić
> > indeksu odczas czytania tocfile. Co o tym myślisz ?  
> 
> Nie bardzo rozumiem o co ci _dokładnie_ chodzi z tym indeksem. W każdym
> razie, do np, dokładanie paietów z zależności potrzebne są wszystkie
> nagłówki. Tak więc i tak muszą być wszystkie na raz w pamięci. Można się

Hm, jeżeli tak, to indeks można sobie darować.   


> zastanowić co można z nagłówków zapisywanych w tocfile wywalić (jakie pola),
> ale narazie nic mi nie przychodzi do głowy. A i tak w czasie gdy jest 
> uruchamiany rpmmen, to jest już po ustawianiu partycji, więc można by już
> podmontować swap, ewentualnie zrobić plik ze swapem na partycji na którą
> instalujemy.

swapon ma user do wyboru(swapfile robiony ,,po cichu'' to IMHO
przesada), chyba trzeba będzie tę możliwość zaakcentować :-) 


> > Zmieniłem dosyć mocno pldilib, na czym Ty głównie ,,ucierpisz''.
> > Zaktualizowałem opis iointf'a, także nie powinno być ze zmianą 
> > wielkich problemów, jeżeli by jednak, to albo pytaj, 
> > albo ja machnę łatkę i Ci podeślę. 
> myślę, że sobie poradzę

fajnie, zajrzyj jeszcze do misc.c, może zainteresuje Cię parę 
funkcji (mkdirhier(), buildpath()).  
   


> > Jestem też w stanie wziąć udział w robieniu wyżej postulowanych 
> > poprawek, wymaga to jedynie Twojego ,,błogosławieństwa'' :-) Więc jak ? 
> Nie wiem jak bardzo ci się spieszy. Jeśłi potrzebjesz tego na wczoraj, to
> zrób, jeśli czwartek wieczorem to wystarczająco wcześnie to ja to zrobię.

Aż nadto, aż tak się z tym nie pali. 


> 
> PS. Zorbiłem sobie diff'a między tym co wylądowało w pldi a wersją
> ,,orginalną''. 99% to były zmiany w układzie kodu, więc nie byłem w stanie
> odsiać zmian merytorycznych od stylistycznych :(

Znaczy się... uznałem, że nie warto dla samego rpmmena zachowywać 
zgodności wstecz(wyżej oferuję pomoc w przejściu!:-). 

IMHO zyskał na tych zmianach cały lib. Zmiana konwencji nazewniczej 
to już moje widzimisię, chociaż i tu IMHO zostały usunięte 
niekonsekwencje.

W iointf(bo chyba to Cię głównie interesuje) nie zmieniłem dużo,
usunięte są błędy i powtórzenia kodu. Inaczej się go inicjuje, 
no i są 3 nowe funkcje 

- ioi_errstr() (dla fs jest to strerror(errno)) 
- iointf_chroot()
- iointf_getroot()

Przy okazji: 
W ttest.c jest błąd w funkcjach test_iointf_*(), 
wołana jest ioi_errstr() w razie niepowodzenia iointf_init(). 

Paweł






Więcej informacji o liście dyskusyjnej pld-installer