#!/usr/bin/perl # # dividespec.pl # - SPEC ファイルを CVS リポジトリのディレクトリにわけます。 # # 使い方: # dividespec.pl -o # $DEFAULT_OUTDIR="$ENV{'HOME'}/pkg_new"; $DIRECTORY_FORMAT = "%{outdir}/%{name}/%{version}"; $DEBUG = 1; $outdir = $DEFAULT_OUTDIR; # 引数を読む。 sub readargv { for ($i = 0 ; $i <=$#ARGV ; $i ++) { if($ARGV[$i] eq '-o') { $i++; $outdir = $ARGV[$i] if (-d $ARGV[$i]); } else { push(@files, $ARGV[$i]); } } $outdir='.' if (!$outdir); } &readargv; print "Files = $#files\n" if ($DEBUG); print "Outdir: $outdir\n"; for (@files) { readfile($_); } sub readfile { my($file) = shift; my($name, $version, $release, $serial, %define); my($outputdir) = $DIRECTORY_FORMAT; print "Processing $file\n"; if(!-r $file) { print "$file is not found, skip.\n"; return; } open(IN, $file); while($line = ) { if($line =~ /^Name:\s*(\S+)\n$/) { $name = &convertdef($1); } elsif ($line =~ /^Version:\s*(\S+)\n$/) { $version = &convertdef($1); } elsif ($line =~ /^Release:\s*(\S+)\n$/) { $release = &convertdef($1); } elsif ($line =~ /^Serial:\s*(\d+)\n/) { $serial = &convertdef($1); } elsif ($line =~ /^\%define\s+(\S+)\s+(.+)\n/) { $Defines{$1} = $2; print "Define: $1 = $2\n" if $DEBUG; } last if($name && $version && $release && $serial); } close(IN); print "Name=$name Ver=$version Release:$release Serial:$serial\n\n" if($DEBUG); $outputdir =~ s/\%{name}/$name/g; $outputdir =~ s/\%{version}/$version/g; $outputdir =~ s/\%{release}/$release/g; $outputdir =~ s/\%{serial}/$serial/g; $outputdir =~ s/\%{outdir}/$outdir/g; #$outputdir =~ s/\%{file}/$file/g; system("mkdir -p $outputdir"); system("cp $file $outputdir/"); } sub convertdef { # %define な部分の置き換え my($target) = shift; my($name, $val); while(($name, $val) = each(%Defines)) { $target =~ s/\%$name/$val/g; $target =~ s/\%\{$name\}/$val/g; } return($target); }