5 Porting/acknowledgements.pl - Generate perldelta acknowledgements text
9 perl Porting/acknowledgements.pl v5.15.0..HEAD
13 This generates the text which goes in the Acknowledgements section in
14 a perldelta. You pass in the previous version and it guesses the next
15 version, fetches information from the repository and outputs the
28 $Text::Wrap::columns = 77;
30 my $since_until = shift;
32 my ( $since, $until ) = split '\.\.', $since_until;
34 die "Usage: perl Porting/acknowledgements.pl v5.15.0..HEAD"
35 unless $since_until && $since && $until;
37 my $previous_version = previous_version();
38 my $next_version = next_version();
39 my $development_time = development_time();
41 my ( $changes, $files, $code_changes, $code_files ) = changes_files();
42 my $formatted_changes = commify( round($changes) );
43 my $formatted_files = commify( round($files) );
44 my $formatted_code_changes = commify( round($code_changes) );
45 my $formatted_code_files = commify( round($code_files) );
47 my $authors = authors();
48 my $nauthors = $authors =~ tr/,/,/;
52 = "Perl $next_version represents approximately $development_time of development
53 since Perl $previous_version and contains approximately $formatted_changes
54 lines of changes across $formatted_files files from $nauthors authors.
56 Excluding auto-generated files, documentation and release tools, there
57 were approximately $formatted_code_changes lines of changes to
58 $formatted_code_files .pm, .t, .c and .h files.
60 Perl continues to flourish into its third decade thanks to a vibrant
61 community of users and developers. The following people are known to
62 have contributed the improvements that became Perl $next_version:
65 The list above is almost certainly incomplete as it is automatically
66 generated from version control history. In particular, it does not
67 include the names of the (very much appreciated) contributors who
68 reported issues to the Perl bug tracker.
70 Many of the changes included in this version originated in the CPAN
71 modules included in Perl's core. We're grateful to the entire CPAN
72 community for helping Perl to flourish.
74 For a more complete list of all of Perl's historical contributors,
75 please see the F<AUTHORS> file in the Perl source distribution.";
77 my $wrapped = fill( '', '', $text );
80 # return the previous Perl version, eg 5.15.0
81 sub previous_version {
82 my $version = version->new($since);
87 # returns the upcoming release Perl version, eg 5.15.1
89 my $version = version->new($since);
90 ( $version->{version}->[-1] )++;
91 return version->new( join( '.', @{ $version->{version} } ) );
94 # returns the development time since the previous version in weeks
96 sub development_time {
97 my $first_timestamp = qx(git log -1 --pretty=format:%ct --summary $since);
98 my $last_timestamp = qx(git log -1 --pretty=format:%ct --summary $until);
100 die "Missing first timestamp" unless $first_timestamp;
101 die "Missing last timestamp" unless $last_timestamp;
103 my $seconds = localtime($last_timestamp) - localtime($first_timestamp);
104 my $weeks = _round( $seconds / ONE_WEEK );
105 my $months = _round( $seconds / ONE_MONTH );
107 my $development_time;
109 return "$weeks @{[$weeks == 1 ? q(week) : q(weeks)]}";
111 return "$months months";
119 my $remainder = $val - $int;
121 return $remainder >= 0.5 ? $int + 1 : $int;
124 # returns the number of changed lines and files since the previous
127 my $output = qx(git diff --shortstat $since_until);
128 my $q = ($^O =~ /^(?:MSWin32|NetWare|VMS)$/io) ? '"' : "'";
129 my @filenames = qx(git diff --numstat $since_until | $^X -anle ${q}next if m{^dist/Module-CoreList} or not /\\.(?:pm|c|h|t)\\z/; print \$F[2]$q);
131 my $output_code_changed = qx# git diff --shortstat $since_until -- @filenames #;
133 return ( _changes_from_cmd ( $output ),
134 _changes_from_cmd ( $output_code_changed ) );
137 sub _changes_from_cmd {
138 my $output = shift || die "No git diff command output";
140 # 585 files changed, 156329 insertions(+), 53586 deletions(-)
141 my ( $files, $insertions, $deletions )
143 =~ /(\d+) files changed, (\d+) insertions\(\+\), (\d+) deletions\(-\)/;
144 my $changes = $insertions + $deletions;
145 return ( $changes, $files );
148 # rounds an integer to two significant figures
151 my $length = length($int);
152 my $divisor = 10**( $length - 2 );
153 return ceil( $int / $divisor ) * $divisor;
156 # adds commas to a number at thousands, millions
159 1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
163 # returns a list of the authors
166 qx(git log --pretty=fuller $since_until | $^X Porting/checkAUTHORS.pl --who -);