Portál AbcLinuxu, 7. května 2025 22:08
mam totiz takove divne mrazeni, ze to bude pomaleTakze je to pomale, alebo nie? Ak je vykonnost dostatocna, riesis neexistujuci problem. Prepisovat 50 riadkov zdrojoveho kodu (t.j. excelentne strucne riesenie) do 500 riadkov potencialne rychlejsieho C kodu bez realneho dovodu je dobre iba ak z akademickych dovodov. Treba si uvedomit, ze N-nasobok poctu riadkov zdrojoveho kodu zo sebou nesie N-nasobne riziko chyby v kode. Nepozeral som co vlastne ten skript robi, ale v zasade vidim dve mozne priciny "pomalosti": 1) IO operacie. V tomto pripade je rychlost vykonavania samotnej riadiacej rutiny, t.j. post-commit hooku irelevantna, a zrychlit treba IO operacie samotne. 2) Neefektivny algoritmus riadiacej rutiny, napr. viacnasobne ziskavanie nejakej informacie ci suboru. V tomto pripade treba vylepsit algoritmus, napr. vyhnut sa opatovnemu ziskavaniu udajov. V tomto pripade opat nezalezi na implementujucom jazyku; opat vitazi program s jednoduchsim (kratsim) zapisom. Jedna moznost, kedy by mohol byt shellovy skript na tom zle, je spustanie velkeho poctu procesov; napr. ked bude pre kazdy z tych 11k suborov spustat nejaky externy program, aby ho spracoval. V tomto pripade ale s vysokou pravdepodobnostou pojde problem riesit davkovym spracovanim, t.j. v zasade spustenim externeho programu naraz pre viacero suborov; vacsina unixovych toolov toto umoznuje,
find
a xargs
su dobri pomocnici.
Nakoniec -- alebo skor na zaciatok -- aky "biznis" problem vlastne riesis? Existuje viacero hotovych rieseni na publikovanie SVN repozitarov cez web. I ked na druhej strane, Tvoj problem moze byt unikatny a teda moze vyzadovat unikatne riesenie. Sam som pomocou post-commit hookov naprogramoval v shelli uz dve continuous integration riesenia; a boli to stovky az tisice riadkov shellovych skriptov.
s post-commit hookem prichazim do styku prvne, tak jsem se chtel jen zeptat co toTakze par mojich rad: - Pozor na nastavenie prostredia. Odporucam vsetko dolezite si nastavit v skripte, vratane takych "nepodstatnych drobnosti" ako je
PATH
ci pracovny adresar, ktory je defaultne /
. Pozor na pristupove prava, post-commit hook je samozrejme spustany obsluhujucim Apacom.
- Nepisat ziadne skripty priamo do suboru post-commit. Lepsie je vytvorit samostatny skript, a ten len z post commit hooku volat. Tak je jeden skript pouzitelny pre viacero repozitarov, ak sa vhodne parametrizuje.
- Prikaz 'svn commit' nevrati, pokial sa post-commit hook nevykona, co je vacsinou silne neziaduce. Preto treba 1) volat externy skript z post-commit hooku na pozadi, a zaroven 2) presmerovat stdout
aj stderr
"niekde"; mozno do /dev/null
, lepsie do nejakeho vlastneho logovacieho suboru.
- Tym prichadzame k problemu, co sa stane, ak dojde druhy commit a teda aj druhe spustnie post-commit hooku este predtym, ako skoncila obsluha toho predchadzajuceho. Zabezpecenie reentrantnosti skriptu vratane spravneho pouzitia externych zdrojov ako su docastne subory ci pripadna vhodnu serializacia uloh su celkom zaujimave programatorske cvicenia.
>Zabezpecenie reentrantnosti skriptu
je mozne to vyresit pomoci zamku? docasne soubory vytvaret nechci (nemam ted potrebu). pokud bys to mohl rozvest budu vdecny.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.