1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-06-11 02:16:16 +02:00

import-tars: support hard links

Previously, we simply treated hard links as if they were plain files
with size 0, ignoring the link type "1" and hence the link target.

What we should do instead, of course, is to use the link target to get
at the import mark for the contents, even if we cannot recreate the hard
link per se, as Git has no concept of hard links.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2016-08-03 15:30:20 +02:00 committed by Junio C Hamano
parent e46579643d
commit 04e0869876

View File

@ -96,18 +96,21 @@
$mtime = oct $mtime;
next if $typeflag == 5; # directory
print FI "blob\n", "mark :$next_mark\n";
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;
if ($typeflag != 1) { # handle hard links later
print FI "blob\n", "mark :$next_mark\n";
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";
my $path;
if ($prefix) {
@ -115,7 +118,13 @@
} 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,^([^/]+)/,;