+ _system "make $name.spec";
+ my $spec=_readfile "$name.spec";
+ my $patch=($spec=~/^Patch\d*\s*:\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,bz2}") {
+ @origs=glob $glob;
+ confess "Invalid glob $glob: ".join(",",@origs) if 1!=@origs;
+ }
+ my($origbase,$ext)=($origs[0]=~/^orig-(.*)[.]tar[.](gz|Z|bz2)$/);
+ _copy $origs[0],_rpmeval("_sourcedir")."/".($origs[0]=~/^orig-(.*)$/)[0];
+ _system "tar x".($ext eq "bz2" ? "j" : "z")."f ".$origs[0];
+ _mkdir $origbase."-orig";
+ # FIXME: Copy also dot-prefixed files!
+ _move \1,$origbase."/*",$origbase."-orig/";
+ rmdir $origbase or confess "rmdir $origbase: $!";
+ my @ours;
+ for my $glob ("$name-*.tar.gz") {
+ @ours=glob $glob;
+ confess "Invalid glob $glob: ".join(",",@ours) if 1!=@ours;
+ }
+ my($ourbase)=($ours[0]=~/^(.*)[.]tar[.]gz$/);
+ _system "tar xzf ".$ours[0];
+ # 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\)\>.*[$]'."'"
+ ." $origbase-orig/ $ourbase/"
+ ." >"._rpmeval("_sourcedir")."/".$patch,
+ sub { $_[0]==0 || $_[0]==1; }; # diff(1) returns non-zero return code on any diffs.
+ _remove \1,$ourbase,$origbase."-orig";
+ }