CVS-RCS-HOW-TO za Linux (sistem za kontrolo izvorne kode) Al Dev (Alavoor Vasudevan) alavoor@yahoo.com; prevedel Jernej Kovačič jkovacic@email.si; v21.4, 25. avgust 2001, prevod 27. september 2001 Ta dokument je "praktični vodnik" do hitre postavitve sistema za nad­ zor izvorne kode CVS/RCS. Dokument vsebuje tudi nekaj lupinskih skrip­ tov, ki poenostavijo nekaj najpogosteje uporabljanih funkcij CVS. Ti skripti omogočajo lahek vmesnik do CVS. Na voljo je tudi nekaj skrip­ tov, ki poenostavijo delo z RCS. Informacije v tem dokumentu se nanašajo tako na Linux kot tudi na ostale vrste Unixa, kot so Solaris, HPUX, AIX, SCO, Sinix, BSD, SCO, Apple Macintosh (ki je BSD unix)... in BeOS. ______________________________________________________________________ Kazalo 1. Uvod 2. Kateri je zame? CVS ali RCS? 3. Postavljanje CVS 3.1 Spremenljivke okolja 3.2 Selitev od RCS k CVS 4. Uvod v ukaze CVS 4.1 checkout 4.2 update 4.3 add 4.4 remove 4.5 commit 4.6 diff 4.7 Urejevalnik Emacs 5. Močno in šibko zaklepanje ali način brez zaklepanja 6. Lupinski skripti 7. Dokumentacija CVS 7.1 Priložena dokumentacija 7.2 Dokumentacija organizacije "CVS Organisation" 7.3 Učenje CVS 8. Grafični uporabniški vmesniki 9. CVS za MS Windows 95/98/NT/2000 9.1 Odjemalci FTP za Windows 95/NT/2000 9.2 Datoteke Visual Cafe(Java), JBuilder, MS Visual C++, HTML 9.3 Orodja za administriranje Sambe 10. Varnost skladišč CVS 11. Večuporabniško skladišče CVS z dostopom z drugih računalnikov 12. Lupinski skripti za RCS 12.1 cotree.sh 12.2 cofiles.sh 12.3 ciall.sh 13. Izboljšanje učinkovitosti strežnika CVS 14. Sistem za sporočanje problemov 15. Orodja za upravljanje s konfiguracijskami datotekami 16. Podobne strani 17. SCCS proti CVS-RCS 18. Ostali zapisi tega dokumenta 18.1 Zapis Acrobat PDF 18.2 Pretvorba zapisa Linuxdoc v Docbook 18.3 Pretvorba v zapis MS WinHelp 18.4 Ogled različnih zapisov 19. Avtorske pravice in licenca 20. sget 21. sedit 22. scommit 23. supdate 24. sunlock 25. slist 26. sinfo 27. slog 28. sdif 29. sadd 30. sdelete 31. sfreeze ______________________________________________________________________ 1. Uvod Sistem za nadzor izvorne kode je NUJEN za nadzor nad spremembami, do katerih prihaja med razvojem programskih projektov. Razvijalci potrebujejo popolno zgodovino sprememb, da se lahko v primeru kakršnihkoli problemov vrnejo k prejšnjim različicam. Ker je izvorna koda najvitalnejša komponenta kateregakoli programskega projekta in ker razvoj programske opreme porabi ogromno časa in denarja, je zelo pomembno porabiti nekaj časa za varovanje izvorne kode z uporabo sistemov za kontrolo izvorne kode, kot sta npr. CVS in RCS. CVS (angl. Concurrent Version Control System, sistem za kontrolo hkratnih različic) je zmogljivo orodje, ki omogoča večim uporabnikom hkraten razvoj programske opreme. Je nadgradnja RCS in je nekakšen vmesnik na aplikacijskem nivoju do RCS. CVS lahko zapisuje zgodovino vaših datotek (ponavadi, vendar ne zmeraj, gre za izvorno kodo). Namesto vsake različice vsake datoteke, ki ste jo kadarkoli naredili, hrani samo razlike med različicami. Med drugim vodi tudi evidenco, kdo, kdaj in zakaj je povzročil kakšno spremembo. CVS je v veliko pomoč pri upravljanju z izdajami in nadzoru hkratnih urejanj izvornih datotek med različnimi avtorji. Namesto omogočanja kontrole različic za zbirko datotek v posameznem imeniku nam CVS omogoča kontrolo različic za hierarhično zbirko imenikov, ki vsebujejo revizije nadzorovanih datotek. Te imenike in datoteke lahko potem kombiniramo, da oblikujemo izdajo programske opreme. S CVS lahko hranimo datoteke "C", "C++", Java, Perl, HTML in druge. 2. Kateri je zame? CVS ali RCS? CVS je pravzaprav nadgrajen RCS. CVS je precej zmogljivejše orodje in lahko nadzoruje celotno drevo izvorne kode. Uporaba CVS je zelo priporočena, ker si delo z njim lahko poenostavite z uporabo skriptnih jezikov, kot so npr. Perl, korn ali bash. Oglejte si vzorčne skripte za lupino Korn v poglavju o ``lupinskih skriptih''. Prednosti CVS: ˇ CVS je decentraliziran, uporabnik prevzema datoteke oz. imenike iz skladišča in ima svoje ločeno stabilno drevo imenikov izvorne kode. ˇ CVS lahko "označuje" izdaje celotnega projekta drevesa izvorne kode. ˇ CVS omogoča hkratno urejanje datotek. ˇ CVS si lahko prilagodimo, da nam omogoča zmogljivo zaklepanje datotek ali hkratno urejanje datotek z uporabo lupinskih skriptov ali Perla. CVS podpira šibko zaklepanje (ukaz 'cvs watches'), mogoče pa je tudi hkratno urejanje datotek brez zaklepanja. Slabosti CVS: ˇ Potrebnega je nekoliko več administriranja kot pri RCS. ˇ Zelo izpopolnjen in kompleksen sistem. Je "zadnji krik" tehnologije. CVS je zelo napreden in zmogljiv sistem, ki so ga razvijali zelo dolgo (več let!!). ˇ Ima veliko število ukazov in ukaznih možnosti, zato se ga začetniki težje privadijo. Lupinski skripti v poglavju o ``lupinskih skriptih'' lahko olajšajo uporabo. Prednosti RCS: ˇ RCS je zelo preprost za nastavljanje, manj dela je z administriranjem. ˇ RCS se uporablja v centraliziranih področjih, kjer vsak dela. ˇ RCS je koristen za preproste sisteme. ˇ Zelo zmogljivo zaklepanje datotek - hkratno delo je onemogočeno. Slabosti RCS: ˇ Hkraten razvoj večih razvijalcev ni mogoč zaradi zaklepanja datotek in omejenosti na posamezni delovni imenik. Zaradi omejitve na posamezni delovni imenik lahko spremembe datotek, povzročene od več razvijalcev, povzročijo napako ob izvedbi ukaza 'make'. ˇ Ne more označevati izdaj celotnega programskega projekta. Ta dokument vsebuje tudi lupinske skripte, ki omogočajo enostavno vlaganje (angl. check in), prevzemanje (angl. check out) in udejanjanje (angl. commit) datotek. Oglejte si jih v poglavju o ``lupinskih skriptih''. Za navodila o uporabi RCS si oglejte RCS mini-howto na CDju z Linuxom: ______________________________________________________________________ cd /mnt/cdrom/Redhat/RPMS ls -l howto-6.0-*.noarch.rpm rpm -qpl howto-6* | grep -i rcs ______________________________________________________________________ ali obiščite Oglejte si tudi poglavje o ``lupinskih skriptih za RCS''. 3. Postavljanje CVS Najprej morate namestiti paket CVS. Če imate Redhat Linux, izvedite ______________________________________________________________________ cd /mnt/cdrom/Redhat/RPMS rpm -i rcs*.rpm rpm -i cvs*.rpm Spisek nameščenih datotek si lahko ogledate z - rpm -qpl cvs*.rpm | less ______________________________________________________________________ in pobrskajte po izhodu z j,k, CTRL+f, CTRL+D, CTRL+B, CTRL+U, page up/down ali smerniškimi tipkami. Oglejte si 'man less'. Pri drugih vrstah Unixa boste morda morali najprej dobiti datoteke v zapisu tar z RCS in CVS ter slediti datotekama README in INSTALL za postavitev CVS. Obiščite in . 3.1. Spremenljivke okolja Naslednje spremenljivke okolja morajo biti nastavljene v /etc/profile - to so privzete vrednosti zahtevane za vse uporabnike. Če niso nastavljene v /etc/profile, morate dodati tole v vašo lokalno datoteko za zagon ob prijavi: /.bash_profile. ______________________________________________________________________ export EDITOR=/bin/vi export CVSROOT=/home/cvsroot export CVSREAD=yes ______________________________________________________________________ Naredite imenik za skladiščenje izvorne kode ter dodelite dostop za branje in pisanje unixovi skupini/uporabniku. Prepričajte se tudi, da ime imenika pri spremenljivki CVSROOT ne vsebuje presledkov (vrednosti te spremenljivke ne smete nastaviti na npr. '/home/moj cvsroot'. ______________________________________________________________________ bash$ su - root bash# export CVSROOT=/home/cvsroot bash# groupadd --help bash# groupadd cvs bash# useradd --help bash# useradd -g cvs -d /home/cvsroot cvs bash# ls -ld $CVSROOT ... (morali bi videti tudi seznam datotek) bash# chmod o-rwx $CVSROOT bash# chmod ug+rwx $CVSROOT # Pripravite si skladišče CVS in vanj shranite datoteke: bash# cvs init # V skupino cvs dodajte uporabniška imena uporabnikov. Naredite dodatno skupino za uporabnike. # Upoštevajte, da za vejicami, ki ločujejo imena skupin pri izbiri -G, NE SME # biti presledkov. # V spodnjem primeru uporabnik tom pripada skupinam cvs, users in staff, # uporabnik johnson pa pripada samo skupini cvs. bash# usermod --help bash# usermod -G cvs unixova_uporabniška_imena bash# usermod -G cvs,users,staff tom bash# usermod -G cvs,users,staroffice billclinton bash# usermod -G cvs johnson bash# exit .... (odjavite se z računa sistemskega uporabnika (root)) # Prijavite se kot uporabnik in uvozite datoteke v CVS.... bash$ su - billclinton bash$ export EDITOR=/bin/vi bash$ export CVSROOT=/home/cvsroot bash$ export CVSREAD=yes # Sprememba delovnega imenika je obvezna bash$ cd $HOME/moj_imenik_z_izvorno_kodo # Podati je treba oznako proizvajalca in revizije cvs import moj_imenik_z_izvorno_kodo Vendor1_0 Rev1_0 # Npr. jaz sem naredil tole: bash$ cd $HOME/foobar bash$ cvs import foobar Vendor1_0 Rev1_0 # Primer testiranja in verifikacije: bash$ cd $HOME/foobar bash$ cvs checkout myfoo.java ______________________________________________________________________ POGOSTA NAPAKA: ko izvedete 'cvs checkout', lahko dobite opozorilo, da je modul neznan. Pogosta napaka je, da ob 'cvs import' ne zamenjate imenika. OBVEZNO morate iti v imenik z izvorno kodo in šele potem izvedite 'cvs import'. Na primer: ______________________________________________________________________ bash$ cd $HOME/foobardir bash$ cvs import foobardir Vendor1_0 Rev1_0 ______________________________________________________________________ 3.2. Selitev od RCS k CVS Ze preselitev obstoječih datotek iz RCS v CVS uporabite naslednji skript. Prepričajte se, da imate nameščen paket z lupino Korn (pdksh*.rpm s CDja Linux Contrib). Opomba: Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux Contrib. ______________________________________________________________________ #!/bin/ksh ############################################################# # Program za selitev obstoječih datotek izvorne kode iz RCS v CVS # # Potreben je RPM paket pdksh*.rpm s Cdja Linux contrib ############################################################# # # rcs2cvs - pretvori drevo izvorne kode iz RCS v CVS # # projekt za pretvorbo PROJECT='project' # trenutni izhodiščni imenik RCS RCSROOT="$HOME/rcs" if cd "$RCSROOT/$PROJECT" then cd "$RCSROOT" else echo >&2 "`basename "$0"`: ne morem priti v RCS-jev imenik '$RCSROOT/$PROJECT'." exit 1 fi # trenutni izhodiščni imenik CVS CVSROOT="$HOME/cvs" # naredi nov imenik v CVS za projekt 'project' if mkdir "$CVSROOT/$PROJECT" then : else echo >&2 "`basename "$0"`: ne morem narediti CVS-jevega imenika '$CVSROOT/$PROJECT'." exit 2 fi # naredi projektno drevo CVS iz drevesa RCS find "$PROJECT" -type d -name RCS -print | while read RCS do CVS="`dirname "$RCS"`" (if cd "$RCS" then # if find . -type f -name '*,v' -print | cpio -pdmv "$CVSROOT/$CVS" if find . -type f -print | cpio -pdmv "$CVSROOT/$CVS" then : else echo >&2 "`basename "$0"`: ne morem pretvoriti RCS-jevega podimenika '$RCSROOT/$RCS' v CVS-jev podimenik '$CVSROOT/$CVS'." fi else echo >&2 "`basename "$0"`: ne morem priti v RCS-jev podimenik '$RCSROOT/$RCS'." fi) done ______________________________________________________________________ Sedaj smo preselili projekt iz RCS v CVS kot 'project'. Pričnete lahko uporabljati ukaze CVS na modulu 'project'. 4. Uvod v ukaze CVS V CVS nam je na voljo precej ukazov (v pregledu cvs_ukaz), izmed katerih nam jih precej nudi še nemajhno število izbir, ki zadostijo precej potrebam upravljanja z izvorno kodo v porazdeljenih okoljih. Vendar nam za koristno delo s CVS ni potrebno obvladati prav vseh podrobnosti. Pravzaprav nam za uporabo in prispevanje v skladišče zadostuje že pet ukazov. Najpogosteje se uporabljajo tile ukazi: checkout, update, add, remove, commit in diff. 4.1. checkout cvs checkout moduli... Potreben začetni ukaz, da deluje večina CVS: naredi vašo zasebno kopijo izvorne kode za module (ki se imenujejo zbirka izvorne kode; tu lahko tudi uporabite pot, ki je relativna na izvorno skladišče). S to kopijo lahko delate brez vmešavanje v delo ostalih. Vedno se naredi vsaj en podimenik. ______________________________________________________________________ bash$ cvs --help checkout Usage: cvs checkout [-ANPRcflnps] [-r rev | -D date] [-d dir] [-j rev1] [-j rev2] [-k kopt] moduli... -A Resetiraj vse lepljive oznake/datum/kopt -N Če je dolčena izbira -d, ne skrajšuj poti v modulu. -P Oklesti prazne imenike. -R Imenike obdelaj rekurzivno. -c Izpiši (z ukazom "cat") podatkovno bazo modula. -f Če ne najdeš oznake/datuma, se naj ujemata z glavno revizijo. -l Samo lokalni imenik, brez rekurzije. -n Ne poganjaj programov v modulu (če obstajajo). -p Prevzemi datoteko na standardni izhod (v izogib lepljivosti). -s Podobno kot -c, vendar vključi še modulov status. -r rev Prevzemi revizijo ali oznako (izvede tudi -P) (je lepljiv). -D date Prevzemi revizije kot od datuma (izvede tudi -P) (je lepljiv) -d dir Prevzemi v imenik dir namesto v ime modula. -k kopt Pri prevzemu uporabi RCS-jevo izbiro kopt -k. -j rev Spoji spremembe, ki so nastale med trenutno revizijo in rev. (Vnesi izbiro --help global za seznam ostalih izbir) ______________________________________________________________________ 4.2. update cvs update Ta ukaz izvedite znotraj vašega zasebnega imenika z izvorno kodo, kadar želite posodobiti vaše kopije izvornih datotek glede na spremembe, ki so jih drugi razvijalci naredili v izvorno kodo v skladišču. ______________________________________________________________________ bash$ cvs --help update Usage: cvs update [-APdflRp] [-k kopt] [-r rev|-D date] [-j rev] [-I ign] [-W spec] [datoteke...] -A Resetiraj vse lepljive oznake/datume/kopt. -P Oklesti prazne imenike. -d Zgradi imenike, podobo kot jih checkout. -f Če ne najdeš oznake/datuma, se naj ujemata z glavno revizijo. -l Samo lokalni imenik, brez rekurzije. -R Obdelaj imenike rekurzivno. -p Pošlji posodobitve na standardni izhod (v izogib lepljivosti). -k kopt Pri prevzemu uporabi RCSjevo izbiro kopt -k. -r rev Posodobi in uporabi podano revizijo/oznako (je lepljiv). -D date Nastavi datum, glede na katerega naj se posodobi (je lepljiv). -j rev Spoji spremembe med trenutno revizijo in rev. -I ign Več datotek, ki naj se spregledajo (! za resetiranje). -W spec Vrstica za določitev ovitka. (Vnesi izbiro --help global za seznam ostalih izbir) ______________________________________________________________________ 4.3. add cvs add datoteka... Ta ukaz uporabite za vpis novih datotek v CVS zapis vašega delovnega imenika. Datoteke se bodo dodale v skladišče ob naslednji izvedbi ukaza uporabite 'cvs import'. 'cvs add' se uporablja samo za nove datoteke v že prevzetem imeniku. ______________________________________________________________________ bash$ cvs --help add Usage: cvs add [-k rcs-kflag] [-m sporočilo] datoteke... -k Pri dodajanju datoteke z določeno zastavico kflag uporabi "rcs-kflag". -m V dnevnik zapiši "sporočilo". (Vnesi izbiro --help global za seznam ostalih izbir) ______________________________________________________________________ 4.4. remove cvs remove datoteka... Ta ukaz uporabite potem, ko ste zbrisali vse prej navedene datoteke. Z njim prijavite CVSju, da želite označene datoteke odstraniti iz skladišča. Odstranitev se ne pozna pri ostalih, vse dokler ne izvedete 'cvs commit'. ______________________________________________________________________ bash$ cvs --help remove Usage: cvs remove [-flR] [datoteke...] -f Briši datoteko preden jo odstraniš iz skladišča. -l Obdelaj samo ta imenik (brez rekurzije). -R Imenike obdelaj rekurzivno. (Vnesi izbiro --help global za seznam ostalih izbir) ______________________________________________________________________ 4.5. commit cvs commit datoteka... Ta ukaz uporabite, kadar želite vnesti spremembe v skladišče in jih ''objaviti'' tudi za ostale razvijalce. ______________________________________________________________________ bash$ cvs --help commit Usage: cvs commit [-nRlf] [-m spr. | -F dnevnik] [-r rev] datoteke... -n Ne poganjaj programov v modulih (če obstajajo). -R Imenike obdelaj rekurzivno. -l Samo lokalni imenik (brez rekurzije). -f Prisili datoteko, da bo udejanjena; onemogoči rekurzijo. -F dat. Preberi dnevniško sporočilo iz datoteke dat. -m spr. Log message. -r rev Udejani v to vejo ali deblo revizije. (Vnesi izbiro --help global za seznam ostalih izbir) ______________________________________________________________________ 4.6. diff cvs diff datoteka... Prikaže razlike med datotekami v delovnem imeniku in skladišču ali med dvema revizijama v skladišču. Ne spreminja datotek niti v skladišču niti v delovnem imeniku. ______________________________________________________________________ bash$ cvs --help diff Usage: cvs diff [-lNR] [rcsdiff-options] [[-r rev1 | -D date1] [-r rev2 | -D date2]] [datoteke...] -l Samo lokalni imenik, brez rekurzije. -R Imenike obdelaj rekurzivno. -D d1 Izvedi diff med datoteko s podanim datumom glede na delovno datoteko. -D d2 Izvedi diff revizije rev1/date1 glede na date2. -N vključi razlike za dodane in odstranjene datoteke. -r rev1 Izvedi diff med revizijo rev1 glede na delovno datoteko. -r rev2 Izvedi diff revizije rev1/date1 glede na revizijo rev2. --ifdef=arg Izpisi razlike v zapisu ifdef. (Glede izbir rcsdiff-options za si oglejte dokumentacijo za vaš program diff. Najbolj priljubljena izbira je -c, je pa na voljo še veliko drugih). (Vnesi izbiro --help global za seznam ostalih izbir) ______________________________________________________________________ 4.7. Urejevalnik Emacs Emacs je zmogljiv urejevalnik in podpira CVS/RCS - še posebej za spajanje in primerjavo revizij. Emacsova glavna domača stran je . 5. Močno in šibko zaklepanje ali način brez zaklepanja CVS je zmogljiv in zelo nastavljiv sistem. CVS podpira: ˇ Močno zaklepanje z "rezerviranimi prevzemi" s pomočjo ukaza cvs admin -l ali ``lupinskega skripta''. Preberite tudi spis Reserved checkouts . Popravek Erica Griswolda o rezerviranih prevzemih najdete na naslovu . ˇ Šibko zaklepanje s pomočjo značilnosti ukaza 'cvs watch'. Oglejte si tudi "cvs edit" glede opozorila ( ), če kdo že ureja datoteko. ˇ Brez zaklepanja - privzeto je dovoljeno, da več razvijalcev hkrati ureja datoteke. 6. Lupinski skripti Sledijo skripti za poenostavitev uporabe osnovnih ukazov CVS. Ti skripti vam dajo prvi vpogled v sistem CVS in so koristni, dokler se ne privadite na ukaze CVS. Skripti so napisani za lupino Korn, ker je ta lupina vedno na voljo za vse vrste Unixa, vedno pa jih lahko prevedete v Bash ali Perl, če je to potrebno. Prilagodite si jih lahko po svojem okusu. V osnovi so to ukazi CVS, dodane pa so še nekatere značilnosti, ki jih naredijo specifične glede na lokacijo. Na primer, skript sedit omogoča zaklepanje, tako uporabniki vedo, da nekdo že ureja to datoteko. Seveda lahko uporabniki neposredno uporabljajo ukaze CVS in tako obidejo te skripte. Ti skripti prikazujejo, kako si lahko prilagodite CVS. OPOMBA: Lupinski skripti privzamejo uporabnikov domači imenik za korenskega in prevzamejo izvorno drevo iz CVS tako, da ga naredijo neposredno pod uporabnikovim domačim imenikom. NASVET: V teh lupinskih skriptih se vsako ime datoteke na vašem disku sestoji iz treh delov: domačega imenika, podimenika in imena datoteke. Polna pot do datoteke je sestavljena iz spremenljivk: $HOME/$subdir/$fname. V CVS je z uporabo spremenljivke $subdir ohranjena enaka struktura imenikov, torej bo tam izgledala nekako takole $CVSROOT/$subdir/$fname. V vseh skriptih igrajo spremenljivke $HOME, $CVSROOT, $subdir in $fname pomembno vlogo. Njihove vrednosti so npr. lahko HOME=/home/aldev, subdir=myproject/src, CVSROOT=/home/cvsroot, in fname=foo.cpp Skopirajte te skripte v imenik /usr/local/bin, ki naj bo v uporabnikovi spremenljivki okolja PATH. 1. sget [-r stevilka_revizije] Iz CVS dobite datoteko ali celoten imenik v načinu "samo-za-branje" (READ ONLY). Kliknite na ``''. 2. sedit [-r stevilka_revizije] Urejanje datoteke z namenom spremeniti vsebino. Datoteka se zaklene, tako, da je nihče ne more prevzeti. Seveda si skript lahko prilagodite svojim potrebam - brez zaklepanja, opozorilna sporočila ali zelo zmogljivo zaklepanje. Kliknite na ``''. 3. scommit [-r stevilka_revizije] Udejanite spremembe v datoteko ali ves imenik. Odložite spremembe v CVS. Kliknite na ``''. 4. supdate Posodobite datoteko ali ves imenik tako, da dobite najnoveše datoteke iz CVS. Kliknite na ``''. 5. sunlock [-r stevilka_revizije] Odklepanje datoteke, dobljene s sedit. Kliknite na ``''. 6. slist Ogled datotek, ki jih trenutno urejate. Izvrši ukaz 'ls -l | grep | ...'. Kliknite na ``''. Upoštevajte, da obstaja še en Unixov ukaz slist (ki izpiše seznam razpoložljivih strežnikov Netware). Prepričajte se, da je imenik s skriptom slist v spremenljivki PATH naveden pred drugimi imeniki s tem ukazom. 7. sinfo Informacije o spremembah/revizijah datoteke. Kliknite na ``''. 8. slog Zgodovina sprememb/revizij datoteke iz CVS. Kliknite na ``''. 9. sdif sdif -r revizija1 -r revizija2 Razlike med dvema revizijama datoteke v CVS. Kliknite na ``''. OPOMBA: ukaz sdif ima samo en 'f', ker že obstaja drug Unixov ukaz 'sdiff' 10. sadd Doda novo datoteko v skladišče CVS. Kliknite na ``''. 11. sdelete Brisanje datoteke iz skladišča CVS. Kliknite na ``''. 12. sfreeze Zamrznitev kode, izdaja celotnega izvornega drevesa. Kliknite na ``''. Na primer: ___________________________________________________________________ cd $HOME; sfreeze REVIZIJA_1_0 izvdrevo ___________________________________________________________________ zamrzne kodo z oznako REVIZIJA_1_0, da lahko pozneje prevzamete celotno drevo z uporabo imena revizije. 7. Dokumentacija CVS V Unixovi ukazni vrstici odtipkajte: 1. cvs --help 2. cvs --help-options 3. cvs --help-commands 4. cvs -H checkout 5. cvs -H commit 6. man cvs 7. man tkcvs 8. Obiščite 9. Obiščite Tkcvs ( ) je Tcl/Tk grafični vmesnik do CVS. Vsebuje tudi sprotno pomoč. ˇ cd $HOME/src/foo.cpp ˇ tkcvs ˇ Kliknite na foo.cpp ˇ Kliknite na ikono 'Revision Log' ki se nahaja takoj za ikono 'spectacle' ˇ To bo v oknu prikazalo vejo drevesa. Sedaj z DESNIM miškinim gumbom kliknite na besedilo '1.3' in z LEVIM gumbom kliknite na '1.1'. Potem kliknite na gumb"Diff". Prikaže se okno z dvema razdelkoma!! ˇ Kliknite na gumb "Next" za sprehod čez še več razlik. Kliknite na "Center" za centriranje besedila. Obstaja tudi CVS odjemalec za Windows 95, ki se imenuje WinCVS (oglejte si in stran Cyclicsite ). WinCVS se lahko uporablja skupaj s Sambo - Potrebni ukazi so: ˇ cvs checkout ˇ cvs update ˇ cvs add ˇ cvs remove ˇ cvs commit ˇ cvs status ˇ cvs log ˇ cvs diff -r1.4 -r1.5 To poda razlike med različicama datoteke 1.4 and 1.5. 7.1. Priložena dokumentacija Na sistemih z Linuxom lahko najdete dokumentacijo za CVS v zapisu postscript v imeniku /usr/doc/cvs*/*.ps. Na voljo je tudi seznam odgovorov na pogosto zastavljana vprašanja in ostale koristne informacije. ______________________________________________________________________ bash# cd /usr/doc/cvs* bash# gv cvs.ps ______________________________________________________________________ 7.2. Dokumentacija organizacije "CVS Organisation" Dokumentacijo organizacije "CVS Organisation" boste našli na naslovu . Uradni Cederquistov priročnik za CVS se nahaja na naslovu . Spisek pogosto zastavljanih vprašanj za CVS boste našli na naslovu . 7.3. Učenje CVS ˇ ˇ ˇ ˇ ˇ ˇ Splošni pripomočki za CVS, ki so jih napisali ostali avtorji: ˇ Knjiga "Open Source Development with CVS" Karla Fogela na naslovu ima Poglavje Third-party-tools v uradnem priročniku in zrcalne strani: Zevils ˇ 8. Grafični uporabniški vmesniki Na voljo so naslednji grafični uporabniški vmesniki za CVS: ˇ CVS home.org: ˇ CVS Web for windows: in ˇ TkCVS ( ) je grafični vmesnik za CVS napisan v jeziku Tcl/Tk. Druga lokacija: cyclicsite ˇ gCVS: prenosljiv grafični vmesnik za netehnične uporabnike CVS: ˇ jCVS je odjemalec za CVS, v celoti napisan v javi: in cyclicsite ˇ WinCVS: in cyclicsite ˇ Component soft Win CVS: ˇ JA-SIG UPortal CVS ˇ ˇ Zelo vam priporočamo, da uporabljate Sambo (samba*.rpm na cdromu) in ``strežnik X'' na računalnikih z operacijskim sistemom MS Windows 95/NT. Z uporabo Sambe bo imenik na računalniku z Unixom v MS Windows videti kot lokalna mapa. Oglejte si naslednji razdelek o ``strežnikih X''. 9. CVS za MS Windows 95/98/NT/2000 ZELO vam priporočamo uporabo Sambe (samba*.rpm na cdromu) in VNC viewerja (ali strežnika X) na sistemih z MS Windows 95/NT. S Sambo bo CVS strežnik na Unixu/Linuxu deloval kot datotečni strežnik. Z uporabo Sambe bo imenik na oddaljenem računalniku z Unixom v MS Windows videti kot lokalna mapa na lokalnem disku. Namestite paket samba*.rpm na strežniku Unix/Linux (s skladiščem CVS) in namestite VNC viewer (ali strežnik X) na namizje MS Windows 95/NT/2000. Z uporabo VNC (ali strežnika X) se z lahkoto prijavite v sistem Unix in vlagate/prevzemate datoteke. Na sistemih MS Windows lahko tudi uporabljate orodja kot Java Visual Cafe ali Java JBuilder za urejanje datotek iz imenikov s sistema Unix/Linux (preko Sambe). Po urejanju lahko vložite datoteke v sistem Unix s pomočjo VNC ali strežnika X. Prednosti uporabe CVS na Linuxu/Unixu preko MS Windows so: ˇ En sam na Linuxu postavljen datotečni strežnik (CVS strežnik) lahko streže veliko odjemalcem na sistemih MS Windows. ˇ Datotečni (CVS) strežnik pod Linuxom je zelo robusten, varen in zanesljiv. ˇ Potrebna je samo ena baterija UPS (za neprekinjeno napajanje) za strežnik z Linuxom. ˇ S pomočjo Sambe bodo Linuxovi imeniki videti kot imeniki na sistemu MS Windows. ˇ Linuxov datotečni (CVS) strežnik podpira centralizirano izdelavo varnostnih kopij s pomočjo orodij kot Arkeia, Bru , zrcalni strežniki tudi na , angelfire , geocities , virtualave , 50megs , theglobe , NBCi , Terrashare , Fortunecity , Freewebsites , Tripod , Spree , Escalix , Httpcity , Freeservers . ˇ Linuxov datotečni (CVS) strežnik zahteva samo en majhen klimatiziran in brezprašen prostor. Majhen prostor zniža stroške hlajenja/ogrevanja. ˇ Linux datotečni (CVS) strežnik omogoča varnost preko Unixovih skupin in overovljanj uporabnikove identitete. Najboljše orodje za dostopanje do oddaljenih računalnikov je VNC. VNC ne porabi veliko procesorske moči ter pomnilnika in je precej boljši od strežnikov X. Uporabo VNC priporočamo bolj kot strežnike X. Oddaljene računalnike lahko dosežete s pomočjo: ˇ VNC (Virtual Network Computing) na . VNC ni strežnik X, vendar lahko prikaže namizje z oddaljenega sistema Unix na namizju Windows. VNC je najboljše orodje na tržišču za dostop do oddaljenih računalnikov, je zelo skromen s porabo procesorske moči in zelo zmogljiv program. Sledi seznam razpoložljivih strežnikov X: ˇ Najboljši, poceni in majhen (3 MB): pojdite na in kliknite na "X-Server (MI/X) for Windows". ˇ Humming bird eXceed (14 MB): ˇ Starnet (5.2 MB): Na voljo je več kot 2 ducata dobaviteljev strežnikov X za Windows: ˇ X-win pro (6.34 MB): ˇ X-WinPro: ˇ X-Link: ˇ Xoftware: Strežniki X z univerz: ˇ Seznami univerz: ˇ Na disketi temelječ strežnik X: 9.1. Odjemalci FTP za Windows 95/NT/2000 S skladišča CVS na Unixu/Linuxu lahko datoteke prenašate na MS Windows tudi preko protokola FTP: ˇ Pojdite na stran Tucows in iščite po ključni besedi "ftp tools" za MS Windows: 9.2. Datoteke Visual Cafe(Java), JBuilder, MS Visual C++, HTML Z uporabo Sambe in strežnika X je mogoče uprabljati CVS na sistemih Windows. CVS podpira tudi orodja, kot so Symantec Visual Cafe (Java), Inprise JBuilder, MS Visual C++ in druga. Datoteke HTML lahko s pomočjo Sambe shranjujete v skladišče CVS in jih z lahkoto dosežete iz MS Windows. 9.3. Orodja za administriranje Sambe Sambo administrirajte z orodji na naslovu . Pojdite tja in kliknite na "GUI Interfaces Tools". 10. Varnost skladišč CVS Strežnik in skladišče CVS lahko zavarujete tako: ˇ Poženite CVS na samostojnem sistemu Linux/Unix, oglejte si še razdelek o ``izboljšanju učinkovitosti''. ˇ Odstranite nepotrebne programske pakete z računalnika s CVS, da zunanjim vandalom preprečite, da bi jih pognali. Za vsak primer, če se jim že posreči vdreti v sistem, jim na ta način vsaj ne ponudite priložnosti, da bi pognali nevarne programe. ˇ Razmislite o uporabi SSH, kot je opisano v poglavju ``Skladišče za več uporabnikov''. ˇ Razmislite o uporabi Kerberos, namestite paket cvs-*-kerberos*.rpm: . ˇ Obiščite in na naslovu mailing list zastavite vprašanja o varnosti. 11. Večuporabniško skladišče CVS z dostopom z drugih računalnikov Cederqvistov priročnik na naslovu opisuje, kako nastaviti CVS, da bo mogoče dostopati nanj z drugih računalnikov. Da bo lahko CVS uporabljala skupina, je potrebno nastaviti sistem dovoljenj, ki bo dovoljeval ljudem dostop do sistema z drugih računalnikov. To lahko omogočite na tri načine in sicer z :server:, :pserver: ali :ext:. Mehanizem pserver in uporaba rsh nista varna. Samo :ext (z uporabo ssh) nam nudi dovolj varnosti. Če spremenljivko CVS_RSH nastavite na SSH ali kakšen drug nadomestek rsh, so lahko navodila podobna tistim za `.rhosts', vendar prej preverite v dokumentaciji za vaš nadomestek za rsh. Ssh dobite, če obiščete in kot iskalni pojem vnesete "ssh". Lahko tudi obiščete in spet kot iskalni pojem vnesite "ssh". Prenesite in namestite ssh RPM in zatem nastavite CVS za uporabo z njim. Oglejte si tudi . Opomba: če nameravate nastaviti CVS za uporabo z rsh, potem MORATE narediti ta kritičen korak: ______________________________________________________________________ bash# chmod 6000 .rhosts ______________________________________________________________________ Oglejte si še skladišče CVS z JA-SIG UPortal: . 12. Lupinski skripti za RCS Če želite namesto CVS uporabljati RCS, si lahko pomagate z naslednjimi lupinskimi skripti. 12.1. cotree.sh ______________________________________________________________________ #!/bin/ksh # cotree.sh (lupinski skript za prevzemanje drevesa) # cotree.sh - Prevzame celotni imenik iz RCS # Uporaba : # Tako boste dobili vse imenike # unix> cotree.sh # # Tako pa boste dobili samo drevo iz enega imenika # unix> cotree.sh # Oglejte si tudi cofiles.sh ############################################################### # Nastavljanje RCS (Revision Control System) # Namestite si programe RCS - dobili boste ukaze co, ci, rcslog # Naredite domači imenik za RCS, kamor boste odlagali datoteke # iz skladišča izvorne kode. Recimo, da se imenuje # $RCSDIR=/home/rcs_version_control # Nastavite vrednost spremenljivki okolja RCSDIR=/home/rcs_version_control # v datoteki $HOME/.profile. Npr. # export RCSDIR=/home/rcs_version_control # Pod $RCSDIR naredite imeniško strukturo in vanjo vločite vse vaše # datoteke z uporabo ci . Oglejte si 'man ci' # Sedaj naredite povezavo iz vašega domačega imenika do vašega projekta # pod $RCSDIR # cd $HOME # mkdir $HOME/myproject # cd $HOME/myproject # in poženite ta skript, da boste dobili vse datoteke in drevo imenikov # cotree.sh # Ta skript bo naredil celotno drevo izvorne kode v uporabnikov # domači imenik in bo imel tudi mehko povezavo do imenikov RCS. Vsak # uporabnik bo pognal ta skript v svojem domačem imeniku. ############################################################### check_out_directory() { # Korenski imenik RCS (revision control system) # npr. RCSDIR=/home/rcs_version_control RCSDIR=$1 DIRNAME=$2 # Ime podanega imenika mora obstajati v korenskem imeniku RCS if [ "$DIRNAME" = "" -o ! -d $RCSDIR/$DIRNAME ]; then print "\nImenik DIRNAME=$DIRNAME ne obstaja!!" print "\nPrekinjam program ... in končujem ...\n" exit fi mkdir -p $DIRNAME ln -s $RCSDIR/$DIRNAME/RCS $DIRNAME ( cd $DIRNAME # To ne bo uspelo v primeru ime datoteke=vzorec,vv # kar bo znotraj RCS enako RCS/vzorec,vv,v # ls RCS | cut -d',' -f1 | xargs co # Uporabite ujemanje za konec imena $, kot je spodaj - # Uporabite ls RCS/*, da se znebite imen ./ in ../ #ls RCS/* | cut -d'/' -f2 | sed -e's/,v$//g' | xargs co if [ -d RCS ]; then ls RCS/* | cut -d'/' -f2 | sed -e's/,v$//g' | \ while read ii do #echo "ii je : $ii" if [ -f "RCS/$ii,v" ]; then co $ii fi done fi ) } # Korenski imenik (revision control system) # npr. RCSDIR=/home/rcs_version_control if [ "$RCSDIR" = "" -o ! -d $RCSDIR ]; then print "\nImenik RCSDIR=$RCSDIR ne obstaja!!" print "\nPrekinjam program ... in ga končujem...\n" exit fi #echo "RCSDIR je : $RCSDIR" # Če je kot argument podano ime imenika, potem prevzemi vse # datoteke samo za ta imenik in končaj. if [ "$1" != "" ]; then (cd $RCSDIR; find $1 -type d -print ) | while read DIRNAME do #echo DIRNAME=$DIRNAME #DIRNAME=c_src #Korenski imenik RCS in ime imenika naj bosta relativna na rcs root dir tmpaa=` basename $DIRNAME ` if [ "$tmpaa" != "RCS" ]; then check_out_directory $RCSDIR $DIRNAME fi done else (cd $RCSDIR; find * -type d -print ) | while read DIRNAME do echo DIRNAME=$DIRNAME #DIRNAME=c_src # Korenski imenik RCS in ime imenika naj bosta relativna na rcs root dir tmpaa=` basename $DIRNAME ` if [ "$tmpaa" != "RCS" ]; then check_out_directory $RCSDIR $DIRNAME fi done fi ______________________________________________________________________ 12.2. cofiles.sh ______________________________________________________________________ #!/bin/ksh # cofiles.sh (Lupinski skript za prevzemanje datotek) # cofiles.sh - Prevzemi vse datoteke v trenutnem imeniku iz RCS # Oglejte si tudi cotree.sh in 'man rcsclean' if [ ! -d RCS ]; then print "\nImenik RCS ne obstaja!!" print "\nPrekinjam program ... in ga končujem...\n" exit fi #echo "No. of args = " $# " and all args " $@ while true do print -n "\n\nPrevzamem vse datoteke s pravicami branja in pisanja (read-write)? [n]: " read ans if [ "$ans" = "" -o "$ans" = "n" -o "$ans" = "N" ]; then ans="N" break elif [ "$ans" = "d" -o "$ans" = "D" ]; then ans="D" break else print "\nNapačen vnos! Poskusite znova!!" fi done #echo "The ans is : " $ans if [ $# -eq 0 ]; then # 'ls RCS' ne uspe v primeru ime_datoteke=vzorec,vv v RCS/vzorec,vv,v # ls RCS | cut -d',' -f1 | xargs co # Uporabite ujemanje, da se ime konča z $, kot je razvidno spodaj - if [ "$ans" = "D" ]; then ls RCS | sed -e's/,v$//g' | xargs co -l else ls RCS | sed -e's/,v$//g' | xargs co fi elif [ $# -eq 1 ]; then if [ -f "RCS/$1,v" ]; then # V tem primeru bo $1 kot dbalter.sql # in ne kot db*.sql.... #echo "One arg, no. of args = " $# " and all args " $@ if [ "$ans" = "D" ]; then co -l "$1" else co "$1" fi else # V primeru, ko je $1=db*.sql in v trenutnem imeniku # ni nobenega db*.sql #echo "No files... no. of args = " $# " and all args " $@ tmpaa="RCS/$1,v" # bo kot RCS/db*.sql,v ls $tmpaa | \ while read ii do #echo "ii is : $ii" if [ "$ans" = "D" ]; then co -l "$ii" else co "$ii" fi done fi else for ii in $@ do #echo "ii is : $ii,v" if [ "$ans" = "D" ]; then co -l "$ii" else co "$ii" fi done fi ______________________________________________________________________ 12.3. ciall.sh ______________________________________________________________________ #!/bin/ksh # ciall.sh (Lupinski skript za vlaganje datotek) # ciall.sh - Vloži vse datoteke v trenutnem imeniku v RCS # Ta skript je zelo koristen za vlaganje ogromnega števila novih datotek # v RCS. Prihrani čas, ker ni potrebno tipkati "opisa" za vsako datoteko. # Za datoteke, ki so že v RCS, izvede običajen ukaz check-in. # Pretvorba imen datotek v male črke: # 'tr', see 'man tr' #ls * | \ #while read ii #do # jj=`echo $ii | tr [A-Z] [a-z] ` # echo "ii is : $ii" # echo "jj is : $jj" # mv $ii $jj #done if [ ! -d RCS ]; then print "\nImenik RCS ne obstaja!!" print "\nImenik RCS bo narejen sedaj ...\n" mkdir RCS fi print "\n\nOpomba: To ni dnevniško sporočilo!" print "Prosim, vnesite opis (uporabil se bo za" print -n "vse vložene datoteke) : " read description # Izbira prune ne deluje, uporabi -maxdepth 0 #find * -prune -type f | # Število podanih izbir je nič ali več.... if [ $# -eq 0 ]; then listoffiles="*" else listoffiles="$@" fi # Izbira prune ne deluje, uporabi -maxdepth 0 #find $listoffiles -prune -type f | find $listoffiles -maxdepth 0 -type f | while read ii do #echo $ii if [ -f "RCS/$ii,v" ]; then #print "The file $ii already in RCS" ci -m"$description" $ii else #print "The file $ii is new file" ci $ii << EOF $description EOF fi done ______________________________________________________________________ 13. Izboljšanje učinkovitosti strežnika CVS Za optimalno učinkovitost mora strežnik CVS teči na samostojnem računalniku z Linuxom/Unixom. Da boste iztisnili čimveč procesorske moči, naredite naslednje: ˇ Ponovno prevedite Linuxovo jedro, da bo manjše in zanesljivejše. Odstranite dele, ki se ne uporabljajo. Oglejte si spis Kernel-HOWTO na naslovu ˇ Izključite nepotrebne Unixove procese. Na sistemih z Linuxom/Unixom poženite chkconfig. ___________________________________________________________________ bash$ su - root bash# man chkconfig bash# chkconfig --help bash# chkconfig --list | grep on | less S seznama, ki ga dobite na zgornji način, odstranite procese, za katere ne želite, da se zaženejo samodejno. bash# chkconfig --level 0123456 off Ko naslednjič vključite računalnik, se ti procesi ne bodo več zagnali. Sedaj vse procese, ki ste jih odstranile s seznama, odstranite še ročno. bash# cd /etc/rc.d/init.d bash# ./ stop ___________________________________________________________________ ˇ Ne poganjajte ostalih nepotrebnih programov. ˇ Ne pustite sistema X Window, da teče brez potrebe, ker njegovi procesi zasedajo pomnilnik in prispevajo k obremenitvi procesorja. Lahko tudi predstavlja resno varnostno luknjo za zunanje napade. Ponavadi se uporabljajo okenski upravniki kot KDE, GNOME, CDE, XDM in drugi. Sistem X Window morate zapustiti takoj po uporabi in večino časa bi na računalniku s strežnikom CVS morali videti prijavni odzivnik v ukazni vrstici. 14. Sistem za sporočanje problemov Skupaj s CVS boste morda želeli uporabljati sistem za sledenje projekta (angl. Project Tracking system) ali sistem za sporočanje problemov (angl. Problem Reporting system. Vsak programski projekt potebuje sistem za sporočanje problemov, kjer se sledijo hrošči in se jih posreduje različnim razvijalcem. Oglejte si projekt GNU gpl GNATS na naslovu in . Komercialni sistem za sporočanje problemov si lahko ogledate na , poiščite še sistem za sledenje projekta. 15. Orodja za upravljanje s konfiguracijskami datotekami Kaj je upravljanje konfiguracijskih datotek (angl. configuration management)? Obstaja več različnih razlag. Nanaša se na sledenje in nadzor nad razvojem programske opreme ter s tem povezane aktivnosti. To pomeni upravljanje razvoja programskih projektov z vidiki kot so, da več razvijalcev istočasno dela z istimi deli kode, ki bo namenjena različnim končnim sistemom, podpora večim različicam in nadzor statusa kode (npr. preizkusne beta različice proti pravim različicam). Tudi v tem pogledu je več različnih razlag: ˇ Tradicionalen nadzor nad vlogami in prevzemi izvorne kode (in včasih tudi prevedenih programov) in možnost prevajanja entitet. Vključene so lahko tudi ostale funkcije. ˇ Upravljanje procesov - nadzor aktivnosti pri razvoju programske opreme. Na primer, možnost zagotoviti, da obstaja zahteva po spremembi, ki je bila odobrena in da so bile aktivnosti kot oblikovanje, dokumentacija in preizkus končane pred dovoljenjem za ponovno "vlaganje" kode. Medtem ko sta upravljanje procesov in nadzor potrebna za ponavljajoč in optimiziran razvojni proces, so trdni temelji upravljanja s konfiguracijskimi datotekami nujni za ta proces. Obiščite naslednje povezave: ˇ Odgovori na pogosto zastavljana vprašanja o orodjih za upravljanje s konfiguracijskimi datotekami: ˇ Linux version control and configuration management tools ˇ Configuration Management systems ˇ Configuration Management Tools ˇ DevGuy CVS config mgmt ˇ Yahoo category site ˇ Free config mgmt tool ˇ Free CM tools ˇ Rational ClearCase tool 16. Podobne strani Podobne strani lahko najdete na: ˇ Linux goodies in zrcalnih straneh: , angelfire , geocities , virtualave , 50megs , theglobe , NBCi , Terrashare , Fortunecity , Freewebsites , Tripod , Spree , Escalix , Httpcity , Freeservers . ˇ CVS Bubbles ˇ CSSC (SCCS like system) in zrcalni strani ˇ SCCS za Linux 17. SCCS proti CVS-RCS SCCS (angl. Source Code Control System, sistem za nadzor izvorne kode) se nič več ne razvija in izboljšuje. Splošno mnenje je, da je to orodje površno in ni primerno za veliko število uporabnikov, ki delajo na enem projektu. Pravzaprav SCCS prepleta vse različice, vendar lahko občutno upočasni. razvoj novih različic. Zatorej se sistem SCCS NE priporoča za začetek novih projektov. Kljub temu ga tu in tam še vedno srečamo zaradi podpore starejšim bazam izvorne kode v SCCS. RCS (angl. Revision Control System, sistem za nadzor revizij) je po pogostnem mnenju boljši od SCCS. En vzrok tiči v dejstvu, da se hrani najnovejša različica in razlike za starejše različice glede na najnovejšo, zaradi česar je razvoj novih različic hitrejši. Dodatne razprave na temo SCCS proti RCS lahko najdete na naslovu . Upoštevajte, da se je RCS učil na napakah SCCS... CVS, ki za delovanje zahteva RCS, razširi RCS tako, da nadzira hkratno urejanje izvorne kode večih uporabnikov, ki delajo na izdajah, zgrajenih iz hierarhičnih množic imenikov. "Če je RCS zbirni jezik, je CVS Pascal". 18. Ostali zapisi tega dokumenta Ta dokument je izdan v 14 različnih zapisih in sicer: DVI, Postscript, Latex, Adobe Acrobat PDF, LyX, GNU-info, HTML, RTF(Rich Text Format), tekst, Unixove priročniške strani, datoteka HTML file, SGML (zapis Linuxdoc), SGML (zapis Docbook) in zapis MS WinHelp. Ta dokument se nahaja na naslovu: ˇ , kliknite na HOWTOs in ga poiščite med dokumenti howto s pomocjo tipk CTRL+f ali ALT+f znotraj vašega brskalnika. Ta dokument lahko najdete tudi na naslednjih naslovih: ˇ ˇ ˇ ˇ ˇ Ostale zrcalne strani v vaši bližini lahko najdete na , kjer izberete najbližjo stran in greste v imenik /LDP/HOWTO/xxxxx-HOWTO.html. ˇ Ta dokument lahko dobite tudi v eni arhivski datoteki (tar) z zapisi HTML, DVI, Postscript ali SGML na naslovih: in . ˇ Dokument zapisan v golem tekstu najdete na: in . ˇ Celoten dokument v eni datoteki HTML se nahaja na: . Enovito datoteko HTML dobite (glejte še man sgml2html) z ukazom: sgml2html -split 0 xxxxhowto.sgml ˇ Prevode dokumenta v druge jezike, npr. francoščino, nemščino, španščino, kitajščino in japonščino najdete na: in Vsakršna vaša pomoč pri prevajanju v druge jezike bo dobrodošla. Dokument je napisan z uporabo orodij "SGML-Tools", ki jih lahko dobite na naslovu: . Po prevajanju izvorne kode boste dobili množico ukazov, npr.: ˇ sgml2html xxxxhowto.sgml (za izdelavo datotke HTML) ˇ sgml2html -split 0 xxxxhowto.sgml (za izdelavo enovite datoteke HTML) ˇ sgml2rtf xxxxhowto.sgml (za izdelavo datoteke RTF) ˇ sgml2latex xxxxhowto.sgml (za izdelavo datoteke Latex) 18.1. Zapis Acrobat PDF Datoteka v zapisu PDF se lahko izdela iz zapisa v Postscriptu z uporabo bodisi programa Acrobat distill bodisi z Ghostscriptom. Datoteko v zapisu Postscript izdelate iz zapisa DVI, le tega pa iz zapisa v Latexu. Programsko opremo Distill lahko poberete z naslova . Spodaj je podan vzorčni postopek za izdelavo datoteke v zapisu PDF: ______________________________________________________________________ bash$ man sgml2latex bash$ sgml2latex dokument.sgml bash$ man dvips bash$ dvips -o dokument.ps dokument.dvi bash$ distill dokument.ps bash$ man ghostscript bash$ man ps2pdf bash$ ps2pdf vhod.ps izhod.pdf bash$ acroread izhod.pdf & ______________________________________________________________________ Lahko pa uporabite Ghostscriptov ukaz Ps2pdf. Ps2pdf je nekakšen nadomestek s skoraj vso funkcionalnostjo izdelka Adobe Acrobat Dis­ tiller: pretvarja datoteke v Postscriptu v zapis Portable Document Format (PDF). Ps2pdf je izveden kot zelo kratek ukazni skript (paketna datoteka), ki kliče Ghostscript in izbere posebno "izhodno napravo" z imenom pdfwrite. Da bo Ps2pdf deloval, mora biti "naprava" pdfwrite ob prevajanju Ghostscripta vključena v datoteko Makefile; glede podrobnosti si oglejte dokumentacijo o postavljanju Ghostscripta. 18.2. Pretvorba zapisa Linuxdoc v Docbook Ta dokument je napisan v zapisu Linuxdoc SGML. Zapis Docbook SGML je njegov naslednik in ima precej več značilnosti kot Linuxdoc. Linuxdoc je zelo enostaven za uporabo. Če želite pretvoriti zapis Linuxdoc SGML v Docbook SGML, uporabite program ld2db.sh in nekaj skriptov v Perlu. Izpis programa Ld2db ni 100% čist, zato boste potrebovali skript clean_ld2db.pl, napisan v Perlu. Lahko se zgodi, da boste morali nekaj vrstic v dokumentu popraviti ročno. ˇ Poberite program Ld2db z naslova ali s strani Al Dev site ˇ Poberite skript v Perlu cleanup_ld2db.pl s strani Al Dev site Programcek ld2db.sh ni 100% čist, zato bo ob njegovem zagonu prišlo do nekaterih napak. ___________________________________________________________________ bash$ ld2db.sh file-linuxdoc.sgml db.sgml bash$ cleanup.pl db.sgml > db_clean.sgml bash$ gvim db_clean.sgml bash$ docbook2html db.sgml ___________________________________________________________________ Po zagonu skripta v Perlu boste morda morali ročno popraviti nekaj manjših napak. Na primer, za vsak < Listitem> boste morali vnesti zapiralmo oznako < /Para>. 18.3. Pretvorba v zapis MS WinHelp Dokument v zapisu SGML lahko pretvorite v zapis Microsoft Windows Help. Najprej pretvorite SGML v HTML: ______________________________________________________________________ bash$ sgml2html xxxxhowto.sgml (izdelava datotek HTML) bash$ sgml2html -split 0 xxxxhowto.sgml (izdelava enovite datoteke HTML) ______________________________________________________________________ Zatem uporabite pripomoček HtmlToHlp . Lahko pa tudi izvedete Sgml2rtf in zatem zapis RTF pretvorite v winhelp. 18.4. Ogled različnih zapisov Če si želite ogledati dokument v zapisu DVI, uporabite program Xdvi, ki ga dobite v paketu tetex-xdvi*.rpm (Redhat Linux) in najdete v meniju ControlPanel | Applications | Publishing | TeX. Dokument v zapisu DVI lahko berete z ukazom: xdvi -geometry 80x90 howto.dvi man xdvi Velikost okna lahko spreminjate z miško. Po dokumentu se pomikate s smerniškimi tipkami, Page Up/Down, lahko pa tudi s tipkami 'f', 'd', 'u', 'c', 'l', 'r', 'p', 'n' za pomik gor, navzdol, na sredino, naslednjo oz. prejšnjo stran ipd. S tipko 'x' izklopite meni. Datoteko v zapisu Postscript si lahko ogledate s programoma 'Gv' (Ghostview) ali 'Ghostscript'. Program 'Ghostscript' se nahaja v paketu ghostscript*.rpm Gv pa v paketu gv*.rpm (Redhat Linux), do njiju pa pridete preko menijev ControlPanel | Applications | Graphics. Program Gv je uporabniku precej prijaznejši kot Ghostscript. Oba programa sta na voljo tudi za druge operacijske sisteme, npr. OS/2, Windows 95 in NT. Ta dokument si lahko ogledate tudi na omenjenih operacijskih sistemih. ˇ Ghostscript za Windows 95, OS/2, in vse druge operacijske sisteme dobite na naslovu . Dokument v zapisu Postscript si lahko ogledate z ukazom: gv howto.ps ghostscript howto.ps Dokument v zapisu HTML si lahko ogledate s pomočjo Netscape Navigatorja, Microsoft Internet Explorerja, Redhat Baron Web browserja ali kateregekoli izmed preostalih 10 spletnih brskalnikov. Dokumente v zapisih Latex in LyX si lahko ogledate s programom LyX - vmesnikom za LaTeX v okolju X Window. 19. Avtorske pravice in licenca (C) Al Dev (Alavoor Vasudevan) 1998-2000. Licenca je GNU GPL, zahteva se še, da avtorjevo ime in elektronski naslov ostaneta na vseh izvodih. 20. sget Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program sget # Program za prevzem datoteke v načinu "samo za branje"iz CVS # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` Usage() { print "\nUporaba: $cmdname [-r stevilka_revizije/simbolicno_ime_oznake] " print "Moznost -r je neobvezna " print "Na primer - " print " $cmdname -r 1.1 foo.cpp" print " $cmdname foo.cpp " print " $cmdname nek_imenik " print "Izvlece po simbolicni oznaki revizije kot - " print " $cmdname -r REVISION_1 some_directory " print " " exit } # Ukaz getopt ne bo vec podprt v naslednji izdaji. # Namesto njega uporabljamo getopts. while getopts r: ii do case $ii in r) FLAG1=$ii; OARG1="$OPTARG";; ?) Usage; exit 2;; esac done shift ` expr $OPTIND - 1 ` #echo FLAG1 = $FLAG1 , OARG1 = $OARG1 if [ $# -lt 1 ]; then Usage fi bkextn=sget_bak homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi cur_dir=`pwd` #echo $cur_dir len=${#homedir} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir je : " $subdir tmpaa=`dirname $1` if [ "$tmpaa" = "." ]; then fname=$1 if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename $1` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi #echo "subdir je : " $subdir #echo "fname je : " $fname # Preveri, ali datoteka ze obstaja.... if [ -f "$HOME/$subdir/$fname" ]; then tmpaa="$HOME/$subdir/$fname" user_perms=" " group_perms=" " other_perms=" " user_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b3-3 ` group_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b6-6 ` other_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b9-9 ` if [ "$user_perms" = "w" -o "$group_perms" = "w" \ -o "$other_perms" = "w" ]; then print "\nNapaka: Datoteko je mogoce spreminjati. Opuscam $cmdname ......" print " Naredite rezervno kopijo, izvedite scommit ali izbrisite datoteko in" print " poskusite s $cmdname znova.\n" exit fi fi # Prestavi datoteko mkdir -p "$HOME/$subdir" touch "$HOME/$subdir/$fname" 2>/dev/null \mv -f "$HOME/$subdir/$fname" "$HOME/$subdir/$fname.$bkextn" # Naredi podlupino ( cd $homedir # Uporabi izbiro -A za izbris vseh lepljivih zastavic if [ "$FLAG1" = "" ]; then if [ "$subdir" = "." ]; then # ne uporabi pike, ker bo zmedla CVS cvs -r checkout -A $fname else cvs -r checkout -A "$subdir/$fname" fi else if [ "$subdir" = "." ]; then # ne uporabi pike, ker bo zmedla CVS cvs -r checkout -A -$FLAG1 $OARG1 $fname else cvs -r checkout -A -$FLAG1 $OARG1 "$subdir/$fname" fi fi ) #pwd if [ -f "$HOME/$subdir/$fname" ]; then print "\nPridobljena kopija datoteke $subdir/$fname samo za branje." print "Dokoncan $cmdname" #print "\nNasvet: $cmdname \n" fi ______________________________________________________________________ 21. sedit Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program sedit # Program za prevzem datotek iz CVS v načinu branje in pisanje z zaklepanjem # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` Usage() { # print "\nUporaba: $cmdname [-r stevilka_revizije] [-F] " # print "Izbiri -r, -F sta neobvezni" # print "Izbira -F prisili k urejanju tudi, ce je datoteko " # print "nekdo ze zaklenil" print "\nUporaba: $cmdname [-r stevilka_revizije] " print "Izbira -r je neobvezna " print "Na primer - " print " $cmdname -r 1.1 foo.cpp" print " $cmdname foo.cpp " # print " $cmdname -F foo.cpp " print " " } # Ukaz getopt ne bo vec podprt v naslednji izdaji. # Namesto njega uporabimo getopts. #while getopts r:F ii while getopts r: ii do case $ii in r) FLAG1=$ii; OARG1="$OPTARG";; # F) FLAG2=$ii; OARG2="$OPTARG";; ?) Usage; exit 2;; esac done shift ` expr $OPTIND - 1 ` #echo FLAG1 = $FLAG1 , OARG1 = $OARG1 if [ $# -lt 1 ]; then Usage exit fi homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi bkextn=sedit_bak cur_dir=`pwd` #echo $cur_dir len=${#homedir} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir | cut -b $len-2000 ` tmpaa=`dirname $1` if [ "$tmpaa" = "." ]; then fname=$1 if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename $1` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi #echo "subdir je : " $subdir #echo "fname je : " $fname # Ce je datoteko ze kdo prevzel.... cvs_root=` echo $CVSROOT | cut -f1 -d' ' ` if [ "$cvs_root" = "" ]; then print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n" exit fi mkdir -p "$CVSROOT/$subdir/Locks" 2>/dev/null if [ ! -e "$CVSROOT/$subdir/$fname,v" ]; then print "\nNapaka: datoteke $fname ni v skladiscu CVS!!\n" exit fi # Imenik CVS v vasem lokalnem imeniku je nujno potreben za delovanje vseh ukazov.. if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja." print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj poskusi izdelati CVS in v lokalnem imeniku s sget. ( cd "$homedir" if [ "$subdir" = "." ]; then # ne uporabljaj pike, ki lahko zmede CVS cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi # Dobi stevilko revizije datoteke.... # Uporabi tmpfile ker argumentov ni mogoce nastavljati znotraj podlupine. tmpfile=$homedir/sedit-lock.tmp \rm -f $tmpfile 2>/dev/null if [ "$FLAG1" = "" ]; then ( cd $homedir if [ "$subdir" = "." ]; then # ne uporabi pike, ki lahko zmede CVS cvs log $fname | head -6 | grep head: | awk '{print $2}' > $tmpfile else cvs log "$subdir/$fname" | head -6 | grep head: | awk '{print $2}' > $tmpfile fi ) OARG1=`cat $tmpfile` \rm -f $tmpfile 2>/dev/null fi lockfile="$CVSROOT/$subdir/Locks/$fname-$OARG1" #echo "lockfile je : " $lockfile #if [ -e $lockfile -a "$FLAG2" = "" ]; then if [ -e $lockfile ]; then print "\nNapaka: Datoteka $fname revizije $OARG1 je ze zaklenjena!!" aa=` ls -l $lockfile | awk '{print "Zaklenil jo je " $3}' ` print $aa print "Ta razvijalec naj izvede scommit ALI sunlock, da jo bo odklenil." print " " # print "Uporabite lahko tudi izbiro -F, da prisilite datoteko k urejanju," # print "tudi ce jo je kdo drug zaklenil. Toda najprej se morate" # print "z njim pogovoriti, da lahko z datoteko delata hkrati." # print "Na primer - ta moznost je koristna, ce delate na loceni" # print "funkctiji v jeziku C++ v datoteki, ki ne moti ostalih" # print "razvijalcev." # print " " exit fi # Sedaj dobi kopijo samo za branje.... if [ ! -e "$HOME/$subdir/$fname" ]; then ( cd $homedir if [ "$subdir" = "." ]; then # ne uporabljaj pike, ki lahko zmede CVS cvs -r checkout $fname 1>/dev/null else cvs -r checkout "$subdir/$fname" 1>/dev/null fi ) fi # Preveri, ali datoteka ze obstaja.... tmpaa="$HOME/$subdir/$fname" if [ -f $tmpaa ]; then user_perms=" " group_perms=" " other_perms=" " user_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b3-3 ` group_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b6-6 ` other_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b9-9 ` if [ "$user_perms" = "w" -o "$group_perms" = "w" \ -o "$other_perms" = "w" ]; then print "\nNapaka: datoteko je mogoce spreminjati. Opuscam $cmdname ......" print " Narediti morate rezervno kopijo, izvesti scommit ali zbrisati datoteko in" print " poskusiti s $cmdname znova.\n" exit fi #print "\nOpomba: datoteka $tmpaa je samo za branje." #print "Zato jo prestavljam v $tmpaa.$bkextn ....\n" \mv -f $tmpaa $tmpaa.$bkextn chmod 444 $tmpaa.$bkextn elif [ -d $tmpaa ]; then print "\nNapaka: $tmpaa je imenik in NE datoteka. Opuscam $cmdname ....\n" exit fi # Naredi podlupino print "\nSedaj dobivam datoteko $fname iz skladisca CVS ...\n" ( cd $homedir # Uporabljam izbiro -A, da zbrisem lepljivo oznako in da dobim # razlicico glavne revizije if [ "$FLAG1" = "" ]; then if [ "$subdir" = "." ]; then # ne uporabljaj pike, ki lahko zmede CVS cvs -w checkout -A $fname else cvs -w checkout -A "$subdir/$fname" fi else if [ "$subdir" = "." ]; then # ne uporabljaj pike, ki lahko zmede CVS cvs -w checkout -A -$FLAG1 $OARG1 $fname else cvs -w checkout -A -$FLAG1 $OARG1 "$subdir/$fname" fi fi ) if [ -e "$HOME/$subdir/$fname" ]; then # Zaklenjena datoteka je $CVSROOT/$subdir/Locks/$fname-$OARG1 touch $lockfile if [ -e $lockfile ]; then print "\nKoncan $cmdname." else print "\nUsodna napaka: datoteka $fname revizije $OARG1 ni zaklenjena !!" print "\nPreverite vzrok za to napako.. pred nadaljevanjem..." fi fi #pwd #print "\nNasvet: $cmdname \n" ______________________________________________________________________ 22. scommit Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program scommit # Program za udejanjenje sprememb in vnos datotek v CVS # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` Usage() { print "\nUporaba: $cmdname [-r stevilka_revizije] " print "Moznost -r je neobvezna" print "Na primer - " print " $cmdname -r 1.1 foo.cpp" print " $cmdname foo.cpp " print " " } # Ukaz getopt v naslednji izdaji ne bo vec podprt. # Namesto njega uporabljam getopts. while getopts r: ii do case $ii in r) FLAG1=$ii; OARG1="$OPTARG";; ?) Usage; exit 2;; esac done shift ` expr $OPTIND - 1 ` #echo FLAG1 = $FLAG1 , OARG1 = $OARG1 if [ $# -lt 1 ]; then Usage exit 2 fi if [ -d $1 ]; then Usage exit 2 fi homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi # Poisci podimenik cur_dir=`pwd` #echo $cur_dir len=${#homedir} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir | cut -b $len-2000 ` tmpaa=`dirname $1` if [ "$tmpaa" = "." ]; then fname=$1 if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename $1` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi # echo "subdir je : " $subdir # echo "fname je : " $fname # Ce je datoteko ze kdo prevzel.... cvs_root=` echo $CVSROOT | cut -f1 -d' ' ` if [ "$cvs_root" = "" ]; then print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n" exit fi mkdir -p "$CVSROOT/$subdir/Locks" 2>/dev/null # pri vseh ukazih je zahtevan imenik CVS v vasem lokalnem imeniku... if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja." print "Najprej morate izvesti sget na imeniku `basename $subdir`. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj poskusi izdelati CVS v lokalnem imeniku s sget ( cd "$homedir" if [ "$subdir" = "." ]; then # ne uporabljaj pike, ki lahko zmede CVS cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi # Ugotovi stevilko delovne revizije za datoteko.... # Uporaba tmpfile kot argumenta se ne more nastaviti znotraj podlupine tmpfile=$homedir/sedit-lock.tmp \rm -f $tmpfile 2>/dev/null if [ "$FLAG1" = "" ]; then ( cd $homedir if [ "$subdir" = "." ]; then # ne uporabljaj pike, ki lahko zmede CVS cvs status $fname 2>/dev/null | grep "Working revision:" | awk '{print $3}' >$tmpfile else cvs status "$subdir/$fname" 2>/dev/null | grep "Working revision:" | awk '{print $3}' >$tmpfile fi ) OARG1=`cat $tmpfile` \rm -f $tmpfile 2>/dev/null fi if [ "$OARG1" = "" ]; then print "Datoteka $subdir/$fname je NOVA, zato je ni v skladiscu CVS." else lockfile="$CVSROOT/$subdir/Locks/$fname-$OARG1" if [ -e $lockfile ]; then # Preveri, ali revizija pripada vam... aa=` ls -l $lockfile | awk '{print $3}' ` userid=`id | cut -d'(' -f2 | cut -d')' -f1 ` if [ "$aa" != "$userid" ]; then print " " print "Datoteke $subdir/$fname NISTE zaklenili vi!!" print "Zaklenil jo je uporabnik $aa , vase uporabnisko ime pa je $userid ." # print "Ce delate socasno z drugim razvijalcem" # print "in ste pri sedit uporabili izbiro -F," print "morate pocakati, da drug razvijalec izvede scommit" print "ali sunlock." print "Opuscam $cmdname ...." print " " exit 2 fi else # Datoteka mora obstajati v CVS if [ -f "$CVSROOT/$subdir/$fname,v" ]; then print "Datoteke $subdir/$fname niste zaklenili s sedit!!" print "Opuscam $cmdname ...." exit 2 else print "\nDatoteke $subdir/$fname se ni v skladiscu CVS!!" print "Na datoteki $subdir/$fname bi morali izvesti sadd...." exit 2 fi fi fi # Deluj znotraj podlupine - in deluj iz korenskega imenika ( cd $homedir # Za zadaj ne dovoli udejanjanj imenikov ... #if [ -d "$subdir/$fname" ]; then # cvs commit "$subdir/$fname" #fi if [ "$subdir" = "." ]; then # ne uporabljaj oike, ki lahko zmede CVS cvs commit $fname else cvs commit "$subdir/$fname" fi exit_status=$? if [ $exit_status -eq 0 ]; then lockfile="$CVSROOT/$subdir/Locks/$fname-$OARG1" if [ -e $lockfile ]; then \rm -f $lockfile fi # Potrebno je spremeniti dovoljenja datoteke za primer, # ko ni sprememb datoteke chmod a-w "$HOME/$subdir/$fname" print "\nKoncan $cmdname. $cmdname uspesen." #print "\nNasvet: $cmdname \n" fi ) ______________________________________________________________________ 23. supdate Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program supdate # Program za posodobitev datoteke iz CVS v nacinu beri/pisi # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` if [ $# -lt 1 ]; then print "\nUporaba: $cmdname " exit fi # Zaradi zascite presledkov v $1 uvedi dvojne narekovaje tmpaa="$1" # Preveri, ali datoteka ze obstaja.... if [ $# -gt 0 -a -f $tmpaa ]; then user_perms=" " group_perms=" " other_perms=" " user_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b3-3 ` group_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b6-6 ` other_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b9-9 ` if [ "$user_perms" = "w" -o "$group_perms" = "w" \ -o "$other_perms" = "w" ]; then while : do print "\n$cmdname bo naredil rezervno kopijo delovne datoteke" print "$tmpaa v $tmpaa.supdate_bak pred kakrsnimkoli spajanjem." print "Ali ste prepricani, da zelite spojiti spremebe iz" print -n "skladisca CVS v vaso delovno datoteko? [n]: " read ans if [ "$ans" = "d" -o "$ans" = "D" ]; then if [ -f $tmpaa.supdate_bak ]; then print "\nOpozorilo: datoteka $tmpaa.supdate_bak ze obstaja!!" print "Preglejte datoteko $tmpaa.supdate_bak in jo izbrisite." print "Zatem poskusite znova s $cmdname " print "Opuscam $cmdname ...." exit else cp $tmpaa $tmpaa.supdate_bak break fi elif [ "$ans" = "n" -o "$ans" = "N" -o "$ans" = "" -o "$ans" = " " ]; then exit fi done fi fi if [ -d $tmpaa ]; then print "\nPosodobitev imenika je onemogocena, ker cvs update" print "spaja spremebe iz skladisca v delovni imenik." print "Zato podajte ime datoteke za posodobitev - kot je prikazano spodaj: " print " Uporaba: $cmdname " exit # cvs update else cvs update $tmpaa fi print "\nKoncan $cmdname. $cmdname uspesen." print "\n\nRezervna kopija prvotne datoteke je v $tmpaa.supdate_bak ." print "\nPrvotna datoteka je tako SHRANJENA v $tmpaa.supdate_bak ." print "\n\n" #print "\nNasvet: $cmdname \n" ______________________________________________________________________ 24. sunlock Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program sunlock # Program za odklepanje datotek, za sprostitev ključavnice, ki jo naredi sedit # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` Usage() { print "\nUporaba: $cmdname [-r stevilka_revizije] " print " Izbira -r je neobvezna" print "Na primer - " print " $cmdname -r 1.1 foo.cpp" print " $cmdname foo.cpp " print " " } # Ukaz getopt v naslednji izdaji ne bo vec podprt. # Namesto njega uporabljam getopts. while getopts r: ii do case $ii in r) FLAG1=$ii; OARG1="$OPTARG";; ?) Usage; exit 2;; esac done shift ` expr $OPTIND - 1 ` if [ $# -lt 1 ]; then Usage exit fi homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi cur_dir=`pwd` #echo $cur_dir len=${#homedir} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir je : " $subdir tmpaa=`dirname $1` if [ "$tmpaa" = "." ]; then fname=$1 if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename $1` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi #echo "subdir je : " $subdir #echo "fname je : " $fname cvs_root=` echo $CVSROOT | cut -f1 -d' ' ` if [ "$cvs_root" = "" ]; then print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n" exit fi if [ ! -e "$CVSROOT/$subdir/$fname,v" ]; then print "\nNapaka: datoteke $fname ni v skladiscu CVS!!\n" exit fi # imenik CVS v vasem lokalnem imeniku je potreben pri vseh ukazih.. if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja" print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj s pomocjo sget poskusi izdelati CVS ( cd "$homedir" if [ "$subdir" = "." ]; then # ne uporabljaj pik, ki lahko zmedejo CVS cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi # Ugotovi stevilko zadnje revizije datoteke.... # Uporabi tmpfile ker argumentov ni mogoce nastavljati v podlupini tmpfile=$homedir/sunlock-lock.tmp \rm -f $tmpfile 2>/dev/null if [ "$FLAG1" = "" ]; then # Deluj znotraj podlupine - iz korenskega imenika ( cd $homedir if [ "$subdir" = "." ]; then # ne uporabljaj pik, ki lahko zmedejo CVS cvs log $fname | head -6 | grep head: | awk '{print $2}' > $tmpfile else cvs log "$subdir/$fname" | head -6 | grep head: | awk '{print $2}' > $tmpfile fi ) OARG1=`cat $tmpfile` \rm -f $tmpfile 2>/dev/null fi lockfile="$CVSROOT/$subdir/Locks/$fname-$OARG1" #echo lockfile is : $lockfile if [ ! -e $lockfile ]; then print "\nDatoteke $fname revizije $OARG1 NI zaklenil nihce." print " " exit fi ans="" while : do print "\n\n********************************************************" print "POZOR: $cmdname bo sprostil kljucavnico in omogocil ostalim" print " razvijalcem urejanje datoteke. Svetujemo, da" print " shranite spremembe z ukazom scommit." print "*********************************************************" print -n "\nAli ste prepricani, da zelite odkleniti datoteko ? [n]: " read ans if [ "$ans" = "" -o "$ans" = " " -o "$ans" = "n" -o "$ans" = "N" ]; then print "\nOpuscam $cmdname ...." exit fi if [ "$ans" = "d" -o "$ans" = "D" ]; then print "\n\n\n\n\n " print "POZOR: izgubite lahko vse spremebe, ki ste jih naredili v datoteki!!" print -n "Ali ste prepricani? Ali res zelite odkleniti datoteko ? [n]: " read ans if [ "$ans" = "d" -o "$ans" = "D" ]; then break elif [ "$ans" = "" -o "$ans" = " " -o "$ans" = "n" -o "$ans" = "N" ]; then exit else print "\n\nNapacen vnos. Poskusite znova..." sleep 1 fi else print "\n\nNapacen vnos. Poskusite znova..." sleep 1 fi done if [ -e $lockfile ]; then \rm -f $lockfile print "\nKoncan $cmdname ." else print "\nDatoteka $fname NI zaklenjena." print " " fi ______________________________________________________________________ 25. slist Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program slist # Program za izpis vseh datotek iz CVS, ki se urejajo # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' # Uporaba: # $ slist (Vse datoteke in podimeniki) # $ slist *.* (Vse datoteke) # $ slist * (Vse datoteke in podimeniki) # $ slist ab* (Vse datoteke, i se zacnejo z ab) homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nPozor: spremenljivka \$HOME ni nastavljena!!\n" exit fi cur_dir=`pwd` #echo $cur_dir len=${#homedir} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir je : " $subdir # Ce je datoteko ze kdo prevzel.... cvs_root=` echo $CVSROOT | cut -f1 -d' ' ` if [ "$cvs_root" = "" ]; then print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n" exit fi # Ce trenutnega imeniskega drevesa ni v korenskem imeniku CVS, koncaj if [ ! -d $CVSROOT/$subdir ]; then print "\nImenika $subdir ni bilo mogoce najti v $CVSROOT" exit fi #echo "st. parametrov : " $# #echo "Argument $ 1 je : " $1 #echo "vsi argumenti : " $@ if [ $# -eq 0 ]; then #tmpbb=` find * -prune -type d ` tmpbb=` find * -maxdepth 0 -type d ` elif [ $# -eq 1 ]; then if [ "$1" = "." ]; then #tmpbb=` find * -prune -type d ` tmpbb=` find * -maxdepth 0 -type d ` else if [ -d $1 -a ! -d $CVSROOT/$subdir/$1 ]; then print "\nImenika $subdir/$1 ni v $CVSROOT" exit fi tmpbb=$@ fi else tmpbb=$@ fi #echo "tmpbb je : " $tmpbb # Sedaj odstrani vsa imena imenikov, ki jih ni v korenskem imeniku CVS dirnames="" for ii in $tmpbb ; do if [ -d $CVSROOT/$subdir/$ii ]; then dirnames="$dirnames $ii " fi done #echo "dirnames je : " $dirnames if [ "$dirnames" != "" ]; then find $dirnames -type f | while read ii do # Prikazi samo tiste datoteke, ki so v sistemu CVS if [ -f "$CVSROOT/$subdir/$ii,v" ]; then #echo "ii is : " $ii ls -l $ii | grep ^\-rw fi done; fi # Ugotovi vse datoteke v trenutnem imeniku listfiles=`ls $tmpbb ` # Izbira prune ne deluje, zato uporabi maxdepth #find * -prune -type f | find * -maxdepth 0 -type f | while read ii do for jj in $listfiles ; do if [ "$jj" = "$ii" ]; then # Prikazi samo datoteke, ki so v sistemu CVS if [ -f "$CVSROOT/$subdir/$ii,v" ]; then #echo "ii je : " $ii ls -l $ii | grep ^\-rw fi fi done done; ______________________________________________________________________ 26. sinfo Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program sinfo # Program za pridobitev statusa datotek v delovnem imeniku # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` if [ $# -lt 1 ]; then print "\nUporaba: $cmdname [ime datoteke/imenika] " print "Na primer - " print " $cmdname foo.cpp" print " $cmdname nek_imenik " print " " exit fi homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi cur_dir=`pwd` #echo $cur_dir len=${#homedir} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir je : " $subdir tmpaa=`dirname $1` if [ "$tmpaa" = "." ]; then fname=$1 if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename $1` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi #echo "subdir je : " $subdir #echo "fname je : " $fname # V lokalnem imeniku se od vseh ukazov zahteva imenik CVS.. if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja" print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj s pomocjo sget poskusi narediti CVS v lokalnem imeniku ( cd "$homedir" if [ "$subdir" = "." ]; then # ne uporabljaj pik, ki lahko zmedejo CVS cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi # Naredi podlupino if [ -f $1 ]; then ( cd $homedir clear print "\nCVS status je : " cvs status "$subdir/$fname" ) elif [ -d $1 ]; then ( cd $homedir clear print "\nCVS status je : " tmpfile="$homedir/cvs_sinfo.tmp" rm -f $tmpfile echo " " >> $tmpfile echo " ****************************************" >> $tmpfile echo " Skupni status imenika" >> $tmpfile echo " ****************************************" >> $tmpfile cvs release "$subdir/$fname" 1>>$tmpfile 2>>$tmpfile << EOF N EOF echo "\n -------------------------------\n" >> $tmpfile aa=`cat $tmpfile | grep ^"M " | awk '{print $2}' ` for ii in $aa do jj="(cd $homedir; cvs status \"$subdir/$ii\" );" echo $jj | /bin/sh \ | grep -v Sticky | awk '{if (NF != 0) print $0}' \ 1>>$tmpfile 2>>$tmpfile done cat $tmpfile | grep -v ^? | grep -v "Are you sure you want to release" \ | less rm -f $tmpfile ) else print "\nArgument $1 ni datoteka ali imenik." exit fi ______________________________________________________________________ 27. slog Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program slog # Program za izpis zgodovine datoteke v CVS # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` if [ $# -lt 1 ]; then print "\nUporaba: $cmdname \n" exit fi # Preveri, ali datoteka ze obstaja.... if [ ! -f $1 ]; then print "\nNapaka: $1 NI datoteka. Opuscam $cmdname ......" exit fi homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi cur_dir=`pwd` #echo $cur_dir len=${#homedir} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir is : " $subdir tmpaa=`dirname $1` if [ "$tmpaa" = "." ]; then fname="$1" if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename $1` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi #echo "subdir je : " $subdir #echo "fname je : " $fname # V lokalnem imeniku se zahteva imenik CVS, da bodo ukazi lahko delovali.. if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja." print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj poskusi s sget narediti CVS v lokalnem imeniku ( cd "$homedir" if [ "$subdir" = "." ]; then # ne uporabljaj pik, ker lahko zmedejo sistem cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi # Deluj znotraj podlupine ( cd $homedir cvs log "$homedir/$subdir/$fname" | less ) print "\nKoncan $cmdname. $cmdname uspesen" #print "\nNasvet: $cmdname \n" ______________________________________________________________________ 28. sdif Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program sdif # Program za prikaz razlik med delovno datoteko in kopijo v CVS # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` Usage() { print "\nUporaba: $cmdname " print "$cmdname -r -r \n" exit } homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi FLAG1="" FLAG2="" OARG1="" OARG2="" # Ukaz getopt v naslednji izdaji ne bo vec podprt. # Namesto njega uporabljam getopts. while getopts r:r: ii do case $ii in r) if [ "$FLAG1" = "" ]; then FLAG1=$ii; OARG1="$OPTARG" else FLAG2=$ii; OARG2="$OPTARG" fi ;; ?) Usage; exit 2;; esac done shift ` expr $OPTIND - 1 ` if [ "$FLAG2" = "" ]; then FLAG2=r OARG2=HEAD fi cur_dir=`pwd` #echo $cur_dir len=${#homedir} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir je : " $subdir tmpaa=`dirname $1` if [ "$tmpaa" = "." ]; then fname="$1" if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename $1` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi #echo "subdir je : " $subdir #echo "fname je : " $fname # imenik CVS v lokalnem imeniku je nujno potreben, da bodo ukazi delovali.. if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja." print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj poskusi s sget narediti CVS v lokalnem imeniku ( cd "$homedir" if [ "$subdir" = "." ]; then # ne uporabi pik, ker lahko zmedejo CVS cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi # Deluj znotraj podlupine ( cd $homedir if [ "$FLAG1" = "" ]; then cvs diff -r HEAD "$homedir/$subdir/$fname" | less else cvs diff -$FLAG1 $OARG1 -$FLAG2 $OARG2 "$homedir/$subdir/$fname" | less fi ) ______________________________________________________________________ 29. sadd Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # test # CVS program sadd # Program za dodajanje datotek v CVS # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` if [ $# -lt 1 ]; then print "\nUporaba: $cmdname \n" exit fi onearg="$1" if [ ! -f "$onearg" -a ! -d "$onearg" ]; then print "\nArgument $onearg ni ime datoteke oz. imenika!" print "Uporaba: $cmdname \n" exit fi # Argument je ime imenika ..... homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi cvs_root=` echo $CVSROOT | cut -f1 -d' ' ` if [ "$cvs_root" = "" ]; then print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n" exit fi cur_dir=`pwd` len=${#homedir} len=$(($len + 2)) subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir je : " $subdir tmpaa=`dirname "$onearg" ` if [ "$tmpaa" = "." ]; then fname="$onearg" if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename "$onearg" ` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi #echo "subdir je : " $subdir #echo "fname je : " $fname # imenik CVS v lokalnem imeniku je nujen za delovanje ukazov.. if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja." print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj poskusi s sget narediti CVS v lokalnem imeniku ( cd "$homedir" if [ "$subdir" = "." ]; then # ne uporabljaj pik, ker lahko zmedejo CVS cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi # Preveri, ali datoteka obstaja .... if [ $# -eq 1 ]; then if [ -f "$onearg" ]; then cvs add "$onearg" exit fi elif [ $# -gt 1 ]; then print "\n\n\nDodajam vse datoteke v trenutnem imeniku v CVS." print "Imeniki se ne bodo dodali." print -n "Pritisnite Enter za nadaljevanje ali CTRL+C za prekinitev..." read ans for ii in $@ do if [ -f "$ii" ]; then cvs add "$ii" fi done; exit fi # Ko je $subdir enak ".", ste v korenskem imeniku if [ "$subdir" = "." ]; then # Na tej tocki je $onearg imenik in ne datoteka... if [ -d "$CVSROOT/$onearg" ]; then print "\nImenik $onearg ze obstaja v CVSROOT." exit else # Dodajate v korenski imenik $CVSROOT if [ "$2" = "" -o "$3" = "" ]; then print "\nUporaba: $cmdname " print "Na primer - " print " $cmdname foo_imenik V_1_0 R_1_0" exit else ( cd "$homedir/$subdir"; cvs import "$onearg" $2 $3 ) fi fi else # Ce trenutni imenik obstaja v CVS... if [ -d "$CVSROOT/$subdir/$onearg" ]; then print "\nImenik $onearg je ze v skladiscu CVS!" exit else ( if [ -d "$homedir/$subdir/$onearg/CVS" ]; then print "\nNapaka: imenik $homedir/$subdir/$onearg/CVS ze obstaja!!" print "\nKoncujem ...." exit fi # za ukaz import MORATE spremeniti ciljni imenik # in MORATE dolociti polno pot, ki se zacnr s $subdir cd "$homedir/$subdir/$onearg"; cvs import "$subdir/$onearg" Ver_1 Rel_1 ) fi fi ______________________________________________________________________ 30. sdelete Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program sdelete # Program za brisanje datotek iz CVS # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` if [ $# -lt 1 ]; then print "\nUporaba: $cmdname \n" exit fi homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi cur_dir=`pwd` len=${#homedir} len=$(($len + 2)) subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir is : " $subdir tmpaa=`dirname "$onearg" ` if [ "$tmpaa" = "." ]; then fname="$onearg" if [ "$subdir" = "" ]; then subdir=$tmpaa fi else fname=`basename "$onearg" ` if [ "$subdir" = "" ]; then subdir=$tmpaa else subdir="$subdir/$tmpaa" fi fi #echo "subdir je : " $subdir #echo "fname je : " $fname # imenik CVS v lokalnem imeniku je nujen za delovanje ukazov.. if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja." print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj poskusi s sget narediti CVS v lokalnem imeniku ( cd "$homedir" if [ "$subdir" = "." ]; then # nu uporabljaj pik, ker lahko zmedejo CVS cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi # Deluj znotraj podlupine ... ( cd $homedir # Check if file does not exist.... if [ ! -f "$subdir/$fname" ]; then # Poskusi dobiti datoteko iz CVS sget "$subdir/$fname" if [ ! -f "$subdir/$fname" ]; then print "\nNapaka: $subdir/$fname NE obstaja v skladiscu CVS." print "\nKoncujem $cmdname ......" exit fi fi bkextn=cvs_sdelete_safety_backup \mv -f "$subdir/$fname" "$subdir/$fname.$bkextn" cvs remove "$subdir/$fname" print "\nUkaz sdelete odstrani datoteko iz skladisca CVS" print "in jo arhivira v imenik CVS Attic. V primeru,da v prihodnosti" print "potrebujete to datoteko, vzpostavite stik z administratorjem CVS." print " " print "\nKoncan $cmdname. $cmdname uspesen" print "Izvedite scommit na imeniku $homedir/$subdir/$fname , da" print "bo ta sprememba stalna." \mv -f "$subdir/$fname.$bkextn" "$subdir/$fname" ) ______________________________________________________________________ 31. sfreeze Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. ______________________________________________________________________ #!/bin/ksh # CVS program sfreeze # Program za zamrznitev in odrez izdaje izvornega drevesa iz CVS # Vsako ime datoteke se sestoji iz treh delov: domačega imenika, podimenika # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname. # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname. # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname) # pomembno vlogo. Na primer, vzorčne vrednosti so lahko: # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot # in fname=foo.cpp # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk # ohranili presledki, npr. "$HOME/$subdir", če je $subdir enak 'some foo.cpp' cmdname=`basename $0` Usage() { print "\nUporaba: $cmdname simbolicna_oznaka " print "\nNa primer: - " print " cd \$HOME" print " $cmdname REVIZIJA_1 moj_imenik_z_izvorno_kodo_projekta" print "Za prikaz seznama revizij izvedite -" print "slog , zapomnite si simbolicno ime in izvedite -" print "cvs history -T" print "\nDa naredite stranski poganjek iz glavnega debla, uporabite" print "izbiri -b in -r, ki naredita oznako kot oznako veje. To je" print "koristno za izdelavo popravkov prej izdane programske opreme" print "Na primer :- " print " cd \$HOME" print " cvs rtag -b -r REVIZIJA_1 REVIZIJA_1_1 moj_imenik_z_izvorno_kodo_projekta" print " " # print "\nInformacija o oznaki se nahaja v \$CVSROOT/CVSROOT/taginfo,v" # print "Lahko izvedete - cd $HOME; sget CVSROOT" # print "da vidite to datoteko" exit } # Ukaz getopt ne bo vec podprt v naslednji izdaji. # Namesto njega uporabljam getopts. #while getopts r: ii #do # case $ii in # r) FLAG1=$ii; OARG1="$OPTARG";; # ?) Usage; exit 2;; # esac #done #shift ` expr $OPTIND - 1 ` #echo FLAG1 = $FLAG1 , OARG1 = $OARG1 if [ $# -lt 2 ]; then Usage fi if [ ! -d $2 ]; then print "\nNapaka: drugi argument $2 ni imenik!" print " Opuscam $cmdname...." print " " exit fi homedir=` echo $HOME | cut -f1 -d' ' ` if [ "$homedir" = "" ]; then print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n" exit fi cur_dir=`pwd` len=${#homedir} len=$(($len + 2)) subdir=` echo $cur_dir | cut -b $len-2000 ` #echo "subdir is : " $subdir # imenik CVS v lokalnem imeniku je nujen za delovanje ukazov.. if [ ! -d "$homedir/$subdir/CVS" ]; then #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) ` tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) ` tmpbb=`basename $tmpaa | cut -d',' -f1 ` if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then print "\nImenik $homedir/$subdir/CVS ne obstaja." print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -" print " cd $homedir/`dirname $subdir` " print " sget `basename $subdir` " exit else # Sedaj poskusi s sget narediti CVS v lokalnem imeniku ( cd "$homedir" if [ "$subdir" = "." ]; then # ne uporabljaj pik, ker lahko zmedejo CVS cvs -r checkout -A $tmpbb else cvs -r checkout -A "$subdir/$tmpbb" fi ) fi fi if [ "$cur_dir" != "$homedir" ]; then print "\nNe nahajate se v domacem imeniku $homedir!!" print "Izvesti morate ukaz sfreeze" print "iz domacega imenika $homedir." exit fi # cvs rtag symbolic_tag cvs rtag $1 $2 print "\nKoncan $cmdname. $cmdname uspesen." ______________________________________________________________________