| 1 | #!/usr/bin/perl -w | 
|---|
| 2 |  | 
|---|
| 3 | # $Id$ | 
|---|
| 4 |  | 
|---|
| 5 | # 20040410 stephan.duehr@suse.de | 
|---|
| 6 | # Funktion dieses Scripts: | 
|---|
| 7 | # Es sollen Konfigurationsdatei (z.B. in /etc und /var) im CVS gepflegt werden. | 
|---|
| 8 | # Überprüfen welche Dateien sich gegenüber der CVS-Arbeitskopie geändert haben | 
|---|
| 9 | # und kopiert diese auf Wunsch in das CVS-Arbeitsverzeichnis | 
|---|
| 10 |  | 
|---|
| 11 | # Parameter: CVS-Arbeitsverzeichnis | 
|---|
| 12 | #            (dort muß die Verzeichnisstruktur bezogen auf / abgebildet sein, | 
|---|
| 13 | #            z.B. etc, var usw. | 
|---|
| 14 |  | 
|---|
| 15 | use strict; | 
|---|
| 16 |  | 
|---|
| 17 | use Env qw($DASSCM_PROD $DASSCM_REPO $USER $DASSCM_USER $DASSCM_PW); | 
|---|
| 18 | use Cwd; | 
|---|
| 19 | use POSIX qw/getpgrp tcgetpgrp/; | 
|---|
| 20 | use File::Find; | 
|---|
| 21 | use File::Compare; | 
|---|
| 22 | use File::Copy; | 
|---|
| 23 |  | 
|---|
| 24 |  | 
|---|
| 25 | my $cvsworkdir = $ARGV[0]; | 
|---|
| 26 | if(! defined $cvsworkdir) { | 
|---|
| 27 | $cvsworkdir = $DASSCM_REPO; | 
|---|
| 28 | } | 
|---|
| 29 | usage() if (! defined $cvsworkdir); | 
|---|
| 30 | # Mit "." als Pfadangabe funktionieren diverse Funktionen nicht | 
|---|
| 31 | # => ersetzen durch vollständigen absoluten Pfad | 
|---|
| 32 | if ($cvsworkdir eq ".") { | 
|---|
| 33 | $cvsworkdir = $ENV{'PWD'}; | 
|---|
| 34 | } | 
|---|
| 35 |  | 
|---|
| 36 | # abschließenden "/" entfernen, falls vorhanden | 
|---|
| 37 | $cvsworkdir =~ s/\/$//g; | 
|---|
| 38 |  | 
|---|
| 39 | (-d $cvsworkdir) || die "Fehler: $cvsworkdir ist kein Verzeichnis!"; | 
|---|
| 40 |  | 
|---|
| 41 |  | 
|---|
| 42 | my %changedfiles = (); | 
|---|
| 43 |  | 
|---|
| 44 | File::Find::find(\&cvscheck, $cvsworkdir); | 
|---|
| 45 |  | 
|---|
| 46 | # Liste der geänderten Files ausgeben, falls nicht leer | 
|---|
| 47 | # Anzahl Elemente im Hash??? | 
|---|
| 48 | my @changedfiles = keys %changedfiles; | 
|---|
| 49 |  | 
|---|
| 50 | if ($#changedfiles > -1) { | 
|---|
| 51 | print "Geänderte Dateien:\n"; | 
|---|
| 52 | foreach my $key (keys %changedfiles) { | 
|---|
| 53 | print "$key\n"; | 
|---|
| 54 | } | 
|---|
| 55 | if (I_am_interactive()) { | 
|---|
| 56 | print "Die Dateien nach $cvsworkdir kopieren? (j/n)"; | 
|---|
| 57 | my $line = <STDIN>; | 
|---|
| 58 | chomp($line); | 
|---|
| 59 | if ($line eq "j") { | 
|---|
| 60 | print "kopiere...\n"; | 
|---|
| 61 | foreach my $key (keys %changedfiles) { | 
|---|
| 62 | print "$key --> $changedfiles{$key} "; | 
|---|
| 63 | copy($key, $changedfiles{$key}) || print "(fehlgeschlagen)"; | 
|---|
| 64 | print "\n"; | 
|---|
| 65 | } | 
|---|
| 66 | print "bitte noch manuell einen commit ... ausführen.\n"; | 
|---|
| 67 | # CVS Environment prüfen | 
|---|
| 68 | #print "Hinweis: CVSROOT nicht gesetzt\n" unless defined $ENV{'CVSROOT'}; | 
|---|
| 69 | } | 
|---|
| 70 | } | 
|---|
| 71 | } | 
|---|
| 72 | else { | 
|---|
| 73 | print "keine geänderten Dateien in $cvsworkdir gefunden.\n"; | 
|---|
| 74 | } | 
|---|
| 75 | print "\n"; | 
|---|
| 76 |  | 
|---|
| 77 | sub cvscheck { | 
|---|
| 78 | return unless -f;     # keine Directories | 
|---|
| 79 | return if $File::Find::dir =~ /\/CVS$/;       # ignoriere CVS-Verzeichnisse | 
|---|
| 80 | return if $File::Find::dir =~ /\/\.svn/;      # ignoriere Subversion Verzeichnisse (inkl. Unterverzeichnisse) | 
|---|
| 81 | my $cvsworkfile = "$File::Find::dir/$_"; | 
|---|
| 82 | #print "$cvsworkfile\n"; | 
|---|
| 83 | # Ursprungspfad ermitteln | 
|---|
| 84 | $cvsworkfile =~ /${cvsworkdir}\/(.+)/; | 
|---|
| 85 | my $realfile = "/" . $1; | 
|---|
| 86 | # relativer Pfad zur CVS-Arbeitsdatei | 
|---|
| 87 | my $relcvsworkfile = $1; | 
|---|
| 88 | (-r $realfile) || die("Fehler: $realfile existiert nicht oder ist nicht lesbar"); | 
|---|
| 89 | (-r "$cvsworkfile") || die("Fehler: $cvsworkfile ist nicht lesbar"); | 
|---|
| 90 | if (compare($cvsworkfile,$realfile) != 0) { | 
|---|
| 91 | # Dateien unterscheiden sich | 
|---|
| 92 | (-w $cvsworkfile) || die("Fehler: kein Schreibrecht auf $cvsworkfile"); | 
|---|
| 93 | # Arbeitskopie durch Kopie ersetzen | 
|---|
| 94 | #copy($realfile,$cvsworkfile) || die("Fehler beim kopieren $realfile --> $cvsworkfile"); | 
|---|
| 95 | $changedfiles{"$realfile"} = $cvsworkfile; | 
|---|
| 96 | } | 
|---|
| 97 | } | 
|---|
| 98 |  | 
|---|
| 99 |  | 
|---|
| 100 | sub I_am_interactive { | 
|---|
| 101 | local *TTY;  # local file handle | 
|---|
| 102 | open(TTY, "/dev/tty") or die "can't open /dev/tty: $!"; | 
|---|
| 103 | my $tpgrp = tcgetpgrp(fileno(TTY)); | 
|---|
| 104 | my $pgrp  = getpgrp(); | 
|---|
| 105 | close TTY; | 
|---|
| 106 | return ($tpgrp == $pgrp); | 
|---|
| 107 | } | 
|---|
| 108 |  | 
|---|
| 109 | sub usage { | 
|---|
| 110 | print <<EOF; | 
|---|
| 111 | Funktion dieses Scripts: | 
|---|
| 112 | Es sollen Konfigurationsdatei (z.B. in /etc und /var) | 
|---|
| 113 | im Versionskontrollsystem (Subversion oder CVS) gepflegt werden. | 
|---|
| 114 | Überprüfen welche Dateien sich gegenüber der CVS-Arbeitskopie geändert haben und kopiert diese auf Wunsch in das Subversion/CVS-Arbeitsverzeichnis | 
|---|
| 115 |  | 
|---|
| 116 | Parameter: Subversion/CVS-Arbeitsverzeichnis | 
|---|
| 117 | (dort muß die Verzeichnisstruktur bezogen auf / abgebildet sein, | 
|---|
| 118 | z.B. etc, var usw.) | 
|---|
| 119 | Alternativ kann dieses über die Umgebungsvariable | 
|---|
| 120 | \$DASSCM_REPO gesetzt sein. | 
|---|
| 121 |  | 
|---|
| 122 | EOF | 
|---|
| 123 | exit 1; | 
|---|
| 124 | } | 
|---|