diff --git a/tools/sendcalls/call.txt.template b/tools/sendcalls/call.txt.template new file mode 100644 index 0000000000..3037b557c9 --- /dev/null +++ b/tools/sendcalls/call.txt.template @@ -0,0 +1,37 @@ +Dear FreeBSD Community, + +The deadline for the next FreeBSD Status Report update is +%%DEADLINE%% for work done since the last round of quarterly reports: +%%START%% %%YEAR%% - %%STOP%% %%YEAR%%. +I would like to remind you that reports are published on a quarterly +basis and are usually collected during the last month of each quarter, +You are also welcome to submit them even earlier if you want, and the +earliest you submit them, the more time we have for reviewing. + +Status report submissions do not need to be very long. They may be +about anything happening in the FreeBSD project and community, and +they provide a great way to inform FreeBSD users and developers about +work that is underway or has been completed. Report submissions are +not limited to committers; anyone doing anything interesting and +FreeBSD related can -- and should -- write one! + +The following methods are available to submit your reports: + +* submit a review on Phabricator and add the group "status" to the + reviewers list. You should put your reports in the directory + doc/website/content/en/status/report-%%YEAR%%-%%START_NUM%%-%%YEAR%%-%%STOP_NUM%%/ ; + +* submit a pull request at https://github.com/freebsd/freebsd-doc . + You should put your reports in the directory + doc/website/content/en/status/report-%%YEAR%%-%%START_NUM%%-%%YEAR%%-%%STOP_NUM%%/ ; + +* send an email to status-submissions@FreeBSD.org including your report. + +An AsciiDoctor template is available at +https://www.FreeBSD.org/status/report-sample.adoc . + +We look forward to seeing your %%YEAR%%Q%%QUARTER%% reports! + +Thanks, + +%%SIGNATURE%% (on behalf of status@) diff --git a/tools/sendcalls/sendcalls b/tools/sendcalls/sendcalls new file mode 100755 index 0000000000..57b6c384a6 --- /dev/null +++ b/tools/sendcalls/sendcalls @@ -0,0 +1,308 @@ +#!/usr/bin/env perl +# +# Copyright (c) 2020-2023 Lorenzo Salvadore +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +use strict; +use warnings; + +use Getopt::Std; + +# ------------------------------------------------------- +# Global variables declaration +# ------------------------------------------------------- + +# Variables used to compute the time coordinates of the call (see below) +# +# They can be computed based on present date or given on the command line +# through options (see --help). +my $day; +my $month; +my $year; + +# Time coordinates of the call +# +# - $quarter is the number of the quarter for which we are sending the +# calls. +# - $urgency_tag indicates the urgency with which we are requesting the +# reports. It will be included in the subject of the calling mail. It +# can be empty, [2 WEEKS LEFT REMINDER] or [LAST OFFICIAL REMINDER]. +my $quarter; +my $urgency_tag; + +# Variables related to the contacts of the last status reports +# +# $year_last, $month_last_start, %month_last_stop and $quarter_last are +# the year, the initial month, the last month and the number of the +# quarter of the last quarterly status reports. They are used to compute +# $quarter_last_directory, the directory where the reports for last +# quarter can be found. +my $year_last; +my $month_last_start; +my $month_last_stop; +my $quarter_last; +my $quarter_last_directory; + +# Variables related to the calls mail we are sending +# +# - $subject is the subject of the mail we send. +# - $send_command is the command we run to send the mail. +# - @bcc_recipients and @cc_recipients are the array of all the addresses +# we want to put in the BCC and CC field respectively. The To field +# contains freebsd-status-calls@FreeBSD.org. +my $subject; +my $send_command; +my @bcc_recipients; +my @cc_recipients; + +# Other variables +# - %quarter_specific_recipients is a hash that contains lists of +# addresses. The addresses of each list should be contacted only for the +# quarter specified by the list's the keys. +# - %template_substitutions is a hash that specifies for each quarter how +# the variabes in the call.template file should be substituted. +# - %options is a hash used for registering option. See --help to list all +# available options. +my %quarter_specific_recipients; +my %template_substitutions; +my %options; + +# ------------------------------------------------------- +# Variables initialization +# ------------------------------------------------------- + +@bcc_recipients = (); +@cc_recipients = ( 'freebsd-current@FreeBSD.org', + 'freebsd-hackers@FreeBSD.org', + 'devsummit@FreeBSD.org' ); + +$quarter_specific_recipients{1} = [ 'secretary@asiabsdcon.org' ]; +$quarter_specific_recipients{2} = [ 'info@bsdcan.org', + 'soc-students@FreeBSD.org', + 'soc-mentors@FreeBSD.org' ]; +$quarter_specific_recipients{3} = [ 'soc-students@FreeBSD.org', + 'soc-mentors@FreeBSD.org' ]; +$quarter_specific_recipients{4} = []; + +$template_substitutions{1}{'%%START%%'} = 'January'; +$template_substitutions{1}{'%%STOP%%'} = 'March'; +$template_substitutions{1}{'%%START_NUM%%'} = '01'; +$template_substitutions{1}{'%%STOP_NUM%%'} = '03'; +$template_substitutions{1}{'%%DEADLINE%%'} = 'March, 31st'; +$template_substitutions{2}{'%%START%%'} = 'April'; +$template_substitutions{2}{'%%STOP%%'} = 'June'; +$template_substitutions{2}{'%%START_NUM%%'} = '04'; +$template_substitutions{2}{'%%STOP_NUM%%'} = '06'; +$template_substitutions{2}{'%%DEADLINE%%'} = 'June, 30th'; +$template_substitutions{3}{'%%START%%'} = 'July'; +$template_substitutions{3}{'%%STOP%%'} = 'September'; +$template_substitutions{3}{'%%START_NUM%%'} = '07'; +$template_substitutions{3}{'%%STOP_NUM%%'} = '09'; +$template_substitutions{3}{'%%DEADLINE%%'} = 'September, 30th'; +$template_substitutions{4}{'%%START%%'} = 'October'; +$template_substitutions{4}{'%%STOP%%'} = 'December'; +$template_substitutions{4}{'%%DEADLINE%%'} = 'December, 31st'; +$template_substitutions{4}{'%%START_NUM%%'} = '10'; +$template_substitutions{4}{'%%STOP_NUM%%'} = '12'; + +$main::VERSION = "[not versioned]"; +$Getopt::Std::STANDARD_HELP_VERSION = 1; + +# ------------------------------------------------------- +# Subroutines definition +# ------------------------------------------------------- + +sub main::HELP_MESSAGE +{ + print <= 1970 + (I think you are unlikely to send calls before + the Unix epoch. And I am writing it in 2020.) + -t Testing flag. Set it it you want to test the + script without actually send mails. + -s signature Name to use for signing the status reports calls mail. + +Example: + ./sendcalls -d 31 -m 2 -y 2000 -s 'Lorenzo Salvadore' + (Yes, you can send calls even on inexistent days such as + 2020 February, 31st.) +EOT + exit 1; +} + +# ------------------------------------------------------- +# Execution starts here +# ------------------------------------------------------- +getopts('d:m:y:s:t', \%options); + +main::HELP_MESSAGE if(not $options{'s'}); + +# ------------------------------------------------------- +# Compute time coordinates (see global variables declaration) +# ------------------------------------------------------- + +(undef, undef, undef, $day, $month, $year, undef, undef, undef) = localtime(); +$year = $year + 1900; + +$day = $options{'d'} if($options{'d'}); +$month = $options{'m'} - 1 if($options{'m'}); +$year = $options{'y'} if($options{'y'}); + +die "Choosen date does not seem plausibile: year is $year, month is $month and day is $day" +if( $day < 1 or + $day > 31 or + $month < 1 or + $month > 12 or + $year < 1970 ); + +if($day < 14) +{ + $urgency_tag = ''; +} +elsif($day < 23) +{ + $urgency_tag = '[2 WEEKS LEFT REMINDER] '; +} +else +{ + $urgency_tag = '[LAST OFFICIAL REMINDER] '; +} + +$quarter = int($month / 3) + 1; + +# ------------------------------------------------------- +# Compute @bcc_recipients and @cc_recipients +# ------------------------------------------------------- +$year_last = $year; +$month_last_start = sprintf("%02d",int((($month - 3) % 12) / 3) * 3 + 1); +$month_last_stop = sprintf("%02d",$month_last_start + 2); +$quarter_last = $quarter - 1; +if($quarter_last == 0) +{ + $year_last = $year_last - 1; + $quarter_last = 4; +} +$quarter_last_directory = '../../website/content/en/status/report-'. + $year_last. + '-'. + $month_last_start. + '-'. + $year_last. + '-'. + $month_last_stop; +foreach(`ls $quarter_last_directory`) +{ + $_ =~ tr/\n//d; + open(quarterly_report, '<', $quarter_last_directory.'/'.$_) or + die "Could not open $quarter_last_directory/$_: $!"; + while() + { + if($_ =~ m/^Contact:.*(<.*@.*>)/) + { + my $address = $1; + $address =~ tr/<>//d; + push @bcc_recipients, $address if(not $address =~ m/\@FreeBSD.org$/i); + } + } + close(quarterly_report); +} + +{ + my %tmp = map {$_ => 0} @bcc_recipients; + @bcc_recipients = keys %tmp; +} + +push @cc_recipients, @{ $quarter_specific_recipients{$quarter} }; + +# ------------------------------------------------------- +# Compute missing %template_substitutions elements +# ------------------------------------------------------- +$template_substitutions{$quarter}{'%%QUARTER%%'} = $quarter; +$template_substitutions{$quarter}{'%%YEAR%%'} = $year; +$template_substitutions{$quarter}{'%%SIGNATURE%%'} = $options{'s'}; +$template_substitutions{$quarter}{'%%DEADLINE%%'} = +$template_substitutions{$quarter}{'%%DEADLINE%%'}.' '.$year; + +# ------------------------------------------------------- +# Generate mail text +# ------------------------------------------------------- +open(call_template, '<', 'call.txt.template') or +die "Could not open call.txt.template: $!"; +open(call_mail, '>', 'call.txt') or +die "Could not open call.txt: $!"; +while() +{ + my $line = $_; + $line =~ s/$_/$template_substitutions{$quarter}{$_}/g + foreach(keys %{ $template_substitutions{$quarter} }); + print call_mail $line; +} +close(call_template); +close(call_mail); + +# ------------------------------------------------------- +# Compute $subject and $send_command +# ------------------------------------------------------- +$subject = $urgency_tag."Call for ".$year."Q".$quarter." status reports"; + +$send_command = "cat call.txt | mail -s \"".$subject."\""; +# @bcc_recipients should never be empty as we have reports with mail +# contacts every quarter, but we test it anyway: we do not want to +# assume that this will be true forever +$send_command = $send_command.' -b '.(join ',', @bcc_recipients) if(@bcc_recipients); +# @cc_recipients should never be empty as we initialize it not empty +# and never remove addresses from there, but we test it anyway: we do +# not want to assume that this will be true forever +$send_command = $send_command.' -c '.(join ',', @cc_recipients) if(@cc_recipients); +$send_command = $send_command.' freebsd-status-calls@FreeBSD.org'; + +# ------------------------------------------------------- +# Send mail or show testing information +# ------------------------------------------------------- +if($options{'t'}) +{ + print <; + close(call_mail); +} +else +{ + system $send_command; +} + +# ------------------------------------------------------- +# Clean environment +# ------------------------------------------------------- +unlink "call.txt"; diff --git a/website/content/en/status/_index.adoc b/website/content/en/status/_index.adoc index f52b4ece23..c197fa83e4 100644 --- a/website/content/en/status/_index.adoc +++ b/website/content/en/status/_index.adoc @@ -1,176 +1,186 @@ --- title: "FreeBSD Status Reports" sidenav: about --- = FreeBSD Status Reports == Next Quarterly Status Report submissions (January - March) due: March 31st, 2023 -Submit your entries as Pull Requests from your fork of link:https://github.com/freebsd/freebsd-quarterly[FreeBSD Status Report GitHub repo] or submit them via e-mail to status-submissions@FreeBSD.org, using the link:https://github.com/freebsd/freebsd-quarterly/blob/master/report-sample.adoc[report-sample.adoc template]. +The following methods are available to submit your reports: + +* submit a link:https://reviews.freebsd.org/[Phabricator review] and add the group _status_ to the reviewers list. +You should put your reports in the pertinent subdirectory of `doc/website/content/en/status/`; + +* submit a pull request to the doc repository through link:https://github.com/freebsd/freebsd-doc[through its GitHub mirror] . +You should put your reports in the directory in the pertinent subdirectory of `doc/website/content/en/status`; + +* send an email to status-submissions@FreeBSD.org including your report. + +An link:../status/report-sample.adoc[AsciiDoc template] is available. ''''' One of the benefits of the FreeBSD development model is a focus on centralized design and implementation, in which the operating system is maintained in a central repository, and discussed on centrally maintained lists. This allows for a high level of coordination between authors of various components of the system, and allows policies to be enforced over the entire system, covering issues ranging from architecture to style. However, as the FreeBSD developer community has grown, and the rate of both mailing list traffic and tree modifications has increased, making it difficult even for the most dedicated developer to remain on top of all the work going on in the tree. The FreeBSD Status Report attempts to address this problem by providing a vehicle that allows developers to make the broader community aware of their on-going work on FreeBSD, both in and out of the central source repository. For each project and sub-project, a one paragraph summary is included, indicating progress since the last summary. If it is a new project, or if a project has not submitted any prior status reports, a short description may precede the status information. For more exact guidelines on how to write good status reports, please consult link:howto/[our recommendations]. Periodically, special status reports are prepared and published. One of those are the developer summit reports. Developer summits are places where developers meet in person to discuss issues related to the project. They are definitely worth attending if one is interested in making significant contributions to the Project and they are open to anybody! These status reports may be reproduced in whole or in part, as long as the source is clearly identified and appropriate credit given. == 2022 * link:report-2022-10-2022-12/[October, 2022 - December, 2022] * link:report-2022-07-2022-09/[July, 2022 - September, 2022] * link:report-2022-04-2022-06/[April, 2022 - June, 2022] * link:report-2022-01-2022-03/[January, 2022 - March, 2022] == 2021 * link:report-2021-10-2021-12/[October, 2021 - December, 2021] * link:report-2021-07-2021-09/[July, 2021 - September, 2021] * link:report-2021-04-2021-06/[April, 2021 - June, 2021] * link:report-2021-01-2021-03/[January, 2021 - March, 2021] == 2020 * link:report-2020-10-2020-12/[October, 2020 - December, 2020] * link:report-2020-07-2020-09/[July, 2020 - September, 2020] * link:report-2020-04-2020-06/[April, 2020 - June, 2020] * link:report-2020-01-2020-03/[January, 2020 - March, 2020] == 2019 * link:report-2019-10-2019-12/[October, 2019 - December, 2019] * link:report-2019-07-2019-09/[July, 2019 - September, 2019] * link:report-2019-04-2019-06/[April, 2019 - June, 2019] * link:report-2019-01-2019-03/[January, 2019 - March, 2019] == 2018 * link:report-2018-09-2018-12/[October, 2018 - December, 2018] * link:report-2018-01-2018-09/[October, 2017 - September, 2018] == 2017 * link:report-2017-07-2017-09/[July, 2017 - September, 2017] * link:report-2017-04-2017-06/[April, 2017 - June, 2017] * link:report-2017-01-2017-03/[January, 2017 - March, 2017] == 2016 * link:report-2016-10-2016-12/[October, 2016 - December, 2016] * link:report-2016-07-2016-09/[July, 2016 - September, 2016] * link:report-2016-04-2016-06/[April, 2016 - June, 2016] * link:report-2016-01-2016-03/[January, 2016 - March, 2016] == 2015 * link:report-2015-10-2015-12/[October, 2015 - December, 2015] * link:report-2015-07-2015-09/[July, 2015 - September, 2015] * link:report-2015-04-2015-06/[April, 2015 - June, 2015] * link:report-2015-01-2015-03/[January, 2015 - March, 2015] == 2014 * link:report-2014-10-2014-12/[October, 2014 - December, 2014] * link:report-2014-07-2014-09/[July, 2014 - September, 2014] * link:report-2014-04-2014-06/[April, 2014 - June, 2014] * link:report-2014-01-2014-03/[January, 2014 - March, 2014] == 2013 * link:report-2013-10-2013-12/[October, 2013 - December, 2013] * link:report-2013-09-devsummit/[EuroBSDcon 2013 Developer Summit Special] * link:report-2013-07-2013-09/[July, 2013 - September, 2013] * link:report-2013-04-2013-06/[April, 2013 - June, 2013] * link:report-2013-05-devsummit/[BSDCan 2013 Developer Summit Special] * link:report-2013-01-2013-03/[January, 2013 - March, 2013] == 2012 * link:report-2012-10-2012-12/[October, 2012 - December, 2012] * link:report-2012-07-2012-09/[July, 2012 - September, 2012] * link:report-2012-04-2012-06/[April, 2012 - June, 2012] * link:report-2012-01-2012-03/[January, 2012 - March, 2012] == 2011 * link:report-2011-10-2011-12/[October, 2011 - December, 2011] * link:report-2011-07-2011-09/[July, 2011 - September, 2011] * link:report-2011-04-2011-06/[April, 2011 - June, 2011] * link:report-2011-01-2011-03/[January, 2011 - March, 2011] == 2010 * link:report-2010-10-2010-12/[October, 2010 - December, 2010] * link:report-2010-07-2010-09/[July, 2010 - September, 2010] * link:report-2010-04-2010-06/[April, 2010 - June, 2010] * link:report-2010-01-2010-03/[January, 2010 - March, 2010] == 2009 * link:report-2009-10-2009-12/[October, 2009 - December, 2009] * link:report-2009-04-2009-09/[April, 2009 - September, 2009] * link:report-2009-01-2009-03/[January, 2009 - March, 2009] == 2008 * link:report-2008-10-2008-12/[October, 2008 - December, 2008] * link:report-2008-07-2008-09/[July, 2008 - September, 2008] * link:report-2008-04-2008-06/[April, 2008 - June, 2008] * link:report-2008-01-2008-03/[January, 2008 - March, 2008] == 2007 * link:report-2007-10-2007-12/[October, 2007 - December, 2007] * link:report-2007-07-2007-10/[July, 2007 - October, 2007] * link:report-2007-04-2007-06/[April, 2007 - June, 2007] * link:report-2007-01-2007-03/[January, 2007 - March, 2007] == 2006 * link:report-2006-10-2006-12/[October, 2006 - December, 2006] * link:report-2006-06-2006-10/[June, 2006 - October, 2006] * link:report-2006-04-2006-06/[April, 2006 - June, 2006] * link:report-2006-01-2006-03/[January, 2006 - March, 2006] == 2005 * link:report-2005-10-2005-12/[October, 2005 - December, 2005] * link:report-2005-07-2005-10/[July, 2005 - October, 2005] * link:report-2005-03-2005-06/[March, 2005 - June, 2005] * link:report-2005-01-2005-03/[January, 2005 - March, 2005] == 2004 * link:report-2004-07-2004-12/[July, 2004 - December, 2004] * link:report-2004-05-2004-06/[May, 2004 - June, 2004] * link:report-2004-03-2004-04/[March, 2004 - April, 2004] * link:report-2004-01-2004-02/[January, 2004 - February, 2004] == 2003 * link:report-2003-10-2003-12/[October, 2003 - December, 2003] * link:report-2003-03-2003-09/[March, 2003 - September, 2003] * link:report-2003-01-2003-02/[January, 2003 - February, 2003] == 2002 * link:report-2002-11-2002-12/[November, 2002 - December, 2002] * link:report-2002-09-2002-10/[September, 2002 - October, 2002] * link:report-2002-07-2002-08/[July, 2002 - August, 2002] * link:report-2002-05-2002-06/[May, 2002 - June, 2002] * link:report-2002-02-2002-04/[February, 2002 - April, 2002] * link:report-2001-12-2002-01/[December, 2001 - January, 2002] == 2001 * link:report-2001-11/[November, 2001] * link:report-2001-09/[September, 2001] * link:report-2001-08/[August, 2001] * link:report-2001-07/[July, 2001] * link:report-2001-06/[June, 2001] diff --git a/website/static/status/report-sample.adoc b/website/static/status/report-sample.adoc new file mode 100644 index 0000000000..913104fe3a --- /dev/null +++ b/website/static/status/report-sample.adoc @@ -0,0 +1,32 @@ +=== Status Report Sample - This Will Become The Title + +Links: + +link:http://www.example.com/project/url[Link description] URL: link:http://www.example.com/project/url[http://www.example.com/project/url] + +link:http://www.example.com/other/url[Another link description] URL: link:http://www.example.com/other/url[http://www.example.com/other/url] + +Contact: Full Name + +Paragraphs are separated with an empty line. +If at all possible, write one sentence per line and don't split a sentence between lines. +Use link:https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/[AsciiDoc syntax], if you can. +If you don't know AsciiDoc, just use plain text. + +Introduce your work. +Do not assume that the person reading the report knows about your project. + +Show the importance of your work. +Status reports are not just about telling everyone that things were done, they also need to explain why things were done. + +What has happened since the last report? +Let us know what is new in this area. + +If help is needed, make this explicit. +List tasks, with enough detail that people know if they are likely to be able to do them, and invite people to get in contact: + +* First task +* Second task +* Additional tasks, if any … + +Optionally include the information about the sponsor. + +Sponsor: Sponsoring Organisation, if any