From 98d5ff79eb8d3c57647707c9e16ae6de2736353a Mon Sep 17 00:00:00 2001
From: Federico Fissore <f.fissore@arduino.cc>
Date: Thu, 10 Dec 2015 16:36:07 +0100
Subject: [PATCH] Upgrading arduino-builder to 1.3.7, which changes the way
 messages are sent back to the IDE. Instead of having just stdour and stderr,
 stdout only is used, but each message has a log level: info, warn, debug,
 error Plain stdout/stderr are still used by child processes

---
 .../i18n/ExternalProcessOutputParserTest.java | 25 ++++++++++++++++
 arduino-core/src/cc/arduino/Compiler.java     |  2 +-
 .../arduino/ProgressAwareMessageConsumer.java |  2 +-
 .../i18n/ExternalProcessOutputParser.java     |  8 +++--
 .../i18n/I18NAwareMessageConsumer.java        | 29 ++++++++++++++-----
 .../arduino-builder-linux32-1.3.6.tar.bz2.sha |  1 -
 .../arduino-builder-linux32-1.3.7.tar.bz2.sha |  1 +
 .../arduino-builder-linux64-1.3.6.tar.bz2.sha |  1 -
 .../arduino-builder-linux64-1.3.7.tar.bz2.sha |  1 +
 .../arduino-builder-macosx-1.3.6.tar.bz2.sha  |  1 -
 .../arduino-builder-macosx-1.3.7.tar.bz2.sha  |  1 +
 build/arduino-builder-windows-1.3.6.zip.sha   |  1 -
 build/arduino-builder-windows-1.3.7.zip.sha   |  1 +
 build/build.xml                               |  2 +-
 14 files changed, 60 insertions(+), 16 deletions(-)
 delete mode 100644 build/arduino-builder-linux32-1.3.6.tar.bz2.sha
 create mode 100644 build/arduino-builder-linux32-1.3.7.tar.bz2.sha
 delete mode 100644 build/arduino-builder-linux64-1.3.6.tar.bz2.sha
 create mode 100644 build/arduino-builder-linux64-1.3.7.tar.bz2.sha
 delete mode 100644 build/arduino-builder-macosx-1.3.6.tar.bz2.sha
 create mode 100644 build/arduino-builder-macosx-1.3.7.tar.bz2.sha
 delete mode 100644 build/arduino-builder-windows-1.3.6.zip.sha
 create mode 100644 build/arduino-builder-windows-1.3.7.zip.sha

diff --git a/app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java b/app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java
index 5bd56ac71..278a2598f 100644
--- a/app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java
+++ b/app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java
@@ -92,4 +92,29 @@ public class ExternalProcessOutputParserTest {
     assertEquals("", args[0]);
   }
 
+  @Test
+  public void testParser6() throws Exception {
+    Map<String, Object> output = new ExternalProcessOutputParser().parse("===info ||| Progress {0} ||| [79.31]");
+
+    assertEquals("info", output.get("level"));
+    assertEquals("Progress {0}", output.get("msg"));
+    Object[] args = (Object[]) output.get("args");
+    assertEquals(1, args.length);
+    assertEquals("79.31", args[0]);
+  }
+
+  @Test
+  public void testParser7() throws Exception {
+    Map<String, Object> output = new ExternalProcessOutputParser().parse("===info ||| Using library {0} at version {1} in folder: {2} {3} ||| [Bridge 1.6.0 %2Fhome%2Ffederico%2Fmateriale%2Fworks_Arduino%2FArduino%2Fbuild%2Flinux%2Fwork%2Flibraries%2FBridge ]");
+
+    assertEquals("info", output.get("level"));
+    assertEquals("Using library {0} at version {1} in folder: {2} {3}", output.get("msg"));
+    Object[] args = (Object[]) output.get("args");
+    assertEquals(4, args.length);
+    assertEquals("Bridge", args[0]);
+    assertEquals("1.6.0", args[1]);
+    assertEquals("/home/federico/materiale/works_Arduino/Arduino/build/linux/work/libraries/Bridge", args[2]);
+    assertEquals("", args[3]);
+  }
+
 }
diff --git a/arduino-core/src/cc/arduino/Compiler.java b/arduino-core/src/cc/arduino/Compiler.java
index 82b91c8c4..bb815575c 100644
--- a/arduino-core/src/cc/arduino/Compiler.java
+++ b/arduino-core/src/cc/arduino/Compiler.java
@@ -137,7 +137,7 @@ public class Compiler implements MessageConsumer {
 
     PreferencesMap prefs = loadPreferences(board, platform, aPackage, vidpid);
 
-    MessageConsumerOutputStream out = new MessageConsumerOutputStream(new ProgressAwareMessageConsumer(new I18NAwareMessageConsumer(System.out), progListener), "\n");
+    MessageConsumerOutputStream out = new MessageConsumerOutputStream(new ProgressAwareMessageConsumer(new I18NAwareMessageConsumer(System.out, System.err), progListener), "\n");
     MessageConsumerOutputStream err = new MessageConsumerOutputStream(new I18NAwareMessageConsumer(System.err, Compiler.this), "\n");
 
     callArduinoBuilder(board, platform, aPackage, vidpid, BuilderAction.COMPILE, new PumpStreamHandler(out, err));
diff --git a/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java b/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java
index d22515b55..22768b04b 100644
--- a/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java
+++ b/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java
@@ -48,7 +48,7 @@ public class ProgressAwareMessageConsumer implements MessageConsumer {
 
   @Override
   public void message(String s) {
-    if (s.startsWith("===Progress")) {
+    if (s.startsWith("===info ||| Progress") || s.startsWith("===Progress")) {
       Map<String, Object> parsedMessage = parser.parse(s);
       Object[] args = (Object[]) parsedMessage.get("args");
       progressListener.progress(Double.valueOf(args[0].toString()).intValue());
diff --git a/arduino-core/src/cc/arduino/i18n/ExternalProcessOutputParser.java b/arduino-core/src/cc/arduino/i18n/ExternalProcessOutputParser.java
index eb0c4e1de..7486ce4fb 100644
--- a/arduino-core/src/cc/arduino/i18n/ExternalProcessOutputParser.java
+++ b/arduino-core/src/cc/arduino/i18n/ExternalProcessOutputParser.java
@@ -50,8 +50,12 @@ public class ExternalProcessOutputParser {
 
     String[] parts = SPLIT.split(s);
 
-    output.put("msg", parts[0]);
-    output.put("args", parseArgs(parts[1]));
+    int idx = 0;
+    if (parts.length == 3) {
+      output.put("level", parts[idx++]);
+    }
+    output.put("msg", parts[idx++]);
+    output.put("args", parseArgs(parts[idx++]));
 
     return output;
   }
diff --git a/arduino-core/src/cc/arduino/i18n/I18NAwareMessageConsumer.java b/arduino-core/src/cc/arduino/i18n/I18NAwareMessageConsumer.java
index 0c1fd98e3..1fee78d85 100644
--- a/arduino-core/src/cc/arduino/i18n/I18NAwareMessageConsumer.java
+++ b/arduino-core/src/cc/arduino/i18n/I18NAwareMessageConsumer.java
@@ -39,16 +39,26 @@ import static processing.app.I18n.tr;
 
 public class I18NAwareMessageConsumer implements MessageConsumer {
 
-  private final PrintStream ps;
+  private final PrintStream out;
+  private final PrintStream err;
   private final MessageConsumer parent;
   private final ExternalProcessOutputParser parser;
 
-  public I18NAwareMessageConsumer(PrintStream ps) {
-    this(ps, null);
+  public I18NAwareMessageConsumer(PrintStream out) {
+    this(out, out, null);
   }
 
-  public I18NAwareMessageConsumer(PrintStream ps, MessageConsumer parent) {
-    this.ps = ps;
+  public I18NAwareMessageConsumer(PrintStream out, MessageConsumer parent) {
+    this(out, out, parent);
+  }
+
+  public I18NAwareMessageConsumer(PrintStream out, PrintStream err) {
+    this(out, err, null);
+  }
+
+  public I18NAwareMessageConsumer(PrintStream out, PrintStream err, MessageConsumer parent) {
+    this.out = out;
+    this.err = err;
     this.parent = parent;
     this.parser = new ExternalProcessOutputParser();
   }
@@ -57,14 +67,19 @@ public class I18NAwareMessageConsumer implements MessageConsumer {
   public void message(String s) {
     if (s.startsWith("===")) {
       Map<String, Object> parsedMessage = parser.parse(s);
-      ps.println(I18n.format(tr((String) parsedMessage.get("msg")), (Object[]) parsedMessage.get("args")));
+      String translatedMessage = I18n.format(tr((String) parsedMessage.get("msg")), (Object[]) parsedMessage.get("args"));
+      if (!parsedMessage.containsKey("level") || "".equals(parsedMessage.get("level")) || "info".equals(parsedMessage.get("level"))) {
+        out.println(translatedMessage);
+      } else {
+        err.println(translatedMessage);
+      }
       return;
     }
 
     if (parent != null) {
       parent.message(s);
     } else {
-      ps.println(s);
+      out.println(s);
     }
   }
 }
diff --git a/build/arduino-builder-linux32-1.3.6.tar.bz2.sha b/build/arduino-builder-linux32-1.3.6.tar.bz2.sha
deleted file mode 100644
index d06ad10a6..000000000
--- a/build/arduino-builder-linux32-1.3.6.tar.bz2.sha
+++ /dev/null
@@ -1 +0,0 @@
-3937100dc54c86cf2c29759e8ea510a05a09baf5
diff --git a/build/arduino-builder-linux32-1.3.7.tar.bz2.sha b/build/arduino-builder-linux32-1.3.7.tar.bz2.sha
new file mode 100644
index 000000000..657c24c36
--- /dev/null
+++ b/build/arduino-builder-linux32-1.3.7.tar.bz2.sha
@@ -0,0 +1 @@
+616acac0908c873b01b627a7902d4ffe454048bd
diff --git a/build/arduino-builder-linux64-1.3.6.tar.bz2.sha b/build/arduino-builder-linux64-1.3.6.tar.bz2.sha
deleted file mode 100644
index 131d6eced..000000000
--- a/build/arduino-builder-linux64-1.3.6.tar.bz2.sha
+++ /dev/null
@@ -1 +0,0 @@
-855b728e5515e2db1a09fe9e31b359a2f9d82689
diff --git a/build/arduino-builder-linux64-1.3.7.tar.bz2.sha b/build/arduino-builder-linux64-1.3.7.tar.bz2.sha
new file mode 100644
index 000000000..88592822a
--- /dev/null
+++ b/build/arduino-builder-linux64-1.3.7.tar.bz2.sha
@@ -0,0 +1 @@
+5b427ca5f56cd38ac90b0cf2beb236dde6d7e576
diff --git a/build/arduino-builder-macosx-1.3.6.tar.bz2.sha b/build/arduino-builder-macosx-1.3.6.tar.bz2.sha
deleted file mode 100644
index 07f8252b1..000000000
--- a/build/arduino-builder-macosx-1.3.6.tar.bz2.sha
+++ /dev/null
@@ -1 +0,0 @@
-635eac9c0cc8eb98973cf2fc1c851af812c99ec2
diff --git a/build/arduino-builder-macosx-1.3.7.tar.bz2.sha b/build/arduino-builder-macosx-1.3.7.tar.bz2.sha
new file mode 100644
index 000000000..b5e653cde
--- /dev/null
+++ b/build/arduino-builder-macosx-1.3.7.tar.bz2.sha
@@ -0,0 +1 @@
+ae2c591c663ce417c03bd04cb119ae2bc721d379
diff --git a/build/arduino-builder-windows-1.3.6.zip.sha b/build/arduino-builder-windows-1.3.6.zip.sha
deleted file mode 100644
index f04887abf..000000000
--- a/build/arduino-builder-windows-1.3.6.zip.sha
+++ /dev/null
@@ -1 +0,0 @@
-1385e473a0d09a0c43fb6a7e3a934cd97f662460
diff --git a/build/arduino-builder-windows-1.3.7.zip.sha b/build/arduino-builder-windows-1.3.7.zip.sha
new file mode 100644
index 000000000..26408fb3c
--- /dev/null
+++ b/build/arduino-builder-windows-1.3.7.zip.sha
@@ -0,0 +1 @@
+6ec1252e3d8c5d7975b89eb221854ed3c0d7494f
diff --git a/build/build.xml b/build/build.xml
index 235e5e3cb..aece76e3a 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -73,7 +73,7 @@
 
   <property name="portable" value="false" />
 
-  <property name="ARDUINO-BUILDER-VERSION" value="1.3.6" />
+  <property name="ARDUINO-BUILDER-VERSION" value="1.3.7" />
 
   <!-- Libraries required for running arduino -->
   <fileset dir=".." id="runtime.jars">