? a ? afresh ? faster.diff ? faster2.diff ? todo ? OpenBSD/.swp ? OpenBSD/strict.diff Index: OpenBSD/Add.pm =================================================================== RCS file: /cvs/src/usr.sbin/pkg_add/OpenBSD/Add.pm,v retrieving revision 1.187 diff -u -p -r1.187 Add.pm --- OpenBSD/Add.pm 9 Mar 2022 12:27:51 -0000 1.187 +++ OpenBSD/Add.pm 13 Mar 2022 11:58:19 -0000 @@ -466,6 +466,7 @@ sub find_safe_dir my $fullname = $self->fullname; my $filename = $state->{destdir}.$fullname; my $d = dirname($filename); + my $orig = $d; # we go back up until we find an existing directory. # hopefully this will be on the same file system. @@ -483,6 +484,12 @@ sub find_safe_dir if (!-e _ && !$state->{not}) { $state->make_path($d, $fullname); } + if ($state->{current_set}{simple_update} && + $d eq $orig && + !-e $filename) { + $self->{avoid_temp} = $filename; + } + return $d; } @@ -503,6 +510,18 @@ sub create_temp return ($fh, $tempname); } +sub may_create_temp +{ + my ($self, $d, $state) = @_; + if ($self->{avoid_temp}) { + if (open(my $fh, '>', $self->{avoid_temp})) { + return ($fh, $self->{avoid_temp}); + } + } + delete $self->{avoid_temp}; + return $self->create_temp($d, $state); +} + sub tie { my ($self, $state) = @_; @@ -513,6 +532,16 @@ sub tie $self->SUPER::extract($state); my $d = $self->find_safe_dir($state); + my $src = $self->{tieto}->realname($state); + my $dest = $self->realname($state); + if ($state->{current_set}{simple_update} && $src eq $dest) { + $state->say("No name change on tied file #1", $src) + if $state->verbose >= 3; + $self->{tieto}{dont_delete} = 1; + $self->{avoid_temp} = 1; + return; + } + delete $self->{avoid_temp}; if ($state->{not}) { $state->say("link #1 -> #2", $self->name, $d) if $state->verbose >= 3; @@ -520,7 +549,6 @@ sub tie my ($fh, $tempname) = $self->create_temp($d, $state); return if !defined $tempname; - my $src = $self->{tieto}->realname($state); unlink($tempname); $state->say("link #1 -> #2", $src, $tempname) if $state->verbose >= 3; @@ -528,6 +556,7 @@ sub tie } } + sub extract { my ($self, $state, $file) = @_; @@ -540,13 +569,13 @@ sub extract $self->name, $d) if $state->verbose >= 3; $state->{archive}->skip; } else { - my ($fh, $tempname) = $self->create_temp($d, $state); - if (!defined $tempname) { + my ($fh, $filename) = $self->may_create_temp($d, $state); + if (!defined $filename) { $state->{archive}->skip; return; } - $state->say("extract #1 -> #2", $self->name, $tempname) + $state->say("extract #1 -> #2", $self->name, $filename) if $state->verbose >= 3; @@ -555,7 +584,7 @@ sub extract $self->stringize); } $file->extract_to_fh($fh); - $self->may_check_digest($tempname, $state); + $self->may_check_digest($filename, $state); } } @@ -576,17 +605,21 @@ sub install } elsif (defined $self->{symlink}) { symlink($self->{symlink}, $destdir.$fullname); } else { - if (!defined $self->{tempname}) { - return if $state->allow_nonroot($fullname); - $state->fatal("No tempname for #1", $fullname); + if (defined $self->{avoid_temp}) { + delete $self->{avoid_temp}; + } else { + if (!defined $self->{tempname}) { + return if $state->allow_nonroot($fullname); + $state->fatal("No tempname for #1", $fullname); + } + rename($self->{tempname}, $destdir.$fullname) or + $state->fatal("can't move #1 to #2: #3", + $self->{tempname}, $fullname, $!); + $state->say("moving #1 -> #2", + $self->{tempname}, $destdir.$fullname) + if $state->verbose >= 5; + delete $self->{tempname}; } - rename($self->{tempname}, $destdir.$fullname) or - $state->fatal("can't move #1 to #2: #3", - $self->{tempname}, $fullname, $!); - $state->say("moving #1 -> #2", - $self->{tempname}, $destdir.$fullname) - if $state->verbose >= 5; - delete $self->{tempname}; } $self->set_modes($state, $destdir.$fullname); } Index: OpenBSD/Delete.pm =================================================================== RCS file: /cvs/src/usr.sbin/pkg_add/OpenBSD/Delete.pm,v retrieving revision 1.160 diff -u -p -r1.160 Delete.pm --- OpenBSD/Delete.pm 24 Jul 2019 18:05:26 -0000 1.160 +++ OpenBSD/Delete.pm 13 Mar 2022 11:58:19 -0000 @@ -448,6 +448,7 @@ sub is_intact sub delete { my ($self, $state) = @_; + return if $self->{dont_delete}; my $realname = $self->realname($state); if (defined $self->{symlink}) { Index: OpenBSD/PkgAdd.pm =================================================================== RCS file: /cvs/src/usr.sbin/pkg_add/OpenBSD/PkgAdd.pm,v retrieving revision 1.122 diff -u -p -r1.122 PkgAdd.pm --- OpenBSD/PkgAdd.pm 12 Oct 2021 09:06:37 -0000 1.122 +++ OpenBSD/PkgAdd.pm 13 Mar 2022 11:58:19 -0000 @@ -102,7 +102,7 @@ sub tie_files $self->{tieto} = $tied; $tied->{tied} = 1; $state->say("Tying #1 to #2", $self->stringize, - $tied->stringize) if $state->verbose >= 3; + $tied->realname) if $state->verbose >= 3; } }