+Support for 'foreign' RPM build where "orig-$name-*.tar.gz" archive is used.
[macros.git] / AutoGen.pm
index 343d463..64dbad3 100644 (file)
@@ -119,15 +119,25 @@ my(@names)=@_;
        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
@@ -136,10 +146,11 @@ sub _copy
 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 &copy 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
@@ -164,6 +175,15 @@ my(@files)=@_;
        _remove @files;
 }
 
+sub _mkdir
+{
+my(@dirs)=@_;
+
+       for (@dirs) {
+               mkdir $_ or confess "$!";
+               }
+}
+
 sub _prepdist
 {
 my($class,$name)=@_;
@@ -177,8 +197,7 @@ 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{
@@ -193,7 +212,35 @@ my($class,%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";
@@ -217,8 +264,7 @@ my($class,%args)=@_;
 
        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")),