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 CopyFrom (FileCopyConfiguration other) { base.CopyFrom (other); LocalFileCopyConfiguration conf = other as LocalFileCopyConfiguration; if (conf != null) targetDirectory = conf.targetDirectory; }
void LoadConfiguration(FileCopyConfiguration config) { if (editorBox.Child != null) { editorBox.Remove(editorBox.Child); } IFileCopyConfigurationEditor editor = null; if (config != null) { editor = GetEditor(config); } if (editor != null) { editorBox.Add(editor.CreateEditor(config)); } ShowAll(); currentConfig = config; if (ConfigurationChanged != null) { ConfigurationChanged(this, EventArgs.Empty); } }
public override void MountTempDirectory(ProgressMonitor monitor, FileCopyConfiguration copyConfig, string tempPath) { SshFuseFileCopyConfiguration config = (SshFuseFileCopyConfiguration)copyConfig; string fuseArgs = string.Format("{0} {1} {2}", config.TargetDirectory, tempPath, config.ExtraMountArguments); RunFuseCommand(monitor, "sshfs", fuseArgs); }
public override void CopyFrom (FileCopyConfiguration other) { base.CopyFrom (other); BaseFuseFileCopyConfiguration conf = other as BaseFuseFileCopyConfiguration; if (conf != null) extraMountArguments= conf.extraMountArguments; }
public override void CopyFrom(FileCopyConfiguration other) { base.CopyFrom(other); BaseFuseFileCopyConfiguration conf = other as BaseFuseFileCopyConfiguration; if (conf != null) { extraMountArguments = conf.extraMountArguments; } }
public override void CopyFrom(FileCopyConfiguration other) { base.CopyFrom(other); LocalFileCopyConfiguration conf = other as LocalFileCopyConfiguration; if (conf != null) { targetDirectory = conf.targetDirectory; } }
static IFileCopyConfigurationEditor GetEditor(FileCopyConfiguration config) { foreach (IFileCopyConfigurationEditor editor in AddinManager.GetExtensionObjects("/MonoDevelop/Deployment/FileCopyConfigurationEditors", false)) { if (editor.CanEdit(config)) { return(editor); } } return(null); }
public void Load(WebDeployTarget target) { nameEntry.Text = target.Name; FileCopyConfiguration fConfig = null; try { fConfig = target.FileCopier == null? null : target.FileCopier.Clone(); } catch (InvalidOperationException) { // if the handler can't be found } selector.Configuration = fConfig; }
protected virtual void OnComboHandlersChanged(object sender, System.EventArgs e) { if (loading) { return; } if (comboHandlers.Active < 0 || comboHandlers.Active >= handlers.Length) { LoadConfiguration(null); return; } FileCopyConfiguration config = handlers [comboHandlers.Active].CreateConfiguration(); LoadConfiguration(config); }
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 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 Gtk.Widget CreateEditor (FileCopyConfiguration config) { return new SshFuseFileCopyConfigurationEditorWidget ((SshFuseFileCopyConfiguration) config); }
public bool CanEdit (FileCopyConfiguration config) { return config != null && config.GetType () == typeof (SshFuseFileCopyConfiguration); }
public override void MountTempDirectory (FileCopyConfiguration copyConfig, string tempPath) { SshFuseFileCopyConfiguration config = (SshFuseFileCopyConfiguration) copyConfig; string fuseArgs = string.Format ("{0} {1} {2}", config.TargetDirectory, tempPath, config.ExtraMountArguments); RunFuseCommand ("sshfs", fuseArgs); }
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); }
public static bool HasEditor(FileCopyConfiguration config) { return(GetEditor(config) != null); }
public abstract void MountTempDirectory (IProgressMonitor monitor, FileCopyConfiguration copyConfig, string tempPath);
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 abstract void MountTempDirectory (FileCopyConfiguration copyConfig, string tempPath);
public abstract void MountTempDirectory(FileCopyConfiguration copyConfig, string tempPath);
public virtual void CopyFiles (IProgressMonitor monitor, IFileReplacePolicy replacePolicy, FileCopyConfiguration copyConfig, DeployFileCollection deployFiles, DeployContext context) { InternalCopyFiles (monitor, replacePolicy, copyConfig, deployFiles, context, null); }
public abstract void MountTempDirectory(IProgressMonitor monitor, FileCopyConfiguration copyConfig, string tempPath);
public bool CanEdit(FileCopyConfiguration config) { return(config != null && config.GetType() == typeof(LocalFileCopyConfiguration)); }
public Gtk.Widget CreateEditor(FileCopyConfiguration config) { return(new LocalFileCopyConfigurationEditorWidget((LocalFileCopyConfiguration)config)); }
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 Gtk.Widget CreateEditor(FileCopyConfiguration config) { return(new SshFuseFileCopyConfigurationEditorWidget((SshFuseFileCopyConfiguration)config)); }