diff options
author | Ben Brown <ben.brown@codethink.co.uk> | 2018-05-21 10:04:40 +0000 |
---|---|---|
committer | Ben Brown <ben.brown@codethink.co.uk> | 2018-05-21 10:04:40 +0000 |
commit | 2b9e5856dbfd7fd6dacbb0c92443d87b502dcc4b (patch) | |
tree | 0d1865dc126ea3ff9eedf14d7231f5a49983ffa4 | |
parent | 82907f62c46438c4cac87d53ad39bd6477261c70 (diff) | |
parent | 6f10fecc49e05d8ad3f2997ac0f788d3fdff51a6 (diff) | |
download | lorry-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-x | lorry.tar-importer | 30 |
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"; |