首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > perl程序自动找回cvs仓库中误删除的文件
【标  题】:perl程序自动找回cvs仓库中误删除的文件
【关键字】:perl,cvs
【来  源】:BLOG.CSDN.NET

perl程序自动找回cvs仓库中误删除的文件

perl程序自动找回cvs仓库中误删除的文件

昨天下午本想重新checkout仓库中一个模块(比如:moduleABC)里的某个子文件夹(比如:subDir),因本身就在这个子文件夹subDir中,用`cvs co -d . moduleABC/subDir`(.没作用啊,需要..\subDir才可以)结果就在本地嵌套了一个新的工作目录moduleABC,想删除这个新的文件夹moduleABC,忙晕了就直接
cvs rm -f moduleABC
cvs ci -m ""
结果把CVS仓库中moduleABC模块下subDir文件夹的代码全给删除了,
懊悔万分啊,不是害怕找不回来这些文件,方法很简单就是拿回dead前的一个版本,重新cvs add file;cvs ci file就行了。痛苦的是有几百个文件,这还不把我累晕倒。

没办法这种郁闷的体力活只能让可爱的Perl来干了,下面是Perl代码。我的环境是Windows平台,Linux平台没有测试过。


主要功能:找回cvs仓库中误删除的文件,需要指定$moduleName和$data(不能把不是误删的找回来)两个变量,我是假设环境变量CVSROOT已经设置过了,如果没有请你设置好再用,不然cvs老带上一长串命令用起来也很不爽。
另外,我假设删除之后没有手动恢复过,就是只恢复仓库模块中状态:dead为最后一个版本且匹配日期$data的那些文件。

//-----------------------------------------------------------

#! perl -w
use strict;
use warnings;

my $moduleName = "这里给出module名,请用你自己的替换"; # 模块名,假定已经设置环境变量CVSROOT
my $data = '2005/09/26'; # 误删除操作的日期,格式:/^\d{4}\/\d{2}\/\d{2}$/,如:'2005/09/26'
#------------------------------
my $tmpdir = 'c:/temp';  # 临时工作目录,最后请自己手动清理这个目录的空文件吧
my $logName = 'cvslog.txt'; # 临时日志文件
#------------------------------
mkdir $tmpdir;
my $log = "$tmpdir/$logName";
my %fileName_lastVersion;
sub parseLog
{
    open F,$log || die("Can't open file $log:$!");
    my $find_dead_version = 0;my $rfdv = \$find_dead_version;  # No.?,find:-1
    my $find_file_name = '';my $rffn = \$find_file_name;   
    while(<F>)
    {
 ($find_file_name,$find_dead_version)=($1,0),next if(/^Working file: (.*)/); #,AUR5=ND<~C{(B
 $find_dead_version=-1,next if(1==$find_dead_version && m!^date: $data.*author.*state: dead;!); #找到dead版本号
 $find_dead_version>=0 && /^revision ([\d\.]*)/ && ++$find_dead_version; # revision count
 $fileName_lastVersion{$$rffn}=$1,$$rffn='',next if('' ne $$rffn && -1==$$rfdv && /^revision ([\d\.]*)/); #找到last版本号
    }
    close F;
#   while( my($k,$v) = each(%fileName_lastVersion) ){print "fileName:$k \t<==>\t lastVersion:$v\n";}
}

chdir("$tmpdir");system("cvs -Q co $moduleName");chdir("$moduleName");system("cvs -Q log -T > $log");

parseLog();

while( my($k,$v) = each(%fileName_lastVersion) )
{
    chdir("$tmpdir/$moduleName");   
    my ($file_path,$file_name) = $k =~ /^(.*)\/(.*)/; # sub Directory
    ($file_path,$file_name)=('.',$k) if $k !~ /\//; # root Directory
    print "$file_path\t$file_name\n";

    chdir $file_path;

    system("cvs up -r $v -p $file_name > $file_name");
    system("cvs add $file_name");system("cvs ci -m '' $file_name");   
}

(my $delpath = "$tmpdir/$moduleName") =~ tr/\//\\/;
system("del /s /q /f $delpath");  #没删除干净,全剩下空目录,自己动手吧
rmdir($delpath); #还是没删除干净,空目录自己清理吧 :)

启动开源项目, 希望有兴趣的朋友加入或提些意见.:【上一篇】
C++代码优化:【下一篇】
【相关文章】
  • Perl 模块
  • perl-xml
  • Perl 脚本的特点
  • Perl DBI 基础
  • 运行perl DBI
  • 用perl访问mysql数据库
  • CVS常用命令速查手册
  • FreeBSD使用CVSup升级简单学习
  • cvsup daemon
  • FreeBSD5.3进行CVSup升级不成功的问题
  • 【随机文章】
  • Oracle 应用技巧
  • Eclipse 3.2 M6发布了
  • 关于宽字符
  • Samba服务器的使用
  • 底噪声
  • 创建ActiveX文档应用程序
  • Director中控制声音音量的几种方法
  • 移动百宝箱把关现在怎么还这么松??
  • 我的嵌入式之路[转]
  • hpux系统维护日常命令
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.