CVS-RCS-HOW-TO za Linux (sistem za kontrolo izvorne kode) <!-- chapt change CVS-RCS HOW-TO Concurrent Version Control System and Revision Control System (Source Code Management Tools) --> <author>Al Dev (Alavoor Vasudevan) <htmlurl url="mailto:alavoor@yahoo.com" name="alavoor@yahoo.com">; prevedel Jernej Kovačič <htmlurl url="mailto:jkovacic@email.si" name="jkovacic@email.si">; <date>v21.4, 25. avgust 2001, prevod 27. september 2001 <abstract> Ta dokument je "praktični vodnik" do hitre postavitve sistema za nadzor izvorne kode CVS/RCS. Dokument vsebuje tudi nekaj lupinskih skriptov, ki poenostavijo nekaj najpogosteje uporabljanih funkcij CVS. Ti skripti omogočajo lahek vmesnik do CVS. Na voljo je tudi nekaj skriptov, 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. </abstract> <!-- Kazalo --> <toc> <!-- Zacetek dokumenta --> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt>Uvod --> <sect>Uvod <p> 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 <it><bf>varovanje</bf></it> izvorne kode z uporabo sistemov za kontrolo izvorne kode, kot sta npr. CVS in RCS. <p> 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. <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Kateri je zame? CVS ali RCS? --> <sect> Kateri je zame? CVS ali RCS? <p> CVS je pravzaprav nadgrajen RCS. CVS je precej zmogljivejše orodje in lahko nadzoruje celotno drevo izvorne kode. Uporaba CVS je <it><bf>zelo</bf></it> 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 <ref id="Shell Scripts" name="lupinskih skriptih">. Prednosti CVS: <itemize> <item> CVS je decentraliziran, uporabnik prevzema datoteke oz. imenike iz skladišča in ima svoje ločeno stabilno drevo imenikov izvorne kode. <item> CVS lahko "označuje" izdaje celotnega projekta drevesa izvorne kode. <item> CVS omogoča hkratno urejanje datotek. <item> 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. </itemize> Slabosti CVS: <itemize> <item> Potrebnega je nekoliko več administriranja kot pri RCS. <item> Zelo izpopolnjen in kompleksen sistem. Je "zadnji krik" tehnologije. CVS je zelo napreden in zmogljiv sistem, ki so ga razvijali zelo dolgo (več let!!). <item> Ima veliko število ukazov in ukaznih možnosti, zato se ga začetniki težje privadijo. Lupinski skripti v poglavju o <ref id="Shell Scripts" name="lupinskih skriptih"> lahko olajšajo uporabo. </itemize> Prednosti RCS: <itemize> <item> RCS je zelo preprost za nastavljanje, manj dela je z administriranjem. <item> RCS se uporablja v centraliziranih področjih, kjer vsak dela. <item> RCS je koristen za preproste sisteme. <item> Zelo zmogljivo zaklepanje datotek - hkratno delo je onemogočeno. </itemize> Slabosti RCS: <itemize> <item> 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'. <item> Ne more označevati izdaj celotnega programskega projekta. </itemize> 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 <ref id="Shell Scripts" name="lupinskih skriptih">. Za navodila o uporabi RCS si oglejte RCS mini-howto na CDju z Linuxom: <CODE> cd /mnt/cdrom/Redhat/RPMS ls -l howto-6.0-*.noarch.rpm rpm -qpl howto-6* | grep -i rcs </CODE> ali obiščite <url url="http://www.LinuxDoc.org/HOWTO/mini/RCS.html"> Oglejte si tudi poglavje o <ref id="rcs_scripts" name="lupinskih skriptih za RCS">. <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Postavljanje CVS <label id="Setting up CVS"> --> <sect> Postavljanje CVS <label id="Setting up CVS"> <p> Najprej morate namestiti paket CVS. Če imate Redhat Linux, izvedite <CODE> 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 </CODE> 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 <url url="http://www.cyclic.com"> in <url url="http://www.loria.fr/~molli/cvs-index.html">. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Spremenljivke okolja <label id="CVS-Env"> <p> 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. <CODE> export EDITOR=/bin/vi export CVSROOT=/home/cvsroot export CVSREAD=yes </CODE> 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'. <CODE> 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 </CODE> <bf>POGOSTA NAPAKA:</bf> ko izvedete 'cvs checkout', lahko dobite opozorilo, da je modul neznan. Pogosta napaka je, da ob 'cvs import' ne zamenjate imenika. <bf><it>OBVEZNO morate</it></bf> iti v imenik z izvorno kodo in šele potem izvedite 'cvs import'. Na primer: <code> bash$ cd $HOME/foobardir bash$ cvs import foobardir Vendor1_0 Rev1_0 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Selitev od RCS k CVS <label id="RCS2CVS"> <p> 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). <bf>Opomba: <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux Contrib.</it></bf> <CODE> #!/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 </CODE> Sedaj smo preselili projekt iz RCS v CVS kot 'project'. Pričnete lahko uporabljati ukaze CVS na modulu 'project'. <sect> Uvod v ukaze CVS<label id="Intro_CVS"> <p> 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: <bf>checkout</bf>, <bf>update</bf>, <bf>add</bf>, <bf>remove</bf>, <bf>commit</bf> in <bf>diff</bf>. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> checkout<label id="checkout"> <p> <bf>cvs checkout moduli...</bf> 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. <code> 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) </code> <p> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1>update<label id="update"> <p> <bf>cvs update</bf> 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. <code> 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) </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1>add<label id="add"> <p> <bf>cvs add datoteka...</bf> 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 'cvs commit'. Opomba: za prenos novih datotek v vaše zasebno skladišče uporabite 'cvs import'. 'cvs add' se uporablja samo za nove datoteke v že prevzetem imeniku. <code> 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) </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1>remove<label id="remove"> <p> <bf>cvs remove datoteka...</bf> 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'. <code> 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) </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1>commit<label id="commit"> <p> <bf>cvs commit datoteka...</bf> Ta ukaz uporabite, kadar želite vnesti spremembe v skladišče in jih ''objaviti'' tudi za ostale razvijalce. <code> 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) </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1>diff<label id="diff"> <p> <bf>cvs diff datoteka...</bf> 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. <code> 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) </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Urejevalnik Emacs <label id="Emacs"> <p> Emacs je zmogljiv urejevalnik in podpira CVS/RCS - še posebej za spajanje in primerjavo revizij. Emacsova glavna domača stran je <url url="http://www.emacs.org">. <sect> Močno in šibko zaklepanje ali način brez zaklepanja<label id="locking"> <p> CVS je zmogljiv in zelo nastavljiv sistem. CVS podpira: <itemize> <item> Močno zaklepanje z "rezerviranimi prevzemi" s pomočjo ukaza <bf>cvs admin -l</bf> ali <ref name="lupinskega skripta" id="Shell Scripts">. Preberite tudi spis <url name="Reserved checkouts" url="http://www.cvshome.org/docs/inforeserve.html">. Popravek Erica Griswolda o rezerviranih prevzemih najdete na naslovu <url url="http://www.cvshome.org/dev/patches/editf">. <p> <item> Šibko zaklepanje s pomočjo značilnosti ukaza 'cvs watch'. Oglejte si tudi "cvs edit" glede opozorila (<url url="http://www.cvshome.org/dev/text2/res2">), če kdo že ureja datoteko. <p> <item> Brez zaklepanja - privzeto je dovoljeno, da več razvijalcev hkrati ureja datoteke. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Lupinski skripti <label id="Shell Scripts"> --> <sect> Lupinski skripti <label id="Shell Scripts"> <p> Sledijo skripti za poenostavitev uporabe osnovnih ukazov CVS. Ti skripti vam dajo <bf>prvi vpogled</bf> 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. <bf> OPOMBA: </bf> <it>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. </it> <bf> NASVET: </bf> <it>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 </it> Skopirajte te skripte v imenik /usr/local/bin, ki naj bo v uporabnikovi spremenljivki okolja PATH. <enum> <item> <bf>sget</bf> [-r stevilka_revizije] <datoteka/imenik ime> Iz CVS dobite datoteko ali celoten imenik v načinu "samo-za-branje" (READ ONLY). Kliknite na <ref id="sget">. <item> <bf>sedit</bf> [-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 <ref id="sedit">. <item> <bf>scommit</bf> [-r stevilka_revizije] <ime_datoteke> Udejanite spremembe v datoteko ali ves imenik. Odložite spremembe v CVS. Kliknite na <ref id="scommit">. <item> <bf>supdate</bf> <ime_datoteke/imenika> Posodobite datoteko ali ves imenik tako, da dobite najnoveše datoteke iz CVS. Kliknite na <ref id="supdate">. <item> <bf>sunlock</bf> [-r stevilka_revizije] <ime_datoteke> Odklepanje datoteke, dobljene s sedit. Kliknite na <ref id="sunlock">. <item> <bf>slist</bf> Ogled datotek, ki jih trenutno urejate. Izvrši ukaz 'ls -l | grep | ...'. Kliknite na <ref id="slist">. 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. <item> <bf>sinfo</bf> <ime_datoteke/imenika> Informacije o spremembah/revizijah datoteke. Kliknite na <ref id="sinfo">. <item> <bf>slog</bf> <ime_datoteke> Zgodovina sprememb/revizij datoteke iz CVS. Kliknite na <ref id="slog">. <item> <bf>sdif</bf> <ime_datoteke> <p><bf>sdif</bf> -r revizija1 -r revizija2 <ime datoteke> Razlike med dvema revizijama datoteke v CVS. Kliknite na <ref id="sdif">. OPOMBA: ukaz sdif ima samo en 'f', ker že obstaja drug Unixov ukaz 'sdiff' <item> <bf>sadd</bf> <ime_datoteke> Doda novo datoteko v skladišče CVS. Kliknite na <ref id="sadd">. <item> <bf>sdelete</bf> <ime_datoteke> Brisanje datoteke iz skladišča CVS. Kliknite na <ref id="sdelete">. <item> <bf>sfreeze</bf> <ime_revizije> <ime_imenika> Zamrznitev kode, izdaja celotnega izvornega drevesa. Kliknite na <ref id="sfreeze">. <p> Na primer: <code> cd $HOME; sfreeze REVIZIJA_1_0 izvdrevo </code> zamrzne kodo z oznako REVIZIJA_1_0, da lahko pozneje prevzamete celotno drevo z uporabo imena revizije. </enum> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Dokumentacija CVS <label id="CVS Documentation"> --> <sect> Dokumentacija CVS <label id="CVS Documentation"> <p> V Unixovi ukazni vrstici odtipkajte: <enum> <item> cvs --help <item> cvs --help-options <item> cvs --help-commands <item> cvs -H checkout <item> cvs -H commit <item> man cvs <item> man tkcvs <item> Obiščite <url url="http://www.cyclic.com"> <item> Obiščite <url url="http://www.loria.fr/~molli/cvs-index.html"> </enum> Tkcvs (<url url="http://www.tkcvs.org">) je Tcl/Tk grafični vmesnik do CVS. Vsebuje tudi sprotno pomoč. <itemize> <item> cd $HOME/src/foo.cpp <item> tkcvs <item> Kliknite na foo.cpp <item> Kliknite na ikono 'Revision Log' ki se nahaja takoj za ikono 'spectacle' <item> 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!! <item> Kliknite na gumb "Next" za sprehod čez še več razlik. Kliknite na "Center" za centriranje besedila. </itemize> Obstaja tudi CVS odjemalec za Windows 95, ki se imenuje WinCVS (oglejte si <url url="http://www.wincvs.org"> in stran <url url="http://www.cvshome.org/cyclic/cvs/soft-maccvs.html" name="Cyclicsite">). WinCVS se lahko uporablja skupaj s Sambo - <url url="http://www.samba.org"> Potrebni ukazi so: <itemize> <item> cvs checkout <ime_datoteke> <item> cvs update <ime_datoteke> <item> cvs add <datoteka, ..> <item> cvs remove <datoteka, ..> <item> cvs commit <datoteka> <item> cvs status <ime_datoteke> <item> cvs log <ime_datoteke> <item> cvs diff -r1.4 -r1.5 <ime_datoteke> To poda razlike med različicama datoteke 1.4 and 1.5. </itemize> <sect1> Priložena dokumentacija<label id="onlinedocs"> <p> Na sistemih z Linuxom lahko najdete dokumentacijo za CVS v zapisu postscript v imeniku <bf>/usr/doc/cvs*/*.ps</bf>. Na voljo je tudi seznam odgovorov na pogosto zastavljana vprašanja in ostale koristne informacije. <code> bash# cd /usr/doc/cvs* bash# gv cvs.ps </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Dokumentacija organizacije "CVS Organisation" <label id="cederquist"> <p> Dokumentacijo organizacije "CVS Organisation" boste našli na naslovu <url url="http://www.cvshome.org/docs">. Uradni Cederquistov priročnik za CVS se nahaja na naslovu <url url="http://www.cvshome.org/docs/manual/cvs.html">. Spisek pogosto zastavljanih vprašanj za CVS boste našli na naslovu <url url="http://www.cs.utah.edu/dept/old/texinfo/cvs/FAQ.txt">. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Učenje CVS <label id="training"> <p> <itemize> <item> <url url="http://rpmfind.net/tools/CVS/training/cvstrain.html"> <item> <url url="http://www.loria.fr/~molli/cvs/cvs-tut/cvs_tutorial_toc.html"> <item> <url url="http://atlas.web.cern.ch/Atlas/GROUPS/SOFTWARE/OO/tools/srt/"> <item> <url url="http://durak.org/cvswebsites/"> <item> <url url="http://www-users.informatik.rwth-aachen.de/~wge/tools/cvs/cvsclient/cvsclient_toc.html"> <item> <url url="http://www-users.informatik.rwth-aachen.de/~wge/tools/cvs.html"> <p> Splošni pripomočki za CVS, ki so jih napisali ostali avtorji: <item> Knjiga "Open Source Development with CVS" Karla Fogela na naslovu <url url="http://cvsbook.red-bean.com"> ima <url name="Poglavje Third-party-tools v uradnem priročniku" url="http://cvsbook.red-bean.com/cvsbook.html#Third-Party_Tools"> in zrcalne strani: <url name="Zevils" url="http://www.zevils.com/doc/cvsbook/cvsbook_8.html"> <item> <url url="http://rcs.ee.washington.edu/spp/Projects/Manastash/Links/cvsbook_toc.html"> </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Grafični uporabniški vmesniki <label id="frontend"> <p> Na voljo so naslednji grafični uporabniški vmesniki za CVS: <itemize> <item> CVS home.org: <url url="http://www.cvshome.org/dev/addons.html"> <item> CVS Web for windows: <url url="http://www.devguy.com/fp/cfgmgmt/cvs/cvs_admin_nt.htm#CVSWEBIIS"> in <url url="http://stud.fh-heilbronn.de/~zeller/cgi/cvsweb.cgi"> <item> TkCVS (<url url="http://www.tkcvs.org">) je grafični vmesnik za CVS napisan v jeziku Tcl/Tk. Druga lokacija: <url name="cyclicsite" url="http://www.cvshome.org/cyclic/tkcvs/index.html"> <item> gCVS: prenosljiv grafični vmesnik za netehnične uporabnike CVS: <url url="http://www.arachne.org/software/gcvs"> <item> jCVS je odjemalec za CVS, v celoti napisan v javi: <url url="http://www.jcvs.org"> in <url name="cyclicsite" url="http://www.cvshome.org/cyclic/jcvs/index.html"> <item> WinCVS: <url url="http://www.cvshome.org/cyclic/cvs/soft-maccvs.html"> in <url name="cyclicsite" url="http://www.cvshome.org/cyclic/cvs/soft-maccvs.html"> <item> Component soft Win CVS: <url url="http://www.componentsoftware.com/cvs"> <item> JA-SIG UPortal CVS <url url="http://www.mis3.udel.edu/~jlaker/development"> <item> <url url="http://ppprs1.phy.tu-dresden.de/~trogisch/lincvs/lincvsen.html"> <item> <url url="http://www.loria.fr/~molli/cvs/doc/cvs_toc.html"> </itemize> <bf>Zelo vam priporočamo</bf>, da uporabljate <url name="Sambo (samba*.rpm na cdromu)" url="http://www.samba.org"> in <ref id="win95" name="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 <ref id="win95" name="strežnikih X">. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> CVS za MS Windows 95/98/NT/2000 <label id="win95"> <p> <bf>ZELO vam priporočamo</bf> uporabo <url name="Sambe (samba*.rpm na cdromu)" url="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 <bf>datotečni strežnik</bf>. 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: <itemize> <item> En sam na Linuxu postavljen datotečni strežnik (CVS strežnik) lahko streže veliko odjemalcem na sistemih MS Windows. <item> Datotečni (CVS) strežnik pod Linuxom je zelo robusten, varen in zanesljiv. <item> Potrebna je samo ena baterija UPS (za neprekinjeno napajanje) za strežnik z Linuxom. <item> S pomočjo Sambe bodo Linuxovi imeniki videti kot imeniki na sistemu MS Windows. <item> Linuxov datotečni (CVS) strežnik podpira centralizirano izdelavo varnostnih kopij s pomočjo orodij kot <url name="Arkeia, Bru" url="http://www.aldev.8m.com">, zrcalni strežniki tudi na <url url="http://aldev0.webjump.com">, <url name="angelfire" url="http://www.angelfire.com/country/aldev0">, <url name="geocities" url="http://www.geocities.com/alavoor/index.html">, <url name="virtualave" url="http://aldev0.virtualave.net">, <url name="50megs" url="http://aldev0.50megs.com">, <url name="theglobe" url="http://members.theglobe.com/aldev1/index.html">, <url name="NBCi" url="http://members.nbci.com/alavoor">, <url name="Terrashare" url="http://aldev.terrashare.com">, <url name="Fortunecity" url="http://members.fortunecity.com/aldev">, <url name="Freewebsites" url="http://aldev.freewebsites.com">, <url name="Tripod" url="http://members.tripod.lycos.com/aldev">, <url name="Spree" url="http://members.spree.com/technology/aldev">, <url name="Escalix" url="http://www.escalix.com/freepage/aldev">, <url name="Httpcity" url="http://www.httpcity.com/aldev/index.html">, <url name="Freeservers" url="http://aldev.freeservers.com">. <item> Linuxov datotečni (CVS) strežnik zahteva samo en majhen klimatiziran in brezprašen prostor. Majhen prostor zniža stroške hlajenja/ogrevanja. <item> Linux datotečni (CVS) strežnik omogoča varnost preko Unixovih skupin in overovljanj uporabnikove identitete. </itemize> 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. <bf><it>Uporabo VNC priporočamo bolj kot strežnike X</it></bf>. Oddaljene računalnike lahko dosežete s pomočjo: <itemize> <item>VNC (Virtual Network Computing) na <url url="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. <p> Sledi seznam razpoložljivih strežnikov X: <item> Najboljši, poceni in majhen (3 MB): pojdite na <url url="http://www.microimages.com"> in kliknite na "X-Server (MI/X) for Windows". <item> Humming bird eXceed (14 MB): <url url="http://www.hummingbird.com"> <item> Starnet (5.2 MB): <url url="http://www.starnet.com"> <p> Na voljo je več kot 2 ducata dobaviteljev strežnikov X za Windows: <item> X-win pro (6.34 MB): <url url="http://www.labf.com"> <item> X-WinPro: <url url="http://lab-pro.com"> <item> X-Link: <url url="http://www.xlink.com/x.htm"> <item> Xoftware: <url url="http://www.age.com"> <p> Strežniki X z univerz: <item> Seznami univerz: <url url="http://www.et.byu.edu/support/pc/xterm.html"> <item> Na disketi temelječ strežnik X: <url url="http://mirriwinni.cse.rmit.edu.au/~brad/co338/sem1/floppy.html"> </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Odjemalci FTP za Windows 95/NT/2000 <label id="ftptools"> <p> S skladišča CVS na Unixu/Linuxu lahko datoteke prenašate na MS Windows tudi preko protokola FTP: <itemize> <item> Pojdite na stran Tucows in iščite po ključni besedi "ftp tools" za MS Windows: <url url="http://www.tucows.com"> </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Datoteke Visual Cafe(Java), JBuilder, MS Visual C++, HTML <label id="mstools"> <p> 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. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Orodja za administriranje Sambe <label id="samba"> <p> Sambo administrirajte z orodji na naslovu <url url="http://www.samba.org">. Pojdite tja in kliknite na "GUI Interfaces Tools". <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Varnost skladišč CVS <label id="cvssecurity"> <p> Strežnik in skladišče CVS lahko zavarujete tako: <itemize> <item> Poženite CVS na samostojnem sistemu Linux/Unix, oglejte si še razdelek o <ref id="perftuning" name="izboljšanju učinkovitosti">. <item> 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. <item> Razmislite o uporabi SSH, kot je opisano v poglavju <ref id="multiuser" name="Skladišče za več uporabnikov">. <item> Razmislite o uporabi Kerberos, namestite paket cvs-*-kerberos*.rpm: <url url="http://cvshome.org/dev/codelinux.html">. <item> Obiščite <url url="http://www.cvshome.org"> in na naslovu <url name="mailing list" url="http://cvshome.org/communication.html"> zastavite vprašanja o varnosti. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Večuporabniško skladišče CVS z dostopom z drugih računalnikov <label id="multiuser"> <p> Cederqvistov priročnik na naslovu <url url="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, <bf>so lahko</bf> navodila podobna tistim za `.rhosts', vendar prej preverite v dokumentaciji za vaš nadomestek za rsh. Ssh dobite, če obiščete <url url="http://rpmfind.net"> in kot iskalni pojem vnesete "ssh". Lahko tudi obiščete <url url="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 <url url="http://www.ssh.org">. Opomba: če nameravate nastaviti CVS za uporabo z rsh, potem MORATE narediti ta kritičen korak: <code> bash# chmod 6000 .rhosts </code> Oglejte si še skladišče CVS z JA-SIG UPortal: <url url="http://www.mis3.udel.edu/~jlaker/development">. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Lupinski skripti za RCS <label id="rcs_scripts"> <p> Če želite namesto CVS uporabljati RCS, si lahko pomagate z naslednjimi lupinskimi skripti. <sect1> cotree.sh <label id="cotree.sh"> <p> <code> #!/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 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> cofiles.sh <label id="cofiles.sh"> <p> <code> #!/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 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> ciall.sh <label id="ciall.sh"> <p> <code> #!/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 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Izboljšanje učinkovitosti strežnika CVS <label id="perftuning"> <p> 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: <itemize> <item> Ponovno prevedite Linuxovo jedro, da bo manjše in zanesljivejše. Odstranite dele, ki se ne uporabljajo. Oglejte si spis Kernel-HOWTO na naslovu <url url="http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html"> <p> <item> Izključite nepotrebne Unixove procese. Na sistemih z Linuxom/Unixom poženite chkconfig. <code> 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 </code> <p> <item> Ne poganjajte ostalih nepotrebnih programov. <p> <item> 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. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Sistem za sporočanje problemov <label id="PRS"> <p> 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 <url url="http://www.gnu.org/software/gnats/gnats.html"> in <url url="http://dcl.sourceforge.net">. Komercialni sistem za sporočanje problemov si lahko ogledate na <url url="http://www.stonekeep.com">, poiščite še sistem za sledenje projekta. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Orodja za upravljanje s konfiguracijskami datotekami <label id="configmgt"> <p> <bf>Kaj je upravljanje konfiguracijskih datotek (angl. configuration management)?</bf> 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: <itemize> <item>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. <item>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. </itemize> 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: <itemize> <item> Odgovori na pogosto zastavljana vprašanja o orodjih za upravljanje s konfiguracijskimi datotekami: <url url="http://www.iac.honeywell.com/Pub/Tech/CM/CMFAQ.html"> <item>Linux version control and configuration management tools <url url="http://linas.org/linux/cmvc.html"> <item> Configuration Management systems <url url="http://www.cmtoday.com/yp/commercial.html"> <item> Configuration Management Tools <url url="http://www.iac.honeywell.com/Pub/Tech/CM/CMTools.html"> <item> DevGuy CVS config mgmt <url url="http://devguy.com/fp/cfgmgmt/cvs"> <item> <url name="Yahoo category site" url="http://dir.yahoo.com/Computers_and_Internet/software/programming_tools/software_engineering/configuration_management/cvs___concurrent_versions_system"> <item> Free config mgmt tool <url url="http://www.canb.auug.org.au/~millerp/aegis/aegis.html"> <item> Free CM tools <url url="http://www.loria.fr/cgi-bin/molli/cm/wilma/fcmt"> <item> Rational ClearCase tool <url url="http://www.rational.com/products/clearcase/prodinfo.jsp"> </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Podobne strani <label id="relatedsites"> <p> Podobne strani lahko najdete na: <itemize> <item> Linux goodies <url url="http://www.aldev.8m.com"> in zrcalnih straneh: <url url="http://aldev0.webjump.com">, <url name="angelfire" url="http://www.angelfire.com/country/aldev0">, <url name="geocities" url="http://www.geocities.com/alavoor/index.html">, <url name="virtualave" url="http://aldev0.virtualave.net">, <url name="50megs" url="http://aldev0.50megs.com">, <url name="theglobe" url="http://members.theglobe.com/aldev1/index.html">, <url name="NBCi" url="http://members.nbci.com/alavoor">, <url name="Terrashare" url="http://aldev.terrashare.com">, <url name="Fortunecity" url="http://members.fortunecity.com/aldev">, <url name="Freewebsites" url="http://aldev.freewebsites.com">, <url name="Tripod" url="http://members.tripod.lycos.com/aldev">, <url name="Spree" url="http://members.spree.com/technology/aldev">, <url name="Escalix" url="http://www.escalix.com/freepage/aldev">, <url name="Httpcity" url="http://www.httpcity.com/aldev/index.html">, <url name="Freeservers" url="http://aldev.freeservers.com">. <item> CVS Bubbles <url url="http://www.loria.fr/~molli/cvs-index.html"> <item> CSSC (SCCS like system) <url url="http://cssc.sourceforge.net"> in <url name="zrcalni strani" url="ftp://alpha.gnu.org/pub/gnu/CSSC"> <item> SCCS za Linux <url url="http://www.bitmover.com/bitkeeper"> </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> SCCS proti CVS-RCS <p> 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 <bf>občutno upočasni</bf>. 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 <url url="http://www.faqs.org/faqs/unix-faq/faq/part7">. <bf>Upoštevajte, da se je RCS učil na napakah SCCS... </bf> 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". <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Ostali zapisi tega dokumenta <p> 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: <itemize> <item> <url url="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. </itemize> Ta dokument lahko najdete tudi na naslednjih naslovih: <itemize> <item> <url url="http://www.caldera.com/LDP/HOWTO"> <item> <url url="http://www.linux.ucla.edu/LDP"> <item> <url url="http://www.cc.gatech.edu/linux/LDP"> <item> <url url="http://www.redhat.com/mirrors/LDP"> <item> Ostale zrcalne strani v vaši bližini lahko najdete na <url url="http://www.linuxdoc.org/mirrors.html">, kjer izberete najbližjo stran in greste v imenik /LDP/HOWTO/xxxxx-HOWTO.html. </itemize> <itemize> <item> Ta dokument lahko dobite tudi v eni arhivski datoteki (tar) z zapisi HTML, DVI, Postscript ali SGML na naslovih: <url url="ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO/other-formats/"> in <url url="http://www.linuxdoc.org/docs.html#howto">. <p> <item>Dokument zapisan v golem tekstu najdete na: <url url="ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO"> in <url url="http://www.linuxdoc.org/docs.html#howto">. <p> <item>Celoten dokument v eni datoteki HTML se nahaja na: <url url="http://www.linuxdoc.org/docs.html#howto">. <p>Enovito datoteko HTML dobite (glejte še man sgml2html) z ukazom: sgml2html -split 0 xxxxhowto.sgml <p> <item>Prevode dokumenta v druge jezike, npr. francoščino, nemščino, španščino, kitajščino in japonščino najdete na: <url url="ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO"> in <url url="http://www.linuxdoc.org/docs.html#howto"> Vsakršna vaša pomoč pri prevajanju v druge jezike bo dobrodošla. </itemize> Dokument je napisan z uporabo orodij "SGML-Tools", ki jih lahko dobite na naslovu: <url url="http://www.sgmltools.org">. Po prevajanju izvorne kode boste dobili množico ukazov, npr.: <itemize> <item>sgml2html xxxxhowto.sgml (za izdelavo datotke HTML) <item>sgml2html -split 0 xxxxhowto.sgml (za izdelavo enovite datoteke HTML) <item>sgml2rtf xxxxhowto.sgml (za izdelavo datoteke RTF) <item>sgml2latex xxxxhowto.sgml (za izdelavo datoteke Latex) </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Zapis Acrobat PDF <label id="acrobatpdf"> <p> Datoteka v zapisu PDF se lahko izdela iz zapisa v Postscriptu z uporabo bodisi programa Acrobat <bf>distill</bf> bodisi z <bf>Ghostscriptom</bf>. Datoteko v zapisu Postscript izdelate iz zapisa DVI, le tega pa iz zapisa v Latexu. Programsko opremo Distill lahko poberete z naslova <url url="http://www.adobe.com">. Spodaj je podan vzorčni postopek za izdelavo datoteke v zapisu PDF: <code> 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 & </code> Lahko pa uporabite Ghostscriptov ukaz <bf>Ps2pdf</bf>. Ps2pdf je nekakšen nadomestek s skoraj vso funkcionalnostjo izdelka Adobe Acrobat Distiller: pretvarja datoteke v Postscriptu v zapis Portable Document Format (PDF). <bf>Ps2pdf</bf> je izveden kot zelo kratek ukazni skript (paketna datoteka), ki kliče Ghostscript in izbere posebno "izhodno napravo" z imenom <bf>pdfwrite</bf>. Da bo Ps2pdf deloval, mora biti "naprava" pdfwrite ob prevajanju Ghostscripta vključena v datoteko Makefile; glede podrobnosti si oglejte dokumentacijo o postavljanju Ghostscripta. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Pretvorba zapisa Linuxdoc v Docbook <label id="linuxdoc2docbook"> <p> 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 <bf>ld2db.sh</bf> in nekaj skriptov v Perlu. Izpis programa Ld2db ni 100% čist, zato boste potrebovali skript <bf>clean_ld2db.pl</bf>, napisan v Perlu. Lahko se zgodi, da boste morali nekaj vrstic v dokumentu popraviti ročno. <itemize> <item> Poberite program Ld2db z naslova <url url="http://www.dcs.gla.ac.uk/~rrt/docbook.html"> ali s strani <url name="Al Dev site" url="http://www.aldev.8m.com/cppsrc.html"> <item> Poberite skript v Perlu cleanup_ld2db.pl s strani <url name="Al Dev site" url="http://www.aldev.8m.com/cppsrc.html"> </itemize> Programcek ld2db.sh ni 100% čist, zato bo ob njegovem zagonu prišlo do nekaterih napak. <code> 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 </code> 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>. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Pretvorba v zapis MS WinHelp <label id="mswinhelp"> <p> Dokument v zapisu SGML lahko pretvorite v zapis Microsoft Windows Help. Najprej pretvorite SGML v HTML: <code> bash$ sgml2html xxxxhowto.sgml (izdelava datotek HTML) bash$ sgml2html -split 0 xxxxhowto.sgml (izdelava enovite datoteke HTML) </code> Zatem uporabite pripomoček <url name="HtmlToHlp" url="http://javadocs.planetmirror.com/htmltohlpe.html">. Lahko pa tudi izvedete Sgml2rtf in zatem zapis RTF pretvorite v winhelp. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Ogled različnih zapisov <label id="readformats"> <p> Č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: <tscreen><verb> xdvi -geometry 80x90 howto.dvi man xdvi </verb></tscreen> 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. <itemize> <item>Ghostscript za Windows 95, OS/2, in vse druge operacijske sisteme dobite na naslovu <url url="http://www.cs.wisc.edu/~ghost">. </itemize> Dokument v zapisu Postscript si lahko ogledate z ukazom: <tscreen><verb> gv howto.ps ghostscript howto.ps </verb></tscreen> 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. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> Avtorske pravice in licenca <p> (C) Al Dev (Alavoor Vasudevan) 1998-2000. Licenca je GNU GPL, zahteva se še, da avtorjevo ime in elektronski naslov ostaneta na vseh izvodih. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> sget <label id="sget"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> sedit <label id="sedit"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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" </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> scommit <label id="scommit"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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 ) </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> supdate <label id="supdate"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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" </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> sunlock <label id="sunlock"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> slist <label id="slist"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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; </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> sinfo <label id="sinfo"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> slog <label id="slog"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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" </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> sdif <label id="sdif"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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 ) </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> sadd <label id="sadd"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> sdelete <label id="sdelete"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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" ) </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect> sfreeze <label id="sfreeze"> <p> <bf>Opomba : <it>Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s CDja Linux contrib</it></bf> Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod a+rx. <code> #!/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." </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> </article>