- my($specsrc)=map((-e $_ ? $_ : "$name.spec.in"),"$name.spec.m4.in");
- my $spec=_readfile $specsrc;
- $spec=~s/\\\n/ /gs;
- $class->run(%Options,
- "ARGV"=>["--copy"],
- "configure_args"=>[split /\s+/,($spec=~/^%configure\s+(.*)$/m)[0]],
- );
- _system "make dist $name.spec";
- _copy "$name-*.tar.gz",_rpmeval("_sourcedir");
- _system(join(" ","rpm",
+ $class->_prepdist($name);
+ _system "make $name.spec";
+ my $spec=_readfile "$name.spec";
+ my $patch=($spec=~/^Patch\d*:\s*(.*)$/m)[0];
+ _system "make dist";
+ if (!$patch) {
+ _copy "$name-*.tar.gz",_rpmeval("_sourcedir");
+ }
+ else {
+ my @origs;
+ for my $glob ("orig-$name-*.tar.{gz,Z}") {
+ @origs=glob "orig-$name-*.tar.{gz,Z,bz2}";
+ confess "Invalid glob $glob: ".join(",",@origs) if 1!=@origs;
+ }
+ my $base=($origs[0]=~/^orig-(.*)[.]tar[.](?:gz|Z)$/)[0];
+ _copy $origs[0],_rpmeval("_sourcedir")."/".($origs[0]=~/^orig-(.*)$/)[0];
+ _system "tar xzf ".$origs[0];
+ _mkdir $base."-orig";
+ # FIXME: Copy also dot-prefixed files!
+ _move \1,$base."/*",$base."-orig/";
+ _system "tar xzf $name-*.tar.gz";
+ # Use single-argument system() as we need shell redirection.
+ # FIXME: Use directory-independent _cleanfiles(), not root-directory '.cvsignore'.
+ # "-X -" does not work, it needs to be stat(2)able file.
+ _system "diff -ruP -X .cvsignore -I '".'[$]\(Id\|RCSfile\)\>.*[$]'."'"
+ ." $base-orig/ $base/"
+ ." >"._rpmeval("_sourcedir")."/".$patch,
+ sub { $_[0]==0 || $_[0]==1; }; # diff(1) returns non-zero return code on any diffs.
+ _remove \1,$base,$base."-orig";
+ }
+ _system(join(" ","rpmbuild",