my $tf = "$dstdir/$f";
     my $downloaded = 0;
 
+    my $checkhash = sub {
+       open F, "<", "$tf" or die "$tf: $!";
+       $fi->{Digester}->reset();
+       $fi->{Digester}->addfile(*F);
+       F->error and die $!;
+       my $got = $fi->{Digester}->hexdigest();
+       $got eq $fi->{Hash} or
+           fail "file $f has hash $got but .dsc".
+               " demands hash $fi->{Hash} ".
+               ($downloaded ? "(got wrong file from archive!)"
+                : "(perhaps you should delete this file?)");
+    };
+
     if (stat_exists $tf) {
        progress "using existing $f";
     } else {
        $downloaded = 1;
     }
 
-    open F, "<", "$tf" or die "$tf: $!";
-    $fi->{Digester}->reset();
-    $fi->{Digester}->addfile(*F);
-    F->error and die $!;
-    my $got = $fi->{Digester}->hexdigest();
-    $got eq $fi->{Hash} or
-       fail "file $f has hash $got but .dsc".
-           " demands hash $fi->{Hash} ".
-           ($downloaded ? "(got wrong file from archive!)"
-            : "(perhaps you should delete this file?)");
+    $checkhash->();
 
     return 1;
 }