--- svn_load_dirs.pl.orig 2005-02-11 13:10:31.000000000 +0100 +++ svn_load_dirs.pl 2005-02-15 17:52:49.000000000 +0100 @@ -574,7 +574,7 @@ "type for '$source_path'.\n"; } - if ($source_type ne 'f' and $source_type ne 'd') + if ($source_type ne 'f' and $source_type ne 'd' and $source_type ne 'l') { warn "$0: skipping loading file '$source_path' of type ", "'$source_type'.\n"; @@ -898,7 +898,7 @@ my ($source_type, $source_is_exe) = &file_info($source_path); my ($dest_type) = &file_info($dest_path); - return if ($source_type ne 'd' and $source_type ne 'f'); + return if ($source_type ne 'd' and $source_type ne 'f' and $source_type ne 'l'); # Fail if the destination type exists but is of a different # type of file than the source type. @@ -915,7 +915,7 @@ { if (defined (my $del_digest = $del_info->{digest})) { - my $new_digest = &digest_hash_file($source_path); + my $new_digest = &digest_hash_file($source_path, $source_type); if ($new_digest ne $del_digest) { print "U $source_path\n"; @@ -966,7 +966,7 @@ # Ignore properties that do not apply to # files. - if ($source_type eq 'f') + if ($source_type eq 'f' or $source_type eq 'l') { if ($property_name eq 'svn:externals' or $property_name eq 'svn:ignore') @@ -1018,6 +1018,18 @@ or die "$0: copy '$source_path' to '$dest_path': $!\n"; } } + elsif + ($source_type eq 'l') { + # Only copy the file if the digests do not match. + if ($add_files{$source_path} or $upd_files{$source_path}) + { + my $link_path = readlink($source_path) + or die "$0: cannot read link '$source_path': $!\n"; + unlink($dest_path); + symlink($link_path, $dest_path) + or die "$0: cannot symlink '$link_path' to '$dest_path': $!\n"; + } + } else { die "$0: does not handle copying files of type '$source_type'.\n"; @@ -1563,7 +1575,7 @@ my $file_digest; if ($file_type eq 'f' or ($file_type eq 'l' and stat($_) and -f _)) { - $file_digest = &digest_hash_file($_); + $file_digest = &digest_hash_file($_, $file_type); } $files{$_} = {type => $file_type, digest => $file_digest}; @@ -1699,25 +1711,38 @@ # Get a digest hash of the specified filename. sub digest_hash_file { - unless (@_ == 1) + unless (@_ == 2) { croak "$0: digest_hash_file $INCORRECT_NUMBER_OF_ARGS"; } my $filename = shift; + my $filetype = shift; - my $ctx = Digest::MD5->new; - if (open(READ, $filename)) + if ($filetype eq 'f') + { + my $ctx = Digest::MD5->new; + if (open(READ, $filename)) + { + binmode READ; + $ctx->addfile(*READ); + close(READ); + } + else + { + die "$0: cannot open '$filename' for reading: $!\n"; + } + $ctx->digest; + } + elsif ($filetype eq 'l') { - binmode READ; - $ctx->addfile(*READ); - close(READ); + my $digest = readlink($filename) or die "$0: cannot read symlink '$filename': $!\n"; + $digest; } else { - die "$0: cannot open '$filename' for reading: $!\n"; + croak "$0: digest_has_file: unknown filetype '$filetype'"; } - $ctx->digest; } # Read standard input until a line contains the required input or an