<!doctype linuxdoc system>

<!-- 
************************** začetek opombe *****************************
     V nadaljevanju je predstavljen HOW-TO za CVS/RCS sistem za revizijo 
         izvorne kode.
	 Ta dokument je v formatu SGML. Za pretvorbo v druge formate morate
         uporabiti paket SGML
************************* konec opombe  *****************************
 -->
<!-- 
************************** NAVODILA ZA SGML *****************************
	Uporabniška navodila za SGML se nahajajo na /usr/doc/sgml-tools
	Preberite dokumenta example.sgml in guide.html.
	Uporaba:
		DVI  		sgml2latex -d foo.sgml
		gnuinfo  	sgml2info foo.sgml
		HTML	  	sgml2html foo.sgml
		Latex	  	sgml2latex foo.sgml
		Lyx		  	sgml2lyx foo.sgml
		man		  	sgml2txt -man foo.sgml
		Postscript 	sgml2latex -p foo.sgml
		Richtext 	sgml2rtf foo.sgml
		SGML	 	sgmlcheck foo.sgml
		Text	 	sgml2txt foo.sgml
************************* konec opombe *****************************
-->

<article>

<!-- Title information -->

<title>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> &lsqb;-r stevilka_revizije&rsqb; &lt;datoteka/imenik ime&gt;
	Iz CVS dobite datoteko ali celoten imenik v načinu "samo-za-branje" 
        (READ ONLY).
	Kliknite na <ref id="sget">.

<item> <bf>sedit</bf> &lsqb;-r stevilka_revizije&rsqb; &lt;ime_datoteke&gt;
	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> &lsqb;-r stevilka_revizije&rsqb; &lt;ime_datoteke&gt;
        Udejanite spremembe v datoteko ali ves imenik. Odložite spremembe v CVS.
	Kliknite na <ref id="scommit">.

<item> <bf>supdate</bf>	&lt;ime_datoteke/imenika&gt; 
	Posodobite datoteko ali ves imenik tako, da dobite najnoveše datoteke 
        iz CVS. 
	Kliknite na <ref id="supdate">.

<item> <bf>sunlock</bf> &lsqb;-r stevilka_revizije&rsqb; &lt;ime_datoteke&gt;
	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> &lt;ime_datoteke/imenika&gt; 
	Informacije o spremembah/revizijah datoteke. 
	Kliknite na <ref id="sinfo">.

<item> <bf>slog</bf> &lt;ime_datoteke&gt; 
	Zgodovina sprememb/revizij datoteke iz CVS.
	Kliknite na <ref id="slog">.

<item> <bf>sdif</bf> &lt;ime_datoteke&gt;
<p><bf>sdif</bf> -r revizija1 -r revizija2 &lt;ime datoteke&gt; 
	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> &lt;ime_datoteke&gt;   
	Doda novo datoteko v skladišče CVS.
	Kliknite na <ref id="sadd">.

<item> <bf>sdelete</bf>	&lt;ime_datoteke&gt; 
	Brisanje datoteke iz skladišča CVS.
	Kliknite na <ref id="sdelete">.

<item> <bf>sfreeze</bf>	&lt;ime_revizije&gt; &lt;ime_imenika&gt;
	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 &lt;ime_datoteke&gt;
<item> cvs update &lt;ime_datoteke&gt;
<item> cvs add &lt;datoteka, ..&gt;
<item> cvs remove &lt;datoteka, ..&gt;
<item> cvs commit &lt;datoteka&gt;
<item> cvs status &lt;ime_datoteke&gt;
<item> cvs log &lt;ime_datoteke&gt;
<item> cvs diff -r1.4 -r1.5 &lt;ime_datoteke&gt;  
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>




