[yocto] [PATCH] [eclipse-poky][branch:windows-build]Performance fix for Linux implementation

Ioana Grigoropol ioanax.grigoropol at intel.com
Wed Jan 16 14:51:48 PST 2013


- run each command in a separate shell - needs explicit sourcing of environment and closing for each command
- tested only against Linux host & Linux local host connection
- needs local patch for upstream API

Signed-off-by: Ioana Grigoropol <ioanax.grigoropol at intel.com>
---
 plugins/org.yocto.bc.ui/META-INF/MANIFEST.MF       |    1 +
 .../src/org/yocto/bc/bitbake/BBRecipe.java         |    5 +-
 .../src/org/yocto/bc/bitbake/ShellSession.java     |   23 ++-
 .../org/yocto/bc/remote/utils/CommandRunnable.java |   90 +++++++++
 .../yocto/bc/remote/utils/ProcessStreamBuffer.java |   12 +-
 .../org/yocto/bc/remote/utils/RemoteHelper.java    |   98 ++++------
 .../org/yocto/bc/remote/utils/RemoteMachine.java   |  127 +++++++++++--
 .../remote/utils/YoctoHostShellProcessAdapter.java |  198 --------------------
 .../bc/remote/utils/YoctoRunnableWithProgress.java |  191 ++++++++++++++++---
 .../bc/ui/wizards/NewBitBakeFileRecipeWizard.java  |    2 +-
 .../ui/wizards/NewBitBakeFileRecipeWizardPage.java |   71 ++++---
 .../yocto/bc/ui/wizards/install/InstallWizard.java |   29 +--
 12 files changed, 467 insertions(+), 380 deletions(-)
 create mode 100644 plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandRunnable.java
 delete mode 100644 plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java

diff --git a/plugins/org.yocto.bc.ui/META-INF/MANIFEST.MF b/plugins/org.yocto.bc.ui/META-INF/MANIFEST.MF
index 1f0e63e..4e57f33 100644
--- a/plugins/org.yocto.bc.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.yocto.bc.ui/META-INF/MANIFEST.MF
@@ -29,6 +29,7 @@ Import-Package: org.eclipse.cdt.managedbuilder.core,
  org.eclipse.rse.core,
  org.eclipse.rse.core.model,
  org.eclipse.rse.core.subsystems,
+ org.eclipse.rse.internal.services.local.shells,
  org.eclipse.rse.services,
  org.eclipse.rse.services.clientserver.messages,
  org.eclipse.rse.services.files,
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/BBRecipe.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/BBRecipe.java
index 6a33ade..6d003ce 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/BBRecipe.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/BBRecipe.java
@@ -26,9 +26,9 @@ public class BBRecipe extends BBSession {
 		super(session.shell, session.pinfo.getURI());
 		this.session = session;
 		this.fileURI = filePath;
-		this.parsingCmd = "DISABLE_SANITY_CHECKS=\"1\" bitbake -e -b " + filePath.getPath();
+		this.parsingCmd = "DISABLE_SANITY_CHECKS=\"1\" bitbake -e -b " + filePath.getPath() + " >& " + BB_ENV_FILE;
 	}
-	
+
 	@Override
 	public void initialize() throws Exception {
 		if (this.size() == 0) {
@@ -37,6 +37,7 @@ public class BBRecipe extends BBSession {
 		}
 	}
 
+	@Override
 	protected URI getDefaultDepends() {
 		return this.fileURI;
 	}
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
index 6441029..ef01d96 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
@@ -48,6 +48,7 @@ public class ShellSession {
 	public static final String LT = System.getProperty("line.separator");
 	public static final String exportCmd = "export BB_ENV_EXTRAWHITE=\"DISABLE_SANITY_CHECKS $BB_ENV_EXTRAWHITE\"";
 	public static final String exportColumnsCmd = "export COLUMNS=1000";
+	private static final String BUILD_DIR = "/build/";
 
 	public static String getFilePath(String file) throws IOException {
 		File f = new File(file);
@@ -87,8 +88,11 @@ public class ShellSession {
 	private void initializeShell(IProgressMonitor monitor) throws IOException {
 		try {
 			if (root != null) {
-				RemoteHelper.runCommandRemote(projectInfo.getConnection(), new YoctoCommand("source " + initCmd, root.getAbsolutePath(), ""));
-				RemoteHelper.runCommandRemote(projectInfo.getConnection(), new YoctoCommand(exportCmd, root.getAbsolutePath(), ""));
+				IHost connection = projectInfo.getConnection();
+//				RemoteHelper.runCommandRemote(projectInfo.getConnection(), new YoctoCommand("source " + initCmd, root.getAbsolutePath(), ""));
+				RemoteHelper.handleRunCommandRemote(connection, new YoctoCommand("source " + initCmd, root.getAbsolutePath(), ""), monitor);
+//				RemoteHelper.runCommandRemote(projectInfo.getConnection(), new YoctoCommand(exportCmd, root.getAbsolutePath(), ""));
+				RemoteHelper.handleRunCommandRemote(connection,  new YoctoCommand(exportCmd, root.getAbsolutePath(), ""), monitor);
 			} else {
 				throw new Exception("Root file not found!");
 			}
@@ -107,9 +111,11 @@ public class ShellSession {
 
 		try {
 			if (projectInfo.getConnection() != null) {
-				hasErrors = RemoteHelper.runCommandRemote(projectInfo.getConnection(), new YoctoCommand(command, root.getAbsolutePath() + "/build/", ""));
+//				hasErrors = RemoteHelper.runCommandRemote(projectInfo.getConnection(), new YoctoCommand(command, root.getAbsolutePath() + "/build/", ""));
+				command = getInitCmd() + command;
+				RemoteHelper.handleRunCommandRemote(projectInfo.getConnection(), new YoctoCommand(command, getBuildDirAbsolutePath(), ""), new NullProgressMonitor());
 //				return RemoteHelper.getProcessBuffer(projectInfo.getConnection()).getMergedOutputLines();
-				return root.getAbsolutePath() + "/build/";
+				return getBuildDirAbsolutePath();
 			}
 			return null;
 		} catch (Exception e) {
@@ -118,9 +124,16 @@ public class ShellSession {
 		return null;
 	}
 
+	private String getBuildDirAbsolutePath(){
+		return root.getAbsolutePath() + BUILD_DIR;
+	}
+
+    private String getInitCmd() {
+    	return "source " + initCmd + " " + getBuildDirAbsolutePath() + " > tempsf; rm -rf tempsf;";
+	}
+
 synchronized
 	public void execute(String command, ICommandResponseHandler handler) throws IOException {
-		System.out.println(command);
 		execute(command, TERMINATOR, handler);
 	}
 
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandRunnable.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandRunnable.java
new file mode 100644
index 0000000..fe8b7a7
--- /dev/null
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandRunnable.java
@@ -0,0 +1,90 @@
+package org.yocto.bc.remote.utils;
+
+import java.io.BufferedReader;
+import java.util.concurrent.locks.Lock;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.rse.core.model.IHost;
+import org.eclipse.rse.services.shells.IHostShell;
+
+public class CommandRunnable implements Runnable{
+	private IHostShell hostShell;
+	private IHost connection;
+	private YoctoCommand cmd;
+	private IProgressMonitor monitor;
+	private CommandResponseHandler cmdHandler;
+
+	CommandRunnable(IHost connection, YoctoCommand cmd, IProgressMonitor monitor){
+		this.connection = connection;
+		this.cmdHandler = RemoteHelper.getCommandHandler(connection);
+		this.cmd = cmd;
+		this.monitor = monitor;
+		this.hostShell = null;
+	}
+	@Override
+	public void run() {
+		try {
+			hostShell = RemoteHelper.runCommandRemote(connection, cmd, monitor);
+			cmd.setProcessBuffer(processOutput());
+		} catch (CoreException e) {
+			e.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	private ProcessStreamBuffer processOutput() throws Exception {
+		if (hostShell == null)
+			throw new Exception("An error has occured while trying to run remote command!");
+
+		Lock lock = hostShell.getStandardOutputReader().getReaderLock();
+		lock.lock();
+		ProcessStreamBuffer processBuffer = new ProcessStreamBuffer();
+		BufferedReader inbr = hostShell.getStandardOutputReader().getReader();
+		BufferedReader errbr = hostShell.getStandardErrorReader().getReader();
+		boolean cancel = false;
+		while (!cancel) {
+			if(monitor.isCanceled()) {
+				cancel = true;
+				lock.unlock();
+				throw new InterruptedException("User Cancelled");
+			}
+			StringBuffer buffer = new StringBuffer();
+			int c;
+			while ((c = errbr.read()) != -1) {
+				char ch = (char) c;
+				buffer.append(ch);
+				if (ch == '\n'){
+					String str = buffer.toString();
+					processBuffer.addErrorLine(str);
+					System.out.println(str);
+					if (str.trim().equals(RemoteHelper.TERMINATOR)) {
+						break;
+					}
+					cmdHandler.response(str, true);
+					buffer.delete(0, buffer.length());
+				}
+			}
+
+			while ((c = inbr.read()) != -1) {
+				char ch = (char) c;
+				buffer.append(ch);
+				if (ch == '\n'){
+					String str = buffer.toString();
+					processBuffer.addOutputLine(str);
+					System.out.println(str);
+					if (str.trim().equals(RemoteHelper.TERMINATOR)) {
+						break;
+					}
+					cmdHandler.response(str, false);
+					buffer.delete(0, buffer.length());
+				}
+			}
+			cancel = true;
+		}
+		lock.unlock();
+		return processBuffer;
+	}
+
+}
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ProcessStreamBuffer.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ProcessStreamBuffer.java
index 2c6d122..e0d502c 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ProcessStreamBuffer.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ProcessStreamBuffer.java
@@ -8,27 +8,27 @@ public class ProcessStreamBuffer {
 	private static final String WHITESPACES = "\\s+";
 	List<String> errorLines;
 	List<String> outputLines;
-	
+
 	ProcessStreamBuffer(){
 		errorLines = new ArrayList<String>();
 		outputLines = new ArrayList<String>();
 	}
-	
+
 	public void addErrorLine(String line){
 		errorLines.add(line);
 	}
 	public void addOutputLine(String line){
 		outputLines.add(line);
 	}
-	
+
 	public List<String> getOutputLines(){
 		return outputLines;
 	}
-	
+
 	public List<String> getErrorLines(){
 		return errorLines;
 	}
-	
+
 	public String getMergedOutputLines(){
 		String returnVal = "";
 		for (int i = 0; i < outputLines.size(); i++) {
@@ -65,6 +65,6 @@ public class ProcessStreamBuffer {
 				}
 			}
 		}
-		return null;
+		return "";
 	}
 }
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
index 814e3a5..1134c8e 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
@@ -14,7 +14,6 @@ import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.eclipse.core.runtime.CoreException;
@@ -25,6 +24,7 @@ import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.ptp.remote.core.IRemoteConnection;
 import org.eclipse.rse.core.RSECorePlugin;
 import org.eclipse.rse.core.model.IHost;
@@ -35,11 +35,11 @@ import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
 import org.eclipse.rse.services.files.IFileService;
 import org.eclipse.rse.services.files.IHostFile;
 import org.eclipse.rse.services.shells.IHostShell;
+import org.eclipse.rse.services.shells.IShellService;
 import org.eclipse.rse.subsystems.files.core.model.RemoteFileUtility;
 import org.eclipse.rse.subsystems.files.core.servicesubsystem.FileServiceSubSystem;
 import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem;
 import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
-import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystem;
 import org.eclipse.ui.console.MessageConsole;
 import org.yocto.bc.ui.Activator;
 import org.yocto.bc.ui.wizards.install.Messages;
@@ -69,10 +69,6 @@ public class RemoteHelper {
 		return getRemoteMachine(connection).getCmdHandler();
 	}
 
-	public static YoctoHostShellProcessAdapter getHostShellProcessAdapter(IHost connection) {
-		return getRemoteMachine(connection).getHostShellProcessAdapter();
-	}
-
 	public static ProcessStreamBuffer getProcessBuffer(IHost connection) {
 		return getRemoteMachine(connection).getProcessBuffer();
 	}
@@ -198,13 +194,37 @@ public class RemoteHelper {
 		return getRemoteMachine(connection).getShellService(monitor);
 	}
 
-	public static ISubSystem getCmdSubsystem(IHost host) {
-		if (host == null)
-			return null;
-		ISubSystem[] subSystems = host.getSubSystems();
-		for (int i = 0; i < subSystems.length; i++) {
-			if (subSystems[i] instanceof IRemoteCmdSubSystem)
-				return subSystems[i];
+	public static void handleRunCommandRemote(IHost connection, YoctoCommand cmd, IProgressMonitor monitor){
+		try {
+			CommandRunnable cmdRun = new CommandRunnable(connection, cmd, monitor);
+			cmdRun.run();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public static IHostShell runCommandRemote(IHost connection, YoctoCommand cmd,
+			IProgressMonitor monitor) throws CoreException {
+
+		monitor.beginTask(NLS.bind(Messages.RemoteShellExec_1,
+				cmd, cmd.getArguments()), 10);
+
+		String remoteCommand = cmd.getCommand() + " " + cmd.getArguments() + " ; echo " + TERMINATOR + "; exit ;";
+
+		IShellService shellService;
+		try {
+			shellService = (IShellService) getConnectedShellService(connection, new SubProgressMonitor(monitor, 7));
+
+			String env[] = getRemoteMachine(connection).prepareEnvString(monitor);
+
+			try {
+				IHostShell hostShell = shellService.runCommand(cmd.getInitialDirectory(), remoteCommand, env, new SubProgressMonitor(monitor, 3));
+				return hostShell;
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		} catch (Exception e1) {
+			e1.printStackTrace();
 		}
 		return null;
 	}
@@ -248,54 +268,6 @@ public class RemoteHelper {
 		return null;
 	}
 
-	public static boolean runCommandRemote(final IHost connection, final YoctoCommand cmd) throws Exception {
-		final String remoteCommand = cmd.getCommand() + " " + cmd.getArguments();
-		final boolean hasErrors = false;
-
-		if (!cmd.getInitialDirectory().isEmpty()) {
-			writeToShell(connection, "cd " + cmd.getInitialDirectory());
-		}
-		if (!hasErrors)
-			writeToShell(connection, remoteCommand);
-
-		return hasErrors;
-	}
-
-	public static boolean writeToShell(final IHost connection, final String remoteCommand){
-		new Thread(new Runnable() {
-			@Override
-			public void run() {
-				try {
-					YoctoHostShellProcessAdapter adapter = getHostShellProcessAdapter(connection);
-					String fullRemoteCommand = remoteCommand + "; echo " + TERMINATOR + ";";
-					adapter.setLastCommand(fullRemoteCommand);
-					getHostShell(connection).writeToShell(fullRemoteCommand);
-					while (!adapter.isFinished())
-						Thread.sleep(2);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		}).run();
-		return true;
-	}
-
-	public static void runBatchRemote(IHost connection, List<YoctoCommand> cmds, boolean displayOutput) throws CoreException {
-		try {
-			String remoteCommand = "";
-			for (YoctoCommand cmd : cmds) {
-				remoteCommand = cmd.getCommand() + " " + cmd.getArguments();
-				if (!cmd.getInitialDirectory().isEmpty()) {
-					writeToShell(connection, "cd " + cmd.getInitialDirectory());
-				}
-				writeToShell(connection, remoteCommand);
-			}
-
-		} catch (Exception e1) {
-			e1.printStackTrace();
-		}
-	}
-
 	/**
 	 * Throws a core exception with an error status object built from the given
 	 * message, lower level exception, and error code.
@@ -345,8 +317,4 @@ public class RemoteHelper {
 		return false;
 	}
 
-	public static void clearProcessBuffer(IHost connection) {
-		getHostShellProcessAdapter(connection).clearProcessBuffer();
-	}
-
 }
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteMachine.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteMachine.java
index d4cdb23..18c41e1 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteMachine.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteMachine.java
@@ -1,6 +1,10 @@
 package org.yocto.bc.remote.utils;
 
-import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.eclipse.core.runtime.CoreException;
@@ -8,10 +12,13 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.rse.core.model.IHost;
 import org.eclipse.rse.core.subsystems.ISubSystem;
+import org.eclipse.rse.internal.services.local.shells.LocalShellService;
 import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
 import org.eclipse.rse.services.files.IFileService;
+import org.eclipse.rse.services.shells.HostShellProcessAdapter;
 import org.eclipse.rse.services.shells.IHostShell;
 import org.eclipse.rse.services.shells.IShellService;
 import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem;
@@ -26,7 +33,6 @@ public class RemoteMachine {
 	private MessageConsole console;
 	private CommandResponseHandler cmdHandler;
 	private IHostShell hostShell;
-	private YoctoHostShellProcessAdapter hostShellProcessAdapter;
 	private IShellService shellService;
 	private ProcessStreamBuffer processBuffer;
 	private IHost connection;
@@ -37,6 +43,111 @@ public class RemoteMachine {
 	public RemoteMachine(IHost connection) {
 		setConnection(connection);
 	}
+	private ProcessStreamBuffer processOutput(Process process, IProgressMonitor monitor) throws Exception {
+		if (process == null)
+			throw new Exception("An error has occured while trying to run remote command!");
+		ProcessStreamBuffer processBuffer = new ProcessStreamBuffer();
+
+		BufferedReader inbr = new BufferedReader(new InputStreamReader(process.getInputStream()));
+		BufferedReader errbr = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+		boolean cancel = false;
+		while (!cancel) {
+			if(monitor.isCanceled()) {
+				cancel = true;
+				throw new InterruptedException("User Cancelled");
+			}
+			StringBuffer buffer = new StringBuffer();
+			int c;
+			while ((c = errbr.read()) != -1) {
+				char ch = (char) c;
+				buffer.append(ch);
+				if (ch == '\n'){
+					String str = buffer.toString();
+					processBuffer.addErrorLine(str);
+					System.out.println(str);
+					if (str.trim().equals(RemoteHelper.TERMINATOR)) {
+						break;
+					}
+					buffer.delete(0, buffer.length());
+				}
+			}
+
+			while ((c = inbr.read()) != -1) {
+				char ch = (char) c;
+				buffer.append(ch);
+				if (ch == '\n'){
+					String str = buffer.toString();
+					processBuffer.addOutputLine(str);
+					System.out.println(str);
+					if (str.trim().equals(RemoteHelper.TERMINATOR)) {
+						break;
+					}
+					buffer.delete(0, buffer.length());
+				}
+			}
+			cancel = true;
+		}
+		return processBuffer;
+	}
+
+	public String[] prepareEnvString(IProgressMonitor monitor){
+		String[] env = null;
+		try {
+			if (shellService instanceof LocalShellService) {
+				env  = shellService.getHostEnvironment();
+			} else {
+				List<String> envList = new ArrayList<String>();
+				getRemoteEnvProxyVars(monitor);
+				String value = "";
+				for (String varName : environment.keySet()){
+					value = varName + "=" + environment.get(varName);
+					envList.add(value);
+				}
+				env = envList.toArray(new String[envList.size()]);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return env;
+	}
+	public void getRemoteEnvProxyVars(IProgressMonitor monitor){
+		try {
+			if (environment != null && !environment.isEmpty())
+				return;
+
+			environment = new HashMap<String, String>();
+
+			IShellService shellService = getShellService(new SubProgressMonitor(monitor, 7));
+
+			HostShellProcessAdapter p = null;
+			ProcessStreamBuffer buffer = null;
+			try {
+				SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 3);
+				IHostShell hostShell = shellService.runCommand("", "env" + " ; echo " + RemoteHelper.TERMINATOR + "; exit;", new String[]{}, subMonitor);
+				p = new HostShellProcessAdapter(hostShell);
+				buffer = processOutput(p, subMonitor);
+				for(int i = 0; i < buffer.getOutputLines().size(); i++) {
+					String out = buffer.getOutputLines().get(i);
+					String[] tokens = out.split("=");
+					if (tokens.length != 2)
+						continue;
+					String varName = tokens[0];
+					String varValue = tokens[1];
+					if (varName.contains(PROXY))
+						environment.put(varName, varValue);
+				}
+			} catch (Exception e) {
+				if (p != null) {
+					p.destroy();
+				}
+				e.printStackTrace();
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
 
 	public Map<String, String> getEnvironment() {
 		return environment;
@@ -60,6 +171,7 @@ public class RemoteMachine {
 		try {
 			if (hostShell == null) {
 				hostShell = getShellService(new NullProgressMonitor()).launchShell("", new String[]{}, new NullProgressMonitor());
+				prepareEnvString(new NullProgressMonitor());
 			}
 		} catch (SystemMessageException e) {
 			e.printStackTrace();
@@ -69,17 +181,6 @@ public class RemoteMachine {
 		return hostShell;
 	}
 
-	public YoctoHostShellProcessAdapter getHostShellProcessAdapter() {
-		try {
-			if (hostShellProcessAdapter == null)
-				hostShellProcessAdapter = new YoctoRunnableWithProgress(getHostShell(), getProcessBuffer(), getCmdHandler());
-			return hostShellProcessAdapter;
-		} catch (IOException e) {
-			e.printStackTrace();
-			return null;
-		}
-	}
-
 	public IShellService getShellService(IProgressMonitor monitor) throws Exception {
 		if (shellService != null)
 			return shellService;
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java
deleted file mode 100644
index aca6a6e..0000000
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java
+++ /dev/null
@@ -1,198 +0,0 @@
-package org.yocto.bc.remote.utils;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Semaphore;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.rse.services.shells.HostShellProcessAdapter;
-import org.eclipse.rse.services.shells.IHostOutput;
-import org.eclipse.rse.services.shells.IHostShell;
-import org.eclipse.rse.services.shells.IHostShellChangeEvent;
-import org.eclipse.rse.services.shells.IHostShellOutputReader;
-import org.eclipse.swt.widgets.Display;
-
-public class YoctoHostShellProcessAdapter extends  HostShellProcessAdapter {
-	private ProcessStreamBuffer processStreamBuffer;
-	private CommandResponseHandler commandResponseHandler;
-	private boolean isFinished;
-	private ICalculatePercentage calculator;
-	private int reportedWorkload;
-	private boolean isAlive;
-
-	private String command;
-	private Map<String, IProgressMonitor> commandMonitors;
-
-	private Semaphore sem;
-
-
-	public YoctoHostShellProcessAdapter(IHostShell hostShell, ProcessStreamBuffer processStreamBuffer, CommandResponseHandler commandResponseHandler) throws IOException {
-		super(hostShell);
-		this.processStreamBuffer = processStreamBuffer;
-		this.commandResponseHandler = commandResponseHandler;
-		this.calculator = new GitCalculatePercentage();
-		this.sem = new Semaphore(1);
-		this.command = "";
-		this.commandMonitors = new HashMap<String, IProgressMonitor>();
-	}
-
-	public String getLastCommand() {
-		return command;
-	}
-
-	public synchronized void setLastCommand(String lastCommand) {
-		try {
-			// there are still some processes that might take a long time and if we do not wait for them,
-			// then the semaphore will not be released, because an interrupted exception will occur
-			Thread.sleep(2000);
-			isFinished = false;
-			sem.acquire();
-			this.command = lastCommand.trim();
-			this.commandMonitors.put(command, getOwnMonitor());
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	private interface ICalculatePercentage {
-		public float calWorkloadDone(String info) throws IllegalArgumentException;
-	}
-
-	private class GitCalculatePercentage implements ICalculatePercentage {
-		final Pattern pattern = Pattern.compile("^Receiving objects:\\s*(\\d+)%.*");
-		@Override
-		public float calWorkloadDone(String info) throws IllegalArgumentException {
-			Matcher m = pattern.matcher(info.trim());
-			if(m.matches()) {
-				return new Float(m.group(1)) / 100;
-			}else {
-				throw new IllegalArgumentException();
-			}
-		}
-	}
-
-	private IProgressMonitor getMonitor() {
-		if (command == null) {
-			return null;
-		}
-		return commandMonitors.get(command);
-	}
-
-	private void updateMonitor(final int work){
-
-		Display.getDefault().asyncExec(new Runnable() {
-
-			@Override
-			public void run() {
-				if (getMonitor() != null) {
-					getMonitor().worked(work);
-				}
-			}
-
-		});
-	}
-
-	private void doneMonitor(){
-		Display.getDefault().asyncExec(new Runnable() {
-			@Override
-			public void run() {
-				getMonitor().done();
-			}
-		});
-	}
-
-	private void reportProgress(String info) {
-		if(calculator == null) {
-			updateMonitor(1);
-		} else {
-			float percentage;
-			try {
-				percentage = calculator.calWorkloadDone(info);
-			} catch (IllegalArgumentException e) {
-				System.out.println(info);
-				//can't get percentage
-				return;
-			}
-			int delta = (int) (RemoteHelper.TOTALWORKLOAD * percentage - reportedWorkload);
-			if( delta > 0 ) {
-				updateMonitor(delta);
-				reportedWorkload += delta;
-			}
-
-			if (reportedWorkload == RemoteHelper.TOTALWORKLOAD)
-				doneMonitor();
-		}
-	}
-
-	@Override
-	public void shellOutputChanged(IHostShellChangeEvent event) {
-		IHostShellOutputReader reader = event.getReader();
-		IHostOutput[] lines = event.getLines();
-		if (reader.isErrorReader()) {
-			for (IHostOutput line : lines) {
-				String value = line.getString();
-				if (value.isEmpty()) {
-					continue;
-				}
-				System.out.println(value);
-				this.processStreamBuffer.addErrorLine(value);
-				if (this.commandResponseHandler != null)
-					this.commandResponseHandler.response(value, false);
-			}
-		} else {
-			for (IHostOutput line : lines) {
-				String value = line.getString().trim();
-				if (value.isEmpty()) {
-					continue;
-				}
-				if (value.endsWith(RemoteHelper.TERMINATOR)) {
-					sem.release();
-					isFinished = true;
-				}
-
-				reportProgress(value);
-				System.out.println(value);
-				this.processStreamBuffer.addOutputLine(value);
-				if (this.commandResponseHandler != null)
-					this.commandResponseHandler.response(value, false);
-			}
-		}
-
-	}
-	public boolean isFinished() {
-		return isFinished;
-	}
-	public boolean hasErrors(){
-		return this.processStreamBuffer.errorLines.size() != 0;
-	}
-
-	public boolean isAlive() {
-		return isAlive;
-	}
-
-	public void setAlive(boolean isAlive) {
-		this.isAlive = isAlive;
-	}
-
-	public void clearProcessBuffer() {
-		this.processStreamBuffer.outputLines.clear();
-		this.processStreamBuffer.errorLines.clear();
-	}
-
-	public IProgressMonitor getOwnMonitor() {
-		return new NullProgressMonitor();
-	}
-
-	public CommandResponseHandler getCommandResponseHandler() {
-		return commandResponseHandler;
-	}
-
-	public void setCommandResponseHandler(CommandResponseHandler commandResponseHandler) {
-		this.commandResponseHandler = commandResponseHandler;
-	}
-
-}
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoRunnableWithProgress.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoRunnableWithProgress.java
index b6ed2b8..5aa6fd2 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoRunnableWithProgress.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoRunnableWithProgress.java
@@ -1,8 +1,13 @@
 package org.yocto.bc.remote.utils;
 
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
+import java.util.concurrent.locks.Lock;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.ptp.remote.core.IRemoteConnection;
@@ -10,21 +15,39 @@ import org.eclipse.ptp.remote.core.IRemoteServices;
 import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
 import org.eclipse.rse.core.model.IHost;
 import org.eclipse.rse.services.shells.IHostShell;
+import org.eclipse.swt.widgets.Display;
 
-public class YoctoRunnableWithProgress extends YoctoHostShellProcessAdapter
-		implements IRunnableWithProgress {
+public class YoctoRunnableWithProgress implements IRunnableWithProgress {
 
 	private String taskName;
 	private IRemoteConnection remoteConnection;
 	private IRemoteServices remoteServices;
-	private String cmd;
-	private String args;
 	private IProgressMonitor monitor;
-	
-	public YoctoRunnableWithProgress(IHostShell hostShell,
-			ProcessStreamBuffer processStreamBuffer,
-			CommandResponseHandler commandResponseHandler) throws IOException {
-		super(hostShell, processStreamBuffer, commandResponseHandler);
+	private ICalculatePercentage calculator;
+	private int reportedWorkload;
+
+	private YoctoCommand command;
+
+	public YoctoRunnableWithProgress(YoctoCommand command) throws IOException {
+		this.command = command;
+		this.calculator = new GitCalculatePercentage();
+	}
+
+	private interface ICalculatePercentage {
+		public float calWorkloadDone(String info) throws IllegalArgumentException;
+	}
+
+	private class GitCalculatePercentage implements ICalculatePercentage {
+		final Pattern pattern = Pattern.compile("^Receiving objects:\\s*(\\d+)%.*");
+		@Override
+		public float calWorkloadDone(String info) throws IllegalArgumentException {
+			Matcher m = pattern.matcher(info.trim());
+			if(m.matches()) {
+				return new Float(m.group(1)) / 100;
+			}else {
+				throw new IllegalArgumentException();
+			}
+		}
 	}
 
 	@Override
@@ -33,7 +56,7 @@ public class YoctoRunnableWithProgress extends YoctoHostShellProcessAdapter
 		try {
 			this.monitor = monitor;
 			this.monitor.beginTask(taskName, RemoteHelper.TOTALWORKLOAD);
-			
+
 			if (!remoteConnection.isOpen()) {
 				try {
 					remoteConnection.open(monitor);
@@ -48,7 +71,8 @@ public class YoctoRunnableWithProgress extends YoctoHostShellProcessAdapter
 
 			try {
 				IHost connection = RemoteHelper.getRemoteConnectionByName(remoteConnection.getName());
-                RemoteHelper.runCommandRemote(connection, new YoctoCommand(cmd, "", args));
+				YoctoThread th = new YoctoThread(connection, command);
+				th.run();
 			} catch (Exception e) {
 				e.printStackTrace();
 			} finally {
@@ -59,9 +83,132 @@ public class YoctoRunnableWithProgress extends YoctoHostShellProcessAdapter
 		}
 	}
 
-	@Override
-	public IProgressMonitor getOwnMonitor() {
-		return monitor;
+
+	class YoctoThread implements Runnable{
+		private IHost connection;
+		private YoctoCommand command;
+		private CommandResponseHandler cmdHandler;
+		private IHostShell hostShell;
+
+		YoctoThread(IHost connection, YoctoCommand command){
+			this.connection = connection;
+			this.cmdHandler = RemoteHelper.getCommandHandler(connection);
+			this.command = command;
+		}
+
+		@Override
+		public void run() {
+			try {
+				hostShell = RemoteHelper.runCommandRemote(this.connection, command, monitor);
+				command.setProcessBuffer(processOutput());
+			} catch (CoreException e) {
+				e.printStackTrace();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		private ProcessStreamBuffer processOutput() throws Exception {
+			if (hostShell == null)
+				throw new Exception("An error has occured while trying to run remote command!");
+			monitor.beginTask(taskName, RemoteHelper.TOTALWORKLOAD);
+			Lock lock = hostShell.getStandardOutputReader().getReaderLock();
+			lock.lock();
+			ProcessStreamBuffer processBuffer = new ProcessStreamBuffer();
+			BufferedReader inbr = hostShell.getStandardOutputReader().getReader();
+			BufferedReader errbr = hostShell.getStandardErrorReader().getReader();
+			boolean cancel = false;
+			while (!cancel) {
+				if(monitor.isCanceled()) {
+					cancel = true;
+					lock.unlock();
+					throw new InterruptedException("User Cancelled");
+				}
+				StringBuffer buffer = new StringBuffer();
+				int c;
+				if (errbr != null) {
+					while ((c = errbr.read()) != -1) {
+						char ch = (char) c;
+						buffer.append(ch);
+						if (ch == '\n' || ch == '\r'){
+							String str = buffer.toString();
+							processBuffer.addOutputLine(str);
+							System.out.println(str);
+							if (ch == '\r')
+								reportProgress(str);
+							if (str.trim().equals(RemoteHelper.TERMINATOR)) {
+								break;
+							}
+							cmdHandler.response(str, false);
+							buffer.delete(0, buffer.length());
+						}
+					}
+				}
+				if (inbr != null) {
+					while ((c = inbr.read()) != -1) {
+						char ch = (char) c;
+						buffer.append(ch);
+						if (ch == '\n'){
+							String str = buffer.toString();
+							processBuffer.addOutputLine(str);
+							System.out.println(str);
+							if (str.trim().equals(RemoteHelper.TERMINATOR)) {
+								break;
+							}
+							cmdHandler.response(str, false);
+							buffer.delete(0, buffer.length());
+						}
+					}
+				}
+				cancel = true;
+			}
+			lock.unlock();
+			return processBuffer;
+		}
+	}
+	private void updateMonitor(final int work){
+
+		Display.getDefault().asyncExec(new Runnable() {
+
+			@Override
+			public void run() {
+				if (monitor != null) {
+					monitor.worked(work);
+				}
+			}
+
+		});
+	}
+
+	private void doneMonitor(){
+		Display.getDefault().asyncExec(new Runnable() {
+			@Override
+			public void run() {
+				monitor.done();
+			}
+		});
+	}
+
+	public void reportProgress(String info) {
+		if(calculator == null) {
+			updateMonitor(1);
+		} else {
+			float percentage;
+			try {
+				percentage = calculator.calWorkloadDone(info);
+			} catch (IllegalArgumentException e) {
+				System.out.println(info);
+				//can't get percentage
+				return;
+			}
+			int delta = (int) (RemoteHelper.TOTALWORKLOAD * percentage - reportedWorkload);
+			if( delta > 0 ) {
+				updateMonitor(delta);
+				reportedWorkload += delta;
+			}
+
+			if (reportedWorkload == RemoteHelper.TOTALWORKLOAD)
+				doneMonitor();
+		}
 	}
 
 	public IRemoteConnection getRemoteConnection() {
@@ -87,20 +234,4 @@ public class YoctoRunnableWithProgress extends YoctoHostShellProcessAdapter
 	public void setRemoteServices(IRemoteServices remoteServices) {
 		this.remoteServices = remoteServices;
 	}
-
-	public String getCmd() {
-		return cmd;
-	}
-
-	public void setCmd(String cmd) {
-		this.cmd = cmd;
-	}
-
-	public String getArgs() {
-		return args;
-	}
-
-	public void setArgs(String args) {
-		this.args = args;
-	}
 }
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizard.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizard.java
index 7345b77..1f15922 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizard.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizard.java
@@ -204,7 +204,7 @@ public class NewBitBakeFileRecipeWizard extends Wizard implements INewWizard {
 			public void run(IProgressMonitor monitor) throws InvocationTargetException {
 				try {
 					doFinish(element, monitor);
-					RemoteHelper.runCommandRemote(connection, new YoctoCommand("rm -rf " + element.getMetaDir() + "/temp", "", ""));
+					RemoteHelper.handleRunCommandRemote(connection, new YoctoCommand("rm -rf " + element.getMetaDir() + "/temp", "", ""), monitor);
 				} catch (Exception e) {
 					throw new InvocationTargetException(e);
 				} finally {
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizardPage.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizardPage.java
index c55f8d7..dd6feea 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizardPage.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizardPage.java
@@ -28,6 +28,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -91,7 +92,6 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 	private static final String MIRRORS_FILE = "mirrors.bbclass";
 	private static final String CLASSES_FOLDER = "classes";
 	private static final String COPYING_FILE = "COPYING";
-	private static final String WHITESPACES = "\\s+";
 	private static final String CMAKE_LIST = "cmakelists.txt";
 	private static final String CMAKE = "cmake";
 	private static final String SETUP_SCRIPT = "setup.py";
@@ -104,9 +104,9 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 
 	private HashMap<String, String> mirrorTable;
 	private URI extractDir;
-	private YoctoCommand licenseChecksumCmd;
-	protected YoctoCommand md5YCmd;
-	protected YoctoCommand sha256YCmd;
+	protected ProcessStreamBuffer md5Buffer;
+	protected ProcessStreamBuffer sha256Buffer;
+	protected ProcessStreamBuffer md5CopyingBuffer;
 
 	public NewBitBakeFileRecipeWizardPage(ISelection selection, IHost connection) {
 		super("wizardPage");
@@ -331,12 +331,11 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 	}
 
 	private void handleLocalPopulate(URI srcURI, IProgressMonitor monitor) {
-		populateLicenseFileChecksum(srcURI);
+		populateLicenseFileChecksum(srcURI, monitor);
 		populateInheritance(srcURI, monitor);
 	}
 
 	private void handleRemotePopulate(final URI srcURI, IProgressMonitor monitor) throws Exception {
-		RemoteHelper.clearProcessBuffer(connection);
 		populateRecipeName(srcURI);
 
 		this.getContainer().run(true, true, new IRunnableWithProgress() {
@@ -345,47 +344,53 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 			public void run(IProgressMonitor monitor) throws InvocationTargetException,
 					InterruptedException {
 				monitor.beginTask("Populating recipe fields ... ", 100);
-				List<YoctoCommand> commands = new ArrayList<YoctoCommand>();
 
 				try {
 					String metaDirLocPath = metaDirLoc.getPath();
-
 					monitor.subTask("Cleaning environment");
-					commands.add(new YoctoCommand("rm -rf " + TEMP_FOLDER_NAME, metaDirLocPath, ""));
-					commands.add(new YoctoCommand( "mkdir " + TEMP_FOLDER_NAME, metaDirLocPath, ""));
+					YoctoCommand rmYCmd = new YoctoCommand("rm -rf " + TEMP_FOLDER_NAME, metaDirLocPath, "");
+					RemoteHelper.handleRunCommandRemote(connection, rmYCmd, new SubProgressMonitor(monitor, 5));
+
+					YoctoCommand mkdirYCmd = new YoctoCommand( "mkdir " + TEMP_FOLDER_NAME, metaDirLocPath, "");
+					RemoteHelper.handleRunCommandRemote(connection, mkdirYCmd, new SubProgressMonitor(monitor, 5));
+
 					updateTempFolderPath();
 					monitor.worked(10);
 
 					monitor.subTask("Downloading package sources");
-					commands.add(new YoctoCommand("wget " + srcURI.toURL(), tempFolderPath, ""));
 
 					updateTempFolderPath();
-					RemoteHelper.runBatchRemote(connection, commands, true);
 
-					commands.clear();
+					YoctoCommand wgetYCmd = new YoctoCommand("wget " + srcURI.toURL(), tempFolderPath, "");
+					RemoteHelper.handleRunCommandRemote(connection, wgetYCmd, new SubProgressMonitor(monitor, 40));
+
 					monitor.worked(50);
 
 					monitor.subTask("Compute package checksums");
 					String md5Cmd = "md5sum " + srcFileNameExt;
-					md5YCmd = new YoctoCommand(md5Cmd, tempFolderPath, "");
-					RemoteHelper.runCommandRemote(connection, md5YCmd);
+					YoctoCommand md5YCmd = new YoctoCommand(md5Cmd, tempFolderPath, "");
+
+					RemoteHelper.handleRunCommandRemote(connection, md5YCmd, new SubProgressMonitor(monitor, 10));
+					md5Buffer =  md5YCmd.getProcessBuffer();
 
 					monitor.worked(60);
 
 					String sha256Cmd = "sha256sum " + srcFileNameExt;
-					sha256YCmd = new YoctoCommand(sha256Cmd, tempFolderPath, "");
-					RemoteHelper.runCommandRemote(connection, sha256YCmd);
+					YoctoCommand sha256YCmd = new YoctoCommand(sha256Cmd, tempFolderPath, "");
+					RemoteHelper.handleRunCommandRemote(connection, sha256YCmd, new SubProgressMonitor(monitor, 10));
+					sha256Buffer = sha256YCmd.getProcessBuffer();
 
 					monitor.worked(70);
 
 					monitor.subTask("Extracting package");
-					extractDir = extractPackage(srcURI);
+					extractDir = extractPackage(srcURI, new SubProgressMonitor(monitor, 0));
 					monitor.worked(80);
 
-					licenseChecksumCmd = populateLicenseFileChecksum(extractDir);
+					YoctoCommand licenseChecksumCmd = populateLicenseFileChecksum(extractDir, new SubProgressMonitor(monitor, 10));
+					md5CopyingBuffer = 	licenseChecksumCmd.getProcessBuffer();
 
 					monitor.subTask("Creating mirror lookup table");
-					mirrorTable = createMirrorLookupTable();
+					mirrorTable = createMirrorLookupTable(new SubProgressMonitor(monitor, 10));
 
 					monitor.worked(90);
 					monitor.done();
@@ -397,23 +402,15 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 		updateSrcUri(mirrorTable, srcURI);
 		populateInheritance(extractDir, monitor);
 
-		String md5Val = retrieveSum(srcFileNameExt, md5Pattern);
+		String md5Val = md5Buffer.getOutputLineContaining(srcFileNameExt, md5Pattern);
 		md5sumText.setText(Pattern.matches(md5Pattern,  md5Val) ? md5Val : "");
-		String sha256Val = retrieveSum(srcFileNameExt, sha256Pattern);
+		String sha256Val = sha256Buffer.getOutputLineContaining(srcFileNameExt, sha256Pattern);
 		sha256sumText.setText(Pattern.matches(sha256Pattern,  sha256Val) ? sha256Val : "");
-		String checkSumVal =  retrieveSum(COPYING_FILE, md5Pattern);
+		String checkSumVal =  md5CopyingBuffer.getOutputLineContaining(COPYING_FILE, md5Pattern);
 		checksumText.setText(RemoteHelper.createNewURI(extractDir, COPYING_FILE).toString() + ";md5=" + (Pattern.matches(md5Pattern,  checkSumVal) ? checkSumVal : ""));
 	}
 
-	private String retrieveSum(String arg, String pattern) {
-		ProcessStreamBuffer buffer = RemoteHelper.getProcessBuffer(this.connection);
-		String sum = buffer.getOutputLineContaining(arg, pattern);
-		if (sum == null)
-			return "";
-		return sum;
-	}
-
-	private URI extractPackage(URI srcURI) {
+	private URI extractPackage(URI srcURI, IProgressMonitor monitor) {
 		try {
 			String path = srcFileNameExt;
 			String tarCmd = "tar ";
@@ -423,7 +420,7 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 				tarCmd += "-xvf ";
 			}
 
-			RemoteHelper.runCommandRemote(connection, new YoctoCommand(tarCmd + path, tempFolderPath, ""));
+			RemoteHelper.handleRunCommandRemote(connection, new YoctoCommand(tarCmd + path, tempFolderPath, ""), monitor);
 
 			return RemoteHelper.createNewURI(metaDirLoc, TEMP_FOLDER_NAME + "/" + srcFileName);
 
@@ -459,13 +456,13 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 		}
 	}
 
-	private YoctoCommand populateLicenseFileChecksum(URI extractDir) {
+	private YoctoCommand populateLicenseFileChecksum(URI extractDir, IProgressMonitor monitor) {
 		if (extractDir == null)
 			throw new RuntimeException("Something went wrong during source extraction!");
 
 		try {
 			YoctoCommand catCmd = new YoctoCommand("md5sum " + COPYING_FILE, extractDir.getPath(), "");
-			RemoteHelper.runCommandRemote(connection, catCmd);
+			RemoteHelper.handleRunCommandRemote(connection, catCmd, monitor);
 			return catCmd;
 		} catch (Exception e) {
 			throw new RuntimeException("Unable to process file for MD5 calculation", e);
@@ -494,11 +491,11 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 		return "";
 	}
 
-	private HashMap<String, String> createMirrorLookupTable() throws Exception {
+	private HashMap<String, String> createMirrorLookupTable(IProgressMonitor monitor) throws Exception {
 		HashMap<String, String> mirrorMap = new HashMap<String, String>();
 
 		YoctoCommand cmd = new YoctoCommand("cat " + MIRRORS_FILE, getMetaFolderPath() + CLASSES_FOLDER, "");
-		RemoteHelper.runCommandRemote(connection, cmd);
+		RemoteHelper.handleRunCommandRemote(connection, cmd, monitor);
 
 		if (!cmd.getProcessBuffer().hasErrors()){
 			String delims = "[\\t]+";
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/InstallWizard.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/InstallWizard.java
index 4fbaca3..071f6aa 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/InstallWizard.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/InstallWizard.java
@@ -6,7 +6,6 @@ import java.util.Hashtable;
 import java.util.Map;
 
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.IWizardContainer;
@@ -20,6 +19,7 @@ import org.eclipse.ui.console.MessageConsole;
 import org.yocto.bc.remote.utils.CommandResponseHandler;
 import org.yocto.bc.remote.utils.ConsoleWriter;
 import org.yocto.bc.remote.utils.RemoteHelper;
+import org.yocto.bc.remote.utils.YoctoCommand;
 import org.yocto.bc.remote.utils.YoctoRunnableWithProgress;
 import org.yocto.bc.ui.Activator;
 import org.yocto.bc.ui.model.ProjectInfo;
@@ -112,18 +112,17 @@ public class InstallWizard extends FiniteStateWizard implements IWorkbenchWizard
 			IRemoteServices remoteServices = ((IRemoteServices)model.get(InstallWizard.SELECTED_REMOTE_SERVICE));
 			final IHost connection = RemoteHelper.getRemoteConnectionByName(remoteConnection.getName());
 			final CommandResponseHandler cmdHandler = RemoteHelper.getCommandHandler(connection);
-			final YoctoRunnableWithProgress adapter = (YoctoRunnableWithProgress)RemoteHelper.getHostShellProcessAdapter(connection);
 			final IWizardContainer container = this.getContainer();
 			if (((Boolean)options.get(GIT_CLONE)).booleanValue()) {
 				String cmd = "/usr/bin/git clone --progress";
 				String args = "git://git.yoctoproject.org/poky.git " + uri.getPath();
 				String taskName = "Checking out Yocto git repository";
 
+				YoctoRunnableWithProgress adapter = new YoctoRunnableWithProgress(new YoctoCommand(cmd, "", args));
+
 				adapter.setRemoteConnection(remoteConnection);
 				adapter.setRemoteServices(remoteServices);
 				adapter.setTaskName(taskName);
-				adapter.setCmd(cmd);
-				adapter.setArgs(args);
 				try {
 					container.run(true, true, adapter);
 				} catch (InvocationTargetException e) {
@@ -148,31 +147,15 @@ public class InstallWizard extends FiniteStateWizard implements IWorkbenchWizard
 				pinfo.setRemoteServices(remoteServices);
 
 				final ConsoleWriter cw = new ConsoleWriter();
-				final ProjectInfo pInfoFinal = pinfo;
-
-				Thread t = new Thread(new Runnable() {
-
-					@Override
-					public void run() {
-						try {
-							Thread.sleep(2000);
-							new BBConfigurationInitializeOperation(pInfoFinal, null).run(new NullProgressMonitor());
-						} catch (InvocationTargetException e) {
-							e.printStackTrace();
-						} catch (InterruptedException e) {
-							e.printStackTrace();
-						}
-					}
-				});
-
+//				final ProjectInfo pInfoFinal = pinfo;
+				container.run(false, false, new BBConfigurationInitializeOperation(pinfo, null));
 				console = RemoteHelper.getConsole(connection);
 				console.newMessageStream().println(cw.getContents());
 
 				model.put(InstallWizard.KEY_PINFO, pinfo);
 				Activator.putProjInfo(pinfo.getURI(), pinfo);
 
-				container.run(true, true, new CreateBBCProjectOperation(pinfo));
-				t.start();
+				container.run(false, false, new CreateBBCProjectOperation(pinfo));
 				return true;
 			}
 		} catch (Exception e) {
-- 
1.7.9.5




More information about the yocto mailing list