]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
test_common: create_*: detect changes all parameters
authorEric Wong <e@80x24.org>
Tue, 28 Nov 2023 14:56:14 +0000 (14:56 +0000)
committerEric Wong <e@80x24.org>
Wed, 29 Nov 2023 02:13:16 +0000 (02:13 +0000)
Data::Dumper+B::Deparse seems fast enough to generate cache keys
with, so this makes updating and developing tests easier (as
opposed to forcing the developer to change the identifier).  The
main downside is we'll have to deal with cache expiration, but
"make clean" seems overly aggressive already (it keeps blowing
away the clones made by t/cindex-join.t :<)

lib/PublicInbox/TestCommon.pm

index 361a2356105e70a76b8acbb21f6e8e9daef54b4f..8e7eb950d1fb0a641b572348db5368a956ee7c89 100644 (file)
@@ -793,6 +793,19 @@ our %COMMIT_ENV = (
        GIT_COMMITTER_EMAIL => 'c@example.com',
 );
 
+# for memoizing based on coderefs and various create_* params
+sub my_sum {
+       require PublicInbox::SHA;
+       require Data::Dumper;
+       my $d = Data::Dumper->new(\@_);
+       $d->$_(1) for qw(Deparse Sortkeys Terse);
+       my @l = split /\n/s, $d->Dump;
+       @l = grep !/\$\^H\{.+?[A-Z]+\(0x[0-9a-f]+\)/, @l; # autodie addresses
+       my @addr = grep /[A-Za-z]+\(0x[0-9a-f]+\)/, @l;
+       xbail 'undumpable addresses: ', \@addr if @addr;
+       substr PublicInbox::SHA::sha256_hex(join('', @l)), 0, 8;
+}
+
 sub create_coderepo ($$;@) {
        my $ident = shift;
        my $cb = pop;
@@ -801,15 +814,12 @@ sub create_coderepo ($$;@) {
        require PublicInbox::Import;
        my ($base) = ($0 =~ m!\b([^/]+)\.[^\.]+\z!);
        my ($db) = (PublicInbox::Import::default_branch() =~ m!([^/]+)\z!);
-       my $dir = "t/data-gen/$base.$ident-$db";
-       my $new = !-d $dir;
-       if ($new && !CORE::mkdir($dir)) {
-               my $err = $!;
-               -d $dir or xbail "mkdir($dir): $err";
-       }
+       my $tmpdir = delete $opt{tmpdir};
+       my $dir = "t/data-gen/$base.$ident-".my_sum($db, $cb, \%opt);
+       require File::Path;
+       my $new = File::Path::make_path($dir);
        my $lk = PublicInbox::Lock->new("$dir/creat.lock");
        my $scope = $lk->lock_for_scope;
-       my $tmpdir = delete $opt{tmpdir};
        if (!-f "$dir/creat.stamp") {
                opendir(my $dfh, '.');
                chdir($dir);
@@ -832,12 +842,10 @@ sub create_inbox ($;@) {
        require PublicInbox::Import;
        my ($base) = ($0 =~ m!\b([^/]+)\.[^\.]+\z!);
        my ($db) = (PublicInbox::Import::default_branch() =~ m!([^/]+)\z!);
-       my $dir = "t/data-gen/$base.$ident-$db";
-       my $new = !-d $dir;
-       if ($new && !mkdir($dir)) {
-               my $err = $!;
-               -d $dir or xbail "mkdir($dir): $err";
-       }
+       my $tmpdir = delete $opt{tmpdir};
+       my $dir = "t/data-gen/$base.$ident-".my_sum($db, $cb, \%opt);
+       require File::Path;
+       my $new = File::Path::make_path($dir);
        my $lk = PublicInbox::Lock->new("$dir/creat.lock");
        $opt{inboxdir} = File::Spec->rel2abs($dir);
        $opt{name} //= $ident;
@@ -846,7 +854,6 @@ sub create_inbox ($;@) {
        $pre_cb->($dir) if $pre_cb && $new;
        $opt{-no_fsync} = 1;
        my $no_gc = delete $opt{-no_gc};
-       my $tmpdir = delete $opt{tmpdir};
        my $addr = $opt{address} // [];
        $opt{-primary_address} //= $addr->[0] // "$ident\@example.com";
        my $parallel = delete($opt{importer_parallel}) // 0;