#!/usr/local/bin/perl # $Id: cvsaddrm,v 1.2 2004/09/12 11:24:17 nao Exp $ # # cvsaddrm # # Copyright (C) 2004 by nao. # http://nao.s164.xrea.com/ # # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # # カレントディレクトリにある「cvs add すべき」ファイルを cvs add します. # ここで「cvs add すべき」ファイルとは # - まだリポジトリに登録されていないファイルで, # - かつ,ignore すべきでないもの # を指します. # # カレントディレクトリから削除された「cvs remove すべき」ファイルを # cvs remove します. # ここで「cvs remove すべき」ファイルとは # - すでにリポジトリに登録されているファイルで, # - かつ,ignore すべきでないもの # を指します. # # ignore すべきかどうかは CVS と同じ基準で判断します. # # デフォルトではファイル毎に確認してきます.OK なら y か Y を入力して下さい. # -q オプションをつけると,いちいち確認せず quiet に動作します. # interactive mode $interactive = 1; # 引数 if ($ARGV[0] eq "-q") { $interactive = 0; } elsif ( $ARGV[0] ne "" ) { die "Usage: cvsaddrm [-q]\n"; } # カレントディレクトリのファイルリストを作る @filelist = `find ./ -name "*" -type f | \\egrep -v "/.*/"`; for (@filelist){ chomp; s+\.\/++; } # ./CVS/Entries から add 済ファイルリストを作る @entries = &read_entries; # ignore リストを作る @ignorelist = &mkignorelist; # 本体 for ( @filelist ){ if ( ( &isignore($_) == 0 ) && ( &check_entries($_) == 0 ) ){ &cvs( $_, "add" ); } } for ( @entries ){ if ( ( &isignore($_) == 0 ) && ( &check_filelist($_) == 0 ) ){ &cvs( $_, "remove" ); } } # ./CVS/Entries から add 済ファイルリストを作る sub read_entries{ my $entries_file = "CVS/Entries"; open(IN, "<$entries_file") || die "Can't open $entries_file\n"; while () { if( m[\/(.*?)\/] ){ push( @entries, $+); } } close(IN); return @entries; } # ignore リストを作る sub mkignorelist{ my @ignorelist; # from src/ignore.c my $default_ignorelist = ". .. core RCSLOG tags TAGS RCS SCCS .make.state .nse_depinfo #* .#* cvslog.* ,* CVS CVS.adm .del-* *.a *.olb *.o *.obj *.so *.Z *~ *.old *.elc *.ln *.bak *.BAK *.orig *.rej *.exe _\$* *\$"; push(@ignorelist, split(/\ /,$default_ignorelist)); if ( -e "$ENV{HOME}/.cvsignore" ){ push(@ignorelist, split(/\n/,`cat $ENV{HOME}/.cvsignore`)); } if ( -f "$ENV{PWD}/.cvsignore" ){ push(@ignorelist, split(/\n/,`cat $ENV{PWD}/.cvsignore`)); } if ( -f "$ENV{CVSROOT}/CVSROOT/cvsignore" ){ push(@ignorelist, split(/\n/,`cat $ENV{CVSROOT}/CVSROOT/cvsignore`)); } for ( @ignorelist ){ my $quoted = quotemeta($_); $_ = $quoted; s/\\\*/.\*/g; } return @ignorelist; } # 引数で指定されたファイルが ignore リストに該当するか sub isignore{ my $filename = $_[0]; for (@ignorelist){ if ( $filename =~ /^($_)$/ ){ return 1; # 該当する } } return 0; # 該当しない } # 引数で指定されたファイルが CVS/Entries に既に含まれているか sub check_entries{ my $filename = $_[0]; for (@entries){ if ( $filename =~ /^($_)$/ ){ return 1; # 含まれている } } return 0; # 含まれていない (新規ファイル) } # 引数で指定されたファイルがディレクトリにあるか sub check_filelist{ my $filename = $_[0]; for (@filelist){ if ( $filename =~ /^($_)$/ ){ return 1; # 含まれている } } return 0; # 含まれていない (削除すべきファイル) } # 引数で与えられたファイルに対しコマンド実行 sub cvs{ my $filename = $_[0]; my $command = $_[1]; if ( $interactive ){ print "$command $filename? [y/n]"; $key = ; chomp( $key ); if ( ( $key eq "y" ) || ( $key eq "Y" ) ){ print "cvs $command $filename...\n"; system("cvs $command $filename"); } } else { print "cvs $command $filename...\n"; system("cvs $command $filename"); } }