Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > 12801f336d9e363d2d56a08891cdf472 > files > 5

howto-text-sl-2006-5mdv2010.0.noarch.rpm

  CVS-RCS-HOW-TO za Linux (sistem za kontrolo izvorne kode)
  Al Dev (Alavoor Vasudevan)        alavoor@yahoo.com;
  prevedel Jernej Kovaèiè jkovacic@email.si;
  v21.4, 25. avgust 2001, prevod 27. september 2001

  Ta dokument je "praktièni vodnik" do hitre postavitve sistema za nad­
  zor izvorne kode CVS/RCS. Dokument vsebuje tudi nekaj lupinskih skrip­
  tov, ki poenostavijo nekaj najpogosteje uporabljanih funkcij CVS. Ti
  skripti omogoèajo lahek vmesnik do CVS. Na voljo je tudi nekaj skrip­
  tov, ki poenostavijo delo z RCS. Informacije v tem dokumentu se
  nana¹ajo tako na Linux kot tudi na ostale vrste Unixa, kot so Solaris,
  HPUX, AIX, SCO, Sinix, BSD, SCO, Apple Macintosh (ki je BSD unix)...
  in BeOS.
  ______________________________________________________________________


  Kazalo


  1. Uvod

  2. Kateri je zame? CVS ali RCS?

  3. Postavljanje CVS

     3.1 Spremenljivke okolja
     3.2 Selitev od RCS k CVS

  4. Uvod v ukaze CVS

     4.1 checkout
     4.2 update
     4.3 add
     4.4 remove
     4.5 commit
     4.6 diff
     4.7 Urejevalnik Emacs

  5. Moèno in ¹ibko zaklepanje ali naèin brez zaklepanja

  6. Lupinski skripti

  7. Dokumentacija CVS

     7.1 Prilo¾ena dokumentacija
     7.2 Dokumentacija organizacije "CVS Organisation"
     7.3 Uèenje CVS

  8. Grafièni uporabni¹ki vmesniki

  9. CVS za MS Windows 95/98/NT/2000

     9.1 Odjemalci FTP za Windows 95/NT/2000
     9.2 Datoteke Visual Cafe(Java), JBuilder, MS Visual C++, HTML
     9.3 Orodja za administriranje Sambe

  10. Varnost skladi¹è CVS

  11. Veèuporabni¹ko skladi¹èe CVS z dostopom z drugih raèunalnikov

  12. Lupinski skripti za RCS

     12.1 cotree.sh
     12.2 cofiles.sh
     12.3 ciall.sh

  13. Izbolj¹anje uèinkovitosti stre¾nika CVS

  14. Sistem za sporoèanje problemov

  15. Orodja za upravljanje s konfiguracijskami datotekami

  16. Podobne strani

  17. SCCS proti CVS-RCS

  18. Ostali zapisi tega dokumenta

     18.1 Zapis Acrobat PDF
     18.2 Pretvorba zapisa Linuxdoc v Docbook
     18.3 Pretvorba v zapis MS WinHelp
     18.4 Ogled razliènih zapisov

  19. Avtorske pravice in licenca

  20. sget

  21. sedit

  22. scommit

  23. supdate

  24. sunlock

  25. slist

  26. sinfo

  27. slog

  28. sdif

  29. sadd

  30. sdelete

  31. sfreeze


  ______________________________________________________________________

  1.  Uvod

  Sistem za nadzor izvorne kode je NUJEN za nadzor nad spremembami, do
  katerih prihaja med razvojem programskih projektov. Razvijalci
  potrebujejo popolno zgodovino sprememb, da se lahko v primeru
  kakr¹nihkoli problemov  vrnejo k prej¹njim razlièicam. Ker je izvorna
  koda najvitalnej¹a komponenta kateregakoli programskega projekta in
  ker razvoj programske opreme porabi ogromno èasa in denarja, je zelo
  pomembno porabiti nekaj èasa za varovanje izvorne kode z uporabo
  sistemov za kontrolo izvorne kode, kot sta npr. CVS in RCS.

  CVS (angl. Concurrent Version Control System, sistem za kontrolo
  hkratnih razlièic) je zmogljivo orodje, ki omogoèa veèim uporabnikom
  hkraten razvoj programske opreme. Je nadgradnja RCS in je nekak¹en
  vmesnik na aplikacijskem nivoju do RCS.

  CVS lahko zapisuje zgodovino va¹ih datotek (ponavadi, vendar ne
  zmeraj, gre za izvorno kodo).  Namesto vsake razlièice vsake datoteke,
  ki ste jo kadarkoli naredili, hrani samo razlike med razlièicami. Med
  drugim vodi tudi evidenco, kdo, kdaj in zakaj je povzroèil kak¹no
  spremembo.

  CVS je v veliko pomoè pri upravljanju z izdajami in nadzoru hkratnih
  urejanj izvornih datotek med razliènimi avtorji. Namesto omogoèanja
  kontrole razlièic za zbirko datotek v posameznem imeniku nam CVS
  omogoèa kontrolo razlièic za hierarhièno zbirko imenikov, ki vsebujejo
  revizije nadzorovanih datotek.

  Te imenike in datoteke lahko potem kombiniramo, da oblikujemo izdajo
  programske opreme.

  S CVS lahko hranimo datoteke "C", "C++", Java, Perl, HTML in druge.

  2.  Kateri je zame? CVS ali RCS?

  CVS je pravzaprav nadgrajen RCS. CVS je precej zmogljivej¹e orodje in
  lahko nadzoruje celotno drevo izvorne kode. Uporaba CVS je zelo
  priporoèena, ker si delo z njim lahko poenostavite z uporabo skriptnih
  jezikov, kot so npr. Perl, korn ali bash.  Oglejte si vzorène skripte
  za lupino Korn v poglavju o ``lupinskih skriptih''.

  Prednosti CVS:

  ·  CVS je decentraliziran, uporabnik prevzema datoteke oz. imenike iz
     skladi¹èa in ima svoje loèeno stabilno drevo imenikov izvorne kode.

  ·  CVS lahko "oznaèuje" izdaje celotnega projekta drevesa izvorne
     kode.

  ·  CVS omogoèa hkratno urejanje datotek.

  ·  CVS si lahko prilagodimo, da nam omogoèa zmogljivo zaklepanje
     datotek ali hkratno urejanje datotek z uporabo lupinskih skriptov
     ali Perla. CVS podpira ¹ibko zaklepanje (ukaz 'cvs watches'),
     mogoèe pa je tudi hkratno urejanje datotek brez zaklepanja.

  Slabosti CVS:

  ·  Potrebnega je nekoliko veè administriranja kot pri RCS.

  ·  Zelo izpopolnjen in kompleksen sistem. Je "zadnji krik"
     tehnologije.  CVS je zelo napreden in zmogljiv sistem, ki so ga
     razvijali zelo dolgo (veè let!!).

  ·  Ima veliko ¹tevilo ukazov in ukaznih mo¾nosti, zato se ga zaèetniki
     te¾je privadijo.  Lupinski skripti v poglavju o ``lupinskih
     skriptih'' lahko olaj¹ajo uporabo.

  Prednosti RCS:

  ·  RCS je zelo preprost za nastavljanje, manj dela je z
     administriranjem.

  ·  RCS se uporablja v centraliziranih podroèjih, kjer vsak dela.

  ·  RCS je koristen za preproste sisteme.

  ·  Zelo zmogljivo zaklepanje datotek - hkratno delo je onemogoèeno.

  Slabosti RCS:

  ·  Hkraten razvoj veèih razvijalcev ni mogoè zaradi zaklepanja datotek
     in omejenosti na posamezni delovni imenik. Zaradi omejitve na
     posamezni delovni imenik lahko spremembe datotek, povzroèene od veè
     razvijalcev, povzroèijo napako ob izvedbi ukaza 'make'.

  ·  Ne more oznaèevati izdaj celotnega programskega projekta.

  Ta dokument vsebuje tudi lupinske skripte, ki omogoèajo enostavno
  vlaganje (angl. check in), prevzemanje (angl. check out) in
  udejanjanje (angl. commit) datotek.  Oglejte si jih v poglavju o
  ``lupinskih skriptih''.

  Za navodila o uporabi RCS si oglejte RCS mini-howto na CDju z Linuxom:

  ______________________________________________________________________
  cd /mnt/cdrom/Redhat/RPMS
  ls -l howto-6.0-*.noarch.rpm
  rpm -qpl howto-6* | grep -i rcs
  ______________________________________________________________________


  ali obi¹èite  <http://www.LinuxDoc.org/HOWTO/mini/RCS.html>

  Oglejte si tudi poglavje o ``lupinskih skriptih za RCS''.

  3.  Postavljanje CVS

  Najprej morate namestiti paket CVS. Èe imate Redhat Linux, izvedite

  ______________________________________________________________________
  cd /mnt/cdrom/Redhat/RPMS
  rpm -i rcs*.rpm
  rpm -i cvs*.rpm
  Spisek name¹èenih datotek si lahko ogledate z -
  rpm -qpl cvs*.rpm | less
  ______________________________________________________________________


  in pobrskajte po izhodu z j,k, CTRL+f, CTRL+D, CTRL+B, CTRL+U, page
  up/down ali smerni¹kimi tipkami.  Oglejte si 'man less'.

  Pri drugih vrstah Unixa boste morda morali najprej dobiti datoteke v
  zapisu tar z RCS in CVS ter slediti datotekama README in INSTALL za
  postavitev CVS.  Obi¹èite  <http://www.cyclic.com> in
  <http://www.loria.fr/~molli/cvs-index.html>.

  3.1.  Spremenljivke okolja

  Naslednje spremenljivke okolja morajo biti nastavljene v /etc/profile
  - to so privzete vrednosti zahtevane za vse uporabnike.  Èe niso
  nastavljene v /etc/profile, morate dodati tole v va¹o lokalno datoteko
  za zagon ob prijavi:  /.bash_profile.

  ______________________________________________________________________
  export EDITOR=/bin/vi
  export CVSROOT=/home/cvsroot
  export CVSREAD=yes
  ______________________________________________________________________


  Naredite imenik za skladi¹èenje izvorne kode ter dodelite dostop za
  branje in pisanje unixovi skupini/uporabniku. Preprièajte se tudi, da
  ime imenika pri spremenljivki CVSROOT ne vsebuje presledkov (vrednosti
  te spremenljivke ne smete nastaviti na npr. '/home/moj cvsroot'.

  ______________________________________________________________________
  bash$ su - root
  bash# export CVSROOT=/home/cvsroot
  bash# groupadd --help
  bash# groupadd cvs
  bash# useradd --help
  bash# useradd -g cvs -d /home/cvsroot cvs

  bash# ls -ld $CVSROOT   ... (morali bi videti tudi seznam datotek)
  bash# chmod o-rwx $CVSROOT
  bash# chmod ug+rwx $CVSROOT

  # Pripravite si skladi¹èe CVS in vanj shranite datoteke:
  bash# cvs init

  # V skupino cvs dodajte uporabni¹ka imena uporabnikov. Naredite dodatno skupino za uporabnike.
  # Upo¹tevajte, da za vejicami, ki loèujejo imena skupin pri izbiri -G, NE SME
  # biti presledkov.
  # V spodnjem primeru uporabnik tom pripada skupinam cvs, users in staff,
  # uporabnik johnson pa pripada samo skupini cvs.
  bash# usermod --help
  bash# usermod -G cvs unixova_uporabni¹ka_imena
  bash# usermod -G cvs,users,staff tom
  bash# usermod -G cvs,users,staroffice billclinton
  bash# usermod -G cvs johnson
  bash# exit    .... (odjavite se z raèuna sistemskega uporabnika (root))

  # Prijavite se kot uporabnik in uvozite datoteke v CVS....
  bash$ su - billclinton
  bash$ export EDITOR=/bin/vi
  bash$ export CVSROOT=/home/cvsroot
  bash$ export CVSREAD=yes

  # Sprememba delovnega imenika je obvezna
  bash$ cd $HOME/moj_imenik_z_izvorno_kodo

  # Podati je treba oznako proizvajalca in revizije
  cvs import moj_imenik_z_izvorno_kodo Vendor1_0 Rev1_0

  # Npr. jaz sem naredil tole:
  bash$ cd $HOME/foobar
  bash$ cvs import foobar Vendor1_0 Rev1_0

  # Primer testiranja in verifikacije:
  bash$ cd $HOME/foobar
  bash$ cvs checkout myfoo.java
  ______________________________________________________________________


  POGOSTA NAPAKA: ko izvedete 'cvs checkout', lahko dobite opozorilo, da
  je modul neznan. Pogosta napaka je, da ob 'cvs import' ne zamenjate
  imenika.  OBVEZNO morate iti v imenik z izvorno kodo in ¹ele potem
  izvedite 'cvs import'. Na primer:

  ______________________________________________________________________
  bash$ cd $HOME/foobardir
  bash$ cvs import foobardir Vendor1_0 Rev1_0
  ______________________________________________________________________


  3.2.  Selitev od RCS k CVS

  Ze preselitev obstojeèih datotek iz RCS v CVS uporabite naslednji
  skript.  Preprièajte se, da imate name¹èen paket z lupino Korn
  (pdksh*.rpm s CDja Linux Contrib).

  Opomba: Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm s
  CDja Linux Contrib.

  ______________________________________________________________________
  #!/bin/ksh

  #############################################################
  # Program za selitev obstojeèih datotek izvorne kode iz RCS v CVS
  #
  # Potreben je RPM paket pdksh*.rpm s Cdja Linux contrib
  #############################################################

  #
  # rcs2cvs - pretvori drevo izvorne kode iz RCS v CVS
  #

  # projekt za pretvorbo
  PROJECT='project'

  # trenutni izhodi¹èni imenik RCS
  RCSROOT="$HOME/rcs"

  if cd "$RCSROOT/$PROJECT"
  then
          cd "$RCSROOT"
  else
          echo >&2 "`basename "$0"`: ne morem priti v RCS-jev imenik '$RCSROOT/$PROJECT'."
          exit 1
  fi

  # trenutni izhodi¹èni imenik CVS
  CVSROOT="$HOME/cvs"

  # naredi nov imenik v CVS za projekt 'project'
  if mkdir "$CVSROOT/$PROJECT"
  then
          :
  else
          echo >&2 "`basename "$0"`: ne morem narediti CVS-jevega imenika '$CVSROOT/$PROJECT'."
          exit 2
  fi

  # naredi projektno drevo CVS iz drevesa RCS
  find "$PROJECT" -type d -name RCS -print |
  while read RCS
  do
          CVS="`dirname "$RCS"`"
          (if cd "$RCS"
          then
  #               if find . -type f -name '*,v' -print | cpio -pdmv "$CVSROOT/$CVS"
                  if find . -type f -print | cpio -pdmv "$CVSROOT/$CVS"
                  then
                          :
                  else
                          echo >&2 "`basename "$0"`: ne morem pretvoriti RCS-jevega podimenika '$RCSROOT/$RCS' v CVS-jev podimenik '$CVSROOT/$CVS'."
                  fi
          else
                  echo >&2 "`basename "$0"`: ne morem priti v  RCS-jev podimenik '$RCSROOT/$RCS'."
          fi)
  done
  ______________________________________________________________________


  Sedaj smo preselili projekt iz RCS v CVS kot 'project'. Priènete lahko
  uporabljati ukaze CVS na modulu 'project'.


  4.  Uvod v ukaze CVS

  V CVS nam je na voljo precej ukazov (v pregledu cvs_ukaz), izmed
  katerih nam jih precej nudi ¹e nemajhno ¹tevilo izbir, ki zadostijo
  precej potrebam upravljanja z izvorno kodo v porazdeljenih okoljih.
  Vendar nam za koristno delo s CVS ni potrebno obvladati prav vseh
  podrobnosti.  Pravzaprav nam za uporabo in prispevanje v skladi¹èe
  zadostuje ¾e pet ukazov.  Najpogosteje se uporabljajo tile ukazi:
  checkout, update, add, remove, commit in diff.

  4.1.  checkout

  cvs checkout moduli...  Potreben zaèetni ukaz, da deluje veèina CVS:
  naredi va¹o zasebno kopijo izvorne kode za module (ki se imenujejo
  zbirka izvorne kode; tu lahko tudi uporabite pot, ki je relativna na
  izvorno skladi¹èe). S to kopijo lahko delate brez vme¹avanje v delo
  ostalih. Vedno se naredi vsaj en podimenik.

  ______________________________________________________________________
  bash$ cvs --help checkout
  Usage:
    cvs checkout [-ANPRcflnps] [-r rev | -D date] [-d dir]
      [-j rev1] [-j rev2] [-k kopt] moduli...
          -A      Resetiraj vse lepljive oznake/datum/kopt
          -N      Èe je dolèena izbira -d, ne skraj¹uj poti v modulu.
          -P      Oklesti prazne imenike.
          -R      Imenike obdelaj rekurzivno.
          -c      Izpi¹i (z ukazom "cat") podatkovno bazo modula.
          -f      Èe ne najde¹ oznake/datuma, se naj ujemata z glavno revizijo.
          -l      Samo lokalni imenik, brez rekurzije.
          -n      Ne poganjaj programov v modulu (èe obstajajo).
          -p      Prevzemi datoteko na standardni izhod (v izogib lepljivosti).
          -s      Podobno kot -c, vendar vkljuèi ¹e modulov status.
          -r rev  Prevzemi revizijo ali oznako (izvede tudi -P) (je lepljiv).
          -D date Prevzemi revizije kot od datuma (izvede tudi -P) (je lepljiv)
          -d dir  Prevzemi v imenik dir namesto v ime modula.
          -k kopt Pri prevzemu uporabi RCS-jevo izbiro kopt -k.
          -j rev  Spoji spremembe, ki so nastale med trenutno revizijo in rev.
  (Vnesi izbiro --help global za seznam ostalih izbir)
  ______________________________________________________________________


  4.2.  update

  cvs update Ta ukaz izvedite znotraj va¹ega zasebnega imenika z izvorno
  kodo, kadar ¾elite posodobiti va¹e kopije izvornih datotek glede na
  spremembe, ki so jih drugi razvijalci naredili v izvorno kodo v
  skladi¹èu.


  ______________________________________________________________________
  bash$ cvs --help update
  Usage: cvs update [-APdflRp] [-k kopt] [-r rev|-D date] [-j rev]
      [-I ign] [-W spec] [datoteke...]
          -A      Resetiraj vse lepljive oznake/datume/kopt.
          -P      Oklesti prazne imenike.
          -d      Zgradi imenike, podobo kot jih checkout.
          -f      Èe ne najde¹ oznake/datuma, se naj ujemata z glavno revizijo.
          -l      Samo lokalni imenik, brez rekurzije.
          -R      Obdelaj imenike rekurzivno.
          -p      Po¹lji posodobitve na standardni izhod (v izogib lepljivosti).
          -k kopt Pri prevzemu uporabi RCSjevo izbiro kopt -k.
          -r rev  Posodobi in uporabi podano revizijo/oznako (je lepljiv).
          -D date Nastavi datum, glede na katerega naj se posodobi (je lepljiv).
          -j rev  Spoji spremembe med trenutno revizijo in rev.
          -I ign  Veè datotek, ki naj se spregledajo (! za resetiranje).
          -W spec Vrstica za doloèitev ovitka.
  (Vnesi izbiro --help global za seznam ostalih izbir)
  ______________________________________________________________________


  4.3.  add

  cvs add datoteka...  Ta ukaz uporabite za vpis novih datotek v CVS
  zapis va¹ega delovnega imenika. Datoteke se bodo dodale v skladi¹èe ob
  naslednji izvedbi ukaza uporabite 'cvs import'. 'cvs add' se uporablja
  samo za nove datoteke v ¾e prevzetem imeniku.

  ______________________________________________________________________
  bash$ cvs --help add
  Usage: cvs add [-k rcs-kflag] [-m sporoèilo] datoteke...
          -k      Pri dodajanju datoteke z doloèeno zastavico kflag uporabi "rcs-kflag".
          -m      V dnevnik zapi¹i "sporoèilo".
  (Vnesi izbiro --help global za seznam ostalih izbir)
  ______________________________________________________________________


  4.4.  remove

  cvs remove datoteka...  Ta ukaz uporabite potem, ko ste zbrisali vse
  prej navedene datoteke. Z njim prijavite CVSju, da ¾elite oznaèene
  datoteke odstraniti iz skladi¹èa.  Odstranitev se ne pozna pri
  ostalih, vse dokler ne izvedete 'cvs commit'.

  ______________________________________________________________________
  bash$ cvs --help remove
  Usage: cvs remove [-flR] [datoteke...]
          -f      Bri¹i datoteko preden jo odstrani¹ iz skladi¹èa.
          -l      Obdelaj samo ta imenik (brez rekurzije).
          -R      Imenike obdelaj rekurzivno.
  (Vnesi izbiro --help global za seznam ostalih izbir)
  ______________________________________________________________________


  4.5.  commit

  cvs commit datoteka...  Ta ukaz uporabite, kadar ¾elite vnesti
  spremembe v skladi¹èe in jih ''objaviti'' tudi za ostale razvijalce.


  ______________________________________________________________________
  bash$ cvs --help commit
  Usage: cvs commit [-nRlf] [-m spr. | -F dnevnik] [-r rev] datoteke...
          -n      Ne poganjaj programov v modulih (èe obstajajo).
          -R      Imenike obdelaj rekurzivno.
          -l      Samo lokalni imenik (brez rekurzije).
          -f      Prisili datoteko, da bo udejanjena; onemogoèi rekurzijo.
          -F dat. Preberi dnevni¹ko sporoèilo iz datoteke dat.
          -m spr. Log message.
          -r rev  Udejani v to vejo ali deblo revizije.
  (Vnesi izbiro --help global za seznam ostalih izbir)
  ______________________________________________________________________


  4.6.  diff

  cvs diff datoteka...  Prika¾e razlike med datotekami v delovnem
  imeniku in skladi¹èu ali med dvema revizijama v skladi¹èu. Ne
  spreminja datotek niti v skladi¹èu niti v delovnem imeniku.

  ______________________________________________________________________
  bash$ cvs --help diff
  Usage: cvs diff [-lNR] [rcsdiff-options]
      [[-r rev1 | -D date1] [-r rev2 | -D date2]] [datoteke...]
          -l      Samo lokalni imenik, brez rekurzije.
          -R      Imenike obdelaj rekurzivno.
          -D d1   Izvedi diff med datoteko s podanim datumom glede na delovno datoteko.
          -D d2   Izvedi diff revizije rev1/date1 glede na date2.
          -N      vkljuèi razlike za dodane in odstranjene datoteke.
          -r rev1 Izvedi diff med revizijo rev1 glede na delovno datoteko.
          -r rev2 Izvedi diff revizije rev1/date1 glede na revizijo rev2.
          --ifdef=arg     Izpisi razlike v zapisu ifdef.
  (Glede izbir rcsdiff-options za si oglejte dokumentacijo za va¹ program diff.
  Najbolj priljubljena izbira je -c, je pa na voljo ¹e veliko drugih).
  (Vnesi izbiro --help global za seznam ostalih izbir)
  ______________________________________________________________________


  4.7.  Urejevalnik Emacs

  Emacs je zmogljiv urejevalnik in podpira CVS/RCS - ¹e posebej za
  spajanje in primerjavo revizij. Emacsova glavna domaèa stran je
  <http://www.emacs.org>.


  5.  Moèno in ¹ibko zaklepanje ali naèin brez zaklepanja

  CVS je zmogljiv in zelo nastavljiv sistem. CVS podpira:

  ·  Moèno zaklepanje z "rezerviranimi prevzemi" s pomoèjo ukaza cvs
     admin -l ali ``lupinskega skripta''.  Preberite tudi spis Reserved
     checkouts <http://www.cvshome.org/docs/inforeserve.html>.  Popravek
     Erica Griswolda o rezerviranih prevzemih najdete na naslovu
     <http://www.cvshome.org/dev/patches/editf>.


  ·  ©ibko zaklepanje s pomoèjo znaèilnosti ukaza 'cvs watch'.  Oglejte
     si tudi "cvs edit" glede opozorila (
     <http://www.cvshome.org/dev/text2/res2>), èe kdo ¾e ureja datoteko.


  ·  Brez zaklepanja - privzeto je dovoljeno, da veè razvijalcev hkrati
     ureja datoteke.

  6.  Lupinski skripti

  Sledijo skripti za poenostavitev uporabe osnovnih ukazov CVS. Ti
  skripti vam dajo prvi vpogled v sistem CVS in so koristni, dokler se
  ne privadite na ukaze CVS. Skripti so napisani za lupino Korn, ker je
  ta lupina vedno na voljo za vse vrste Unixa, vedno pa jih lahko
  prevedete v Bash ali Perl, èe je to potrebno. Prilagodite si jih lahko
  po svojem okusu. V osnovi so to ukazi CVS, dodane pa so ¹e nekatere
  znaèilnosti, ki jih naredijo specifiène glede na lokacijo. Na primer,
  skript sedit omogoèa zaklepanje, tako uporabniki vedo, da nekdo ¾e
  ureja to datoteko. Seveda lahko uporabniki neposredno uporabljajo
  ukaze CVS in tako obidejo te skripte. Ti skripti prikazujejo, kako si
  lahko prilagodite CVS.

   OPOMBA:  Lupinski skripti privzamejo uporabnikov domaèi imenik za
  korenskega in prevzamejo izvorno drevo iz CVS tako, da ga naredijo
  neposredno pod uporabnikovim domaèim imenikom.

   NASVET:  V teh lupinskih skriptih se vsako ime datoteke na va¹em
  disku sestoji iz treh delov: domaèega imenika, podimenika in imena
  datoteke.  Polna pot do datoteke je sestavljena iz spremenljivk:
  $HOME/$subdir/$fname.  V CVS je z uporabo spremenljivke $subdir
  ohranjena enaka struktura imenikov, torej bo tam izgledala nekako
  takole $CVSROOT/$subdir/$fname.  V vseh skriptih igrajo spremenljivke
  $HOME, $CVSROOT, $subdir in $fname pomembno vlogo. Njihove vrednosti
  so npr. lahko HOME=/home/aldev, subdir=myproject/src,
  CVSROOT=/home/cvsroot, in fname=foo.cpp

  Skopirajte te skripte v imenik /usr/local/bin, ki naj bo v
  uporabnikovi spremenljivki okolja PATH.

  1. sget [-r stevilka_revizije] <datoteka/imenik ime> Iz CVS dobite
     datoteko ali celoten imenik v naèinu "samo-za-branje" (READ ONLY).
     Kliknite na ``''.

  2. sedit [-r stevilka_revizije] <ime_datoteke> Urejanje datoteke z
     namenom spremeniti vsebino. Datoteka se zaklene, tako, da je nihèe
     ne more prevzeti. Seveda si skript lahko prilagodite svojim
     potrebam - brez zaklepanja, opozorilna sporoèila ali zelo zmogljivo
     zaklepanje.  Kliknite na ``''.

  3. scommit [-r stevilka_revizije] <ime_datoteke> Udejanite spremembe v
     datoteko ali ves imenik. Odlo¾ite spremembe v CVS.  Kliknite na
     ``''.

  4. supdate  <ime_datoteke/imenika> Posodobite datoteko ali ves imenik
     tako, da dobite najnove¹e datoteke iz CVS.  Kliknite na ``''.

  5. sunlock [-r stevilka_revizije] <ime_datoteke> Odklepanje datoteke,
     dobljene s sedit.  Kliknite na ``''.

  6. slist Ogled datotek, ki jih trenutno urejate.  Izvr¹i ukaz 'ls -l |
     grep | ...'.  Kliknite na ``''.  Upo¹tevajte, da obstaja ¹e en
     Unixov ukaz slist (ki izpi¹e seznam razpolo¾ljivih stre¾nikov
     Netware). Preprièajte se, da je imenik s skriptom slist v
     spremenljivki PATH naveden pred drugimi imeniki s tem ukazom.

  7. sinfo <ime_datoteke/imenika> Informacije o spremembah/revizijah
     datoteke.  Kliknite na ``''.

  8. slog <ime_datoteke> Zgodovina sprememb/revizij datoteke iz CVS.
     Kliknite na ``''.

  9. sdif <ime_datoteke>

     sdif -r revizija1 -r revizija2 <ime datoteke> Razlike med dvema
     revizijama datoteke v CVS.  Kliknite na ``''.

     OPOMBA: ukaz sdif ima samo en 'f', ker ¾e obstaja drug Unixov ukaz
     'sdiff'


  10.
     sadd <ime_datoteke> Doda novo datoteko v skladi¹èe CVS.  Kliknite
     na ``''.

  11.
     sdelete  <ime_datoteke> Brisanje datoteke iz skladi¹èa CVS.
     Kliknite na ``''.

  12.
     sfreeze  <ime_revizije> <ime_imenika> Zamrznitev kode, izdaja
     celotnega izvornega drevesa.  Kliknite na ``''.

     Na primer:

     ___________________________________________________________________
             cd $HOME;
             sfreeze REVIZIJA_1_0  izvdrevo
     ___________________________________________________________________


  zamrzne kodo z oznako REVIZIJA_1_0, da lahko pozneje prevzamete
  celotno drevo z uporabo imena revizije.


  7.  Dokumentacija CVS

  V Unixovi ukazni vrstici odtipkajte:

  1. cvs --help

  2. cvs --help-options

  3. cvs --help-commands

  4. cvs -H checkout

  5. cvs -H commit

  6. man cvs

  7. man tkcvs

  8. Obi¹èite  <http://www.cyclic.com>

  9. Obi¹èite  <http://www.loria.fr/~molli/cvs-index.html>

  Tkcvs ( <http://www.tkcvs.org>) je Tcl/Tk grafièni vmesnik do CVS.
  Vsebuje tudi sprotno pomoè.

  ·  cd $HOME/src/foo.cpp

  ·  tkcvs

  ·  Kliknite na foo.cpp

  ·  Kliknite na ikono 'Revision Log' ki se nahaja takoj za ikono
     'spectacle'

  ·  To bo v oknu prikazalo vejo drevesa. Sedaj z DESNIM mi¹kinim gumbom
     kliknite na besedilo '1.3' in z LEVIM gumbom kliknite na '1.1'.
     Potem kliknite na gumb"Diff". Prika¾e se okno z dvema razdelkoma!!

  ·  Kliknite na gumb "Next" za sprehod èez ¹e veè razlik.  Kliknite na
     "Center" za centriranje besedila.

  Obstaja tudi CVS odjemalec za Windows 95, ki se imenuje WinCVS
  (oglejte si <http://www.wincvs.org> in stran Cyclicsite
  <http://www.cvshome.org/cyclic/cvs/soft-maccvs.html>).  WinCVS se
  lahko uporablja skupaj s Sambo -  <http://www.samba.org>

  Potrebni ukazi so:

  ·  cvs checkout <ime_datoteke>

  ·  cvs update <ime_datoteke>

  ·  cvs add <datoteka, ..>

  ·  cvs remove <datoteka, ..>

  ·  cvs commit <datoteka>

  ·  cvs status <ime_datoteke>

  ·  cvs log <ime_datoteke>

  ·  cvs diff -r1.4 -r1.5 <ime_datoteke> To poda razlike med razlièicama
     datoteke 1.4 and 1.5.


  7.1.  Prilo¾ena dokumentacija

  Na sistemih z Linuxom lahko najdete dokumentacijo za CVS v zapisu
  postscript v imeniku /usr/doc/cvs*/*.ps. Na voljo je tudi seznam
  odgovorov na pogosto zastavljana vpra¹anja in ostale koristne
  informacije.

  ______________________________________________________________________
  bash# cd /usr/doc/cvs*
  bash# gv cvs.ps
  ______________________________________________________________________


  7.2.  Dokumentacija organizacije "CVS Organisation"

  Dokumentacijo organizacije "CVS Organisation" boste na¹li na naslovu
  <http://www.cvshome.org/docs>.

  Uradni Cederquistov priroènik za CVS se nahaja na naslovu
  <http://www.cvshome.org/docs/manual/cvs.html>.

  Spisek pogosto zastavljanih vpra¹anj za CVS boste na¹li na naslovu
  <http://www.cs.utah.edu/dept/old/texinfo/cvs/FAQ.txt>.

  7.3.  Uèenje CVS


  ·  <http://rpmfind.net/tools/CVS/training/cvstrain.html>

  ·  <http://www.loria.fr/~molli/cvs/cvs-tut/cvs_tutorial_toc.html>

  ·  <http://atlas.web.cern.ch/Atlas/GROUPS/SOFTWARE/OO/tools/srt/>

  ·  <http://durak.org/cvswebsites/>

  ·  <http://www-users.informatik.rwth-
     aachen.de/~wge/tools/cvs/cvsclient/cvsclient_toc.html>

  ·  <http://www-users.informatik.rwth-aachen.de/~wge/tools/cvs.html>

     Splo¹ni pripomoèki za CVS, ki so jih napisali ostali avtorji:

  ·  Knjiga "Open Source Development with CVS" Karla Fogela na naslovu
     <http://cvsbook.red-bean.com> ima Poglavje Third-party-tools v
     uradnem priroèniku <http://cvsbook.red-bean.com/cvsbook.html#Third-
     Party_Tools> in zrcalne strani: Zevils
     <http://www.zevils.com/doc/cvsbook/cvsbook_8.html>

  ·  <http://rcs.ee.washington.edu/spp/Projects/Manastash/Links/cvsbook_toc.html>


  8.  Grafièni uporabni¹ki vmesniki

  Na voljo so naslednji grafièni uporabni¹ki vmesniki za CVS:

  ·  CVS home.org:  <http://www.cvshome.org/dev/addons.html>

  ·  CVS Web for windows:
     <http://www.devguy.com/fp/cfgmgmt/cvs/cvs_admin_nt.htm#CVSWEBIIS>
     in  <http://stud.fh-heilbronn.de/~zeller/cgi/cvsweb.cgi>

  ·  TkCVS ( <http://www.tkcvs.org>) je grafièni vmesnik za CVS napisan
     v jeziku Tcl/Tk. Druga lokacija: cyclicsite
     <http://www.cvshome.org/cyclic/tkcvs/index.html>

  ·  gCVS: prenosljiv grafièni vmesnik za netehniène uporabnike CVS:
     <http://www.arachne.org/software/gcvs>

  ·  jCVS je odjemalec za CVS, v celoti napisan v javi:
     <http://www.jcvs.org> in cyclicsite
     <http://www.cvshome.org/cyclic/jcvs/index.html>

  ·  WinCVS:  <http://www.cvshome.org/cyclic/cvs/soft-maccvs.html> in
     cyclicsite <http://www.cvshome.org/cyclic/cvs/soft-maccvs.html>

  ·  Component soft Win CVS:  <http://www.componentsoftware.com/cvs>

  ·  JA-SIG UPortal CVS  <http://www.mis3.udel.edu/~jlaker/development>

  ·  <http://ppprs1.phy.tu-dresden.de/~trogisch/lincvs/lincvsen.html>

  ·  <http://www.loria.fr/~molli/cvs/doc/cvs_toc.html>

     Zelo vam priporoèamo, da uporabljate Sambo (samba*.rpm na cdromu)
     <http://www.samba.org> in ``stre¾nik X'' na raèunalnikih z
     operacijskim sistemom MS Windows 95/NT. Z uporabo Sambe bo imenik
     na raèunalniku z Unixom v MS Windows videti kot lokalna mapa.
     Oglejte si naslednji razdelek o ``stre¾nikih X''.


  9.  CVS za MS Windows 95/98/NT/2000

  ZELO vam priporoèamo uporabo Sambe (samba*.rpm na cdromu)
  <http://www.samba.org> in VNC viewerja (ali stre¾nika X) na sistemih z
  MS Windows 95/NT.  S Sambo bo CVS stre¾nik na Unixu/Linuxu deloval kot
  datoteèni stre¾nik.  Z uporabo Sambe bo imenik na oddaljenem
  raèunalniku z Unixom v MS Windows videti kot lokalna mapa na lokalnem
  disku.  Namestite paket samba*.rpm na stre¾niku Unix/Linux (s
  skladi¹èem CVS) in namestite VNC viewer (ali stre¾nik X) na namizje MS
  Windows 95/NT/2000. Z uporabo VNC (ali stre¾nika X) se z lahkoto
  prijavite v sistem Unix in vlagate/prevzemate datoteke. Na sistemih MS
  Windows lahko tudi uporabljate orodja kot Java Visual Cafe ali Java
  JBuilder za urejanje datotek iz imenikov s sistema Unix/Linux (preko
  Sambe).  Po urejanju lahko vlo¾ite datoteke v sistem Unix s pomoèjo
  VNC ali stre¾nika X.

  Prednosti uporabe CVS na Linuxu/Unixu preko MS Windows so:

  ·  En sam na Linuxu postavljen datoteèni stre¾nik (CVS stre¾nik) lahko
     stre¾e veliko odjemalcem na sistemih MS Windows.

  ·  Datoteèni (CVS) stre¾nik pod Linuxom je zelo robusten, varen in
     zanesljiv.

  ·  Potrebna je samo ena baterija UPS (za neprekinjeno napajanje) za
     stre¾nik z Linuxom.

  ·  S pomoèjo Sambe bodo Linuxovi imeniki videti kot imeniki na sistemu
     MS Windows.

  ·  Linuxov datoteèni (CVS) stre¾nik podpira centralizirano izdelavo
     varnostnih kopij s pomoèjo orodij kot Arkeia, Bru
     <http://www.aldev.8m.com>, zrcalni stre¾niki tudi na
     <http://aldev0.webjump.com>, angelfire
     <http://www.angelfire.com/country/aldev0>, geocities
     <http://www.geocities.com/alavoor/index.html>, virtualave
     <http://aldev0.virtualave.net>, 50megs <http://aldev0.50megs.com>,
     theglobe <http://members.theglobe.com/aldev1/index.html>, NBCi
     <http://members.nbci.com/alavoor>, Terrashare
     <http://aldev.terrashare.com>, Fortunecity
     <http://members.fortunecity.com/aldev>, Freewebsites
     <http://aldev.freewebsites.com>, Tripod
     <http://members.tripod.lycos.com/aldev>, Spree
     <http://members.spree.com/technology/aldev>, Escalix
     <http://www.escalix.com/freepage/aldev>, Httpcity
     <http://www.httpcity.com/aldev/index.html>, Freeservers
     <http://aldev.freeservers.com>.

  ·  Linuxov datoteèni (CVS) stre¾nik zahteva samo en majhen
     klimatiziran in brezpra¹en prostor. Majhen prostor zni¾a stro¹ke
     hlajenja/ogrevanja.

  ·  Linux datoteèni (CVS) stre¾nik omogoèa varnost preko Unixovih
     skupin in overovljanj uporabnikove identitete.

  Najbolj¹e orodje za dostopanje do oddaljenih raèunalnikov je VNC. VNC
  ne porabi veliko procesorske moèi ter pomnilnika in je precej bolj¹i
  od stre¾nikov X.  Uporabo VNC priporoèamo bolj kot stre¾nike X.
  Oddaljene raèunalnike lahko dose¾ete s pomoèjo:

  ·  VNC (Virtual Network Computing) na
     <http://www.uk.research.att.com/vnc>.  VNC ni stre¾nik X, vendar
     lahko prika¾e namizje z oddaljenega sistema Unix na namizju
     Windows.  VNC je najbolj¹e orodje na tr¾i¹èu za dostop do
     oddaljenih raèunalnikov, je zelo skromen s porabo procesorske moèi
     in zelo zmogljiv program.


     Sledi seznam razpolo¾ljivih stre¾nikov X:

  ·  Najbolj¹i, poceni in majhen (3 MB): pojdite na
     <http://www.microimages.com> in kliknite na "X-Server (MI/X) for
     Windows".

  ·  Humming bird eXceed (14 MB):  <http://www.hummingbird.com>


  ·  Starnet (5.2 MB):  <http://www.starnet.com>


     Na voljo je veè kot 2 ducata dobaviteljev stre¾nikov X za Windows:

  ·  X-win pro (6.34 MB):  <http://www.labf.com>

  ·  X-WinPro:  <http://lab-pro.com>

  ·  X-Link:  <http://www.xlink.com/x.htm>

  ·  Xoftware:  <http://www.age.com>

     Stre¾niki X z univerz:

  ·  Seznami univerz:  <http://www.et.byu.edu/support/pc/xterm.html>

  ·  Na disketi temeljeè stre¾nik X:
     <http://mirriwinni.cse.rmit.edu.au/~brad/co338/sem1/floppy.html>


  9.1.  Odjemalci FTP za Windows 95/NT/2000

  S skladi¹èa CVS na Unixu/Linuxu lahko datoteke prena¹ate na MS Windows
  tudi preko protokola FTP:

  ·  Pojdite na stran Tucows in i¹èite po kljuèni besedi "ftp tools" za
     MS Windows:  <http://www.tucows.com>


  9.2.  Datoteke Visual Cafe(Java), JBuilder, MS Visual C++, HTML

  Z uporabo Sambe in stre¾nika X je mogoèe uprabljati CVS na sistemih
  Windows.  CVS podpira tudi orodja, kot so Symantec Visual Cafe (Java),
  Inprise JBuilder, MS Visual C++ in druga.

  Datoteke HTML lahko s pomoèjo Sambe shranjujete v skladi¹èe CVS in jih
  z lahkoto dose¾ete iz MS Windows.


  9.3.  Orodja za administriranje Sambe

  Sambo administrirajte z orodji na naslovu  <http://www.samba.org>.
  Pojdite tja in kliknite na "GUI Interfaces Tools".


  10.  Varnost skladi¹è CVS

  Stre¾nik in skladi¹èe CVS lahko zavarujete tako:

  ·  Po¾enite CVS na samostojnem sistemu Linux/Unix, oglejte si ¹e
     razdelek o ``izbolj¹anju uèinkovitosti''.

  ·  Odstranite nepotrebne programske pakete z raèunalnika s CVS, da
     zunanjim vandalom prepreèite, da bi jih pognali. Za vsak primer, èe
     se jim ¾e posreèi vdreti v sistem, jim na ta naèin vsaj ne ponudite
     prilo¾nosti, da bi pognali nevarne programe.

  ·  Razmislite o uporabi SSH, kot je opisano v poglavju ``Skladi¹èe za
     veè uporabnikov''.

  ·  Razmislite o uporabi Kerberos, namestite paket cvs-*-kerberos*.rpm:
     <http://cvshome.org/dev/codelinux.html>.

  ·  Obi¹èite  <http://www.cvshome.org> in na naslovu mailing list
     <http://cvshome.org/communication.html> zastavite vpra¹anja o
     varnosti.


  11.  Veèuporabni¹ko skladi¹èe CVS z dostopom z drugih raèunalnikov

  Cederqvistov priroènik na naslovu
  <http://cvshome.org/docs/manual/cvs_2.html#SEC30> opisuje, kako
  nastaviti CVS, da bo mogoèe dostopati nanj z drugih raèunalnikov.

  Da bo lahko CVS uporabljala skupina, je potrebno nastaviti sistem
  dovoljenj, ki bo dovoljeval ljudem dostop do sistema z drugih
  raèunalnikov. To lahko omogoèite na tri naèine in sicer z :server:,
  :pserver: ali :ext:.  Mehanizem pserver in uporaba rsh nista varna.
  Samo :ext (z uporabo ssh) nam nudi dovolj varnosti.

  Èe spremenljivko CVS_RSH nastavite na SSH ali kak¹en drug nadomestek
  rsh, so lahko navodila podobna tistim za `.rhosts', vendar prej
  preverite v dokumentaciji za va¹ nadomestek za rsh.

  Ssh dobite, èe obi¹èete <http://rpmfind.net> in kot iskalni pojem
  vnesete "ssh".  Lahko tudi obi¹èete
  <http://www.redhat.com/apps/download> in spet kot iskalni pojem
  vnesite "ssh".  Prenesite in namestite ssh RPM in zatem nastavite CVS
  za uporabo z njim.  Oglejte si tudi  <http://www.ssh.org>.

  Opomba: èe nameravate nastaviti CVS za uporabo z rsh, potem MORATE
  narediti ta kritièen korak:

  ______________________________________________________________________
  bash# chmod 6000 .rhosts
  ______________________________________________________________________


  Oglejte si ¹e skladi¹èe CVS z JA-SIG UPortal:
  <http://www.mis3.udel.edu/~jlaker/development>.


  12.  Lupinski skripti za RCS

  Èe ¾elite namesto CVS uporabljati RCS, si lahko pomagate z naslednjimi
  lupinskimi skripti.

  12.1.  cotree.sh


  ______________________________________________________________________
  #!/bin/ksh

  # cotree.sh (lupinski skript za prevzemanje drevesa)
  # cotree.sh - Prevzame celotni imenik iz RCS

  # Uporaba :
  # Tako boste dobili vse imenike
  #       unix> cotree.sh
  #
  # Tako pa boste dobili samo drevo iz enega imenika
  #       unix> cotree.sh <ime imenika>

  # Oglejte si tudi cofiles.sh

  ###############################################################
  # Nastavljanje RCS (Revision Control System)
  # Namestite si programe RCS - dobili boste ukaze co, ci, rcslog
  # Naredite domaèi imenik za RCS, kamor boste odlagali datoteke
  # iz skladi¹èa izvorne kode. Recimo, da se imenuje
  # $RCSDIR=/home/rcs_version_control
  # Nastavite vrednost spremenljivki okolja RCSDIR=/home/rcs_version_control
  # v datoteki $HOME/.profile. Npr.
  #               export RCSDIR=/home/rcs_version_control
  # Pod $RCSDIR naredite imeni¹ko strukturo in vanjo vloèite vse va¹e
  # datoteke z uporabo ci . Oglejte si 'man ci'
  # Sedaj naredite povezavo iz va¹ega domaèega imenika do va¹ega projekta
  # pod $RCSDIR
  #               cd $HOME
  #               mkdir $HOME/myproject
  #               cd $HOME/myproject
  # in po¾enite ta skript, da boste dobili vse datoteke in drevo imenikov
  #               cotree.sh
  # Ta skript bo naredil celotno drevo izvorne kode v uporabnikov
  # domaèi imenik in bo imel tudi mehko povezavo do imenikov RCS. Vsak
  # uporabnik bo pognal ta skript v svojem domaèem imeniku.
  ###############################################################

  check_out_directory()
  {
          # Korenski imenik RCS (revision control system)
          # npr.  RCSDIR=/home/rcs_version_control
          RCSDIR=$1
          DIRNAME=$2

          # Ime podanega imenika mora obstajati v korenskem imeniku RCS
          if [ "$DIRNAME" = "" -o  ! -d $RCSDIR/$DIRNAME ]; then
                  print "\nImenik DIRNAME=$DIRNAME ne obstaja!!"
                  print "\nPrekinjam program ... in konèujem ...\n"
                  exit
          fi

          mkdir -p $DIRNAME
          ln -s $RCSDIR/$DIRNAME/RCS $DIRNAME
          (
                  cd $DIRNAME

                  # To ne bo uspelo v primeru ime datoteke=vzorec,vv
                  # kar bo znotraj RCS enako RCS/vzorec,vv,v
                  # ls RCS | cut -d',' -f1 | xargs co
                  # Uporabite ujemanje za konec imena $, kot je spodaj -
                  # Uporabite ls RCS/*, da se znebite imen ./ in ../
                  #ls RCS/* | cut -d'/' -f2 | sed -e's/,v$//g' | xargs co
                  if [ -d RCS ]; then
                          ls RCS/* | cut -d'/' -f2 | sed -e's/,v$//g' | \
                          while read ii
                          do
                                  #echo "ii je : $ii"
                                  if [ -f "RCS/$ii,v" ]; then
                                          co $ii
                                  fi
                          done
                  fi
          )
  }

  # Korenski imenik (revision control system)
  # npr. RCSDIR=/home/rcs_version_control
  if [ "$RCSDIR" = "" -o ! -d $RCSDIR ]; then
          print "\nImenik RCSDIR=$RCSDIR ne obstaja!!"
          print "\nPrekinjam program ... in ga konèujem...\n"
          exit
  fi
  #echo "RCSDIR je : $RCSDIR"

  # Èe je kot argument podano ime imenika, potem prevzemi vse
  # datoteke samo za ta imenik in konèaj.
  if [ "$1" != "" ]; then
          (cd $RCSDIR; find $1 -type d -print ) |
          while read DIRNAME
          do
                  #echo DIRNAME=$DIRNAME
                  #DIRNAME=c_src
                  #Korenski imenik RCS in ime imenika naj bosta relativna na rcs root dir
                  tmpaa=` basename $DIRNAME `
                  if [ "$tmpaa" != "RCS" ]; then
                          check_out_directory $RCSDIR $DIRNAME
                  fi
          done
  else
          (cd $RCSDIR; find * -type d -print ) |
          while read DIRNAME
          do
                  echo DIRNAME=$DIRNAME
                  #DIRNAME=c_src
                  # Korenski imenik RCS in ime imenika naj bosta relativna na rcs root dir
                  tmpaa=` basename $DIRNAME `
                  if [ "$tmpaa" != "RCS" ]; then
                          check_out_directory $RCSDIR $DIRNAME
                  fi
          done
  fi
  ______________________________________________________________________


  12.2.  cofiles.sh


  ______________________________________________________________________
  #!/bin/ksh

  # cofiles.sh (Lupinski skript za prevzemanje datotek)
  # cofiles.sh - Prevzemi vse datoteke v trenutnem imeniku iz RCS
  # Oglejte si tudi cotree.sh in 'man rcsclean'

  if [ ! -d RCS ]; then
          print "\nImenik RCS ne obstaja!!"
          print "\nPrekinjam program ... in ga konèujem...\n"
          exit
  fi

  #echo "No. of args = " $# " and all args " $@

  while true
  do
          print -n "\n\nPrevzamem vse datoteke s pravicami branja in pisanja (read-write)? <d/n> [n]: "
          read ans
          if [ "$ans" = "" -o "$ans" = "n" -o "$ans" = "N" ]; then
                  ans="N"
                  break
          elif [ "$ans" = "d" -o "$ans" = "D" ]; then
                  ans="D"
                  break
          else
                  print "\nNapaèen vnos! Poskusite znova!!"
          fi
  done
  #echo "The ans is : " $ans

  if [ $# -eq 0 ]; then
          # 'ls RCS' ne uspe v primeru ime_datoteke=vzorec,vv v RCS/vzorec,vv,v
          # ls RCS | cut -d',' -f1 | xargs co
          # Uporabite ujemanje, da se ime konèa z $, kot je razvidno spodaj -
          if [ "$ans" = "D" ]; then
                  ls RCS | sed -e's/,v$//g' | xargs co -l
          else
                  ls RCS | sed -e's/,v$//g' | xargs co
          fi
  elif [ $# -eq 1 ]; then
          if [ -f "RCS/$1,v" ]; then
                  # V tem primeru bo $1 kot dbalter.sql
                  # in ne kot db*.sql....
                  #echo "One arg, no. of args = " $# " and all args " $@
                  if [ "$ans" = "D" ]; then
                          co -l "$1"
                  else
                          co "$1"
                  fi
          else
                  # V primeru, ko je $1=db*.sql in v trenutnem imeniku
                  # ni nobenega db*.sql
                  #echo "No files... no. of args = " $# " and all args " $@
                  tmpaa="RCS/$1,v"  # bo kot RCS/db*.sql,v
                  ls $tmpaa | \
                  while read ii
                  do
                          #echo "ii is : $ii"
                          if [ "$ans" = "D" ]; then
                                  co -l "$ii"
                          else
                                  co "$ii"
                          fi
                  done
          fi
  else
          for ii in $@
          do
                  #echo "ii is : $ii,v"
                  if [ "$ans" = "D" ]; then
                          co -l "$ii"
                  else
                          co "$ii"
                  fi
          done
  fi
  ______________________________________________________________________


  12.3.  ciall.sh


  ______________________________________________________________________
  #!/bin/ksh

  # ciall.sh (Lupinski skript za vlaganje datotek)
  # ciall.sh - Vlo¾i vse datoteke v trenutnem imeniku v RCS
  # Ta skript je zelo koristen za vlaganje ogromnega ¹tevila novih datotek
  # v RCS. Prihrani èas, ker ni potrebno tipkati "opisa" za vsako datoteko.
  # Za datoteke, ki so ¾e v RCS, izvede obièajen ukaz check-in.


  # Pretvorba imen datotek v male èrke:
  # 'tr', see 'man tr'
  #ls * | \
  #while read ii
  #do
  #       jj=`echo $ii | tr [A-Z] [a-z] `
  #       echo "ii is : $ii"
  #       echo "jj is : $jj"
  #       mv $ii $jj
  #done

  if [ ! -d RCS ]; then
          print "\nImenik RCS ne obstaja!!"
          print "\nImenik RCS bo narejen sedaj ...\n"
          mkdir RCS
  fi

  print "\n\nOpomba: To ni dnevni¹ko sporoèilo!"
  print "Prosim, vnesite opis (uporabil se bo za"
  print -n "vse vlo¾ene datoteke) : "
  read description

  # Izbira prune ne deluje, uporabi -maxdepth 0
  #find * -prune -type f |

  # ©tevilo podanih izbir je niè ali veè....
  if  [ $# -eq 0 ]; then
          listoffiles="*"
  else
          listoffiles="$@"
  fi

  # Izbira prune ne deluje, uporabi -maxdepth 0
  #find $listoffiles -prune -type f |
  find $listoffiles -maxdepth 0 -type f |
  while read ii
  do
          #echo $ii
          if [ -f "RCS/$ii,v" ]; then
                  #print "The file $ii already in RCS"
                  ci -m"$description" $ii
          else
                  #print "The file $ii is new file"
                  ci $ii << EOF
  $description
  EOF
          fi
  done
  ______________________________________________________________________


  13.  Izbolj¹anje uèinkovitosti stre¾nika CVS

  Za optimalno uèinkovitost mora stre¾nik CVS teèi na samostojnem
  raèunalniku z Linuxom/Unixom.
  Da boste iztisnili èimveè procesorske moèi, naredite naslednje:

  ·  Ponovno prevedite Linuxovo jedro, da bo manj¹e in zanesljivej¹e.
     Odstranite dele, ki se ne uporabljajo. Oglejte si spis Kernel-HOWTO
     na naslovu <http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html>


  ·  Izkljuèite nepotrebne Unixove procese. Na sistemih z Linuxom/Unixom
     po¾enite chkconfig.

     ___________________________________________________________________
     bash$ su - root
     bash# man chkconfig
     bash# chkconfig --help
     bash# chkconfig --list | grep on | less
     S seznama, ki ga dobite na zgornji naèin, odstranite procese, za katere ne
     ¾elite, da se za¾enejo samodejno.
     bash# chkconfig --level 0123456 <ime procesa> off
     Ko naslednjiè vkljuèite raèunalnik, se ti procesi ne bodo veè zagnali.
     Sedaj vse procese, ki ste jih odstranile s seznama, odstranite ¹e roèno.
     bash# cd /etc/rc.d/init.d
     bash# ./<ime procesa> stop
     ___________________________________________________________________


  ·  Ne poganjajte ostalih nepotrebnih programov.


  ·  Ne pustite sistema X Window, da teèe brez potrebe, ker njegovi
     procesi zasedajo pomnilnik in prispevajo k obremenitvi procesorja.
     Lahko tudi predstavlja resno varnostno luknjo za zunanje napade.
     Ponavadi se uporabljajo okenski upravniki kot KDE, GNOME, CDE, XDM
     in drugi.  Sistem X Window morate zapustiti takoj po uporabi in
     veèino èasa bi na raèunalniku s stre¾nikom CVS morali videti
     prijavni odzivnik v ukazni vrstici.


  14.  Sistem za sporoèanje problemov

  Skupaj s CVS boste morda ¾eleli uporabljati sistem za sledenje
  projekta (angl. Project Tracking system) ali sistem za sporoèanje
  problemov (angl.  Problem Reporting system. Vsak programski projekt
  potebuje sistem za sporoèanje problemov, kjer se sledijo hro¹èi in se
  jih posreduje razliènim razvijalcem.  Oglejte si projekt GNU gpl GNATS
  na naslovu <http://www.gnu.org/software/gnats/gnats.html> in
  <http://dcl.sourceforge.net>.  Komercialni sistem za sporoèanje
  problemov si lahko ogledate na <http://www.stonekeep.com>, poi¹èite ¹e
  sistem za sledenje projekta.


  15.  Orodja za upravljanje s konfiguracijskami datotekami

  Kaj je upravljanje konfiguracijskih datotek (angl. configuration
  management)?

  Obstaja veè razliènih razlag.  Nana¹a se na sledenje in nadzor nad
  razvojem programske opreme ter s tem povezane aktivnosti. To pomeni
  upravljanje razvoja programskih projektov z vidiki kot so, da veè
  razvijalcev istoèasno dela z istimi deli kode, ki bo namenjena
  razliènim konènim sistemom, podpora veèim razlièicam in nadzor statusa
  kode (npr. preizkusne beta razlièice proti pravim razlièicam). Tudi v
  tem pogledu je veè razliènih razlag:

  ·  Tradicionalen nadzor nad vlogami in prevzemi izvorne kode (in
     vèasih tudi prevedenih programov) in mo¾nost prevajanja entitet.
     Vkljuèene so lahko tudi ostale funkcije.

  ·  Upravljanje procesov - nadzor aktivnosti pri razvoju programske
     opreme.  Na primer, mo¾nost zagotoviti, da obstaja zahteva po
     spremembi, ki je bila odobrena in da so bile aktivnosti kot
     oblikovanje, dokumentacija in preizkus konèane pred dovoljenjem za
     ponovno "vlaganje" kode.

  Medtem ko sta upravljanje procesov in nadzor potrebna za ponavljajoè
  in optimiziran razvojni proces, so trdni temelji upravljanja s
  konfiguracijskimi datotekami nujni za ta proces.

  Obi¹èite naslednje povezave:

  ·  Odgovori na pogosto zastavljana vpra¹anja o orodjih za upravljanje
     s konfiguracijskimi datotekami:
     <http://www.iac.honeywell.com/Pub/Tech/CM/CMFAQ.html>

  ·  Linux version control and configuration management tools
     <http://linas.org/linux/cmvc.html>

  ·  Configuration Management systems
     <http://www.cmtoday.com/yp/commercial.html>

  ·  Configuration Management Tools
     <http://www.iac.honeywell.com/Pub/Tech/CM/CMTools.html>

  ·  DevGuy CVS config mgmt  <http://devguy.com/fp/cfgmgmt/cvs>

  ·  Yahoo category site
     <http://dir.yahoo.com/Computers_and_Internet/software/programming_tools/software_engineering/configuration_management/cvs___concurrent_versions_system>

  ·  Free config mgmt tool
     <http://www.canb.auug.org.au/~millerp/aegis/aegis.html>

  ·  Free CM tools  <http://www.loria.fr/cgi-bin/molli/cm/wilma/fcmt>

  ·  Rational ClearCase tool
     <http://www.rational.com/products/clearcase/prodinfo.jsp>

  16.  Podobne strani

  Podobne strani lahko najdete na:

  ·  Linux goodies  <http://www.aldev.8m.com> in zrcalnih straneh:
     <http://aldev0.webjump.com>, angelfire
     <http://www.angelfire.com/country/aldev0>, geocities
     <http://www.geocities.com/alavoor/index.html>, virtualave
     <http://aldev0.virtualave.net>, 50megs <http://aldev0.50megs.com>,
     theglobe <http://members.theglobe.com/aldev1/index.html>, NBCi
     <http://members.nbci.com/alavoor>, Terrashare
     <http://aldev.terrashare.com>, Fortunecity
     <http://members.fortunecity.com/aldev>, Freewebsites
     <http://aldev.freewebsites.com>, Tripod
     <http://members.tripod.lycos.com/aldev>, Spree
     <http://members.spree.com/technology/aldev>, Escalix
     <http://www.escalix.com/freepage/aldev>, Httpcity
     <http://www.httpcity.com/aldev/index.html>, Freeservers
     <http://aldev.freeservers.com>.

  ·  CVS Bubbles  <http://www.loria.fr/~molli/cvs-index.html>

  ·  CSSC (SCCS like system) <http://cssc.sourceforge.net> in zrcalni
     strani <ftp://alpha.gnu.org/pub/gnu/CSSC>
  ·  SCCS za Linux  <http://www.bitmover.com/bitkeeper>

  17.  SCCS proti CVS-RCS

  SCCS (angl. Source Code Control System, sistem za nadzor izvorne kode)
  se niè veè ne razvija in izbolj¹uje.  Splo¹no mnenje je, da je to
  orodje povr¹no in ni primerno za veliko ¹tevilo uporabnikov, ki delajo
  na enem projektu.  Pravzaprav SCCS prepleta vse razlièice, vendar
  lahko obèutno upoèasni. razvoj novih razlièic. Zatorej se sistem SCCS
  NE priporoèa za zaèetek novih projektov. Kljub temu ga tu in tam ¹e
  vedno sreèamo zaradi podpore starej¹im bazam izvorne kode v SCCS.

  RCS (angl. Revision Control System, sistem za nadzor revizij) je po
  pogostnem mnenju bolj¹i od SCCS. En vzrok tièi v dejstvu, da se hrani
  najnovej¹a razlièica in razlike za starej¹e razlièice glede na
  najnovej¹o, zaradi èesar je razvoj novih razlièic hitrej¹i. Dodatne
  razprave na temo SCCS proti RCS lahko najdete na naslovu
  <http://www.faqs.org/faqs/unix-faq/faq/part7>.

  Upo¹tevajte, da se je RCS uèil na napakah SCCS...

  CVS, ki za delovanje zahteva RCS, raz¹iri RCS tako, da nadzira hkratno
  urejanje izvorne kode veèih uporabnikov, ki delajo na izdajah,
  zgrajenih iz hierarhiènih mno¾ic imenikov. "Èe je RCS zbirni jezik, je
  CVS Pascal".


  18.  Ostali zapisi tega dokumenta

  Ta dokument je izdan v 14 razliènih zapisih in sicer: DVI, Postscript,
  Latex, Adobe Acrobat PDF, LyX, GNU-info, HTML, RTF(Rich Text Format),
  tekst, Unixove priroèni¹ke strani, datoteka HTML file, SGML (zapis
  Linuxdoc), SGML (zapis Docbook) in zapis MS WinHelp.

  Ta dokument se nahaja na naslovu:

  ·  <http://www.linuxdoc.org>, kliknite na HOWTOs in ga poi¹èite med
     dokumenti howto s pomocjo tipk CTRL+f ali ALT+f znotraj va¹ega
     brskalnika.

  Ta dokument lahko najdete tudi na naslednjih naslovih:

  ·  <http://www.caldera.com/LDP/HOWTO>

  ·  <http://www.linux.ucla.edu/LDP>

  ·  <http://www.cc.gatech.edu/linux/LDP>

  ·  <http://www.redhat.com/mirrors/LDP>

  ·  Ostale zrcalne strani v va¹i bli¾ini lahko najdete na
     <http://www.linuxdoc.org/mirrors.html>, kjer izberete najbli¾jo
     stran in greste v imenik /LDP/HOWTO/xxxxx-HOWTO.html.


  ·  Ta dokument lahko dobite tudi v eni arhivski datoteki (tar) z
     zapisi HTML, DVI, Postscript ali SGML na naslovih:
     <ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO/other-formats/> in
     <http://www.linuxdoc.org/docs.html#howto>.


  ·  Dokument zapisan v golem tekstu najdete na:
     <ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO> in
     <http://www.linuxdoc.org/docs.html#howto>.

  ·  Celoten dokument v eni datoteki HTML se nahaja na:
     <http://www.linuxdoc.org/docs.html#howto>.

     Enovito datoteko HTML dobite (glejte ¹e man sgml2html) z ukazom:
     sgml2html -split 0   xxxxhowto.sgml


  ·  Prevode dokumenta v druge jezike, npr. franco¹èino, nem¹èino,
     ¹pan¹èino, kitaj¹èino in japon¹èino najdete na:
     <ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO> in
     <http://www.linuxdoc.org/docs.html#howto> Vsakr¹na va¹a pomoè pri
     prevajanju v druge jezike bo dobrodo¹la.

     Dokument je napisan z uporabo orodij "SGML-Tools", ki jih lahko
     dobite na naslovu: <http://www.sgmltools.org>.  Po prevajanju
     izvorne kode boste dobili mno¾ico ukazov, npr.:

  ·  sgml2html xxxxhowto.sgml     (za izdelavo datotke HTML)

  ·  sgml2html -split 0   xxxxhowto.sgml (za izdelavo enovite datoteke
     HTML)

  ·  sgml2rtf  xxxxhowto.sgml     (za izdelavo datoteke RTF)

  ·  sgml2latex xxxxhowto.sgml    (za izdelavo datoteke Latex)

  18.1.  Zapis Acrobat PDF

  Datoteka v zapisu PDF se lahko izdela iz zapisa v Postscriptu z
  uporabo bodisi programa Acrobat distill bodisi z Ghostscriptom.
  Datoteko v zapisu Postscript izdelate iz zapisa DVI, le tega pa iz
  zapisa v Latexu.  Programsko opremo Distill lahko poberete z naslova
  <http://www.adobe.com>. Spodaj je podan vzorèni postopek za izdelavo
  datoteke v zapisu PDF:

  ______________________________________________________________________
  bash$ man sgml2latex
  bash$ sgml2latex dokument.sgml
  bash$ man dvips
  bash$ dvips -o dokument.ps dokument.dvi
  bash$ distill dokument.ps
  bash$ man ghostscript
  bash$ man ps2pdf
  bash$ ps2pdf vhod.ps izhod.pdf
  bash$ acroread izhod.pdf &
  ______________________________________________________________________


  Lahko pa uporabite Ghostscriptov ukaz Ps2pdf.  Ps2pdf je nekak¹en
  nadomestek s skoraj vso funkcionalnostjo izdelka Adobe Acrobat Dis­
  tiller: pretvarja datoteke v Postscriptu v zapis Portable Document
  Format (PDF).  Ps2pdf je izveden kot zelo kratek ukazni skript
  (paketna datoteka), ki klièe Ghostscript in izbere posebno "izhodno
  napravo" z imenom pdfwrite. Da bo Ps2pdf deloval, mora biti "naprava"
  pdfwrite ob prevajanju Ghostscripta vkljuèena v datoteko Makefile;
  glede podrobnosti si oglejte dokumentacijo o postavljanju
  Ghostscripta.

  18.2.  Pretvorba zapisa Linuxdoc v Docbook

  Ta dokument je napisan v zapisu Linuxdoc SGML. Zapis Docbook SGML je
  njegov naslednik in ima precej veè znaèilnosti kot Linuxdoc. Linuxdoc
  je zelo enostaven za uporabo. Èe ¾elite pretvoriti zapis Linuxdoc SGML
  v Docbook SGML, uporabite program ld2db.sh in nekaj skriptov v Perlu.
  Izpis programa Ld2db ni 100% èist, zato boste potrebovali skript
  clean_ld2db.pl, napisan v Perlu. Lahko se zgodi, da boste morali nekaj
  vrstic v dokumentu popraviti roèno.

  ·  Poberite program Ld2db z naslova
     <http://www.dcs.gla.ac.uk/~rrt/docbook.html> ali s strani Al Dev
     site <http://www.aldev.8m.com/cppsrc.html>

  ·  Poberite skript v Perlu cleanup_ld2db.pl s strani Al Dev site
     <http://www.aldev.8m.com/cppsrc.html>

     Programcek ld2db.sh ni 100% èist, zato bo ob njegovem zagonu pri¹lo
     do nekaterih napak.

     ___________________________________________________________________
             bash$ ld2db.sh file-linuxdoc.sgml db.sgml
             bash$ cleanup.pl db.sgml > db_clean.sgml
             bash$ gvim db_clean.sgml
             bash$ docbook2html db.sgml
     ___________________________________________________________________


  Po zagonu skripta v Perlu boste morda morali roèno popraviti nekaj
  manj¹ih napak. Na primer, za vsak < Listitem> boste morali vnesti
  zapiralmo oznako < /Para>.

  18.3.  Pretvorba v zapis MS WinHelp

  Dokument v zapisu SGML lahko pretvorite v zapis Microsoft Windows
  Help.  Najprej pretvorite SGML v HTML:

  ______________________________________________________________________
          bash$ sgml2html xxxxhowto.sgml     (izdelava datotek HTML)
          bash$ sgml2html -split 0   xxxxhowto.sgml (izdelava enovite datoteke HTML)
  ______________________________________________________________________


  Zatem uporabite pripomoèek HtmlToHlp <http://javadocs.planetmir­
  ror.com/htmltohlpe.html>.  Lahko pa tudi izvedete Sgml2rtf in zatem
  zapis RTF pretvorite v winhelp.

  18.4.  Ogled razliènih zapisov

  Èe si ¾elite ogledati dokument v zapisu DVI, uporabite program Xdvi,
  ki ga dobite v paketu tetex-xdvi*.rpm (Redhat Linux) in najdete v
  meniju ControlPanel | Applications | Publishing | TeX.  Dokument v
  zapisu DVI lahko berete z ukazom:


               xdvi -geometry 80x90 howto.dvi
               man xdvi


  Velikost okna lahko spreminjate z mi¹ko.  Po dokumentu se pomikate s
  smerni¹kimi tipkami, Page Up/Down, lahko pa tudi s tipkami 'f', 'd',
  'u', 'c', 'l', 'r', 'p', 'n' za pomik gor, navzdol, na sredino,
  naslednjo oz. prej¹njo stran ipd.  S tipko 'x' izklopite meni.

  Datoteko v zapisu Postscript si lahko ogledate s programoma 'Gv'
  (Ghostview) ali 'Ghostscript'. Program 'Ghostscript' se nahaja v
  paketu ghostscript*.rpm Gv pa v paketu gv*.rpm (Redhat Linux), do
  njiju pa pridete preko menijev ControlPanel | Applications | Graphics.
  Program Gv je uporabniku precej prijaznej¹i kot Ghostscript. Oba
  programa sta na voljo tudi za druge operacijske sisteme, npr. OS/2,
  Windows 95 in NT. Ta dokument si lahko ogledate tudi na omenjenih
  operacijskih sistemih.
  ·  Ghostscript za Windows 95, OS/2, in vse druge operacijske sisteme
     dobite na naslovu  <http://www.cs.wisc.edu/~ghost>.

  Dokument v zapisu Postscript si lahko ogledate z ukazom:


                       gv howto.ps
                       ghostscript howto.ps


  Dokument v zapisu HTML si lahko ogledate s pomoèjo Netscape
  Navigatorja, Microsoft Internet Explorerja, Redhat Baron Web browserja
  ali kateregekoli izmed preostalih 10 spletnih brskalnikov.

  Dokumente v zapisih Latex in LyX si lahko ogledate s programom LyX -
  vmesnikom za LaTeX v okolju X Window.


  19.  Avtorske pravice in licenca

  (C) Al Dev (Alavoor Vasudevan) 1998-2000.

  Licenca je GNU GPL, zahteva se ¹e, da avtorjevo ime in elektronski
  naslov ostaneta na vseh izvodih.

  20.  sget

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.


  ______________________________________________________________________
  #!/bin/ksh

  # CVS program sget
  # Program za prevzem datoteke v naèinu "samo za branje"iz CVS

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  Usage()
  {
          print "\nUporaba: $cmdname [-r stevilka_revizije/simbolicno_ime_oznake] <ime datoteke/imenika> "
          print "Moznost -r je neobvezna "
          print "Na primer - "
          print "       $cmdname -r 1.1 foo.cpp"
          print "       $cmdname foo.cpp "
          print "       $cmdname nek_imenik "
          print "Izvlece po simbolicni oznaki revizije kot - "
          print "       $cmdname -r REVISION_1 some_directory "
          print " "
          exit
  }

  # Ukaz getopt ne bo vec podprt v naslednji izdaji.
  # Namesto njega uporabljamo getopts.
  while getopts r: ii
  do
          case $ii in
          r) FLAG1=$ii; OARG1="$OPTARG";;
          ?) Usage; exit 2;;
          esac
  done
  shift ` expr $OPTIND - 1 `

  #echo FLAG1 = $FLAG1 , OARG1 = $OARG1

  if [ $# -lt 1 ]; then
          Usage
  fi

  bkextn=sget_bak

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  cur_dir=`pwd`
  #echo $cur_dir

  len=${#homedir}
  len=$(($len + 2))
  #echo $len

  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir je : " $subdir
  tmpaa=`dirname $1`
  if [ "$tmpaa" = "." ]; then
          fname=$1
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename $1`
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  #echo "subdir je : " $subdir
  #echo "fname je : " $fname

  # Preveri, ali datoteka ze obstaja....
  if [ -f "$HOME/$subdir/$fname" ]; then
          tmpaa="$HOME/$subdir/$fname"
          user_perms=" "
          group_perms=" "
          other_perms=" "
          user_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b3-3 `
          group_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b6-6 `
          other_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b9-9 `
          if [ "$user_perms" = "w" -o "$group_perms" = "w"  \
                          -o "$other_perms" = "w" ]; then
                  print "\nNapaka: Datoteko je mogoce spreminjati. Opuscam $cmdname ......"
                  print "          Naredite rezervno kopijo, izvedite scommit ali izbrisite datoteko in"
                  print "          poskusite s $cmdname znova.\n"
                  exit
          fi
  fi

  # Prestavi datoteko
  mkdir -p "$HOME/$subdir"
  touch "$HOME/$subdir/$fname" 2>/dev/null
  \mv -f "$HOME/$subdir/$fname" "$HOME/$subdir/$fname.$bkextn"

  # Naredi podlupino
  (
          cd $homedir

          # Uporabi izbiro -A za izbris vseh lepljivih zastavic
          if [ "$FLAG1" = "" ]; then
                  if [ "$subdir" = "." ]; then  # ne uporabi pike, ker bo zmedla CVS
                          cvs -r checkout -A $fname
                  else
                          cvs -r checkout -A "$subdir/$fname"
                  fi
          else
                  if [ "$subdir" = "." ]; then  # ne uporabi pike, ker bo zmedla CVS
                          cvs -r checkout -A -$FLAG1 $OARG1 $fname
                  else
                          cvs -r checkout -A -$FLAG1 $OARG1 "$subdir/$fname"
                  fi
          fi
  )
  #pwd

  if [ -f "$HOME/$subdir/$fname" ]; then
          print "\nPridobljena kopija datoteke $subdir/$fname samo za branje."
          print "Dokoncan $cmdname"
          #print "\nNasvet: $cmdname <ime datoteke/imenika> \n"
  fi
  ______________________________________________________________________


  21.  sedit

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.

  ______________________________________________________________________
  #!/bin/ksh
  # CVS program sedit
  # Program za prevzem datotek iz CVS v naèinu branje in pisanje z zaklepanjem

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  Usage()
  {
  #       print "\nUporaba: $cmdname [-r stevilka_revizije] [-F] <ime_datoteke>"
  #       print "Izbiri -r, -F sta neobvezni"
  #       print "Izbira -F prisili k urejanju tudi, ce je datoteko "
  #       print "nekdo ze zaklenil"

          print "\nUporaba: $cmdname [-r stevilka_revizije] <ime_datoteke>"
          print "Izbira -r je neobvezna "

          print "Na primer - "
          print "       $cmdname -r 1.1 foo.cpp"
          print "       $cmdname foo.cpp "
  #       print "       $cmdname -F foo.cpp "
          print " "
  }

  # Ukaz getopt ne bo vec podprt v naslednji izdaji.
  # Namesto njega uporabimo getopts.
  #while getopts r:F ii
  while getopts r: ii
  do
          case $ii in
          r) FLAG1=$ii; OARG1="$OPTARG";;
  #       F) FLAG2=$ii; OARG2="$OPTARG";;
          ?) Usage; exit 2;;
          esac
  done
  shift ` expr $OPTIND - 1 `

  #echo FLAG1 = $FLAG1 , OARG1 = $OARG1

  if [ $# -lt 1 ]; then
          Usage
          exit
  fi

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  bkextn=sedit_bak

  cur_dir=`pwd`
  #echo $cur_dir
  len=${#homedir}
  len=$(($len + 2))
  #echo $len

  subdir=` echo $cur_dir | cut -b $len-2000 `
  tmpaa=`dirname $1`
  if [ "$tmpaa" = "." ]; then
          fname=$1
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename $1`
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  #echo "subdir je : " $subdir
  #echo "fname je : " $fname

  # Ce je datoteko ze kdo prevzel....
  cvs_root=` echo $CVSROOT | cut -f1 -d' '  `
  if [ "$cvs_root" = "" ]; then
          print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n"
          exit
  fi
  mkdir -p "$CVSROOT/$subdir/Locks" 2>/dev/null

  if [ ! -e "$CVSROOT/$subdir/$fname,v" ]; then
          print "\nNapaka: datoteke $fname ni v skladiscu CVS!!\n"
          exit
  fi

  # Imenik CVS v vasem lokalnem imeniku je nujno potreben za delovanje vseh ukazov..
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja."
                  print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj poskusi izdelati CVS in v lokalnem imeniku s sget.
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # ne uporabljaj pike, ki lahko zmede CVS
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  # Dobi stevilko revizije datoteke....
  # Uporabi tmpfile ker argumentov ni mogoce nastavljati znotraj podlupine.
  tmpfile=$homedir/sedit-lock.tmp
  \rm -f $tmpfile 2>/dev/null
  if [ "$FLAG1" = "" ]; then
          (
          cd $homedir
                  if [ "$subdir" = "." ]; then  # ne uporabi pike, ki lahko zmede CVS
                          cvs log $fname | head -6 | grep head: | awk '{print $2}' > $tmpfile
                  else
                          cvs log "$subdir/$fname" | head -6 | grep head: | awk '{print $2}' > $tmpfile
                  fi
          )
          OARG1=`cat $tmpfile`
          \rm -f $tmpfile 2>/dev/null
  fi

  lockfile="$CVSROOT/$subdir/Locks/$fname-$OARG1"
  #echo "lockfile je : " $lockfile
  #if [ -e $lockfile -a "$FLAG2" = "" ]; then
  if [ -e $lockfile ]; then
          print "\nNapaka: Datoteka $fname revizije $OARG1 je ze zaklenjena!!"
          aa=` ls -l $lockfile | awk '{print "Zaklenil jo je " $3}' `
          print $aa
          print "Ta razvijalec naj izvede scommit ALI sunlock, da jo bo odklenil."
          print " "
  #       print "Uporabite lahko tudi izbiro -F, da prisilite datoteko k urejanju,"
  #       print "tudi ce jo je kdo drug zaklenil. Toda najprej se morate"
  #       print "z njim pogovoriti, da lahko z datoteko delata hkrati."
  #       print "Na primer - ta moznost je koristna, ce delate na loceni"
  #       print "funkctiji v jeziku C++ v datoteki, ki ne moti ostalih"
  #       print "razvijalcev."
  #       print " "
          exit
  fi

  # Sedaj dobi kopijo samo za branje....
  if [ ! -e "$HOME/$subdir/$fname" ]; then
          (
          cd $homedir
                  if [ "$subdir" = "." ]; then  # ne uporabljaj pike, ki lahko zmede CVS
                          cvs -r checkout $fname 1>/dev/null
                  else
                          cvs -r checkout "$subdir/$fname" 1>/dev/null
                  fi
          )
  fi

  # Preveri, ali datoteka ze obstaja....
  tmpaa="$HOME/$subdir/$fname"
  if [ -f $tmpaa ]; then
          user_perms=" "
          group_perms=" "
          other_perms=" "
          user_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b3-3 `
          group_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b6-6 `
          other_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b9-9 `
          if [ "$user_perms" = "w" -o "$group_perms" = "w"  \
                          -o "$other_perms" = "w" ]; then
                  print "\nNapaka: datoteko je mogoce spreminjati. Opuscam $cmdname ......"
                  print "          Narediti morate rezervno kopijo, izvesti scommit ali zbrisati datoteko in"
                  print "          poskusiti s $cmdname znova.\n"
                  exit
          fi
          #print "\nOpomba: datoteka $tmpaa je samo za branje."
          #print "Zato jo prestavljam v $tmpaa.$bkextn ....\n"
          \mv -f $tmpaa $tmpaa.$bkextn
          chmod 444 $tmpaa.$bkextn
  elif [ -d $tmpaa ]; then
          print "\nNapaka: $tmpaa je imenik in NE datoteka. Opuscam $cmdname ....\n"
          exit
  fi

  # Naredi podlupino
  print "\nSedaj dobivam datoteko $fname iz skladisca CVS ...\n"
  (
          cd $homedir
          # Uporabljam izbiro -A, da zbrisem lepljivo oznako in da dobim
          # razlicico glavne revizije
          if [ "$FLAG1" = "" ]; then
                  if [ "$subdir" = "." ]; then  # ne uporabljaj pike, ki lahko zmede CVS
                          cvs -w checkout -A $fname
                  else
                          cvs -w checkout -A "$subdir/$fname"
                  fi
          else
                  if [ "$subdir" = "." ]; then  # ne uporabljaj pike, ki lahko zmede CVS
                          cvs -w checkout -A -$FLAG1 $OARG1 $fname
                  else
                          cvs -w checkout -A -$FLAG1 $OARG1 "$subdir/$fname"
                  fi
          fi
  )

  if [ -e "$HOME/$subdir/$fname" ]; then
          # Zaklenjena datoteka je $CVSROOT/$subdir/Locks/$fname-$OARG1
          touch $lockfile
          if [ -e $lockfile ]; then
                  print "\nKoncan $cmdname."
          else
                  print "\nUsodna napaka: datoteka $fname revizije $OARG1 ni zaklenjena !!"
                  print "\nPreverite vzrok za to napako.. pred nadaljevanjem..."
          fi
  fi

  #pwd

  #print "\nNasvet: $cmdname <ime_datoteke> \n"
  ______________________________________________________________________


  22.  scommit

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.


  ______________________________________________________________________
  #!/bin/ksh
  # CVS program scommit
  # Program za udejanjenje sprememb in vnos datotek v CVS

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  Usage()
  {
          print "\nUporaba: $cmdname [-r stevilka_revizije] <ime_datoteke>"
          print "Moznost -r je neobvezna"
          print "Na primer - "
          print "       $cmdname -r 1.1 foo.cpp"
          print "       $cmdname foo.cpp "
          print " "
  }

  # Ukaz getopt v naslednji izdaji ne bo vec podprt.
  # Namesto njega uporabljam getopts.
  while getopts r: ii
  do
          case $ii in
          r) FLAG1=$ii; OARG1="$OPTARG";;
          ?) Usage; exit 2;;
          esac
  done
  shift ` expr $OPTIND - 1 `

  #echo FLAG1 = $FLAG1 , OARG1 = $OARG1

  if [ $# -lt 1 ]; then
          Usage
          exit 2
  fi

  if [ -d $1 ]; then
          Usage
          exit 2
  fi

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  # Poisci podimenik
  cur_dir=`pwd`
  #echo $cur_dir
  len=${#homedir}
  len=$(($len + 2))
  #echo $len

  subdir=` echo $cur_dir | cut -b $len-2000 `
  tmpaa=`dirname $1`
  if [ "$tmpaa" = "." ]; then
          fname=$1
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename $1`
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  # echo "subdir je : " $subdir
  # echo "fname je : " $fname

  # Ce je datoteko ze kdo prevzel....
  cvs_root=` echo $CVSROOT | cut -f1 -d' '  `
  if [ "$cvs_root" = "" ]; then
          print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n"
          exit
  fi
  mkdir -p "$CVSROOT/$subdir/Locks" 2>/dev/null

  # pri vseh ukazih je zahtevan imenik CVS v vasem lokalnem imeniku...
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja."
                  print "Najprej morate izvesti sget na imeniku `basename $subdir`. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj poskusi izdelati CVS v lokalnem imeniku s sget
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # ne uporabljaj pike, ki lahko zmede CVS
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  # Ugotovi stevilko delovne revizije za datoteko....
  # Uporaba tmpfile kot argumenta se ne more nastaviti znotraj podlupine
  tmpfile=$homedir/sedit-lock.tmp
  \rm -f $tmpfile 2>/dev/null
  if [ "$FLAG1" = "" ]; then
          (
          cd $homedir
                  if [ "$subdir" = "." ]; then  # ne uporabljaj pike, ki lahko zmede CVS
                          cvs status $fname 2>/dev/null | grep "Working revision:" | awk '{print $3}' >$tmpfile
                  else
                          cvs status "$subdir/$fname" 2>/dev/null | grep "Working revision:" | awk '{print $3}' >$tmpfile
                  fi
          )
          OARG1=`cat $tmpfile`
          \rm -f $tmpfile 2>/dev/null
  fi

  if [ "$OARG1" = "" ]; then
          print "Datoteka $subdir/$fname je NOVA, zato je ni v skladiscu CVS."
  else
          lockfile="$CVSROOT/$subdir/Locks/$fname-$OARG1"

          if [ -e $lockfile ]; then
                  # Preveri, ali revizija pripada vam...
                  aa=` ls -l $lockfile | awk '{print $3}' `
                  userid=`id | cut -d'(' -f2 | cut -d')' -f1 `
                  if [ "$aa" != "$userid" ]; then
                          print " "
                          print "Datoteke $subdir/$fname NISTE zaklenili vi!!"
                          print "Zaklenil jo je uporabnik $aa , vase uporabnisko ime pa je $userid ."
  #                       print "Ce delate socasno z drugim razvijalcem"
  #                       print "in ste pri sedit uporabili izbiro -F,"
                          print "morate pocakati, da drug razvijalec izvede scommit"
                          print "ali sunlock."
                          print "Opuscam $cmdname ...."
                          print " "
                          exit 2
                  fi
          else
                  # Datoteka mora obstajati v CVS
                  if [ -f "$CVSROOT/$subdir/$fname,v" ]; then
                          print "Datoteke $subdir/$fname niste zaklenili s sedit!!"
                          print "Opuscam $cmdname ...."
                          exit 2
                  else
                          print "\nDatoteke $subdir/$fname se ni v skladiscu CVS!!"
                          print "Na datoteki $subdir/$fname bi morali izvesti sadd...."
                          exit 2
                  fi
          fi
  fi

  # Deluj znotraj podlupine - in deluj iz korenskega imenika
  (
          cd $homedir

          # Za zadaj ne dovoli udejanjanj imenikov ...
          #if [ -d "$subdir/$fname" ]; then
          #       cvs commit "$subdir/$fname"
          #fi

          if [ "$subdir" = "." ]; then  # ne uporabljaj oike, ki lahko zmede CVS
                  cvs commit $fname
          else
                  cvs commit "$subdir/$fname"
          fi
          exit_status=$?

          if [ $exit_status -eq 0 ]; then
                  lockfile="$CVSROOT/$subdir/Locks/$fname-$OARG1"
                  if [ -e $lockfile ]; then
                          \rm -f $lockfile
                  fi

                  # Potrebno je spremeniti dovoljenja datoteke za primer,
                  # ko ni sprememb datoteke
                  chmod a-w "$HOME/$subdir/$fname"
                  print "\nKoncan $cmdname. $cmdname uspesen."
                  #print "\nNasvet: $cmdname <ime datoteke/imenika>\n"
          fi
  )
  ______________________________________________________________________

  23.  supdate

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.

  ______________________________________________________________________
  #!/bin/ksh

  # CVS program supdate
  # Program za posodobitev datoteke iz CVS v nacinu beri/pisi

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  if [ $# -lt 1 ]; then
          print "\nUporaba: $cmdname <ime_datoteke>"
          exit
  fi

  # Zaradi zascite presledkov v $1 uvedi dvojne narekovaje
  tmpaa="$1"

  # Preveri, ali datoteka ze obstaja....
  if [ $# -gt 0 -a  -f $tmpaa ]; then
          user_perms=" "
          group_perms=" "
          other_perms=" "
          user_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b3-3 `
          group_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b6-6 `
          other_perms=`ls -l $tmpaa | awk '{print $tmpaa }' | cut -b9-9 `
          if [ "$user_perms" = "w" -o "$group_perms" = "w"  \
                          -o "$other_perms" = "w" ]; then
                  while :
                  do
                          print "\n$cmdname bo naredil rezervno kopijo delovne datoteke"
                          print "$tmpaa v $tmpaa.supdate_bak pred kakrsnimkoli spajanjem."
                          print "Ali ste prepricani, da zelite spojiti spremebe iz"
                          print -n "skladisca CVS v vaso delovno datoteko? <d/n> [n]: "
                          read ans
                          if [ "$ans" = "d" -o "$ans" = "D" ]; then
                                  if [ -f $tmpaa.supdate_bak ]; then
                                          print "\nOpozorilo: datoteka $tmpaa.supdate_bak ze obstaja!!"
                                          print "Preglejte datoteko $tmpaa.supdate_bak in jo izbrisite."
                                          print "Zatem poskusite znova s $cmdname "
                                          print "Opuscam $cmdname ...."
                                          exit
                                  else
                                          cp $tmpaa $tmpaa.supdate_bak
                                          break
                                  fi
                          elif [ "$ans" = "n" -o "$ans" = "N" -o "$ans" = "" -o "$ans" = " " ]; then
                                  exit
                          fi
                  done
          fi
  fi

  if [ -d $tmpaa ]; then
          print "\nPosodobitev imenika je onemogocena, ker cvs update"
          print "spaja spremebe iz skladisca v delovni imenik."
          print "Zato podajte ime datoteke za posodobitev - kot je prikazano spodaj: "
          print " Uporaba: $cmdname <ime_datoteke>"
          exit
  #       cvs update
  else
          cvs update $tmpaa
  fi

  print "\nKoncan $cmdname. $cmdname uspesen."
  print "\n\nRezervna kopija prvotne datoteke je v $tmpaa.supdate_bak ."
  print "\nPrvotna datoteka je tako SHRANJENA v $tmpaa.supdate_bak ."
  print "\n\n"
  #print "\nNasvet: $cmdname <ime datoteke/imenika>\n"
  ______________________________________________________________________


  24.  sunlock

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.

  ______________________________________________________________________
  #!/bin/ksh
  # CVS program sunlock
  # Program za odklepanje datotek, za sprostitev kljuèavnice, ki jo naredi sedit

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  Usage()
  {
          print "\nUporaba: $cmdname [-r stevilka_revizije] <ime_datoteke>"
          print "       Izbira -r je neobvezna"
          print "Na primer - "
          print "       $cmdname -r 1.1 foo.cpp"
          print "       $cmdname foo.cpp "
          print " "
  }

  # Ukaz getopt v naslednji izdaji ne bo vec podprt.
  # Namesto njega uporabljam getopts.
  while getopts r: ii
  do
          case $ii in
          r) FLAG1=$ii; OARG1="$OPTARG";;
          ?) Usage; exit 2;;
          esac
  done
  shift ` expr $OPTIND - 1 `

  if [ $# -lt 1 ]; then
          Usage
          exit
  fi

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  cur_dir=`pwd`
  #echo $cur_dir

  len=${#homedir}
  len=$(($len + 2))
  #echo $len

  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir je : " $subdir
  tmpaa=`dirname $1`
  if [ "$tmpaa" = "." ]; then
          fname=$1
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename $1`
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  #echo "subdir je : " $subdir
  #echo "fname je : " $fname

  cvs_root=` echo $CVSROOT | cut -f1 -d' '  `
  if [ "$cvs_root" = "" ]; then
          print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n"
          exit
  fi

  if [ ! -e "$CVSROOT/$subdir/$fname,v" ]; then
          print "\nNapaka: datoteke $fname ni v skladiscu CVS!!\n"
          exit
  fi

  # imenik CVS v vasem lokalnem imeniku je potreben pri vseh ukazih..
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja"
                  print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj s pomocjo sget poskusi izdelati CVS
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # ne uporabljaj pik, ki lahko zmedejo CVS
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  # Ugotovi stevilko zadnje revizije datoteke....
  # Uporabi tmpfile ker argumentov ni mogoce nastavljati v podlupini
  tmpfile=$homedir/sunlock-lock.tmp
  \rm -f $tmpfile 2>/dev/null
  if [ "$FLAG1" = "" ]; then
          # Deluj znotraj podlupine - iz korenskega imenika
          (
          cd $homedir
                  if [ "$subdir" = "." ]; then  # ne uporabljaj pik, ki lahko zmedejo CVS
                          cvs log $fname | head -6 | grep head: | awk '{print $2}' > $tmpfile
                  else
                          cvs log "$subdir/$fname" | head -6 | grep head: | awk '{print $2}' > $tmpfile
                  fi
          )
          OARG1=`cat $tmpfile`
          \rm -f $tmpfile 2>/dev/null
  fi

  lockfile="$CVSROOT/$subdir/Locks/$fname-$OARG1"
  #echo lockfile is : $lockfile
  if [ ! -e $lockfile ]; then
          print "\nDatoteke $fname revizije $OARG1 NI zaklenil nihce."
          print " "
          exit
  fi

  ans=""
  while :
  do
          print "\n\n********************************************************"
          print "POZOR: $cmdname bo sprostil kljucavnico in omogocil ostalim"
          print "       razvijalcem urejanje datoteke. Svetujemo, da"
          print "       shranite spremembe z ukazom scommit."
          print "*********************************************************"
          print -n "\nAli ste prepricani, da zelite odkleniti datoteko <d/n>? [n]: "
          read ans
          if [ "$ans" = "" -o "$ans" = " " -o "$ans" = "n" -o "$ans" = "N" ]; then
                  print "\nOpuscam $cmdname ...."
                  exit
          fi
          if [ "$ans" = "d" -o "$ans" = "D" ]; then
                  print "\n\n\n\n\n "
                  print "POZOR: izgubite lahko vse spremebe, ki ste jih naredili v datoteki!!"
                  print -n "Ali ste prepricani? Ali res zelite odkleniti datoteko <d/n>? [n]: "
                  read ans
                  if [ "$ans" = "d" -o "$ans" = "D" ]; then
                          break
                  elif [ "$ans" = "" -o "$ans" = " " -o "$ans" = "n" -o "$ans" = "N" ]; then
                          exit
                  else
                          print "\n\nNapacen vnos. Poskusite znova..."
                          sleep 1
                  fi
          else
                  print "\n\nNapacen vnos. Poskusite znova..."
                  sleep 1
          fi
  done

  if [ -e $lockfile ]; then
          \rm -f $lockfile
          print "\nKoncan $cmdname ."
  else
          print "\nDatoteka $fname NI zaklenjena."
          print " "
  fi

  ______________________________________________________________________


  25.  slist

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.


  ______________________________________________________________________
  #!/bin/ksh

  # CVS program slist
  # Program za izpis vseh datotek iz CVS, ki se urejajo

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  # Uporaba:
  #               $ slist      (Vse datoteke in podimeniki)
  #               $ slist *.*      (Vse datoteke)
  #               $ slist *      (Vse datoteke in podimeniki)
  #               $ slist ab*      (Vse datoteke, i se zacnejo z ab)

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nPozor: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  cur_dir=`pwd`
  #echo $cur_dir

  len=${#homedir}
  len=$(($len + 2))
  #echo $len

  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir je : " $subdir

  # Ce je datoteko ze kdo prevzel....
  cvs_root=` echo $CVSROOT | cut -f1 -d' '  `
  if [ "$cvs_root" = "" ]; then
          print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n"
          exit
  fi

  # Ce trenutnega imeniskega drevesa ni v korenskem imeniku CVS, koncaj
  if [ ! -d $CVSROOT/$subdir ]; then
          print "\nImenika $subdir ni bilo mogoce najti v $CVSROOT"
          exit
  fi

  #echo "st. parametrov : " $#
  #echo "Argument $ 1 je : " $1
  #echo "vsi argumenti : " $@

  if [ $# -eq 0 ]; then
          #tmpbb=` find * -prune -type d `
          tmpbb=` find * -maxdepth 0 -type d `
  elif [ $# -eq 1 ]; then
          if [ "$1" = "." ]; then
                  #tmpbb=` find * -prune -type d `
                  tmpbb=` find * -maxdepth 0 -type d `
          else
                  if [ -d $1 -a ! -d $CVSROOT/$subdir/$1 ]; then
                          print "\nImenika $subdir/$1 ni v $CVSROOT"
                          exit
                  fi
                  tmpbb=$@
          fi
  else
          tmpbb=$@
  fi

  #echo "tmpbb je : " $tmpbb

  # Sedaj odstrani vsa imena imenikov, ki jih ni v korenskem imeniku CVS
  dirnames=""
  for ii in $tmpbb ; do
          if [ -d $CVSROOT/$subdir/$ii ]; then
                  dirnames="$dirnames $ii "
          fi
  done
  #echo "dirnames je : " $dirnames

  if [ "$dirnames" != "" ]; then
          find $dirnames  -type f |
          while read ii
          do
                  # Prikazi samo tiste datoteke, ki so v sistemu CVS
                  if [ -f "$CVSROOT/$subdir/$ii,v" ]; then
                          #echo "ii is : " $ii
                          ls -l $ii | grep ^\-rw
                  fi
          done;
  fi

  # Ugotovi vse datoteke v trenutnem imeniku
  listfiles=`ls $tmpbb `
  # Izbira prune ne deluje, zato uporabi maxdepth
  #find * -prune -type f |
  find * -maxdepth 0 -type f |
  while read ii
  do
          for jj in $listfiles ; do
                  if [ "$jj" = "$ii" ]; then
                          # Prikazi samo datoteke, ki so v sistemu CVS
                          if [ -f "$CVSROOT/$subdir/$ii,v" ]; then
                                  #echo "ii je : " $ii
                                  ls -l $ii | grep ^\-rw
                          fi
                  fi
          done
  done;

  ______________________________________________________________________


  26.  sinfo

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.


  ______________________________________________________________________
  #!/bin/ksh

  # CVS program sinfo
  # Program za pridobitev statusa datotek v delovnem imeniku

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  if [ $# -lt 1 ]; then
          print "\nUporaba: $cmdname [ime datoteke/imenika] "
          print "Na primer - "
          print "       $cmdname foo.cpp"
          print "       $cmdname nek_imenik "
          print " "
          exit
  fi

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  cur_dir=`pwd`
  #echo $cur_dir

  len=${#homedir}
  len=$(($len + 2))
  #echo $len

  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir je : " $subdir
  tmpaa=`dirname $1`
  if [ "$tmpaa" = "." ]; then
          fname=$1
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename $1`
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  #echo "subdir je : " $subdir
  #echo "fname je : " $fname

  # V lokalnem imeniku se od vseh ukazov zahteva imenik CVS..
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja"
                  print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj s pomocjo sget poskusi narediti CVS v lokalnem imeniku
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # ne uporabljaj pik, ki lahko zmedejo CVS
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  # Naredi podlupino
  if [ -f $1 ]; then
          (
          cd $homedir
                  clear
                  print "\nCVS status je : "
          cvs status "$subdir/$fname"
          )
  elif [ -d $1 ]; then
          (
                  cd $homedir
                  clear
                  print "\nCVS status je : "
                  tmpfile="$homedir/cvs_sinfo.tmp"
                  rm -f $tmpfile
          echo "  " >> $tmpfile
          echo "  ****************************************" >> $tmpfile
          echo "        Skupni status imenika" >> $tmpfile
          echo "  ****************************************" >> $tmpfile
          cvs release "$subdir/$fname" 1>>$tmpfile 2>>$tmpfile << EOF
  N
  EOF
          echo "\n   -------------------------------\n" >> $tmpfile

          aa=`cat $tmpfile | grep ^"M " | awk '{print $2}' `
          for ii in $aa
          do
                          jj="(cd $homedir; cvs status \"$subdir/$ii\" );"
                          echo $jj | /bin/sh  \
                                          | grep -v Sticky | awk '{if (NF != 0) print $0}' \
                                          1>>$tmpfile 2>>$tmpfile
          done

          cat $tmpfile | grep -v ^? | grep -v "Are you sure you want to release" \
          | less
          rm -f $tmpfile
          )
  else
          print "\nArgument $1 ni datoteka ali imenik."
          exit
  fi
  ______________________________________________________________________


  27.  slog

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.

  ______________________________________________________________________
  #!/bin/ksh

  # CVS program slog
  # Program za izpis zgodovine datoteke v CVS

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  if [ $# -lt 1 ]; then
          print "\nUporaba: $cmdname <ime_datoteke> \n"
          exit
  fi

  # Preveri, ali datoteka ze obstaja....
  if [ ! -f $1 ]; then
          print "\nNapaka: $1 NI datoteka. Opuscam $cmdname ......"
          exit
  fi

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  cur_dir=`pwd`
  #echo $cur_dir

  len=${#homedir}
  len=$(($len + 2))
  #echo $len

  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir is : " $subdir
  tmpaa=`dirname $1`
  if [ "$tmpaa" = "." ]; then
          fname="$1"
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename $1`
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  #echo "subdir je : " $subdir
  #echo "fname je : " $fname

  # V lokalnem imeniku se zahteva imenik CVS, da bodo ukazi lahko delovali..
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja."
                  print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj poskusi s sget narediti CVS v lokalnem imeniku
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # ne uporabljaj pik, ker lahko zmedejo sistem
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  # Deluj znotraj podlupine
  (
          cd $homedir
          cvs log "$homedir/$subdir/$fname" | less
  )

  print "\nKoncan $cmdname. $cmdname uspesen"
  #print "\nNasvet: $cmdname <ime_datoteke>\n"
  ______________________________________________________________________


  28.  sdif

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.

  ______________________________________________________________________
  #!/bin/ksh

  # CVS program sdif
  # Program za prikaz razlik med delovno datoteko in kopijo v CVS

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  Usage()
  {
          print "\nUporaba: $cmdname <ime_datoteke> "
          print "$cmdname -r<revizija1> -r<revizija2> <ime_datoteke> \n"
          exit
  }

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  FLAG1=""
  FLAG2=""
  OARG1=""
  OARG2=""
  # Ukaz getopt v naslednji izdaji ne bo vec podprt.
  # Namesto njega uporabljam getopts.
  while getopts r:r: ii
  do
          case $ii in
          r)
                  if [ "$FLAG1" = "" ]; then
                          FLAG1=$ii;
                          OARG1="$OPTARG"
                  else
                          FLAG2=$ii;
                          OARG2="$OPTARG"
                  fi
                  ;;
          ?) Usage; exit 2;;
          esac
  done
  shift ` expr $OPTIND - 1 `

  if [ "$FLAG2" = "" ]; then
          FLAG2=r
          OARG2=HEAD
  fi

  cur_dir=`pwd`
  #echo $cur_dir

  len=${#homedir}
  len=$(($len + 2))
  #echo $len

  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir je : " $subdir
  tmpaa=`dirname $1`
  if [ "$tmpaa" = "." ]; then
          fname="$1"
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename $1`
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  #echo "subdir je : " $subdir
  #echo "fname je : " $fname

  # imenik CVS v lokalnem imeniku je nujno potreben, da bodo ukazi delovali..
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja."
                  print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj poskusi s sget narediti CVS v lokalnem imeniku
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # ne uporabi pik, ker lahko zmedejo CVS
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  # Deluj znotraj podlupine
  (
          cd $homedir
          if [ "$FLAG1" = "" ]; then
                  cvs diff -r HEAD "$homedir/$subdir/$fname" | less
          else
                  cvs diff -$FLAG1 $OARG1 -$FLAG2 $OARG2 "$homedir/$subdir/$fname" | less
          fi
  )

  ______________________________________________________________________


  29.  sadd

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.
  ______________________________________________________________________
  #!/bin/ksh

  # test
  # CVS program sadd
  # Program za dodajanje datotek v CVS

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`
  if [ $# -lt 1 ]; then
          print "\nUporaba: $cmdname <ime datoteke/imenika> \n"
          exit
  fi

  onearg="$1"
  if [ ! -f "$onearg" -a ! -d "$onearg" ]; then
          print "\nArgument $onearg ni ime datoteke oz. imenika!"
          print "Uporaba: $cmdname <ime datoteke/imenika> \n"
          exit
  fi

  # Argument je ime imenika .....
  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  cvs_root=` echo $CVSROOT | cut -f1 -d' '  `
  if [ "$cvs_root" = "" ]; then
          print "\nNapaka: spremenljivka \$CVSROOT ni nastavljena!!\n"
          exit
  fi

  cur_dir=`pwd`
  len=${#homedir}
  len=$(($len + 2))
  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir je : " $subdir
  tmpaa=`dirname "$onearg" `
  if [ "$tmpaa" = "." ]; then
          fname="$onearg"
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename "$onearg" `
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  #echo "subdir je : " $subdir
  #echo "fname je : " $fname
  # imenik CVS v lokalnem imeniku je nujen za delovanje ukazov..
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja."
                  print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj poskusi s sget narediti CVS v lokalnem imeniku
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # ne uporabljaj pik, ker lahko zmedejo CVS
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  # Preveri, ali datoteka obstaja ....
  if [ $# -eq 1 ]; then
          if [ -f "$onearg" ]; then
                  cvs add "$onearg"
                  exit
          fi
  elif [ $# -gt 1 ]; then
          print "\n\n\nDodajam vse datoteke v trenutnem imeniku v CVS."
          print "Imeniki se ne bodo dodali."
          print -n "Pritisnite Enter za nadaljevanje ali CTRL+C za prekinitev..."
          read ans
          for ii in $@
          do
                  if [ -f "$ii" ]; then
                          cvs add "$ii"
                  fi
          done;
          exit
  fi

  # Ko je $subdir enak ".", ste v korenskem imeniku
  if [ "$subdir" = "." ]; then
          # Na tej tocki je $onearg imenik in ne datoteka...
          if [ -d "$CVSROOT/$onearg" ]; then
                  print "\nImenik $onearg ze obstaja v CVSROOT."
                  exit
          else
                  # Dodajate v korenski imenik $CVSROOT
                  if [ "$2" = "" -o "$3" = "" ]; then
                          print "\nUporaba: $cmdname <imenik> <oznaka proizvajalca> <oznaka izdaje>"
                          print "Na primer - "
                          print " $cmdname foo_imenik V_1_0 R_1_0"
                          exit
                  else
                          (
                                  cd "$homedir/$subdir";
                                  cvs import "$onearg" $2 $3
                          )
                  fi
          fi
  else
          # Ce trenutni imenik obstaja v CVS...
          if [ -d "$CVSROOT/$subdir/$onearg" ]; then
                  print "\nImenik $onearg je ze v skladiscu CVS!"
                  exit
          else
                  (
                          if [ -d "$homedir/$subdir/$onearg/CVS" ]; then
                                  print "\nNapaka: imenik $homedir/$subdir/$onearg/CVS ze obstaja!!"
                                  print "\nKoncujem ...."
                                  exit
                          fi

                          # za ukaz import MORATE spremeniti ciljni imenik
                          # in MORATE dolociti polno pot, ki se zacnr s $subdir
                          cd "$homedir/$subdir/$onearg";
                          cvs import "$subdir/$onearg" Ver_1 Rel_1
                  )
          fi
  fi
  ______________________________________________________________________


  30.  sdelete

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.

  ______________________________________________________________________
  #!/bin/ksh

  # CVS program sdelete
  # Program za brisanje datotek iz CVS

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  if [ $# -lt 1 ]; then
          print "\nUporaba: $cmdname <ime_datoteke> \n"
          exit
  fi


  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  cur_dir=`pwd`
  len=${#homedir}
  len=$(($len + 2))
  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir is : " $subdir
  tmpaa=`dirname "$onearg" `
  if [ "$tmpaa" = "." ]; then
          fname="$onearg"
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          fi
  else
          fname=`basename "$onearg" `
          if [ "$subdir" = "" ]; then
                  subdir=$tmpaa
          else
                  subdir="$subdir/$tmpaa"
          fi
  fi
  #echo "subdir je : " $subdir
  #echo "fname je : " $fname

  # imenik CVS v lokalnem imeniku je nujen za delovanje ukazov..
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja."
                  print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj poskusi s sget narediti CVS v lokalnem imeniku
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # nu uporabljaj pik, ker lahko zmedejo CVS
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  # Deluj znotraj podlupine ...
  (
          cd $homedir

          # Check if file does not exist....
          if [ ! -f "$subdir/$fname" ]; then
                  # Poskusi dobiti datoteko iz CVS
                  sget "$subdir/$fname"
                  if [ ! -f "$subdir/$fname" ]; then
                          print "\nNapaka: $subdir/$fname NE obstaja v skladiscu CVS."
                          print "\nKoncujem $cmdname ......"
                          exit
                  fi
          fi

          bkextn=cvs_sdelete_safety_backup
          \mv -f "$subdir/$fname" "$subdir/$fname.$bkextn"

          cvs remove "$subdir/$fname"

          print "\nUkaz sdelete odstrani datoteko iz skladisca CVS"
          print "in jo arhivira v imenik CVS Attic. V primeru,da v prihodnosti"
          print "potrebujete to datoteko, vzpostavite stik z administratorjem CVS."
          print " "

          print "\nKoncan $cmdname. $cmdname uspesen"
          print "Izvedite scommit na imeniku $homedir/$subdir/$fname , da"
          print "bo ta sprememba stalna."
          \mv -f "$subdir/$fname.$bkextn" "$subdir/$fname"
  )
  ______________________________________________________________________


  31.  sfreeze

  Opomba : Lupino Korn /bin/ksh dobite z namestitvijo paketa pdksh*.rpm
  s CDja Linux contrib

  Shranite to datoteko kot tekstovno datoteko in na njej izvedite chmod
  a+rx.


  ______________________________________________________________________
  #!/bin/ksh

  # CVS program sfreeze
  # Program za zamrznitev in odrez izdaje izvornega drevesa iz CVS

  # Vsako ime datoteke se sestoji iz treh delov: domaèega imenika, podimenika
  # in imena datoteke. Polna pot do datoteke je tako $HOME/$subdir/$fname.
  # V CVS se ohrani enaka struktura imenikov (z vpeljavo spremenljivke
  # $subdir), torej se bo pot v CVS glasila $CVSROOT/$subdir/$fname.
  # V tem programu igrajo 4 spremenljivke ($HOME, $CVSROOT, $subdir in $fname)
  # pomembno vlogo. Na primer, vzorène vrednosti so lahko:
  # HOME=/home/aldev, subdir=myproject/src CVSROOT=/home/cvsroot
  # in fname=foo.cpp

  # Pozor: Uporabljajte dvojne narekovaje, da se bodo v vrednostih spremenljivk
  #        ohranili presledki, npr. "$HOME/$subdir", èe je $subdir enak 'some foo.cpp'

  cmdname=`basename $0`

  Usage()
  {
          print "\nUporaba: $cmdname simbolicna_oznaka <ime imenika> "

          print "\nNa primer: - "
          print "   cd \$HOME"
          print "   $cmdname  REVIZIJA_1   moj_imenik_z_izvorno_kodo_projekta"
          print "Za prikaz seznama revizij izvedite -"
          print "slog <ime_datoteke>, zapomnite si simbolicno ime in izvedite -"
          print "cvs history -T"

          print "\nDa naredite stranski poganjek iz glavnega debla, uporabite"
          print "izbiri -b in -r, ki naredita oznako kot oznako veje. To je"
          print "koristno za izdelavo popravkov prej izdane programske opreme"
          print "Na primer :- "
          print "   cd \$HOME"
          print "   cvs rtag -b -r REVIZIJA_1 REVIZIJA_1_1 moj_imenik_z_izvorno_kodo_projekta"
          print " "

  #       print "\nInformacija o oznaki se nahaja v \$CVSROOT/CVSROOT/taginfo,v"
  #       print "Lahko izvedete - cd $HOME; sget CVSROOT"
  #       print "da vidite to datoteko"
          exit
  }

  # Ukaz getopt ne bo vec podprt v naslednji izdaji.
  # Namesto njega uporabljam getopts.
  #while getopts r: ii
  #do
  #       case $ii in
  #       r) FLAG1=$ii; OARG1="$OPTARG";;
  #       ?) Usage; exit 2;;
  #       esac
  #done
  #shift ` expr $OPTIND - 1 `

  #echo FLAG1 = $FLAG1 , OARG1 = $OARG1

  if [ $# -lt 2 ]; then
          Usage
  fi

  if [ ! -d $2 ]; then
          print "\nNapaka: drugi argument $2 ni imenik!"
          print "          Opuscam $cmdname...."
          print " "
          exit
  fi

  homedir=` echo $HOME | cut -f1 -d' '  `
  if [ "$homedir" = "" ]; then
          print "\nNapaka: spremenljivka \$HOME ni nastavljena!!\n"
          exit
  fi

  cur_dir=`pwd`
  len=${#homedir}
  len=$(($len + 2))
  subdir=` echo $cur_dir | cut -b $len-2000 `
  #echo "subdir is : " $subdir

  # imenik CVS v lokalnem imeniku je nujen za delovanje ukazov..
  if [ ! -d  "$homedir/$subdir/CVS" ]; then
          #tmpaa=` (cd "$CVSROOT/$subdir"; find * -prune -type f -print | head -1 ) `
          tmpaa=` (cd "$CVSROOT/$subdir"; find * -maxdepth 0 -type f -print | head -1 ) `
          tmpbb=`basename $tmpaa | cut -d',' -f1 `
          if [ "$tmpaa" = "" -o ! -f "$CVSROOT/$subdir/$tmpbb,v" ]; then
                  print "\nImenik $homedir/$subdir/CVS ne obstaja."
                  print "Na imeniku `basename $subdir` morate izvesti sget. Podajte -"
                  print "       cd $homedir/`dirname $subdir` "
                  print "       sget `basename $subdir` "
                  exit
          else
                  # Sedaj poskusi s sget narediti CVS v lokalnem imeniku
                  (
                          cd "$homedir"
                          if [ "$subdir" = "." ]; then  # ne uporabljaj pik, ker lahko zmedejo CVS
                                  cvs -r checkout -A $tmpbb
                          else
                                  cvs -r checkout -A "$subdir/$tmpbb"
                          fi
                  )
          fi
  fi

  if [ "$cur_dir" != "$homedir" ]; then
          print "\nNe nahajate se v domacem imeniku $homedir!!"
          print "Izvesti morate ukaz sfreeze"
          print "iz domacega imenika $homedir."
          exit
  fi

  # cvs rtag symbolic_tag <directory name>
  cvs rtag $1 $2

  print "\nKoncan $cmdname. $cmdname uspesen."
  ______________________________________________________________________