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 <http://www.LinuxDoc.org/HOWTO/mini/RCS.html> 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 <http://www.cyclic.com> in <http://www.loria.fr/~molli/cvs-index.html>. 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 <http://www.emacs.org>. 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 <http://www.cvshome.org/docs/inforeserve.html>. Popravek Erica Griswolda o rezerviranih prevzemih najdete na naslovu <http://www.cvshome.org/dev/patches/editf>. · ©ibko zaklepanje s pomoèjo znaèilnosti ukaza 'cvs watch'. Oglejte si tudi "cvs edit" glede opozorila ( <http://www.cvshome.org/dev/text2/res2>), è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] <datoteka/imenik ime> Iz CVS dobite datoteko ali celoten imenik v naèinu "samo-za-branje" (READ ONLY). Kliknite na ``''. 2. sedit [-r stevilka_revizije] <ime_datoteke> 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] <ime_datoteke> Udejanite spremembe v datoteko ali ves imenik. Odlo¾ite spremembe v CVS. Kliknite na ``''. 4. supdate <ime_datoteke/imenika> Posodobite datoteko ali ves imenik tako, da dobite najnove¹e datoteke iz CVS. Kliknite na ``''. 5. sunlock [-r stevilka_revizije] <ime_datoteke> 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 <ime_datoteke/imenika> Informacije o spremembah/revizijah datoteke. Kliknite na ``''. 8. slog <ime_datoteke> Zgodovina sprememb/revizij datoteke iz CVS. Kliknite na ``''. 9. sdif <ime_datoteke> sdif -r revizija1 -r revizija2 <ime datoteke> 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 <ime_datoteke> Doda novo datoteko v skladi¹èe CVS. Kliknite na ``''. 11. sdelete <ime_datoteke> Brisanje datoteke iz skladi¹èa CVS. Kliknite na ``''. 12. sfreeze <ime_revizije> <ime_imenika> 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 <http://www.cyclic.com> 9. Obi¹èite <http://www.loria.fr/~molli/cvs-index.html> Tkcvs ( <http://www.tkcvs.org>) 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 <http://www.wincvs.org> in stran Cyclicsite <http://www.cvshome.org/cyclic/cvs/soft-maccvs.html>). WinCVS se lahko uporablja skupaj s Sambo - <http://www.samba.org> Potrebni ukazi so: · cvs checkout <ime_datoteke> · cvs update <ime_datoteke> · cvs add <datoteka, ..> · cvs remove <datoteka, ..> · cvs commit <datoteka> · cvs status <ime_datoteke> · cvs log <ime_datoteke> · cvs diff -r1.4 -r1.5 <ime_datoteke> 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 <http://www.cvshome.org/docs>. Uradni Cederquistov priroènik za CVS se nahaja na naslovu <http://www.cvshome.org/docs/manual/cvs.html>. Spisek pogosto zastavljanih vpra¹anj za CVS boste na¹li na naslovu <http://www.cs.utah.edu/dept/old/texinfo/cvs/FAQ.txt>. 7.3. Uèenje CVS · <http://rpmfind.net/tools/CVS/training/cvstrain.html> · <http://www.loria.fr/~molli/cvs/cvs-tut/cvs_tutorial_toc.html> · <http://atlas.web.cern.ch/Atlas/GROUPS/SOFTWARE/OO/tools/srt/> · <http://durak.org/cvswebsites/> · <http://www-users.informatik.rwth- aachen.de/~wge/tools/cvs/cvsclient/cvsclient_toc.html> · <http://www-users.informatik.rwth-aachen.de/~wge/tools/cvs.html> Splo¹ni pripomoèki za CVS, ki so jih napisali ostali avtorji: · Knjiga "Open Source Development with CVS" Karla Fogela na naslovu <http://cvsbook.red-bean.com> ima Poglavje Third-party-tools v uradnem priroèniku <http://cvsbook.red-bean.com/cvsbook.html#Third- Party_Tools> in zrcalne strani: Zevils <http://www.zevils.com/doc/cvsbook/cvsbook_8.html> · <http://rcs.ee.washington.edu/spp/Projects/Manastash/Links/cvsbook_toc.html> 8. Grafièni uporabni¹ki vmesniki Na voljo so naslednji grafièni uporabni¹ki vmesniki za CVS: · CVS home.org: <http://www.cvshome.org/dev/addons.html> · CVS Web for windows: <http://www.devguy.com/fp/cfgmgmt/cvs/cvs_admin_nt.htm#CVSWEBIIS> in <http://stud.fh-heilbronn.de/~zeller/cgi/cvsweb.cgi> · TkCVS ( <http://www.tkcvs.org>) je grafièni vmesnik za CVS napisan v jeziku Tcl/Tk. Druga lokacija: cyclicsite <http://www.cvshome.org/cyclic/tkcvs/index.html> · gCVS: prenosljiv grafièni vmesnik za netehniène uporabnike CVS: <http://www.arachne.org/software/gcvs> · jCVS je odjemalec za CVS, v celoti napisan v javi: <http://www.jcvs.org> in cyclicsite <http://www.cvshome.org/cyclic/jcvs/index.html> · WinCVS: <http://www.cvshome.org/cyclic/cvs/soft-maccvs.html> in cyclicsite <http://www.cvshome.org/cyclic/cvs/soft-maccvs.html> · Component soft Win CVS: <http://www.componentsoftware.com/cvs> · JA-SIG UPortal CVS <http://www.mis3.udel.edu/~jlaker/development> · <http://ppprs1.phy.tu-dresden.de/~trogisch/lincvs/lincvsen.html> · <http://www.loria.fr/~molli/cvs/doc/cvs_toc.html> Zelo vam priporoèamo, da uporabljate Sambo (samba*.rpm na cdromu) <http://www.samba.org> 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) <http://www.samba.org> 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 <http://www.aldev.8m.com>, zrcalni stre¾niki tudi na <http://aldev0.webjump.com>, angelfire <http://www.angelfire.com/country/aldev0>, geocities <http://www.geocities.com/alavoor/index.html>, virtualave <http://aldev0.virtualave.net>, 50megs <http://aldev0.50megs.com>, theglobe <http://members.theglobe.com/aldev1/index.html>, NBCi <http://members.nbci.com/alavoor>, Terrashare <http://aldev.terrashare.com>, Fortunecity <http://members.fortunecity.com/aldev>, Freewebsites <http://aldev.freewebsites.com>, Tripod <http://members.tripod.lycos.com/aldev>, Spree <http://members.spree.com/technology/aldev>, Escalix <http://www.escalix.com/freepage/aldev>, Httpcity <http://www.httpcity.com/aldev/index.html>, Freeservers <http://aldev.freeservers.com>. · 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 <http://www.uk.research.att.com/vnc>. 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 <http://www.microimages.com> in kliknite na "X-Server (MI/X) for Windows". · Humming bird eXceed (14 MB): <http://www.hummingbird.com> · Starnet (5.2 MB): <http://www.starnet.com> Na voljo je veè kot 2 ducata dobaviteljev stre¾nikov X za Windows: · X-win pro (6.34 MB): <http://www.labf.com> · X-WinPro: <http://lab-pro.com> · X-Link: <http://www.xlink.com/x.htm> · Xoftware: <http://www.age.com> Stre¾niki X z univerz: · Seznami univerz: <http://www.et.byu.edu/support/pc/xterm.html> · Na disketi temeljeè stre¾nik X: <http://mirriwinni.cse.rmit.edu.au/~brad/co338/sem1/floppy.html> 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: <http://www.tucows.com> 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 <http://www.samba.org>. 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: <http://cvshome.org/dev/codelinux.html>. · Obi¹èite <http://www.cvshome.org> in na naslovu mailing list <http://cvshome.org/communication.html> zastavite vpra¹anja o varnosti. 11. Veèuporabni¹ko skladi¹èe CVS z dostopom z drugih raèunalnikov Cederqvistov priroènik na naslovu <http://cvshome.org/docs/manual/cvs_2.html#SEC30> 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 <http://rpmfind.net> in kot iskalni pojem vnesete "ssh". Lahko tudi obi¹èete <http://www.redhat.com/apps/download> in spet kot iskalni pojem vnesite "ssh". Prenesite in namestite ssh RPM in zatem nastavite CVS za uporabo z njim. Oglejte si tudi <http://www.ssh.org>. 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: <http://www.mis3.udel.edu/~jlaker/development>. 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 <ime imenika> # 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)? <d/n> [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 <http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html> · 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 <ime procesa> 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# ./<ime procesa> 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 <http://www.gnu.org/software/gnats/gnats.html> in <http://dcl.sourceforge.net>. Komercialni sistem za sporoèanje problemov si lahko ogledate na <http://www.stonekeep.com>, 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: <http://www.iac.honeywell.com/Pub/Tech/CM/CMFAQ.html> · Linux version control and configuration management tools <http://linas.org/linux/cmvc.html> · Configuration Management systems <http://www.cmtoday.com/yp/commercial.html> · Configuration Management Tools <http://www.iac.honeywell.com/Pub/Tech/CM/CMTools.html> · DevGuy CVS config mgmt <http://devguy.com/fp/cfgmgmt/cvs> · Yahoo category site <http://dir.yahoo.com/Computers_and_Internet/software/programming_tools/software_engineering/configuration_management/cvs___concurrent_versions_system> · Free config mgmt tool <http://www.canb.auug.org.au/~millerp/aegis/aegis.html> · Free CM tools <http://www.loria.fr/cgi-bin/molli/cm/wilma/fcmt> · Rational ClearCase tool <http://www.rational.com/products/clearcase/prodinfo.jsp> 16. Podobne strani Podobne strani lahko najdete na: · Linux goodies <http://www.aldev.8m.com> in zrcalnih straneh: <http://aldev0.webjump.com>, angelfire <http://www.angelfire.com/country/aldev0>, geocities <http://www.geocities.com/alavoor/index.html>, virtualave <http://aldev0.virtualave.net>, 50megs <http://aldev0.50megs.com>, theglobe <http://members.theglobe.com/aldev1/index.html>, NBCi <http://members.nbci.com/alavoor>, Terrashare <http://aldev.terrashare.com>, Fortunecity <http://members.fortunecity.com/aldev>, Freewebsites <http://aldev.freewebsites.com>, Tripod <http://members.tripod.lycos.com/aldev>, Spree <http://members.spree.com/technology/aldev>, Escalix <http://www.escalix.com/freepage/aldev>, Httpcity <http://www.httpcity.com/aldev/index.html>, Freeservers <http://aldev.freeservers.com>. · CVS Bubbles <http://www.loria.fr/~molli/cvs-index.html> · CSSC (SCCS like system) <http://cssc.sourceforge.net> in zrcalni strani <ftp://alpha.gnu.org/pub/gnu/CSSC> · SCCS za Linux <http://www.bitmover.com/bitkeeper> 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 <http://www.faqs.org/faqs/unix-faq/faq/part7>. 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: · <http://www.linuxdoc.org>, 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: · <http://www.caldera.com/LDP/HOWTO> · <http://www.linux.ucla.edu/LDP> · <http://www.cc.gatech.edu/linux/LDP> · <http://www.redhat.com/mirrors/LDP> · Ostale zrcalne strani v va¹i bli¾ini lahko najdete na <http://www.linuxdoc.org/mirrors.html>, 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: <ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO/other-formats/> in <http://www.linuxdoc.org/docs.html#howto>. · Dokument zapisan v golem tekstu najdete na: <ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO> in <http://www.linuxdoc.org/docs.html#howto>. · Celoten dokument v eni datoteki HTML se nahaja na: <http://www.linuxdoc.org/docs.html#howto>. 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: <ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO> in <http://www.linuxdoc.org/docs.html#howto> 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: <http://www.sgmltools.org>. 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 <http://www.adobe.com>. 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 <http://www.dcs.gla.ac.uk/~rrt/docbook.html> ali s strani Al Dev site <http://www.aldev.8m.com/cppsrc.html> · Poberite skript v Perlu cleanup_ld2db.pl s strani Al Dev site <http://www.aldev.8m.com/cppsrc.html> 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 <http://javadocs.planetmir ror.com/htmltohlpe.html>. 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 <http://www.cs.wisc.edu/~ghost>. 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] <ime datoteke/imenika> " 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 <ime datoteke/imenika> \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] <ime_datoteke>" # 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] <ime_datoteke>" 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 <ime_datoteke> \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] <ime_datoteke>" 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 <ime datoteke/imenika>\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 <ime_datoteke>" 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? <d/n> [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 <ime_datoteke>" 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 <ime datoteke/imenika>\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] <ime_datoteke>" 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 <d/n>? [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 <d/n>? [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 <ime_datoteke> \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 <ime_datoteke>\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 <ime_datoteke> " print "$cmdname -r<revizija1> -r<revizija2> <ime_datoteke> \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 <ime datoteke/imenika> \n" exit fi onearg="$1" if [ ! -f "$onearg" -a ! -d "$onearg" ]; then print "\nArgument $onearg ni ime datoteke oz. imenika!" print "Uporaba: $cmdname <ime datoteke/imenika> \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 <imenik> <oznaka proizvajalca> <oznaka izdaje>" 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 <ime_datoteke> \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 <ime imenika> " print "\nNa primer: - " print " cd \$HOME" print " $cmdname REVIZIJA_1 moj_imenik_z_izvorno_kodo_projekta" print "Za prikaz seznama revizij izvedite -" print "slog <ime_datoteke>, 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 <directory name> cvs rtag $1 $2 print "\nKoncan $cmdname. $cmdname uspesen." ______________________________________________________________________