You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2014/02/09 12:17:25 UTC

git commit: [MNG-5176] Print build times in an ISO 8601-style manner

Updated Branches:
  refs/heads/master d266733f0 -> be19ddb6d


[MNG-5176] Print build times in an ISO 8601-style manner


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/be19ddb6
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/be19ddb6
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/be19ddb6

Branch: refs/heads/master
Commit: be19ddb6d92a6162c0b0cd0673f94dd5f570282b
Parents: d266733
Author: Michael Osipov <mi...@apache.org>
Authored: Sun Feb 9 12:14:43 2014 +0100
Committer: Michael Osipov <mi...@apache.org>
Committed: Sun Feb 9 12:14:43 2014 +0100

----------------------------------------------------------------------
 maven-core/pom.xml                              |  2 +-
 .../org/apache/maven/cli/CLIReportingUtils.java | 56 ++++++++++++++++--
 .../maven/cli/event/ExecutionEventLogger.java   | 47 +++++----------
 .../apache/maven/cli/CLIReportingUtilsTest.java | 40 +++++++++++++
 .../cli/event/ExecutionEventLoggerTest.java     | 61 --------------------
 5 files changed, 104 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/be19ddb6/maven-core/pom.xml
----------------------------------------------------------------------
diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index ffb2b4c..974c0ca 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -194,7 +194,7 @@
               <goal>create-timestamp</goal>
             </goals>
             <configuration>
-              <timestampFormat>'NON-CANONICAL_'yyyy-MM-dd_HH-mm_'${user.name}'</timestampFormat>
+              <timestampFormat>'NON-CANONICAL_'yyyy-MM-dd'T'HH:mm:ss_'${user.name}'</timestampFormat>
               <timestampPropertyName>nonCanonicalRevision</timestampPropertyName>
             </configuration>
           </execution>

http://git-wip-us.apache.org/repos/asf/maven/blob/be19ddb6/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
index 3ce2c48..32f8cca 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
@@ -25,6 +25,7 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Locale;
 import java.util.Properties;
+import java.util.TimeZone;
 
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.Os;
@@ -41,10 +42,11 @@ public final class CLIReportingUtils
 
     public static final long MB = 1024 * 1024;
 
-    public static final int MS_PER_SEC = 1000;
+    private static final long ONE_SECOND = 1000L;
+    private static final long ONE_MINUTE = 60 * ONE_SECOND;
+    private static final long ONE_HOUR = 60 * ONE_MINUTE;
+    private static final long ONE_DAY = 24 * ONE_HOUR;
 
-    public static final int SEC_PER_MIN = 60;
-    
     public static final String BUILD_VERSION_PROPERTY = "version";
 
     public static String showVersion()
@@ -68,7 +70,7 @@ public final class CLIReportingUtils
 
     /**
      * Create a human readable string containing the Maven version, buildnumber, and time of build
-     * 
+     *
      * @param buildProperties The build properties
      * @return Readable build info
      */
@@ -87,8 +89,7 @@ public final class CLIReportingUtils
             msg += ( rev != null ? rev : "" );
             if ( timestamp != null )
             {
-                SimpleDateFormat fmt = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ssZ" );
-                String ts = fmt.format( new Date( Long.valueOf( timestamp ) ) );
+                String ts = formatTimestamp( Long.valueOf( timestamp ) );
                 msg += ( rev != null ? "; " : "" ) + ts;
             }
             msg += ")";
@@ -148,4 +149,47 @@ public final class CLIReportingUtils
         }
     }
 
+    public static String formatTimestamp( long timestamp )
+    {
+        // Manual construction of the tz offset because only Java 7 understands 'ZZ' replacement
+        TimeZone tz = TimeZone.getDefault();
+        int offset = tz.getRawOffset();
+
+        long m = Math.abs( ( offset / ONE_MINUTE ) % 60 );
+        long h = Math.abs( ( offset / ONE_HOUR ) % 24 );
+
+        int offsetDir = (int) Math.signum( (float) offset );
+        char offsetSign = offsetDir >= 0 ? '+' : '-';
+        return String.format( "%tFT%<tT%s%02d:%02d", timestamp, offsetSign, h, m );
+    }
+
+    public static String formatDuration( long duration )
+    {
+        long ms = duration % 1000;
+        long s = ( duration / ONE_SECOND ) % 60;
+        long m = ( duration / ONE_MINUTE ) % 60;
+        long h = ( duration / ONE_HOUR ) % 24;
+        long d = duration / ONE_DAY;
+
+        String format;
+        if ( d > 0 )
+        {
+            format = "%d d %02d:%02d h";
+        }
+        else if ( h > 0 )
+        {
+            format = "%2$02d:%3$02d h";
+        }
+        else if ( m > 0 )
+        {
+            format = "%3$02d:%4$02d min";
+        }
+        else
+        {
+            format = "%4$d.%5$03d s";
+        }
+
+        return String.format( format, d, h, m, s, ms );
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/maven/blob/be19ddb6/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java b/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
index 3891172..1412cac 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
@@ -19,8 +19,8 @@ package org.apache.maven.cli.event;
  * under the License.
  */
 
-import java.util.Date;
-
+import static org.apache.maven.cli.CLIReportingUtils.formatDuration;
+import static org.apache.maven.cli.CLIReportingUtils.formatTimestamp;
 import org.apache.maven.execution.AbstractExecutionListener;
 import org.apache.maven.execution.BuildFailure;
 import org.apache.maven.execution.BuildSuccess;
@@ -44,6 +44,7 @@ public class ExecutionEventLogger
     private final Logger logger;
 
     private static final int LINE_LENGTH = 72;
+    private static final int BUILD_TIME_DURATION_LENGTH = 9;
 
     public ExecutionEventLogger()
     {
@@ -73,32 +74,6 @@ public class ExecutionEventLogger
         return buffer.toString();
     }
 
-    private static String getFormattedTime( long time )
-    {
-        // NOTE: DateFormat is not suitable to format timespans of 24h+
-
-        long h = time / ( 60 * 60 * 1000 );
-        long m = ( time - h * 60 * 60 * 1000 ) / ( 60 * 1000 );
-        long s = ( time - h * 60 * 60 * 1000 - m * 60 * 1000 ) / 1000;
-        long ms = time % 1000;
-
-        String format;
-        if ( h > 0 )
-        {
-            format = "%1$d:%2$02d:%3$02d.%4$03ds";
-        }
-        else if ( m > 0 )
-        {
-            format = "%2$d:%3$02d.%4$03ds";
-        }
-        else
-        {
-            format = "%3$d.%4$03ds";
-        }
-
-        return String.format( format, h, m, s, ms );
-    }
-
     @Override
     public void projectDiscoveryStarted( ExecutionEvent event )
     {
@@ -176,13 +151,17 @@ public class ExecutionEventLogger
             else if ( buildSummary instanceof BuildSuccess )
             {
                 buffer.append( "SUCCESS [" );
-                buffer.append( getFormattedTime( buildSummary.getTime() ) );
+                String buildTimeDuration = formatDuration( buildSummary.getTime() );
+                buffer.append( chars( ' ', BUILD_TIME_DURATION_LENGTH - buildTimeDuration.length() ) );
+                buffer.append( buildTimeDuration );
                 buffer.append( "]" );
             }
             else if ( buildSummary instanceof BuildFailure )
             {
                 buffer.append( "FAILURE [" );
-                buffer.append( getFormattedTime( buildSummary.getTime() ) );
+                String buildTimeDuration = formatDuration( buildSummary.getTime() );
+                buffer.append( chars( ' ', BUILD_TIME_DURATION_LENGTH - buildTimeDuration.length() ) );
+                buffer.append( buildTimeDuration );
                 buffer.append( "]" );
             }
 
@@ -208,15 +187,15 @@ public class ExecutionEventLogger
     {
         logger.info( chars( '-', LINE_LENGTH ) );
 
-        Date finish = new Date();
+        long finish = System.currentTimeMillis();
 
-        long time = finish.getTime() - session.getRequest().getStartTime().getTime();
+        long time = finish - session.getRequest().getStartTime().getTime();
 
         String wallClock = session.getRequest().getDegreeOfConcurrency() > 1 ? " (Wall Clock)" : "";
 
-        logger.info( "Total time: " + getFormattedTime( time ) + wallClock );
+        logger.info( "Total time: " + formatDuration( time ) + wallClock );
 
-        logger.info( "Finished at: " + finish );
+        logger.info( "Finished at: " + formatTimestamp( finish ) );
 
         System.gc();
 

http://git-wip-us.apache.org/repos/asf/maven/blob/be19ddb6/maven-embedder/src/test/java/org/apache/maven/cli/CLIReportingUtilsTest.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/test/java/org/apache/maven/cli/CLIReportingUtilsTest.java b/maven-embedder/src/test/java/org/apache/maven/cli/CLIReportingUtilsTest.java
new file mode 100644
index 0000000..65488c7
--- /dev/null
+++ b/maven-embedder/src/test/java/org/apache/maven/cli/CLIReportingUtilsTest.java
@@ -0,0 +1,40 @@
+package org.apache.maven.cli;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import junit.framework.TestCase;
+
+public class CLIReportingUtilsTest
+    extends TestCase
+{
+
+    public void testFormatDuration()
+    {
+        assertEquals( "0.001 s", CLIReportingUtils.formatDuration( 1 ) );
+        assertEquals( "0.999 s", CLIReportingUtils.formatDuration( 1000 - 1 ) );
+        assertEquals( "1.000 s", CLIReportingUtils.formatDuration( 1000 ) );
+        assertEquals( "59.999 s", CLIReportingUtils.formatDuration( 60 * 1000 - 1 ) );
+        assertEquals( "01:00 min", CLIReportingUtils.formatDuration( 60 * 1000 ) );
+        assertEquals( "59:59 min", CLIReportingUtils.formatDuration( 60 * 60 * 1000 - 1 ) );
+        assertEquals( "01:00 h", CLIReportingUtils.formatDuration( 60 * 60 * 1000 ) );
+        assertEquals( "23:59 h", CLIReportingUtils.formatDuration( 24 * 60 * 60 * 1000 - 1 ) );
+        assertEquals( "1 d 00:00 h", CLIReportingUtils.formatDuration( 24 * 60 * 60 * 1000 ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/be19ddb6/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java b/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java
deleted file mode 100644
index e0671a3..0000000
--- a/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.apache.maven.cli.event;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import junit.framework.TestCase;
-
-public class ExecutionEventLoggerTest
-    extends TestCase
-{
-
-    private static String getFormattedTime( long time )
-        throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
-        InvocationTargetException
-    {
-        Method method = ExecutionEventLogger.class.getDeclaredMethod( "getFormattedTime", long.class );
-        boolean accessible = method.isAccessible();
-        try
-        {
-            method.setAccessible( true );
-            return (String) method.invoke( null, time );
-        }
-        finally
-        {
-            method.setAccessible( accessible );
-        }
-    }
-
-    public void testGetFormattedTime()
-        throws Exception
-    {
-        assertEquals( "0.001s", getFormattedTime( 1 ) );
-        assertEquals( "0.999s", getFormattedTime( 1000 - 1 ) );
-        assertEquals( "1.000s", getFormattedTime( 1000 ) );
-        assertEquals( "59.999s", getFormattedTime( 60 * 1000 - 1 ) );
-        assertEquals( "1:00.000s", getFormattedTime( 60 * 1000 ) );
-        assertEquals( "59:59.999s", getFormattedTime( 60 * 60 * 1000 - 1 ) );
-        assertEquals( "1:00:00.000s", getFormattedTime( 60 * 60 * 1000 ) );
-        assertEquals( "23:59:59.999s", getFormattedTime( 24 * 60 * 60 * 1000 - 1 ) );
-        assertEquals( "24:00:00.000s", getFormattedTime( 24 * 60 * 60 * 1000 ) );
-    }
-}