CVS

Robert Vojta robert na v0jta.net
Středa Srpen 13 10:17:26 CEST 2003


VN> zacal jsem pouzivat CVS pro jeden projekt a nyni mam trochu problem. V
VN> zachvatu prace jsem pridal spoustu souboru a nestacil psat "cvs add...". 
VN> Existuje nejaky elegantni zpusob, jak zjistit, ktere soubory pribyly (a 
VN> nejsou registrovany v cvs)? Delat cvs add pro vsechny soubory a ty co uz 
VN> registrovany jsou proste "jen" hodi chybu mi neprijde jako reseni. A 
VN> delat vypisy pro kazdy soubor znamena spoustu cteni (cvs status). Ty 
VN> soubory jsou rozesety do docela uchvatne adresarove struktury...

  Nasledujici skript smazev vsechny soubory (rekursivne, pocinaje
aktualnim adresarem), ktere nejsou soucasti CVS. Upravte si ho tak, ze
je nebude mazat, ale pridavat ...

  Po rychlem zkouknuti skriptu by mohlo stacit to, ze ve funkci rmrf()
nahradite tyto dva prikazy ...

  rmdir($fn)  -> `cvs add $fn`
  unlink($fn) -> `cvs add $fn`

  ... a otocite prubeh prochazeni adresu, tzn. maze to od nejvice
vnoreneho, ale vy potrebujete pridavat adresare a soubory opacne.

#! /usr/bin/perl

#
# This script recursively (beginning with the current directory)
# wipes out everything not registered in CVS.
#
# written by Oswald Buddenhagen <ossi na kde.org>
#  inspired by the "old" cvs-clean target from Makefile.common
#
# This file is free software in terms of the BSD licence. That means
# that you can do anything with it except removing this license or
# the above copyright notice. There is NO WARRANTY of any kind.
#

sub rmrf()
{
  my $fn = shift;
  lstat ($fn);
  if (-d _) {
    if (opendir (DIR, $fn)) {
      for my $efn (grep (!/^\.\.?$/, readdir (DIR))) {
        &rmrf ($fn."/".$efn);
      }
      closedir (DIR);
      rmdir ($fn);
    }
  } else {
    unlink ($fn);
  }
}

sub newfiles()
{
  my ($indir, $incvs) = @_;
  for my $n (keys (%$incvs)) { delete $$indir{$n} }
  return sort (keys (%$indir));
}

sub cvsclean()
{
  my $dir = shift;
  my (%dirsdir, %filesdir, %dirscvs, %filescvs);
  my $dnam = $dir ? $dir : ".";
  if (!opendir (DIR, $dnam)) {
    print STDERR "Cannot enter \"".$dnam."\".\n";
    return;
  }
  for my $fn (grep (!/^\.\.?$/, readdir (DIR))) {
    if (-d $dir.$fn) {
      $fn eq "CVS" or $dirsdir{$fn} = 1;
    } else {
      $filesdir{$fn} = 1;
    }
  }
  closedir (DIR);
  if (!open (FILE, "<".$dir."CVS/Entries")) {
    print STDERR "No CVS information in \"".$dnam."\".\n";
    return;
  }
  while (<FILE>) {
    m%^D/([^/]+)/.*$% and $dirscvs{$1} = 1;
    m%^/([^/]+)/.*$% and $filescvs{$1} = 1;
  }
  close (FILE);
  if (open (FILE, "<".$dir."CVS/Entries.Log")) {
    while (<FILE>) {
      m%^A D/([^/]+)/.*$% and $dirscvs{$1} = 1;
      m%^A /([^/]+)/.*$% and $filescvs{$1} = 1;
      m%^R D/([^/]+)/.*$% and delete $dirscvs{$1};
      m%^R /([^/]+)/.*$% and delete $filescvs{$1};
    }
    close (FILE);
  }
  for my $fn (&newfiles (\%filesdir, \%filescvs)) {
    print ("F ".$dir.$fn."\n");
    &rmrf ($dir.$fn);
  }
  for my $fn (&newfiles (\%dirsdir, \%dirscvs)) {
    print ("D ".$dir.$fn."\n");
    &rmrf ($dir.$fn);
  }
  for my $fn (sort (keys (%dirscvs))) {
    &cvsclean ($dir.$fn."/");
  }
}

&cvsclean ("");


-- 
Robert Vojta



Další informace o konferenci Linux