summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Brown <ben.brown@codethink.co.uk>2018-05-21 10:04:40 +0000
committerBen Brown <ben.brown@codethink.co.uk>2018-05-21 10:04:40 +0000
commit2b9e5856dbfd7fd6dacbb0c92443d87b502dcc4b (patch)
tree0d1865dc126ea3ff9eedf14d7231f5a49983ffa4
parent82907f62c46438c4cac87d53ad39bd6477261c70 (diff)
parent6f10fecc49e05d8ad3f2997ac0f788d3fdff51a6 (diff)
downloadlorry-2b9e5856dbfd7fd6dacbb0c92443d87b502dcc4b.tar.gz
Merge branch 'pedro/fix-gcc-tar-import' into 'master'
lorry.tar-importer: Improve support for PAX extended headers Closes #1 See merge request baserock/lorry!3
-rwxr-xr-xlorry.tar-importer30
1 files changed, 27 insertions, 3 deletions
diff --git a/lorry.tar-importer b/lorry.tar-importer
index d4d27f5..6cdad1d 100755
--- a/lorry.tar-importer
+++ b/lorry.tar-importer
@@ -70,6 +70,8 @@ foreach my $tar_file (@ARGV)
my $have_top_dir = 1;
my ($top_dir, %files);
+ my $next_path = '';
+
while (read(I, $_, 512) == 512) {
my ($name, $mode, $uid, $gid, $size, $mtime,
$chksum, $typeflag, $linkname, $magic,
@@ -77,6 +79,13 @@ foreach my $tar_file (@ARGV)
$prefix) = unpack 'Z100 Z8 Z8 Z8 Z12 Z12
Z8 Z1 Z100 Z6
Z2 Z32 Z32 Z8 Z8 Z*', $_;
+
+ unless ($next_path eq '') {
+ # Recover name from previous extended header
+ $name = $next_path;
+ $next_path = '';
+ }
+
last unless length($name);
if ($name eq '././@LongLink') {
# GNU tar extension
@@ -97,7 +106,6 @@ foreach my $tar_file (@ARGV)
Z8 Z1 Z100 Z6
Z2 Z32 Z32 Z8 Z8 Z*', $_;
}
- next if $name =~ m{/\z};
$mode = oct $mode;
$size = oct $size;
$mtime = oct $mtime;
@@ -108,8 +116,24 @@ foreach my $tar_file (@ARGV)
print FI "data ", length($linkname), "\n", $linkname;
$mode = 0120000;
} elsif ($typeflag eq 'x') { # extended header
- # skip header contents
- $size -= 512 while ($size > 0 && read(I, $_, 512) == 512);
+ # If extended header, check for path
+ my $pax_header = '';
+ while ($size > 0 && read(I, $_, 512) == 512) {
+ $pax_header = $pax_header . substr($_, 0, $size);
+ $size -= 512;
+ }
+
+ my @lines = split /\n/, $pax_header;
+ foreach my $line (@lines) {
+ my ($len, $entry) = split / /, $line;
+ my ($key, $value) = split /=/, $entry;
+ if ($key eq 'path') {
+ $next_path = $value;
+ }
+ }
+ next;
+ } elsif ($name =~ m{/\z}) {
+ # If it's a folder, ignore
next;
} else {
print FI "blob\n", "mark :$next_mark\n";