return $r[0];
}
+sub _system_error
+{
+my($code,$cmd)=@_;
+
+ confess $cmd.": $code=".join(",",
+ (!WIFEXITED($code) ? () : ("EXITSTATUS(".WEXITSTATUS($code).")")),
+ (!WIFSIGNALED($code) ? () : ("TERMSIG(" .WTERMSIG($code) .")")),
+ (!WIFSTOPPED($code) ? () : ("STOPSIG(" .WSTOPSIG($code) .")")),
+ );
+}
+
sub _system
{
my(@args)=@_;
- system(@args) and confess join(" ",@args).": $?=".join(",",
- (!WIFEXITED($?) ? () : ("EXITSTATUS(".WEXITSTATUS($?).")")),
- (!WIFSIGNALED($?) ? () : ("TERMSIG(" .WTERMSIG($?) .")")),
- (!WIFSTOPPED($?) ? () : ("STOPSIG(" .WSTOPSIG($?) .")")),
- );
+ my $rc_sub=pop @args if ref $args[$#args];
+ $rc_sub||=sub { $_[0]==0; };
+ my $rc=system(@args);
+ _system_error $?,join(" ",@args) if !WIFEXITED($?) || !&{$rc_sub}(WEXITSTATUS($?));
}
# Assumed wildcard pattern expansion to exactly one item if !$nocheck
my(@files)=@_;
my $nocheck=shift @files if $files[0] eq "nocheck";
+ my $flag=shift @files if ref $files[0];
my $dest=pop @files;
# expand pattern to properly match © resulting filenames count
@files=map({ glob $_; } @files);
- @files==copy @files,$dest or $nocheck or confess "$!";
+ @files==copy((!$flag ? () : $flag),@files,$dest) or $nocheck or confess "$!";
}
# Assumed wildcard pattern expansion to exactly one item if !$nocheck
_remove @files;
}
+sub _mkdir
+{
+my(@dirs)=@_;
+
+ for (@dirs) {
+ mkdir $_ or confess "$!";
+ }
+}
+
sub _prepdist
{
my($class,$name)=@_;
"ARGV"=>[qw(--copy)],
"configure_args"=>[split /\s+/,$configure_args],
);
- _remove $Options{"ChangeLog"} || "ChangeLog"; # force its rebuild by Makefile/rcs2log
- _system "make dist $name.spec";
+ _remove "nocheck",($Options{"ChangeLog"} || "ChangeLog"); # force its rebuild by Makefile/rcs2log
}
# $args{
_rpmeval("_tmppath" )."/$name-*-root",
_rpmeval("_builddir")."/$name-*";
$class->_prepdist($name);
- _copy "$name-*.tar.gz",_rpmeval("_sourcedir");
+ _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",
"-ba",
"--rmsource", # _remove _rpmeval("_sourcedir")."/$name-*.tar.gz";
my $name=$Options{"name"};
$class->_prepdist($name);
- _system "tar xzf $name-*.tar.gz";
- _remove "$name-*.tar.gz"; # permit "cd $name-*" below
+ _system "make distdir";
_system(join(" ","cd $name-*;dpkg-buildpackage",
"-rfakeroot",
($args{"sign"} ? () : ("-us","-uc")),