diff options
Diffstat (limited to 'lorry.tar-importer')
-rwxr-xr-x | lorry.tar-importer | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/lorry.tar-importer b/lorry.tar-importer index 10696bf..7ffdfa9 100755 --- a/lorry.tar-importer +++ b/lorry.tar-importer @@ -112,11 +112,7 @@ foreach my $tar_file (@ARGV) $mtime = oct $mtime; next if $typeflag == 5; # directory - if ($typeflag == 2) { # symbolic link - print FI "blob\n", "mark :$next_mark\n"; - print FI "data ", length($linkname), "\n", $linkname; - $mode = 0120000; - } elsif ($typeflag eq 'x') { # extended header + if ($typeflag eq 'x') { # extended header # If extended header, check for path my $pax_header = ''; while ($size > 0 && read(I, $_, 512) == 512) { @@ -136,15 +132,21 @@ foreach my $tar_file (@ARGV) } elsif ($name =~ m{/\z}) { # If it's a folder, ignore next; - } else { + } elsif ($typeflag != 1) { # handle hard links later print FI "blob\n", "mark :$next_mark\n"; - print FI "data $size\n"; - while ($size > 0 && read(I, $_, 512) == 512) { - print FI substr($_, 0, $size); - $size -= 512; + if ($typeflag == 2) { # symbolic link + print FI "data ", length($linkname), "\n", + $linkname; + $mode = 0120000; + } else { + print FI "data $size\n"; + while ($size > 0 && read(I, $_, 512) == 512) { + print FI substr($_, 0, $size); + $size -= 512; + } } + print FI "\n"; } - print FI "\n"; next if ($typeflag eq 'g'); # ignore global header @@ -154,7 +156,13 @@ foreach my $tar_file (@ARGV) } else { $path = "$name"; } - $files{$path} = [$next_mark++, $mode]; + + if ($typeflag == 1) { # hard link + $linkname = "$prefix/$linkname" if $prefix; + $files{$path} = [ $files{$linkname}->[0], $mode ]; + } else { + $files{$path} = [$next_mark++, $mode]; + } $author_time = $mtime if $mtime > $author_time; $path =~ m,^([^/]+)/,; |