aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2020-01-22 10:57:41 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2020-01-22 11:01:29 +0200
commit00c8b97d6e3fab6b87c9b3070bfb69f5858fe2b2 (patch)
tree26049cbc1ca95e987f2583cc6f6d4ed0d10cd6dc
parent68be041dd11573aff08847748456040b9ef3f0b4 (diff)
downloadfile-backup-00c8b97d6e3fab6b87c9b3070bfb69f5858fe2b2.tar.gz
file-backup-00c8b97d6e3fab6b87c9b3070bfb69f5858fe2b2.tar.bz2
Optimize file creation loop
* lib/File/BackupCopy.pm (backup_copy_simple): Use base file name as the last argument to catfile. (backup_copy_internal): Compute backup file stub name before the loop.
-rw-r--r--lib/File/BackupCopy.pm12
1 files changed, 5 insertions, 7 deletions
diff --git a/lib/File/BackupCopy.pm b/lib/File/BackupCopy.pm
index 226e8ce..43ce150 100644
--- a/lib/File/BackupCopy.pm
+++ b/lib/File/BackupCopy.pm
@@ -89,7 +89,7 @@ sub backup_copy_simple {
89 croak "unrecognized keyword arguments" if keys %_; 89 croak "unrecognized keyword arguments" if keys %_;
90 my $backup_name = $file_name . '~'; 90 my $backup_name = $file_name . '~';
91 if ($dir) { 91 if ($dir) {
92 $backup_name = File::Spec->catfile($dir, $backup_name); 92 $backup_name = File::Spec->catfile($dir, basename($backup_name));
93 } 93 }
94 copy($file_name, $backup_name) 94 copy($file_name, $backup_name)
95 or return _backup_copy_error($error, 95 or return _backup_copy_error($error,
@@ -122,8 +122,9 @@ sub backup_copy_internal {
122 or return _backup_copy_error($error, 122 or return _backup_copy_error($error,
123 "failed to make a temporary copy of $file_name: $!"); 123 "failed to make a temporary copy of $file_name: $!");
124 124
125 my $pat = $dir ? File::Spec->catfile($dir, "$file_name.~*~") 125 my $backup_stub = $dir ? File::Spec->catfile($dir, basename($file_name))
126 : "$file_name.~*~"; 126 : $file_name;
127 my $pat = "$backup_stub.~*~";
127 my $num = (sort { $b <=> $a } 128 my $num = (sort { $b <=> $a }
128 map { 129 map {
129 if (/.+\.~(\d+)~$/) { 130 if (/.+\.~(\d+)~$/) {
@@ -141,10 +142,7 @@ sub backup_copy_internal {
141 142
142 my $backup_name; 143 my $backup_name;
143 while (1) { 144 while (1) {
144 $backup_name = "$file_name.~$num~"; 145 $backup_name = "$backup_stub.~$num~";
145 if ($dir) {
146 $backup_name = File::Spec->catfile($dir, $backup_name);
147 }
148 last if symlink($fh->filename, $backup_name); 146 last if symlink($fh->filename, $backup_name);
149 unless ($!{EEXIST}) { 147 unless ($!{EEXIST}) {
150 return _backup_copy_error("can't link " 148 return _backup_copy_error("can't link "

Return to:

Send suggestions and report system problems to the System administrator.