From 1f11b445216d92a38546abdd8b2d3523493ed766 Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 14 Sep 2014 11:03:00 +0000 Subject: [PATCH] * Added some extra options for recursion, additional extensions and verbosity git-svn-id: trunk@28654 - --- utils/delp.pp | 137 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 45 deletions(-) diff --git a/utils/delp.pp b/utils/delp.pp index 7b3b717a0a..4f893443b9 100644 --- a/utils/delp.pp +++ b/utils/delp.pp @@ -149,7 +149,12 @@ begin until s=''; end; -Var quiet: boolean; +Var + quiet : boolean = False; + Recurse : Boolean = False; + Verbose : Boolean = False; + NoDelete : Boolean = False; + MaxDepth : Integer = 0; procedure usage; @@ -157,8 +162,13 @@ begin Writeln('Delp [options] [ [ ...]'); Writeln('Where options is one of:'); writeln(' -e Delete executables also (Not on Unix)'); + writeln(' -x ext Add extension to list of extensions to delete (no dot)'); writeln(' -h Display (this) help message.'); + writeln(' -r Recurse into directories.'); + writeln(' -n Do not actually delete files.'); + writeln(' -m N Maximum depth to recurse into directories (1 based, zero is no max).'); writeln(' -q Quietly perfoms deleting.'); + writeln(' -v Verbose (print names of deleted files).'); Halt(1); end; @@ -169,21 +179,95 @@ Var c : char; begin quiet:=false; Repeat - C:=Getopt('ehq'); + C:=Getopt('ehvnqrm:x:'); Case C of 'e' : AddMAsk('*.exe *.so *.dll'); + 'x' : if (optarg<>'') then + AddMask('*.'+optarg); 'h' : Usage; - 'q' : Quiet:=True; + 'r' : Recurse:=True; + 'n' : NoDelete:=True; + 'm' : MaxDepth:=StrToInt(optarg); + 'q' : begin + Quiet:=True; + verbose:=False; + end; + 'v' : Verbose:=True; EndOfOptions : ; end; Until C=EndOfOptions; end; +Procedure DoDir(basedir : string; ALevel : Integer); + var Dir : TSearchrec; - Total : longint; hp : pmaskitem; + +begin + if Verbose and not Quiet then + Writeln('Cleaning directory "',BaseDir,'".'); + if FindFirst(basedir+'*.*',faanyfile,Dir)=0 then + begin + repeat + hp:=masklist; + while assigned(hp) do + begin + if ((Dir.Attr and faDirectory)=0) and MatchesMask(Dir.Name,hp^.mask) then + begin + if Verbose then + Writeln('Deleting "',BaseDir+Dir.Name,'"'); + if not NoDelete then + DeleteFile(BaseDir+Dir.Name); + inc(hp^.Files); + inc(hp^.Size,Dir.Size); + break; + end; + hp:=hp^.next; + end; + until FindNext(Dir)<>0; + FindClose(Dir); + end; + if Recurse and ((MaxDepth=0) or (ALevel<=MaxDepth)) then + if FindFirst(basedir+allfilesmask,faanyfile,Dir)=0 then + begin + Repeat + if ((Dir.Attr and faDirectory)=faDirectory) and Not ((Dir.Name='.') or (Dir.Name='..')) then + DoDir(IncludeTrailingPathDelimiter(BaseDir+Dir.Name),ALevel+1); + until FindNext(Dir)<>0; + FindClose(Dir); + end; +end; + +Procedure PrintResults; + +var + Total : longint; found : boolean; + hp : pmaskitem; + +begin + { Write Results } + Total:=0; + found:=false; + hp:=masklist; + while assigned(hp) do + begin + if hp^.Files>0 then + begin + WriteLn(' - Removed ',hp^.Files:2,' ',hp^.Mask,' (',DStr(hp^.Size)+' Bytes)'); + inc(Total,hp^.Size); + found:=true; + end; + hp:=hp^.next; + end; + if not found then + WriteLn(' - No Redundant Files Found!') + else + WriteLn(' - Total ',DStr(Total),' Bytes Freed'); +end; + +var basedir : string; i : Integer; @@ -212,49 +296,12 @@ begin writeln(Copyright); Writeln; end; - Total:=0; While (I<=ParamCount) do begin - BaseDir:=Paramstr(I); - If BaseDir[Length(BaseDir)]<>DirectorySeparator then - BaseDir:=BaseDir+DirectorySeparator; - if FindFirst(basedir+'*.*',faanyfile,Dir)=0 then - begin - repeat - hp:=masklist; - while assigned(hp) do - begin - if MatchesMask(Dir.Name,hp^.mask) then - begin - DeleteFile(BaseDir+Dir.Name); - inc(hp^.Files); - inc(hp^.Size,Dir.Size); - break; - end; - hp:=hp^.next; - end; - until FindNext(Dir)<>0; - FindClose(Dir); - end; + BaseDir:=IncludeTrailingPathDelimiter(Paramstr(I)); + DoDir(Basedir,1); Inc(I); end; - { Write Results } - found:=false; - hp:=masklist; - while assigned(hp) do - begin - if hp^.Files>0 then - begin - if not quiet then - WriteLn(' - Removed ',hp^.Files:2,' ',hp^.Mask,' (',DStr(hp^.Size)+' Bytes)'); - inc(Total,hp^.Size); - found:=true; - end; - hp:=hp^.next; - end; - if not quiet then - if not found then - WriteLn(' - No Redundant Files Found!') - else - WriteLn(' - Total ',DStr(Total),' Bytes Freed'); + if Not Quiet then + PrintResults; end.