diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2020-01-22 11:05:03 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2020-01-22 13:13:24 +0200 |
commit | f3d76da04b7e918c104693b8584c4f4bd18a7c8d (patch) | |
tree | b53668b38e588552a775f3e6ffb6505e3d657605 | |
parent | 00c8b97d6e3fab6b87c9b3070bfb69f5858fe2b2 (diff) | |
download | file-backup-f3d76da04b7e918c104693b8584c4f4bd18a7c8d.tar.gz file-backup-f3d76da04b7e918c104693b8584c4f4bd18a7c8d.tar.bz2 |
Don't create temporary file if falling back to simple backup
-rw-r--r-- | lib/File/BackupCopy.pm | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/lib/File/BackupCopy.pm b/lib/File/BackupCopy.pm index 43ce150..fd52029 100644 --- a/lib/File/BackupCopy.pm +++ b/lib/File/BackupCopy.pm @@ -110,39 +110,38 @@ sub backup_copy_internal { $dir = delete $_{dir}; croak "unrecognized keyword arguments" if keys %_; } else { croak "wrong number of arguments"; } - my $fh = eval { File::Temp->new(DIR => $dir || dirname($file_name)) }; - if ($@) { - return _backup_copy_error($error, $@); - } - - copy($file_name, $fh) - or return _backup_copy_error($error, - "failed to make a temporary copy of $file_name: $!"); - my $backup_stub = $dir ? File::Spec->catfile($dir, basename($file_name)) : $file_name; - my $pat = "$backup_stub.~*~"; my $num = (sort { $b <=> $a } map { if (/.+\.~(\d+)~$/) { $1 } else { () } - } glob($pat))[0]; + } glob("$backup_stub.~*~"))[0]; if (!defined($num)) { return backup_copy_simple($file_name, error => $error, dir => $dir) if $if_exists; $num = '1'; } + my $fh = eval { File::Temp->new(DIR => $dir || dirname($file_name)) }; + if ($@) { + return _backup_copy_error($error, $@); + } + + copy($file_name, $fh) + or return _backup_copy_error($error, + "failed to make a temporary copy of $file_name: $!"); + my $backup_name; while (1) { $backup_name = "$backup_stub.~$num~"; last if symlink($fh->filename, $backup_name); unless ($!{EEXIST}) { return _backup_copy_error("can't link " |