| [3] | 1 | #!/usr/bin/perl -w | 
|---|
|  | 2 |  | 
|---|
| [183] | 3 | # $Id$ | 
|---|
| [3] | 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. | 
|---|
| [183] | 8 | # Überprüfen welche Dateien sich gegenüber der CVS-Arbeitskopie geändert haben | 
|---|
| [3] | 9 | # und kopiert diese auf Wunsch in das CVS-Arbeitsverzeichnis | 
|---|
|  | 10 |  | 
|---|
|  | 11 | # Parameter: CVS-Arbeitsverzeichnis | 
|---|
| [183] | 12 | #            (dort muß die Verzeichnisstruktur bezogen auf / abgebildet sein, | 
|---|
| [3] | 13 | #            z.B. etc, var usw. | 
|---|
|  | 14 |  | 
|---|
| [194] | 15 | use strict; | 
|---|
|  | 16 |  | 
|---|
|  | 17 | use Env qw($DASSCM_PROD $DASSCM_REPO $USER $DASSCM_USER $DASSCM_PW); | 
|---|
|  | 18 | use Cwd; | 
|---|
| [3] | 19 | use POSIX qw/getpgrp tcgetpgrp/; | 
|---|
|  | 20 | use File::Find; | 
|---|
|  | 21 | use File::Compare; | 
|---|
|  | 22 | use File::Copy; | 
|---|
|  | 23 |  | 
|---|
| [194] | 24 |  | 
|---|
| [3] | 25 | my $cvsworkdir = $ARGV[0]; | 
|---|
| [194] | 26 | if(! defined $cvsworkdir) { | 
|---|
|  | 27 | $cvsworkdir = $DASSCM_REPO; | 
|---|
|  | 28 | } | 
|---|
| [3] | 29 | usage() if (! defined $cvsworkdir); | 
|---|
|  | 30 | # Mit "." als Pfadangabe funktionieren diverse Funktionen nicht | 
|---|
| [183] | 31 | # => ersetzen durch vollständigen absoluten Pfad | 
|---|
| [3] | 32 | if ($cvsworkdir eq ".") { | 
|---|
|  | 33 | $cvsworkdir = $ENV{'PWD'}; | 
|---|
|  | 34 | } | 
|---|
|  | 35 |  | 
|---|
| [183] | 36 | # abschließenden "/" entfernen, falls vorhanden | 
|---|
| [3] | 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 |  | 
|---|
| [183] | 46 | # Liste der geänderten Files ausgeben, falls nicht leer | 
|---|
| [3] | 47 | # Anzahl Elemente im Hash??? | 
|---|
|  | 48 | my @changedfiles = keys %changedfiles; | 
|---|
|  | 49 |  | 
|---|
|  | 50 | if ($#changedfiles > -1) { | 
|---|
| [183] | 51 | print "Geänderte Dateien:\n"; | 
|---|
| [3] | 52 | foreach my $key (keys %changedfiles) { | 
|---|
|  | 53 | print "$key\n"; | 
|---|
|  | 54 | } | 
|---|
| [204] | 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 | #  } | 
|---|
| [3] | 71 | } | 
|---|
|  | 72 | else { | 
|---|
| [183] | 73 | print "keine geänderten Dateien in $cvsworkdir gefunden.\n"; | 
|---|
| [3] | 74 | } | 
|---|
|  | 75 | print "\n"; | 
|---|
|  | 76 |  | 
|---|
|  | 77 | sub cvscheck { | 
|---|
|  | 78 | return unless -f;     # keine Directories | 
|---|
|  | 79 | return if $File::Find::dir =~ /\/CVS$/;       # ignoriere CVS-Verzeichnisse | 
|---|
| [194] | 80 | return if $File::Find::dir =~ /\/\.svn/;      # ignoriere Subversion Verzeichnisse (inkl. Unterverzeichnisse) | 
|---|
| [3] | 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; | 
|---|
| [204] | 88 | #  (-r $realfile) || die("Fehler: $realfile existiert nicht oder ist nicht lesbar"); | 
|---|
|  | 89 | if( ! -r $realfile ) { | 
|---|
|  | 90 | print "d     $realfile\n"; | 
|---|
|  | 91 | } else { | 
|---|
|  | 92 | (-r "$cvsworkfile") || die("Fehler: $cvsworkfile ist nicht lesbar"); | 
|---|
|  | 93 | if (compare($cvsworkfile,$realfile) != 0) { | 
|---|
|  | 94 | # Dateien unterscheiden sich | 
|---|
|  | 95 | (-w $cvsworkfile) || die("Fehler: kein Schreibrecht auf $cvsworkfile"); | 
|---|
|  | 96 | # Arbeitskopie durch Kopie ersetzen | 
|---|
|  | 97 | #copy($realfile,$cvsworkfile) || die("Fehler beim kopieren $realfile --> $cvsworkfile"); | 
|---|
|  | 98 | $changedfiles{"$realfile"} = $cvsworkfile; | 
|---|
|  | 99 | } | 
|---|
| [3] | 100 | } | 
|---|
|  | 101 | } | 
|---|
|  | 102 |  | 
|---|
|  | 103 |  | 
|---|
|  | 104 | sub I_am_interactive { | 
|---|
|  | 105 | local *TTY;  # local file handle | 
|---|
|  | 106 | open(TTY, "/dev/tty") or die "can't open /dev/tty: $!"; | 
|---|
|  | 107 | my $tpgrp = tcgetpgrp(fileno(TTY)); | 
|---|
|  | 108 | my $pgrp  = getpgrp(); | 
|---|
|  | 109 | close TTY; | 
|---|
|  | 110 | return ($tpgrp == $pgrp); | 
|---|
|  | 111 | } | 
|---|
|  | 112 |  | 
|---|
|  | 113 | sub usage { | 
|---|
|  | 114 | print <<EOF; | 
|---|
|  | 115 | Funktion dieses Scripts: | 
|---|
| [183] | 116 | Es sollen Konfigurationsdatei (z.B. in /etc und /var) | 
|---|
|  | 117 | im Versionskontrollsystem (Subversion oder CVS) gepflegt werden. | 
|---|
| [194] | 118 | Überprüfen welche Dateien sich gegenüber der CVS-Arbeitskopie geändert haben und kopiert diese auf Wunsch in das Subversion/CVS-Arbeitsverzeichnis | 
|---|
| [3] | 119 |  | 
|---|
| [194] | 120 | Parameter: Subversion/CVS-Arbeitsverzeichnis | 
|---|
| [183] | 121 | (dort muß die Verzeichnisstruktur bezogen auf / abgebildet sein, | 
|---|
| [194] | 122 | z.B. etc, var usw.) | 
|---|
|  | 123 | Alternativ kann dieses über die Umgebungsvariable | 
|---|
|  | 124 | \$DASSCM_REPO gesetzt sein. | 
|---|
| [3] | 125 |  | 
|---|
|  | 126 | EOF | 
|---|
|  | 127 | exit 1; | 
|---|
|  | 128 | } | 
|---|