[FFmpeg-devel] [PATCH 1/2] tools/general_assembly: implement extra GA members

Alexander Strasser eclipse7 at gmx.net
Sun Nov 26 17:08:42 EET 2023


On 2023-11-26 10:18 +0100, Anton Khirnov wrote:
> Set pushed.
>
> The general_assembly.pl script should now be usable as the authoritative
> source for GA members.

The patches mostly LGTM.

My Perl knowledge in general is really mostly from 20 years ago.
So if there is any Perl-ish devil in the details I surely have
overlooked it.

Please pardon me if I missed any details on how the program works.
The edge cases are always the tricky stuff...

One thing about this patch and that program in general is a bit
unfortunate: The use of PerlDate is_between.

Here is the doc I found for it:

    $dt->is_between( $lower, $upper )
    Checks whether $dt is strictly between two other DateTime objects.

    "Strictly" means that $dt must be greater than $lower and less than $upper. If it is equal to either object then this method returns false.


AFAIU it affects the script in 2 places:

1. In subroutine get_date_range:
   Here the exact day matching date_ga_rule is treated like
   anything >= date_first_regular

2. In the loop adding the extra member. The member would not be added
   on both, the day they were elected nor the day 2 years after.

Case 1 should be "strictly academical" and thus not really important
because to my knowledge no vote was started on that day.

For case 2 it will be not important on most days, but it would seem
more common and intuitive to use either the closed interval or a
half open interval. Where including the first and the last day or
including the first and excluding the day seem most natural to me.


Best regards,
  Alexander


P.S.
As date calculations always turn out nightmares if you look at them
long enough, it would possible be a good idea to always use UTC and
review how time zones are handled in git CLI.

P.P.S.
For quick reference follow copies for both places referenced above:

Case 1:
    sub get_date_range {
        my ($now) = @_;

        # date on which the GA update rule was established, and the voter list
        # was extraordinarily updated; cf.:
        # * http://lists.ffmpeg.org/pipermail/ffmpeg-devel/2023-October/316054.html
        #   Message-Id <169818211998.11195.16532637803201641594 at lain.khirnov.net>
        # * http://lists.ffmpeg.org/pipermail/ffmpeg-devel/2023-November/316618.html
        #   Message-Id <5efcab06-8510-4226-bf18-68820c7c69ba at betaapp.fastmail.com>
        my $date_ga_rule       = DateTime->new(year => 2023, month => 11, day => 06);
        # date when the regular update rule is first applied
        my $date_first_regular = DateTime->new(year => 2024);

        if ($now->is_between($date_ga_rule, $date_first_regular)) {
            return ($date_ga_rule->clone()->set_year($date_ga_rule->year - 3), $date_ga_rule);
        }

        if ($now < $date_ga_rule) {
            print STDERR  "GA before $date_ga_rule is not well-defined, be very careful with the output\n";
        }

        my $cur_year_jan  = $now->clone()->truncate(to => "year");
        my $cur_year_jul  = $cur_year_jan->clone()->set_month(7);
        my $date_until    = $now > $cur_year_jul ? $cur_year_jul : $cur_year_jan;
        my $date_since    = $date_until->clone()->set_year($date_until->year - 3);

        return ($date_since, $date_until);
    }


Case 2:
    foreach my $entry (@extra_members) {
        my $elected = $entry->[2];
        if ($date->is_between($elected, $elected->clone()->set_year($elected->year + 2))) {
            $assembly{$entry->[0]} = $entry->[1];
        }
    }


More information about the ffmpeg-devel mailing list