Fix the calculation for development time so it doesn't come up with things like ...
authorDave Rolsky <autarch@urth.org>
Fri, 23 Dec 2011 17:01:34 +0000 (11:01 -0600)
committerDave Rolsky <autarch@urth.org>
Fri, 23 Dec 2011 17:01:34 +0000 (11:01 -0600)
There were a couple bugs ...

First, we should just use the date of the two commits we're looking at rather
than looking at all the commits in between and picking the earliest one. This
can find _much_ earlier things that weren't merged until much later, which
really throws the numbers off.

Second, when calculating the number of weeks and months, we shouldn't use
POSIX::ceil(), that rounds up 4.01 weeks to 5. Instead, I wrote a simple
rounding function that does standard rounding.

Porting/acknowledgements.pl

index 5f36b8f..bdfef41 100644 (file)
@@ -88,21 +88,15 @@ sub next_version {
 # returns the development time since the previous version in weeks
 # or months
 sub development_time {
-    my $dates = qx(git log --pretty=format:%ct --summary $since_until);
-    my $first_timestamp;
-    foreach my $line ( split $/, $dates ) {
-        next unless $line;
-        next unless $line =~ /^\d+$/;
-        $first_timestamp = $line;
-    }
+    my $first_timestamp = qx(git log -1 --pretty=format:%ct --summary $since);
+    my $last_timestamp  = qx(git log -1 --pretty=format:%ct --summary $until);
 
     die "Missing first timestamp" unless $first_timestamp;
+    die "Missing last timestamp" unless $last_timestamp;
 
-    my $now     = localtime;
-    my $then    = localtime($first_timestamp);
-    my $seconds = $now - $then;
-    my $weeks   = ceil( $seconds / ONE_WEEK );
-    my $months  = ceil( $seconds / ONE_MONTH );
+    my $seconds = localtime($last_timestamp) - localtime($first_timestamp);
+    my $weeks   = _round( $seconds / ONE_WEEK );
+    my $months  = _round( $seconds / ONE_MONTH );
 
     my $development_time;
     if ( $months < 2 ) {
@@ -112,6 +106,15 @@ sub development_time {
     }
 }
 
+sub _round {
+    my $val = shift;
+
+    my $int = int $val;
+    my $remainder = $val - $int;
+
+    return $remainder >= 0.5 ? $int + 1 : $int;
+}
+
 # returns the number of changed lines and files since the previous
 # version
 sub changes_files {