[yocto] [PATCH 1/8] Add console fixes & run commands in a synchronous way

Ioana Grigoropol ioanax.grigoropol at intel.com
Wed Nov 28 02:12:23 PST 2012


- when creating a new Yocto Project, the window does not wait for the process to complete, and closes beforehand
- the long time running task will be created without forking and monitor will be updated when receiving events from the YoctoHostShellProcessAdapter
- use AbstractHostShellReader.isFinished to wait for command outputs

Signed-off-by: Ioana Grigoropol <ioanax.grigoropol at intel.com>
---
 .../src/org/yocto/bc/bitbake/ShellSession.java     |   13 +-
 .../org/yocto/bc/remote/utils/ConsoleHelper.java   |   18 +--
 .../bc/remote/utils/ConsoleHelperRunnable.java     |   31 +++++
 .../org/yocto/bc/remote/utils/ConsoleRunnable.java |   37 ++++++
 .../org/yocto/bc/remote/utils/RemoteHelper.java    |   34 +++--
 .../org/yocto/bc/remote/utils/RemoteMachine.java   |    6 +-
 .../remote/utils/YoctoHostShellProcessAdapter.java |  140 +++++++++++++-------
 .../bc/ui/wizards/NewBitBakeFileRecipeWizard.java  |    2 +-
 .../ui/wizards/NewBitBakeFileRecipeWizardPage.java |   10 +-
 .../yocto/bc/ui/wizards/install/InstallWizard.java |   86 +++---------
 10 files changed, 217 insertions(+), 160 deletions(-)
 create mode 100644 plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleHelperRunnable.java
 create mode 100644 plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleRunnable.java

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 06978fb..a7ed3d6 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
@@ -18,7 +18,6 @@ import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.Writer;
 
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.rse.services.files.IHostFile;
@@ -119,12 +118,12 @@ public class ShellSession {
 	synchronized 
 	public String execute(String command, int[] retCode) throws IOException {
 		//FIXME : parse output 
-		try {
-			RemoteHelper.runCommandRemote(RemoteHelper.getRemoteConnectionByName(projectInfo.getConnection().getName()), new YoctoCommand(command, root.getAbsolutePath(), ""), new NullProgressMonitor(), true);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		
+//		try {
+//			RemoteHelper.runCommandRemote(RemoteHelper.getRemoteConnectionByName(projectInfo.getConnection().getName()), new YoctoCommand(command, root.getAbsolutePath(), ""), new NullProgressMonitor());
+//		} catch (Exception e) {
+//			e.printStackTrace();
+//		}
+//		
 //		String errorMessage = null;
 //		interrupt = false;
 //		out.write(command);
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleHelper.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleHelper.java
index 4655fe0..25bd9f9 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleHelper.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleHelper.java
@@ -1,14 +1,9 @@
 package org.yocto.bc.remote.utils;
 
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.console.ConsolePlugin;
 import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleConstants;
 import org.eclipse.ui.console.IConsoleManager;
-import org.eclipse.ui.console.IConsoleView;
 import org.eclipse.ui.console.MessageConsole;
 
 public class ConsoleHelper {
@@ -28,15 +23,6 @@ public class ConsoleHelper {
 	}
 	
 	public static void showConsole(MessageConsole console){
-		IWorkbench wb = PlatformUI.getWorkbench();
-		IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
-		IWorkbenchPage page = win.getActivePage();
-		String id = IConsoleConstants.ID_CONSOLE_VIEW;
-		try {
-			IConsoleView view = (IConsoleView) page.showView(id);
-			view.display(console);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
+		Display.getDefault().syncExec(new ConsoleRunnable(console));
 	}
 }
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleHelperRunnable.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleHelperRunnable.java
new file mode 100644
index 0000000..36f6b70
--- /dev/null
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleHelperRunnable.java
@@ -0,0 +1,31 @@
+package org.yocto.bc.remote.utils;
+
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.IConsoleConstants;
+import org.eclipse.ui.console.IConsoleView;
+import org.eclipse.ui.console.MessageConsole;
+
+public class ConsoleHelperRunnable implements Runnable {
+	MessageConsole console;
+	
+	ConsoleHelperRunnable(MessageConsole console){
+		this.console = console;
+	}
+	@Override
+	public void run() {
+		IWorkbench wb = PlatformUI.getWorkbench();
+		IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
+		IWorkbenchPage page = win.getActivePage();
+		String id = IConsoleConstants.ID_CONSOLE_VIEW;
+		try {
+			IConsoleView view = (IConsoleView) page.showView(id);
+			view.display(console);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleRunnable.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleRunnable.java
new file mode 100644
index 0000000..b665fed
--- /dev/null
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ConsoleRunnable.java
@@ -0,0 +1,37 @@
+package org.yocto.bc.remote.utils;
+
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.IConsoleConstants;
+import org.eclipse.ui.console.IConsoleView;
+import org.eclipse.ui.console.MessageConsole;
+
+public class ConsoleRunnable implements Runnable{
+	MessageConsole console;
+	ConsoleRunnable (MessageConsole console){
+		this.console = console;
+	}
+	@Override
+	public void run() {
+		IWorkbench wb = PlatformUI.getWorkbench();
+		if (wb == null)
+			return;
+		IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
+		if (win == null)
+			return;
+		IWorkbenchPage page = win.getActivePage();
+		if (page == null)
+			return;
+		String id = IConsoleConstants.ID_CONSOLE_VIEW;
+		try {
+			IConsoleView view = (IConsoleView) page.showView(id);
+			if (view == null)
+				return;
+			view.display(console);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
\ No newline at end of file
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 18e216f..430dc6d 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
@@ -34,7 +34,6 @@ import org.eclipse.rse.services.IService;
 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.HostShellProcessAdapter;
 import org.eclipse.rse.services.shells.IHostShell;
 import org.eclipse.rse.subsystems.files.core.model.RemoteFileUtility;
 import org.eclipse.rse.subsystems.files.core.servicesubsystem.FileServiceSubSystem;
@@ -46,6 +45,7 @@ import org.yocto.bc.ui.Activator;
 import org.yocto.bc.ui.wizards.install.Messages;
 
 public class RemoteHelper {
+	public static final int TOTALWORKLOAD = 100;
 	private static Map<IHost, RemoteMachine> machines;
 	
 	public static RemoteMachine getRemoteMachine(IHost connection){
@@ -68,7 +68,7 @@ public class RemoteHelper {
 		return getRemoteMachine(connection).getCmdHandler();
 	}
 
-	public static HostShellProcessAdapter getHostShellProcessAdapter(IHost connection) {
+	public static YoctoHostShellProcessAdapter getHostShellProcessAdapter(IHost connection) {
 		return getRemoteMachine(connection).getHostShellProcessAdapter();
 	}
 	
@@ -270,24 +270,34 @@ public class RemoteHelper {
 		return null;
 	}
 	
-	public static void runCommandRemote(IHost connection, YoctoCommand cmd, IProgressMonitor monitor, boolean waitForOutput) throws Exception {
+	public static boolean runCommandRemote(IHost connection, YoctoCommand cmd, IProgressMonitor monitor) throws Exception {
 		String remoteCommand = cmd.getCommand() + " " + cmd.getArguments();
-		
+		boolean hasErrors = false;
 		try {
 			if (!cmd.getInitialDirectory().isEmpty()) {
-				writeToShell(connection, "cd " + cmd.getInitialDirectory(), waitForOutput);
+				hasErrors = writeToShell(connection, "cd " + cmd.getInitialDirectory(), monitor);
 			}
-			writeToShell(connection, remoteCommand, waitForOutput);
+			if (!hasErrors)
+				return writeToShell(connection, remoteCommand, monitor);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
+		return hasErrors;
 	}
 	
-	public static void writeToShell(IHost connection, String remoteCommand, boolean waitForOutput){
-		YoctoHostShellProcessAdapter hostShellProcessAdapter = ((YoctoHostShellProcessAdapter)getHostShellProcessAdapter(connection));
-		hostShellProcessAdapter.setWaitForOutput(waitForOutput);
-		hostShellProcessAdapter.setLastCommand(remoteCommand);
+	public static boolean writeToShell(IHost connection, String remoteCommand, IProgressMonitor monitor){
+		YoctoHostShellProcessAdapter hostShellProcessAdapter = getHostShellProcessAdapter(connection);
+		hostShellProcessAdapter.setMonitor(monitor);
 		getHostShell(connection).writeToShell(remoteCommand);
+		
+		try {
+			while (!hostShellProcessAdapter.isFinished() && hostShellProcessAdapter.isAlive()) {
+				Thread.sleep(2);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return hostShellProcessAdapter.hasErrors();
 	}
 	
 	public static void runBatchRemote(IHost connection, List<YoctoCommand> cmds, IProgressMonitor monitor, boolean waitForOutput) throws CoreException {
@@ -298,9 +308,9 @@ public class RemoteHelper {
 			for (YoctoCommand cmd : cmds) {
 				remoteCommand = cmd.getCommand() + " " + cmd.getArguments();
 				if (!cmd.getInitialDirectory().isEmpty()) {
-					writeToShell(connection, "cd " + cmd.getInitialDirectory(), waitForOutput);
+					writeToShell(connection, "cd " + cmd.getInitialDirectory(), monitor);
 				}
-				writeToShell(connection, remoteCommand, waitForOutput);
+				writeToShell(connection, remoteCommand, monitor);
 			}
 		} catch (Exception e1) {
 			e1.printStackTrace();
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 40e2c7e..a953ef7 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
@@ -12,7 +12,6 @@ import org.eclipse.rse.core.model.IHost;
 import org.eclipse.rse.core.subsystems.ISubSystem;
 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;
@@ -27,7 +26,7 @@ public class RemoteMachine {
 	private MessageConsole console;
 	private CommandResponseHandler cmdHandler;
 	private IHostShell hostShell;
-	private HostShellProcessAdapter hostShellProcessAdapter;
+	private YoctoHostShellProcessAdapter hostShellProcessAdapter;
 	private IShellService shellService;
 	private ProcessStreamBuffer processBuffer;
 	private IHost connection;
@@ -61,7 +60,6 @@ public class RemoteMachine {
 		try {
 			if (hostShell == null) {
 				hostShell = getShellService(new NullProgressMonitor()).launchShell("", new String[]{}, new NullProgressMonitor());
-				getHostShellProcessAdapter();
 			}
 		} catch (SystemMessageException e) {
 			e.printStackTrace();
@@ -71,7 +69,7 @@ public class RemoteMachine {
 		return hostShell;
 	}
 	
-	public HostShellProcessAdapter getHostShellProcessAdapter() {
+	public YoctoHostShellProcessAdapter getHostShellProcessAdapter() {
 		try {
 			if (hostShellProcessAdapter == null)
 				hostShellProcessAdapter = new YoctoHostShellProcessAdapter(getHostShell(), getProcessBuffer(), getCmdHandler());
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
index 198d6a1..a772dc4 100644
--- 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
@@ -1,65 +1,113 @@
 package org.yocto.bc.remote.utils;
 
 import java.io.IOException;
-import java.util.concurrent.Semaphore;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.rse.services.shells.AbstractHostShellOutputReader;
 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 String commandPrompt = null;
-	private static final String ROOT = "root";
-	private static final String PROMPT_USER_CH = "$";
-	private static final String PROMPT_ROOT_CH = "#";
-	
 	private ProcessStreamBuffer processStreamBuffer;
 	private CommandResponseHandler commandResponseHandler;
-	private Semaphore sem;
-	private String lastCommand;
-	private boolean waitForOutput; 
-	private String endChar = null;
+	private boolean isFinished;
+	private ICalculatePercentage calculator;
+	private int reportedWorkload;
+	private IProgressMonitor monitor;
+	private boolean isAlive;
 	
-	public String getLastCommand() {
-		return lastCommand;
+	public IProgressMonitor getMonitor() {
+		return monitor;
 	}
 
-	public void setLastCommand(String lastCommand) {
-		if (waitForOutput) {
-			try {
-				// there are still some processed 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);
-				sem.acquire();
-			} catch (InterruptedException e) {
-				e.printStackTrace();
+	public void setMonitor(IProgressMonitor monitor) {
+		this.monitor = monitor;
+	}
+
+	private interface ICalculatePercentage {
+		public float calWorkloadDone(String info) throws IllegalArgumentException;
+	}
+	
+	private class GitCalculatePercentage implements ICalculatePercentage {
+		final Pattern pattern = Pattern.compile("^Receiving objects:\\s*(\\d+)%.*");
+		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();
 			}
 		}
-		this.lastCommand = lastCommand.trim();
 	}
-
+	
 	public YoctoHostShellProcessAdapter(IHostShell hostShell, ProcessStreamBuffer processStreamBuffer, CommandResponseHandler commandResponseHandler) throws IOException {
 		super(hostShell);
 		this.processStreamBuffer = processStreamBuffer;
 		this.commandResponseHandler = commandResponseHandler;
-		this.sem = new Semaphore(1);
-		this.lastCommand = "";
+		this.calculator = new GitCalculatePercentage();
 	}
 
+	private void updateMonitor(final int work){
+//		Display.getDefault().syncExec(new Runnable() {
+//			
+//			@Override
+//			public void run() {
+//				monitor.worked(work);
+//			}
+//		});
+	}
+	
+	private void doneMonitor(){
+//		Display.getCurrent().syncExec(new Runnable() {
+//			
+//			@Override
+//			public void run() {
+//				monitor.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;
 				}
-				setCommandPrompt(value);
 				System.out.println(value);
 				this.processStreamBuffer.addErrorLine(value);
 				this.commandResponseHandler.response(value, false);
@@ -70,41 +118,31 @@ public class YoctoHostShellProcessAdapter extends  HostShellProcessAdapter{
 				if (value.isEmpty()) {
 					continue;
 				}
-				setCommandPrompt(value);
-				if (value.startsWith(commandPrompt) &&  value.endsWith(endChar) && 
-						!value.endsWith(lastCommand) && processStreamBuffer.getLastOutputLineContaining(lastCommand) != null && 
-						waitForOutput) {
-					sem.release();
-				}
 				
+				reportProgress(value);
 				System.out.println(value);
 				this.processStreamBuffer.addOutputLine(value);
 				this.commandResponseHandler.response(value, false);
 			}
 		}
-//		super.shellOutputChanged(event);
+
+		AbstractHostShellOutputReader absReader = (AbstractHostShellOutputReader)reader;
+		isAlive = absReader.isAlive();
+		isFinished = absReader.isFinished();
 	}
 
-	private void setCommandPrompt(String value) {
-		if (commandPrompt == null) {
-			if (value.startsWith(ROOT) && value.indexOf(PROMPT_ROOT_CH) != -1) {
-				int end = value.indexOf(PROMPT_ROOT_CH);
-				commandPrompt = value.substring(0, end);
-				endChar = PROMPT_ROOT_CH;
-			} else if (value.indexOf(PROMPT_USER_CH) != -1) {
-				int end = value.indexOf(PROMPT_USER_CH);
-				commandPrompt = value.substring(0, end);
-				endChar = PROMPT_USER_CH;
-			}
-				
-		}
+	public boolean isFinished() {
+		return isFinished;
+	}
+	public boolean hasErrors(){
+		return this.processStreamBuffer.errorLines.size() != 0;
 	}
 
-	public boolean isWaitForOutput() {
-		return waitForOutput;
+	public boolean isAlive() {
+		return isAlive;
 	}
 
-	public void setWaitForOutput(boolean waitForOutput) {
-		this.waitForOutput = waitForOutput;
+	public void setAlive(boolean isAlive) {
+		this.isAlive = isAlive;
 	}
 }
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 f820e21..73b21f5 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
@@ -205,7 +205,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 temp", element.getMetaDir() + "/temp", ""), monitor, true);
+					RemoteHelper.runCommandRemote(connection, new YoctoCommand("rm -rf temp", 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 cea0724..f45158f 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
@@ -352,11 +352,11 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 		
 		String md5Cmd = "md5sum " + getSrcFileName(true); 
 		YoctoCommand md5YCmd = new YoctoCommand(md5Cmd, tempFolderPath, "");
-		RemoteHelper.runCommandRemote(connection, md5YCmd, monitor, true);
+		RemoteHelper.runCommandRemote(connection, md5YCmd, monitor);
 		
 		String sha256Cmd = "sha256sum " + getSrcFileName(true); 
 		YoctoCommand sha256YCmd = new YoctoCommand(sha256Cmd, tempFolderPath, "");
-		RemoteHelper.runCommandRemote(connection, sha256YCmd, monitor, true);
+		RemoteHelper.runCommandRemote(connection, sha256YCmd, monitor);
 		
 		URI extractDir = extractPackage(srcURI, monitor);
 		YoctoCommand licenseChecksumCmd = populateLicenseFileChecksum(extractDir, monitor);
@@ -388,7 +388,7 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 				tarCmd += "-xvf ";
 			}
 			
-			RemoteHelper.runCommandRemote(connection, new YoctoCommand(tarCmd + path, tempFolderPath, ""), monitor, true);
+			RemoteHelper.runCommandRemote(connection, new YoctoCommand(tarCmd + path, tempFolderPath, ""), monitor);
 			
 			return RemoteHelper.createNewURI(metaDirLoc, TEMP_FOLDER_NAME + "/" + getSrcFileName(false));
 			
@@ -427,7 +427,7 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 		
 		try {
 			YoctoCommand catCmd = new YoctoCommand("md5sum " + COPYING_FILE, extractDir.getPath(), "");
-			RemoteHelper.runCommandRemote(connection, catCmd, monitor, true);
+			RemoteHelper.runCommandRemote(connection, catCmd, monitor);
 			return catCmd;
 		} catch (Exception e) {
 			throw new RuntimeException("Unable to process file for MD5 calculation", e);
@@ -495,7 +495,7 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
 		HashMap<String, String> mirrorMap = new HashMap<String, String>();
 		
 		YoctoCommand cmd = new YoctoCommand("cat " + MIRRORS_FILE, getMetaFolderPath() + CLASSES_FOLDER, "");
-		RemoteHelper.runCommandRemote(connection, cmd, monitor, true);
+		RemoteHelper.runCommandRemote(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 2401664..dd2074c 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
@@ -1,12 +1,9 @@
 package org.yocto.bc.ui.wizards.install;
 
-import java.io.File;
 import java.lang.reflect.InvocationTargetException;
 import java.net.URI;
 import java.util.Hashtable;
 import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -21,7 +18,6 @@ import org.eclipse.rse.core.model.IHost;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchWizard;
 import org.eclipse.ui.console.MessageConsole;
-import org.yocto.bc.bitbake.ICommandResponseHandler;
 import org.yocto.bc.remote.utils.CommandResponseHandler;
 import org.yocto.bc.remote.utils.ConsoleWriter;
 import org.yocto.bc.remote.utils.RemoteHelper;
@@ -118,23 +114,14 @@ public class InstallWizard extends FiniteStateWizard implements IWorkbenchWizard
 				
 			if (((Boolean)options.get(GIT_CLONE)).booleanValue()) {
 				String[] cmd = {"/usr/bin/git clone --progress", "git://git.yoctoproject.org/poky.git", uri.getPath()};
-				final Pattern pattern = Pattern.compile("^Receiving objects:\\s*(\\d+)%.*");
-				LongtimeRunningTask runningTask = new LongtimeRunningTask("Checking out Yocto git repository", cmd, null, null,
+				LongtimeRunningTask runningTask = new LongtimeRunningTask("Checking out Yocto git repository", cmd, 
 						((IRemoteConnection)model.get(InstallWizard.SELECTED_CONNECTION)), 
-						((IRemoteServices)model.get(InstallWizard.SELECTED_REMOTE_SERVICE)),
-					new ICalculatePercentage() {
-						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();
-							}
-						}
-					}
-				);
-				this.getContainer().run(true,true, runningTask);
+						((IRemoteServices)model.get(InstallWizard.SELECTED_REMOTE_SERVICE)));
+				this.getContainer().run(false, false, runningTask);
+//				while (!runningTask.isFinished)
+//					Thread.sleep(2);
 			}
+			
 			CommandResponseHandler cmdHandler = RemoteHelper.getCommandHandler(RemoteHelper.getRemoteConnectionByName(((IRemoteConnection)model.get(InstallWizard.SELECTED_CONNECTION)).getName()));
 			if (!cmdHandler.hasError()) {
 				String initPath = "";
@@ -177,62 +164,27 @@ public class InstallWizard extends FiniteStateWizard implements IWorkbenchWizard
 	public void init(IWorkbench workbench, IStructuredSelection selection) {
 	}
 
-	private interface ICalculatePercentage {
-		public float calWorkloadDone(String info) throws IllegalArgumentException;
-	}
-
 	private class LongtimeRunningTask implements IRunnableWithProgress {
 		static public final int TOTALWORKLOAD = 100;
 		
 		private String []cmdArray;
-		private Process process;
 		private String taskName;
-		private int reported_workload;
 		private IRemoteConnection connection;
 		private IRemoteServices remoteServices;
 		
-		ICalculatePercentage cal;
-
 		public LongtimeRunningTask(String taskName, 
-				String []cmdArray, String []envp, File dir, 
-				IRemoteConnection connection, IRemoteServices remoteServices,
-				ICalculatePercentage calculator) {
+				String []cmdArray,
+				IRemoteConnection connection, IRemoteServices remoteServices) {
 			this.taskName = taskName;
 			this.cmdArray = cmdArray;
-			this.process = null;
-			this.cal = calculator;
 			this.connection = connection;
-//			this.handler = RemoteHelper.getCommandHandler(RemoteHelper.getRemoteConnectionByName(connection.getName()));
 			this.remoteServices = remoteServices;
 		}
 
-//		private void reportProgress(IProgressMonitor monitor,String info) {
-//			if(cal == null) {
-//				monitor.worked(1);
-//			}else {
-//				float percentage;
-//				try {
-//					percentage=cal.calWorkloadDone(info);
-//				} catch (IllegalArgumentException e) {
-//					//can't get percentage
-//					return;
-//				}
-//				int delta=(int) (TOTALWORKLOAD * percentage - reported_workload);
-//				if( delta > 0 ) {
-//					monitor.worked(delta);
-//					reported_workload += delta;
-//				}
-//			}
-//		}
-
 		synchronized public void run(IProgressMonitor monitor) 
 				throws InvocationTargetException, InterruptedException {
-
-//			boolean cancel = false;
-			reported_workload = 0;
-
+			boolean cancel = false;
 			try {
-				
 				monitor.beginTask(taskName, TOTALWORKLOAD);
 				
 				if (!connection.isOpen()) {
@@ -251,18 +203,24 @@ public class InstallWizard extends FiniteStateWizard implements IWorkbenchWizard
 				for (int i = 1; i < cmdArray.length; i++)
 					args += cmdArray[i] + " ";
 				try {
-					RemoteHelper.runCommandRemote(RemoteHelper.getRemoteConnectionByName(connection.getName()), new YoctoCommand(cmdArray[0], "", args), monitor, true);
-					RemoteHelper.runCommandRemote(RemoteHelper.getRemoteConnectionByName(connection.getName()), new YoctoCommand("pwd", "", ""), monitor, true);
+					while (!cancel) {
+	                    if(monitor.isCanceled()) {
+	                            cancel=true;
+	                            throw new InterruptedException("User Cancelled");
+	                    }
+	                    boolean hasErrors = RemoteHelper.runCommandRemote(RemoteHelper.getRemoteConnectionByName(connection.getName()), new YoctoCommand(cmdArray[0], "", args), monitor);
+	                    if (hasErrors)
+	                    	break;
+	                    
+	                    Thread.sleep(5000);
+					}
 				} catch (Exception e) {
 					e.printStackTrace();
+				} finally {
+					monitor.done();
 				}
 			} catch (Exception e) {
 				e.printStackTrace();
-			} finally {
-				monitor.done();
-				if (process != null ) {
-					process.destroy();
-				}
 			}
 		}
 	}
-- 
1.7.9.5




More information about the yocto mailing list