137538 mirror command mirrors nothing if one part missing
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/Utilities.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/Utilities.java
index d429916..0649c4a 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/core/Utilities.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/Utilities.java
@@ -220,7 +220,14 @@
 			}
 			status = new Status(IStatus.ERROR, id, code, completeString.toString(), e);
 		}
-		return new CoreException(status); 
+		CoreException ce = new CoreException(status);
+		if ( e instanceof CoreException) {
+			ce.initCause(e.getCause());
+		} else {
+			ce.initCause(e);
+		}
+		e.setStackTrace(e.getStackTrace());
+		return ce; 
 	}
 
 	/**
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/mirror/MirrorCommand.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/mirror/MirrorCommand.java
index d3dc35e..d760e0f 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/mirror/MirrorCommand.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/mirror/MirrorCommand.java
@@ -10,16 +10,28 @@
  *******************************************************************************/
 package org.eclipse.update.internal.mirror;
 
-import java.io.*;
-import java.net.*;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.standalone.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.PluginVersionIdentifier;
+import org.eclipse.update.core.ISite;
+import org.eclipse.update.core.ISiteFeatureReference;
+import org.eclipse.update.core.JarContentReference;
+import org.eclipse.update.core.SiteFeatureReference;
+import org.eclipse.update.core.SiteFeatureReferenceModel;
+import org.eclipse.update.core.SiteManager;
+import org.eclipse.update.core.Utilities;
+import org.eclipse.update.core.VersionedIdentifier;
+import org.eclipse.update.core.model.InvalidSiteTypeException;
+import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.standalone.ScriptedCommand;
+import org.eclipse.update.standalone.StandaloneUpdateApplication;
 
 /**
  * Mirrors a remote site locally.
@@ -31,6 +43,7 @@
 	private String fromSiteUrl;
 	private String toSiteDir;
 	private String mirrorURL;
+	private boolean ignoreNonPresentPlugins = false;
 	private MirrorSite mirrorSite;
 
 	public MirrorCommand(
@@ -38,12 +51,14 @@
 		String featureVersion,
 		String fromSiteUrl,
 		String toSiteDir,
-		String mirrorUrl) {
+		String mirrorUrl, 
+		String ignoreNonPresentPlugins) {
 		this.featureId = featureId;
 		this.featureVersion = featureVersion;
 		this.fromSiteUrl = fromSiteUrl;
 		this.toSiteDir = toSiteDir;
 		this.mirrorURL = mirrorUrl;
+		this.ignoreNonPresentPlugins = (ignoreNonPresentPlugins != null) && (ignoreNonPresentPlugins.equals("true"));
 	}
 
 	/**
@@ -124,6 +139,7 @@
 				try {
 					mirrorSite =
 						(MirrorSite) factory.createSite(new File(toSiteDir));
+					mirrorSite.setIgnoreNonPresentPlugins(ignoreNonPresentPlugins);
 				} catch (InvalidSiteTypeException iste) {
 				}
 				System.out.println("  Done."); //$NON-NLS-1$
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/mirror/MirrorSite.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/mirror/MirrorSite.java
index 3d4adba..83f3b2a 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/mirror/MirrorSite.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/mirror/MirrorSite.java
@@ -10,19 +10,45 @@
  *******************************************************************************/
 package org.eclipse.update.internal.mirror;
 
-import java.io.*;
-import java.net.*;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.standalone.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.update.core.ContentReference;
+import org.eclipse.update.core.ICategory;
+import org.eclipse.update.core.IFeature;
+import org.eclipse.update.core.IFeatureContentProvider;
+import org.eclipse.update.core.IFeatureReference;
+import org.eclipse.update.core.INonPluginEntry;
+import org.eclipse.update.core.IPluginEntry;
+import org.eclipse.update.core.ISite;
+import org.eclipse.update.core.ISiteFeatureReference;
+import org.eclipse.update.core.IURLEntry;
+import org.eclipse.update.core.IVerificationListener;
+import org.eclipse.update.core.Site;
+import org.eclipse.update.core.SiteFeatureReferenceModel;
+import org.eclipse.update.core.Utilities;
+import org.eclipse.update.core.VersionedIdentifier;
+import org.eclipse.update.core.model.CategoryModel;
+import org.eclipse.update.core.model.SiteModelFactory;
+import org.eclipse.update.core.model.URLEntryModel;
+import org.eclipse.update.internal.core.FatalIOException;
+import org.eclipse.update.internal.core.ISiteContentConsumer;
+import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.internal.core.UpdateManagerUtils;
+import org.eclipse.update.standalone.StandaloneUpdateApplication;
 
 /**
  * Local mirror site.  Read/Write
@@ -35,6 +61,7 @@
 	 */
 	private Collection downloadedPluginEntries = new ArrayList();
 	private Collection downloadedFeatureReferenceModels = new ArrayList();
+	private boolean ignoreNonPresentPlugins;
 	public MirrorSite(SiteModelFactory factory) {
 		this.factory = factory;
 	}
@@ -216,7 +243,15 @@
 				+ " ..."); //$NON-NLS-1$
 		// download plugin archives
 		for (int i = 0; i < pluginsToInstall.length; i++) {
-			provider.getPluginEntryArchiveReferences(pluginsToInstall[i], null);
+			try {
+				provider.getPluginEntryArchiveReferences(pluginsToInstall[i], null);
+			} catch (CoreException ce) {
+				if ( ignoreNonPresentPlugins && (ce.getCause() != null) && (ce.getCause() instanceof FatalIOException) ) {
+					System.out.println("Could not mirror plug-in " + pluginsToInstall[i].getVersionedIdentifier().toString() + ". It does not exist on the given site");
+				} else {
+					throw ce;
+				}
+			}
 		}
 
 		System.out.println(
@@ -253,12 +288,18 @@
 				+ " ..."); //$NON-NLS-1$
 		// store plugins' archives
 		for (int i = 0; i < pluginsToInstall.length; i++) {
-			ContentReference[] references =
-				provider.getPluginEntryArchiveReferences(
-					pluginsToInstall[i],
-					null);
-			storePluginArchive(references[0]);
-			addDownloadedPluginEntry(pluginsToInstall[i]);
+			try {
+				ContentReference[] references = provider.getPluginEntryArchiveReferences( pluginsToInstall[i], null);
+				storePluginArchive(references[0]);
+				addDownloadedPluginEntry(pluginsToInstall[i]);
+			} catch (CoreException ce) {
+				if ( ignoreNonPresentPlugins && (ce.getCause() != null) && (ce.getCause() instanceof FatalIOException) ) {
+					System.out.println("Could not write plug-in " + pluginsToInstall[i].getVersionedIdentifier().toString() + ". It does not exist on the given site");
+				} else {
+					System.out.println("ignoreNonPresentPlugins:"+ignoreNonPresentPlugins);
+					throw ce;
+				}
+			}
 		}
 
 		System.out.println(
@@ -752,4 +793,9 @@
 			writer.println(" />"); //$NON-NLS-1$
 		}
 	}
+
+	public void setIgnoreNonPresentPlugins(boolean ignoreNonPresentPlugins) {
+		this.ignoreNonPresentPlugins = ignoreNonPresentPlugins;
+		
+	}
 }
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/standalone/CmdLineArgs.java b/update/org.eclipse.update.core/src/org/eclipse/update/standalone/CmdLineArgs.java
index 45e60f5..8b099ac 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/standalone/CmdLineArgs.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/standalone/CmdLineArgs.java
@@ -10,12 +10,14 @@
  *******************************************************************************/
 package org.eclipse.update.standalone;
 
-import java.net.*;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.HashMap;
 
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.mirror.*;
+import org.eclipse.update.core.Utilities;
+import org.eclipse.update.internal.core.Messages;
+import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.internal.mirror.MirrorCommand;
 
 /**
  * This class parses the command line arguments for update standalone commands
@@ -47,9 +49,11 @@
 					return;
 				}
 			}
+
 			if (isValidParam(args[i])) {
 				options.put(args[i], args[i + 1]);
 				i++;
+
 			}
 			// -to should specify a directory
 			// if -to specifies file URL, change it to a directory
@@ -71,7 +75,8 @@
 			|| param.equals("-from") //$NON-NLS-1$
 			|| param.equals("-featureId") //$NON-NLS-1$
 			|| param.equals("-verifyOnly") //$NON-NLS-1$
-			|| param.equals("-mirrorURL"); //$NON-NLS-1$
+			|| param.equals("-mirrorURL") //$NON-NLS-1$
+		    || param.equals("-ignoreMissingPlugins"); //$NON-NLS-1$
 	}
 
 	private boolean isValidCommand(String cmd) {
@@ -127,7 +132,8 @@
 					(String) options.get("-version"), //$NON-NLS-1$
 					(String) options.get("-from"), //$NON-NLS-1$
 					(String) options.get("-to"), //$NON-NLS-1$
-					(String) options.get("-mirrorURL")); //$NON-NLS-1$
+					(String) options.get("-mirrorURL"), //$NON-NLS-1$
+					(String) options.get("-ignoreMissingPlugins")); //$NON-NLS-1$
 			else if (cmd.equals("uninstall")) //$NON-NLS-1$
 				return new UninstallCommand(
 					(String) options.get("-featureId"), //$NON-NLS-1$