From 8cf790bf04ea4f4cc5b88b661d63ccc27eed7b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Sun, 16 Jan 2022 12:45:12 -0500 Subject: [PATCH] Generate symlinks properly for multi tests --- Makefile | 1 - bin/YAMLTestSuite.pm | 11 ++++++++++- bin/data-symlinks | 47 -------------------------------------------- bin/suite-to-data.pl | 35 ++++++++++++++++++++++++++------- 4 files changed, 38 insertions(+), 56 deletions(-) delete mode 100755 bin/data-symlinks diff --git a/Makefile b/Makefile index fbec8c38..54dda81a 100644 --- a/Makefile +++ b/Makefile @@ -82,7 +82,6 @@ data: data-update: data rm -fr ${make}++; $self->{data} = $test; $self->{num} = sprintf "%0${l}d", $i++; - $self->{ID} = $multi + my $ID = $self->{ID} = $multi ? "$self->{id}-$self->{num}" : $self->{id}; + die "Can't change test name in '$ID'" + if $test->{name} and $cache->{name}; + $test->{name} ||= $cache->{name} or die; + $test->{tags} ||= $cache->{tags} || ''; $test->{yaml} ||= $cache->{yaml} or die; $test->{fail} = exists $test->{fail} ? 1 : 0; + $self->{slug} = lc $test->{name}; + $self->{slug} =~ s/[^\w]+/-/g; + $self->{slug} =~ s/^-//; + $self->{slug} =~ s/-$//; + for my $key (qw< tree json dump emit toke >) { if ( not exists $test->{$key} and diff --git a/bin/data-symlinks b/bin/data-symlinks deleted file mode 100755 index 446fd71f..00000000 --- a/bin/data-symlinks +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -set -e -u -o pipefail -shopt -s globstar - -data=${1:-data} - -for dir in meta name tags; do - rm -fr "${data:?}/$dir" - mkdir -p "$data/$dir" -done - -for file in "$data"/**/===; do - id=${file#$data/} - id=${id%/===} - label=$(< "$file") - slug=$( - echo "$label" | - perl -pe '$_=lc; s/[^\w]+/-/g; s/^-//; s/-$//' - ) - - baseid=$id - if [[ $(basename "$id") != "$id" ]]; then - # we have a multitest, e.g. AB34/00 - baseid=$(dirname "$id") - mkdir -p "$data/meta/$baseid" - fi - ln -s "$label" "$data/meta/$id.label" - [[ -e $data/name/$slug ]] || - ln -s "../$baseid" "$data/name/$slug" - IFS=' ' read -r -a tags <<< "$( - grep '^ tags:' < "src/$baseid.yaml" | - cut -d: -f2 - )" - for tag in "${tags[@]}"; do - mkdir -p "$data/tags/$tag" - if [[ $(basename "$id") != "$id" ]]; then - mkdir -p "$data/tags/$tag/$baseid" - ln -s "../../../$id" "$data/tags/$tag/$id" - else - ln -s "../../$id" "$data/tags/$tag/$id" - fi - done -done - -echo "Regenerated symlinks in $data/meta, $data/name and $data/tag" -echo diff --git a/bin/suite-to-data.pl b/bin/suite-to-data.pl index f18c566c..b681ecf7 100644 --- a/bin/suite-to-data.pl +++ b/bin/suite-to-data.pl @@ -12,6 +12,7 @@ use lib $FindBin::Bin; use base 'YAMLTestSuite'; use Encode; +use File::Path qw(make_path); my %map = ( 'name' => '===', @@ -24,20 +25,25 @@ 'toke' => 'lex.token', ); +die "'data' directory not empty" if glob('data/*'); +mkdir my $meta_dir = "data/meta"; +mkdir my $name_dir = "data/name"; +mkdir my $tags_dir = "data/tags"; + main->new->run([@ARGV]); sub make { my ($self) = @_; - my ($id, $ID, $num, $data, $multi) = - @$self{qw}; + my ($id, $ID, $num, $data, $multi, $slug) = + @$self{qw}; - my $dir = "data/$id"; - mkdir $dir unless -d $dir; + my $test_dir = "data/$id"; + mkdir $test_dir unless -d $test_dir; if ($multi) { - $dir .= "/$num"; - mkdir $dir or die $dir; + $test_dir .= "/$num"; + mkdir $test_dir or die $test_dir; } for my $k (sort keys %map) { @@ -57,11 +63,26 @@ sub make { $_ = $self->unescape($_); - open my $out, '>', "$dir/$map{$k}" or die; + open my $out, '>', "$test_dir/$map{$k}" or die; print $out encode_utf8($_); close $out; } } + + if ($num == 0) { + symlink $data->{name}, "$meta_dir/$id.label"; + symlink "../$id", "$name_dir/$slug"; + } + + for my $tag (split /\s+/, $data->{tags}) { + mkdir "$tags_dir/$tag"; + if ($multi) { + symlink "../../$id/$num", "$tags_dir/$tag/$id-$num"; + } + else { + symlink "../../$id", "$tags_dir/$tag/$id"; + } + } } sub final {