summaryrefslogtreecommitdiff
path: root/lorry.tar-importer
diff options
context:
space:
mode:
Diffstat (limited to 'lorry.tar-importer')
-rwxr-xr-xlorry.tar-importer32
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,^([^/]+)/,;