[prev in list] [next in list] [prev in thread] [next in thread] 

List:       opensuse-buildservice
Subject:    [opensuse-buildservice] [PATCH 4/4] deb: improve action reporting in debtransform
From:       Jan Engelhardt <jengelh () inai ! de>
Date:       2015-06-02 10:59:43
Message-ID: 1433242783-3506-5-git-send-email-jengelh () inai ! de
[Download RAW message or body]

As there is an utter lack of debtransform documentation, make the tool
report some more information messages as a first step to let users
know what magic actually _is_ going on.

Improve the error reporting in the same go.
---
 debtransform | 81 ++++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 54 insertions(+), 27 deletions(-)

diff --git a/debtransform b/debtransform
index b5ae2e7..0b286f1 100755
--- a/debtransform
+++ b/debtransform
@@ -32,7 +32,7 @@ sub parsedsc {
   my ($fn) = @_;
   my @control;
   local *F;
-  open(F, '<', $fn) || die("$fn: $!\n");
+  open(F, '<', $fn) || die("Error in reading $fn: $!\n");
   @control = <F>;
   close F;
   chomp @control;
@@ -59,7 +59,8 @@ sub parsedsc {
 
 sub writedsc {
   my ($fn, $tags) = @_;
-  open(F, '>', $fn) || die("$fn: $!\n");
+  print "Writing $fn\n";
+  open(F, '>', $fn) || die("open $fn: $!\n");
   my @seq = @{$tags->{'__seq'} || []};
   my %seq = map {uc($_) => 1} @seq;
   for (sort keys %$tags) {
@@ -78,44 +79,48 @@ sub writedsc {
 
 sub listtar {
   my ($tar, $skipdebiandir) = @_;
+  print "Scanning $tar...\n";
   local *F;
   my @c;
   unless(defined($skipdebiandir)) {
     $skipdebiandir = 1;
   }
-  open(F, '-|', 'tar', '--numeric-owner', '-tvf', $tar) || die("tar: $!\n");
+  open(F, '-|', 'tar', '--numeric-owner', '-tvf', $tar) ||
+    die("Execution of tar subprocess failed: $!\n");
   while(<F>) {
     next unless /^([-dlbcp])(.........)\s+\d+\/\d+\s+(\S+) \d\d\d\d-\d\d-\d\d \
\d\d:\d\d(?::\d\d)? (.*)$/;  my ($type, $mode, $size, $name) = ($1, $2, $3, $4);
     next if $type eq 'd';
     if ($type eq 'l') {
       next if $skipdebiandir eq 0;
-      die("debian tar contains link: $name\n");
+      die("Archive contains a link: $name\n");
     }
     if ($type ne '-') {
       next if $skipdebiandir eq 0;
-      die("debian tar contains unexpected file type: $name\n");
+      die("Archive contains an unexpected type for file \"$name\"\n");
     }
     $name =~ s/^\.\///;
     $name =~ s/^debian\/// if $skipdebiandir eq 1;
     push @c, {'name' => $name, 'size' => $size};
   }
-  close(F) || die("tar: $!\n");
+  close(F) || die("tar exited with non-zero status: $!\n");
   return @c;
 }
 
 sub extracttar {
   my ($tar, $filename, $s) = @_;
   local *F;
-  open(F, '-|', 'tar', '-xOf', $tar, $filename) || die("tar: $!\n");
+  print "Extracting $tar...\n";
+  open(F, '-|', 'tar', '-xOf', $tar, $filename) ||
+    die("Execution of tar subprocess failed: $!\n");
   my $file = '';
   while ($s > 0) {
     my $l = sysread(F, $file, $s, length($file));
-    die("tar read error\n") unless $l;
+    die("Error while reading from tar subprocess: $!\n") unless $l;
     $s -= $l;
   }
   my @file = split("\n", $file);
-  close(F);
+  close(F) || warn("tar exited with non-zero status: $!\n");
   return @file;
 }
 
@@ -174,7 +179,8 @@ sub dotar {
 sub dofile {
   my ($file, $tardir, $dfile, $origtarfile) = @_;
   local *F;
-  open(F, '<', $file) || die("$file: $!\n");
+  print "Processing file \"$file\"...\n";
+  open(F, '<', $file) || die("Error in reading $file: $!\n");
   my @file = <F>;
   close F;
   chomp(@file);
@@ -192,13 +198,15 @@ sub doseries {
   my @series = <F>;
   close F;
   chomp(@series);
+  print "Processing series file \"$series\"...\n";
   for my $patch (@series) {
     $patch =~ s/(^|\s+)#.*//;
     next if $patch =~ /^\s*$/;
     my $level = 1;
     $level = $1 if $patch =~ /\s.*-p\s*(\d+)/;
     $patch =~ s/\s.*//;
-    open(F, '<', "$dir/$patch") || die("$dir/$patch: $!\n");
+    print "Processing patch $dir/$patch...\n";
+    open(F, '<', "$dir/$patch") || die("Error in reading $dir/$patch: $!\n");
     while(<F>) {
       chomp;
       if ((/^--- ./ || /^\+\+\+ ./) && !/^... \/dev\/null/) {
@@ -227,7 +235,7 @@ sub addfile {
   my $base = $file;
   $base =~ s/.*\///;
   local *F;
-  open(F, '<', $file) || die("$file: $!\n");
+  open(F, '<', $file) || die("Error in reading $file: $!\n");
   my $size = -s F;
   my $ctx = Digest::MD5->new;
   $ctx->addfile(*F);
@@ -236,7 +244,7 @@ sub addfile {
   return "$md5 $size $base";
 }
 
-print "debtransform: ", join( " ", @ARGV ), "\n";
+print "** Started: debtransform @ARGV\n";
 
 my $debug = 0;
 my $changelog;
@@ -265,11 +273,11 @@ my $dir = $ARGV[0];
 my $dsc = $ARGV[1];
 my $out = $ARGV[2];
 
-die("$out: $!\n") unless -d $out;
+die("$out is not a directory\n") unless -d $out;
 
 my $tags = parsedsc($dsc);
 
-opendir(D, $dir) || die("$dir: $!\n");
+opendir(D, $dir) || die("Could not open $dir: $!\n");
 my @dir = grep {$_ ne '.' && $_ ne '..'} readdir(D);
 closedir(D);
 my %dir = map {$_ => 1} @dir;
@@ -284,29 +292,41 @@ if (!$tarfile || !@debtarfiles) {
   my @tars = grep {/\.tgz$|\.tar(?:\.gz|\.bz2|\.xz)?$/} @dir;
   my @debtars = grep {/^debian\.tar(?:\.gz|\.bz2|\.xz)?$/} @tars;
   if (!$tarfile) {
+    print "No DEBTRANSFORM-TAR line in the .dsc file.\n";
+    print "Attempting automatic discovery of a suitable source archive.\n";
     @tars = grep {!/^debian\.tar(?:\.gz|\.bz2|\.xz)?$/} @tars;
     if (@debtarfiles) {
       my %debtarfiles = map {$_ => 1} @debtarfiles;
       @tars = grep {!$debtarfiles{$_}} @tars;
     }
-    die("package contains no tar file\n") unless @tars;
-    die("package contains more than one tar file: @tars\n") if @tars > 1;
+    die("None of the files looks like a usable source tarball.\n") unless @tars;
+    die("Too many files looking like a usable source tarball (would not know which \
to pick): @tars\n") if @tars > 1;  $tarfile = $tars[0];
+    print "Source archive chosen for transformation: $tarfile\n";
+  }
+  if (!exists($tags->{'DEBTRANSFORM-FILES-TAR'})) {
+    print "No DEBTRANSFORM-FILES-TAR line in the .dsc file.\n";
+    print "Attempting automatic discovery of a debian archive.\n";
   }
   if (@debtars && !exists($tags->{'DEBTRANSFORM-FILES-TAR'})) {
-    die("package contains more than one debian tar file\n") if @debtars > 1;
+    die("package contains more than one debian archive\n") if @debtars > 1;
     @debtarfiles = ($debtars[0]);
+    print "Debian archive chosen for transformation: $debtars[0]\n";
   }
 }
 
 my $name = $tags->{'SOURCE'};
-die("dsc file contains no source\n") unless defined($name);
+die("dsc file contains no Source: line\n") unless defined($name);
 my $version = $tags->{'VERSION'};
-die("dsc file contains no version\n") unless defined($version);
-$version =~ s/^\d+://;	# no epoch in version, please
+die("dsc file contains no Version: line\n") unless defined($version);
+# no epoch in version, please
+if ($version =~ s/^\d+://) {
+	print "Stripped epoch from Version field, which is now \"$version\".\n";
+}
 
 
-# transform 
+# debtransform will always generate a 1.0 format type,
+# so it has to transform all source archives into weak gzip files.
 my $tmptar;
 if ($tarfile =~ /\.tar\.bz2/) {
     my $old = $tarfile;
@@ -343,12 +363,15 @@ $v =~ s/-[^-]*$//;
 $tarfile =~ /.*(\.tar.*?)$/;
 my $ntarfile = "${name}_$v.orig$1";
 if( $tmptar ) {
-  link("$tmptar", "$out/$ntarfile") || die("link $dir/$tarfile $out/$ntarfile: \
$!\n"); +  print "Moving $dir/$tarfile to $out/$ntarfile\n";
+  link("$tmptar", "$out/$ntarfile") || die("link: $!\n");
   unlink("$tmptar");
 } else {
-  link("$dir/$tarfile", "$out/$ntarfile") || die("link $dir/$tarfile $out/$ntarfile: \
$!\n"); +  print "Hardlinking $dir/$tarfile to $out/$ntarfile\n";
+  link("$dir/$tarfile", "$out/$ntarfile") || die("link: $!\n");
 }
 push @files, addfile("$out/$ntarfile");
+print "files @files\n";
 
 if ( $tags->{'DEBTRANSFORM-RELEASE'} && $release ) {
     # if dsc file contains the tag DEBTRANSFORM-RELEASE
@@ -360,6 +383,7 @@ if ( $tags->{'DEBTRANSFORM-RELEASE'} && $release ) {
     # (same as for RPMs)
     $version = $v . "-" . $release;
     $tags->{'VERSION'} = $version;
+    print "Modifying dsc Version field to \"$tags->{VERSION}\"\n";
 }
 
 my $tarpath = "$out/$ntarfile";
@@ -367,9 +391,12 @@ my $tardir = $tarfile;
 $tardir =~ s/\.orig\.tar/\.tar/;
 $tardir =~ s/\.tar.*?$//;
 my @tarfilecontent = listtar($tarpath, 0);
-my $origtarfile = { 'name', $tarpath, 'content', \@tarfilecontent, 'version', \
$tags->{'VERSION'}, 'tardir', $tardir}; +my $origtarfile = {'name' => $tarpath, \
'content' => \@tarfilecontent, 'version' => $tags->{'VERSION'}, 'tardir' => $tardir}; \
                
-open(DIFF, '>', "$out/${name}_$version.diff") || die("$out/${name}_$version.diff: \
$!\n"); +print "Generating $out/${name}_$version.diff\n";
+# Since we are generating a unitary diff, we must re-set Format:.
+$tags->{"FORMAT"} = "1.0";
+open(DIFF, '>', "$out/${name}_$version.diff") || die("Cannot open \
$out/${name}_$version.diff for write: $!\n");  
 undef $changelog if $dir{'debian.changelog'};
 
@@ -379,7 +406,7 @@ for my $debtarfile (@debtarfiles) {
   my @c = listtar("$dir/$debtarfile");
   $debtarcontent{$debtarfile} = \@c;
   for (@c) {
-    die("debian tar and directory both contain '$_->{'name'}'\n") if \
$dir{"debian.$_->{'name'}"}; +    die("\"$_->{'name'}\" exists in both the debian \
archive as well as the package source directory.\n") if $dir{"debian.$_->{'name'}"};  \
undef $changelog if $_->{'name'} eq 'changelog';  $debtarorigin{$_->{'name'}} = \
"$dir/$debtarfile";  }
-- 
2.4.0

-- 
To unsubscribe, e-mail: opensuse-buildservice+unsubscribe@opensuse.org
To contact the owner, e-mail: opensuse-buildservice+owner@opensuse.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic