public override void CopyFiles (IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context)
		{
			DirectoryInfo tempDir = null;
			try {
				tempDir = CreateTempDir ();
			} catch (Exception e) {
				monitor.ReportError (GettextCatalog.GetString ("Could not create temporary directory."), e);
				return;
			}
			
			try {
				MountTempDirectory (copyConfig, tempDir.FullName);
			} catch (Exception e) {
				monitor.ReportError (GettextCatalog.GetString ("Could not mount FUSE filesystem."), e);
				RemoveTempDirIfEmpty (tempDir);
				return;
			}
			
			try {
				base.InternalCopyFiles (monitor, replacePolicy, copyConfig, deployFiles, context, tempDir.FullName);
			} finally {
				try {
					//unmount the fuse directory
					RunFuseCommand ("fusermount", string.Format ("-u \"{0}\"", tempDir.FullName));
				} catch (Exception e) {
					monitor.ReportError (GettextCatalog.GetString ("Could not unmount FUSE filesystem."), e);
				}
				RemoveTempDirIfEmpty (tempDir);
			}
		}
        public override void CopyFiles(IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context)
        {
            DirectoryInfo tempDir = null;

            try {
                tempDir = CreateTempDir();
            } catch (Exception e) {
                monitor.ReportError(GettextCatalog.GetString("Could not create temporary directory."), e);
                return;
            }

            try {
                MountTempDirectory(copyConfig, tempDir.FullName);
            } catch (Exception e) {
                monitor.ReportError(GettextCatalog.GetString("Could not mount FUSE filesystem."), e);
                RemoveTempDirIfEmpty(tempDir);
                return;
            }

            try {
                base.InternalCopyFiles(monitor, replacePolicy, copyConfig, deployFiles, context, tempDir.FullName);
            } finally {
                try {
                    //unmount the fuse directory
                    RunFuseCommand("fusermount", string.Format("-u \"{0}\"", tempDir.FullName));
                } catch (Exception e) {
                    monitor.ReportError(GettextCatalog.GetString("Could not unmount FUSE filesystem."), e);
                }
                RemoveTempDirIfEmpty(tempDir);
            }
        }
        public override void CopyFiles(IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context)
        {
            DirectoryInfo tempDir = null;

            try {
                tempDir = CreateTempDir();
            } catch (Exception e) {
                monitor.ReportError(GettextCatalog.GetString("Could not create temporary directory."), e);
                return;
            }

            try {
                MountTempDirectory(monitor, copyConfig, tempDir.FullName);
            } catch (Exception e) {
                monitor.ReportError(GettextCatalog.GetString("Could not mount FUSE filesystem."), e);
                RemoveTempDirIfEmpty(tempDir);
                return;
            }

            try {
                base.InternalCopyFiles(monitor, replacePolicy, copyConfig, deployFiles, context, tempDir.FullName);
            } finally {
                //unmount the filesystem
                try {
                    string escapedDir = tempDir.FullName.Replace("\"", "\\\"");
                    string cmd, args;

                    if (Platform.IsMac)
                    {
                        cmd  = "umount";
                        args = string.Format("\"{0}\"", escapedDir);
                    }
                    else
                    {
                        cmd  = "fusermount";
                        args = string.Format("-u \"{0}\"", escapedDir);
                    }
                    RunFuseCommand(monitor, cmd, args);
                } catch (Exception e) {
                    LoggingService.LogError(GettextCatalog.GetString("Could not unmount FUSE filesystem."), e);
                    monitor.ReportError(GettextCatalog.GetString("Could not unmount FUSE filesystem."), e);
                }
                RemoveTempDirIfEmpty(tempDir);
            }
        }
		public override void CopyFiles (IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context)
		{
			DirectoryInfo tempDir = null;
			try {
				tempDir = CreateTempDir ();
			} catch (Exception e) {
				monitor.ReportError (GettextCatalog.GetString ("Could not create temporary directory."), e);
				return;
			}
			
			try {
				MountTempDirectory (monitor, copyConfig, tempDir.FullName);
			} catch (Exception e) {
				monitor.ReportError (GettextCatalog.GetString ("Could not mount FUSE filesystem."), e);
				RemoveTempDirIfEmpty (tempDir);
				return;
			}
			
			try {
				base.InternalCopyFiles (monitor, replacePolicy, copyConfig, deployFiles, context, tempDir.FullName);
			} finally {
				//unmount the filesystem
				try {
					string escapedDir = tempDir.FullName.Replace ("\"", "\\\"");
					string cmd, args;
					
					if (PropertyService.IsMac) {
						cmd = "umount";
						args = string.Format ("\"{0}\"", escapedDir);
					} else {
						cmd = "fusermount";
						args = string.Format ("-u \"{0}\"", escapedDir);
					}
					RunFuseCommand (monitor, cmd, args);
				} catch (Exception e) {
					LoggingService.LogError (GettextCatalog.GetString ("Could not unmount FUSE filesystem."), e);
					monitor.ReportError (GettextCatalog.GetString ("Could not unmount FUSE filesystem."), e);
				}
				RemoveTempDirIfEmpty (tempDir);
			}
		}
 public void CopyFiles(IProgressMonitor monitor, IFileReplacePolicy replacePolicy, DeployFileCollection files, DeployContext context)
 {
     Handler.CopyFiles(monitor, replacePolicy, this, files, context);
 }
		internal void InternalCopyFiles (IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context, string realPrefix)
		{
			string targetDirectory = ((LocalFileCopyConfiguration) copyConfig).TargetDirectory;
			
			if (string.IsNullOrEmpty (copyConfig.FriendlyLocation) || string.IsNullOrEmpty (targetDirectory))
				throw new InvalidOperationException ("Cannot deploy to unconfigured location.");
			
			List<DeployFileConf> files = new List<DeployFileConf> ();
			long totalFileSize = 0;
			
			//pre-scan: ask all copy/replace questions first so user doesn't have to wait, and get 
			foreach (DeployFile df in deployFiles) {
				if (!context.IncludeFile (df))
					continue;
				
				DeployFileConf dfc = new DeployFileConf ();
				files.Add (dfc);
				dfc.SourceFile = df.SourcePath;
				dfc.FileSize = FileSize (dfc.SourceFile);
				totalFileSize += dfc.FileSize;
				
				string relativeTarget = context.GetResolvedPath (df.TargetDirectoryID, df.RelativeTargetPath);
				if (relativeTarget == null)
					throw new InvalidOperationException (GettextCatalog.GetString ("Could not resolve target directory ID \"{0}\"", df.TargetDirectoryID));
				dfc.TargetFile = Path.Combine (targetDirectory, relativeTarget);
				
				//this is a bit hacky; it's an internal hook to the BaseFuseFileCopyHandler implementation a level up the inheritance heirarchy
				//Essentailly we are aliasing the path so that  BaseFuseFileCopyHandler can use LocalFileCopyHandler to do the local copying 
				//after the temp FUSE directory is mounted
				if (!string.IsNullOrEmpty (realPrefix)) {
					dfc.InternalTargetFile = Path.Combine (realPrefix, context.GetResolvedPath (df.TargetDirectoryID, df.RelativeTargetPath));
				} else {
					dfc.InternalTargetFile = dfc.TargetFile;
				}
				
				if (FileExists (dfc.InternalTargetFile)) {
					dfc.SourceModified = File.GetLastWriteTime (dfc.SourceFile);
					dfc.TargetModified = GetTargetModificationTime (dfc.InternalTargetFile);
					dfc.ReplaceMode = replacePolicy.GetReplaceAction (dfc.SourceFile, dfc.SourceModified, dfc.TargetFile, dfc.TargetModified);
					if (dfc.ReplaceMode == FileReplaceMode.Abort) {
						monitor.Log.WriteLine (GettextCatalog.GetString ("Deployment aborted: target file {0} already exists.", dfc.TargetFile));
						throw new OperationCanceledException ();
					}
				}
			}
			
			//PROBLEM: monitor takes ints, file sizes are longs
			//HOWEVER: longs are excessively long for a progress bar
			//SOLUTION: assume total task has a length of 1000 (longer than this is probably unnecessary for a progress bar),
			//  and set up a callback system for translating the actual long number of bytes into a portion of this
			const int progressBarLength = 1000;
			long stepSize = totalFileSize / progressBarLength;
			long carry = 0; 
			monitor.BeginTask (copyConfig.FriendlyLocation, progressBarLength);
			CopyReportCallback copyCallback = delegate (long bytes) {
				if (monitor.IsCancelRequested)
					return false;
				int steps = (int) (bytes / stepSize);
				carry += bytes % stepSize;
				if (carry > stepSize) {
					steps += 1;
					carry -= stepSize;
				}
				if (steps > 0)
					monitor.Step (steps);
				return true;
			};
			
			//now the actual copy
			foreach (DeployFileConf file in files) {
				//abort the copy if cancelling
				if (monitor.IsCancelRequested)
					break;
				
				EnsureDirectoryExists (Path.GetDirectoryName (file.InternalTargetFile));
				
				if (file.ReplaceMode != FileReplaceMode.NotSet) {
					switch (file.ReplaceMode) {
					case FileReplaceMode.Skip:
						monitor.Log.WriteLine (GettextCatalog.GetString ("Skipped {0}: file exists.", file.TargetFile));
						copyCallback (file.FileSize);
						continue; //next file
					
					case FileReplaceMode.Replace:
						monitor.Log.WriteLine (GettextCatalog.GetString ("Replaced {0}.", file.TargetFile));
						break;
					
					case FileReplaceMode.ReplaceOlder:
						if (file.SourceModified > file.TargetModified) {
							monitor.Log.WriteLine (GettextCatalog.GetString ("Replacing {0}: existing file is older.", file.TargetFile));
						} else {
							if (file.SourceModified == file.TargetModified)
								monitor.Log.WriteLine (GettextCatalog.GetString ("Skipped {0}: existing file is the same age.", file.TargetFile));
							else
								monitor.Log.WriteLine (GettextCatalog.GetString ("Skipped {0}: existing file is newer.", file.TargetFile));
							copyCallback (file.FileSize);
							continue; //next file
						}
						break;
					}
				}
				else {
					monitor.Log.WriteLine (GettextCatalog.GetString ("Deployed file {0}.", file.TargetFile));
				}
				
				CopyFile (file.SourceFile, file.InternalTargetFile, copyCallback);
			}
			
			monitor.EndTask ();
		}
		public virtual void CopyFiles (IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context)
		{
			InternalCopyFiles (monitor, replacePolicy, copyConfig, deployFiles, context, null);
		}
 internal void CopyFiles(IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection files, DeployContext context)
 {
     handler.CopyFiles(monitor, replacePolicy, copyConfig, files, context);
 }
示例#9
0
        internal void InternalCopyFiles(IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context, string realPrefix)
        {
            string targetDirectory = ((LocalFileCopyConfiguration)copyConfig).TargetDirectory;

            if (string.IsNullOrEmpty(copyConfig.FriendlyLocation) || string.IsNullOrEmpty(targetDirectory))
            {
                throw new InvalidOperationException("Cannot deploy to unconfigured location.");
            }

            List <DeployFileConf> files = new List <DeployFileConf> ();
            long totalFileSize          = 0;

            //pre-scan: ask all copy/replace questions first so user doesn't have to wait, and get
            foreach (DeployFile df in deployFiles)
            {
                if (!context.IncludeFile(df))
                {
                    continue;
                }

                DeployFileConf dfc = new DeployFileConf();
                files.Add(dfc);
                dfc.SourceFile = df.SourcePath;
                dfc.FileSize   = FileSize(dfc.SourceFile);
                totalFileSize += dfc.FileSize;

                string relativeTarget = context.GetResolvedPath(df.TargetDirectoryID, df.RelativeTargetPath);
                if (relativeTarget == null)
                {
                    throw new InvalidOperationException(GettextCatalog.GetString("Could not resolve target directory ID \"{0}\"", df.TargetDirectoryID));
                }
                dfc.TargetFile = Path.Combine(targetDirectory, relativeTarget);

                //this is a bit hacky; it's an internal hook to the BaseFuseFileCopyHandler implementation a level up the inheritance heirarchy
                //Essentailly we are aliasing the path so that  BaseFuseFileCopyHandler can use LocalFileCopyHandler to do the local copying
                //after the temp FUSE directory is mounted
                if (!string.IsNullOrEmpty(realPrefix))
                {
                    dfc.InternalTargetFile = Path.Combine(realPrefix, context.GetResolvedPath(df.TargetDirectoryID, df.RelativeTargetPath));
                }
                else
                {
                    dfc.InternalTargetFile = dfc.TargetFile;
                }

                if (FileExists(dfc.InternalTargetFile))
                {
                    dfc.SourceModified = File.GetLastWriteTime(dfc.SourceFile);
                    dfc.TargetModified = GetTargetModificationTime(dfc.InternalTargetFile);
                    dfc.ReplaceMode    = replacePolicy.GetReplaceAction(dfc.SourceFile, dfc.SourceModified, dfc.TargetFile, dfc.TargetModified);
                    if (dfc.ReplaceMode == FileReplaceMode.Abort)
                    {
                        monitor.Log.WriteLine(GettextCatalog.GetString("Deployment aborted: target file {0} already exists.", dfc.TargetFile));
                        throw new OperationCanceledException();
                    }
                }
            }

            //PROBLEM: monitor takes ints, file sizes are longs
            //HOWEVER: longs are excessively long for a progress bar
            //SOLUTION: assume total task has a length of 1000 (longer than this is probably unnecessary for a progress bar),
            //  and set up a callback system for translating the actual long number of bytes into a portion of this
            const int progressBarLength = 1000;
            long      stepSize          = totalFileSize / progressBarLength;
            long      carry             = 0;

            monitor.BeginTask(copyConfig.FriendlyLocation, progressBarLength);
            CopyReportCallback copyCallback = delegate(long bytes) {
                if (monitor.IsCancelRequested)
                {
                    return(false);
                }
                int steps = (int)(bytes / stepSize);
                carry += bytes % stepSize;
                if (carry > stepSize)
                {
                    steps += 1;
                    carry -= stepSize;
                }
                if (steps > 0)
                {
                    monitor.Step(steps);
                }
                return(true);
            };

            //now the actual copy
            foreach (DeployFileConf file in files)
            {
                //abort the copy if cancelling
                if (monitor.IsCancelRequested)
                {
                    break;
                }

                EnsureDirectoryExists(Path.GetDirectoryName(file.InternalTargetFile));

                if (file.ReplaceMode != FileReplaceMode.NotSet)
                {
                    switch (file.ReplaceMode)
                    {
                    case FileReplaceMode.Skip:
                        monitor.Log.WriteLine(GettextCatalog.GetString("Skipped {0}: file exists.", file.TargetFile));
                        copyCallback(file.FileSize);
                        continue;                         //next file

                    case FileReplaceMode.Replace:
                        monitor.Log.WriteLine(GettextCatalog.GetString("Replaced {0}.", file.TargetFile));
                        break;

                    case FileReplaceMode.ReplaceOlder:
                        if (file.SourceModified > file.TargetModified)
                        {
                            monitor.Log.WriteLine(GettextCatalog.GetString("Replacing {0}: existing file is older.", file.TargetFile));
                        }
                        else
                        {
                            if (file.SourceModified == file.TargetModified)
                            {
                                monitor.Log.WriteLine(GettextCatalog.GetString("Skipped {0}: existing file is the same age.", file.TargetFile));
                            }
                            else
                            {
                                monitor.Log.WriteLine(GettextCatalog.GetString("Skipped {0}: existing file is newer.", file.TargetFile));
                            }
                            copyCallback(file.FileSize);
                            continue;                             //next file
                        }
                        break;
                    }
                }
                else
                {
                    monitor.Log.WriteLine(GettextCatalog.GetString("Deployed file {0}.", file.TargetFile));
                }

                CopyFile(file.SourceFile, file.InternalTargetFile, copyCallback);
            }

            monitor.EndTask();
        }
示例#10
0
 public virtual void CopyFiles(IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context)
 {
     InternalCopyFiles(monitor, replacePolicy, copyConfig, deployFiles, context, null);
 }
		internal void CopyFiles (ProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection files, DeployContext context)
		{
			handler.CopyFiles (monitor, replacePolicy, copyConfig, files, context);
		}
		public void CopyFiles (ProgressMonitor monitor, IFileReplacePolicy replacePolicy, DeployFileCollection files, DeployContext context)
		{
			Handler.CopyFiles (monitor, replacePolicy, this, files, context);
		}