diff options
author | Thomas Leberbauer <slosd@freedig.org> | 2012-08-02 13:42:46 +0200 |
---|---|---|
committer | Bertrand Lorentz <bertrand.lorentz@gmail.com> | 2012-08-04 18:37:08 +0200 |
commit | a0b12ea8d42e9ae496e3d9e88042790bb72c3fa6 (patch) | |
tree | 8efdddda35c67a79f30994da2f5e30afed9117f7 | |
parent | 2572e19d2d5310263c450f4717ee58d2d746b4ea (diff) |
FolderSync: Add option to create symbolic links instead of copying files
Signed-off-by: Bertrand Lorentz <bertrand.lorentz@gmail.com>
-rw-r--r-- | src/FolderSync/Banshee.FolderSync/FolderSyncController.cs | 29 | ||||
-rw-r--r-- | src/FolderSync/Banshee.FolderSync/FolderSyncView.cs | 7 |
2 files changed, 32 insertions, 4 deletions
diff --git a/src/FolderSync/Banshee.FolderSync/FolderSyncController.cs b/src/FolderSync/Banshee.FolderSync/FolderSyncController.cs index 7850343..9673403 100644 --- a/src/FolderSync/Banshee.FolderSync/FolderSyncController.cs +++ b/src/FolderSync/Banshee.FolderSync/FolderSyncController.cs @@ -26,6 +26,7 @@ using System.Text; using System.Threading; using Mono.Addins; +using Mono.Unix; using Hyena; using Hyena.Data.Sqlite; @@ -178,13 +179,35 @@ namespace Banshee.FolderSync // copy file to selected folder try { - if (options.OverwriteExisting || !Banshee.IO.File.Exists (destUri)) { - Banshee.IO.File.Copy (track.Uri, destUri, true); + var destExists = Banshee.IO.File.Exists (destUri); + + if (options.OverwriteExisting || !destExists) { + if (options.CreateSymLinks) { + var trackFilePath = SafeUri.UriToFilename (track.Uri); + var destFilePath = SafeUri.UriToFilename (destUri); + + if (track.Uri.IsLocalPath) { + var target = new UnixFileInfo (trackFilePath); + + // symbolic links need manual deletion, + // otherwise an exception is thrown in CreateSymbolicLink() + if (destExists) { + var dest = new UnixFileInfo (destFilePath); + dest.Delete (); + } + + target.CreateSymbolicLink (destFilePath); + } else { + Hyena.Log.ErrorFormat ("Cannot create symlink to remote path {0} in {1}, skipping", track.Uri, destFilePath); + } + } else { + Banshee.IO.File.Copy (track.Uri, destUri, true); + } Hyena.Log.DebugFormat ("Copying {0} to {1}", track.Uri, destUri); } else Hyena.Log.Debug ("Not overwriting existing file {0}", destUri); } catch { - Hyena.Log.ErrorFormat ("error copying file {0} to {1}, skipping", track.Uri, destUri); + Hyena.Log.ErrorFormat ("Error copying file {0} to {1}, skipping", track.Uri, destUri); } // increment the progressbar diff --git a/src/FolderSync/Banshee.FolderSync/FolderSyncView.cs b/src/FolderSync/Banshee.FolderSync/FolderSyncView.cs index 4d32012..a42c367 100644 --- a/src/FolderSync/Banshee.FolderSync/FolderSyncView.cs +++ b/src/FolderSync/Banshee.FolderSync/FolderSyncView.cs @@ -39,6 +39,7 @@ namespace Banshee.FolderSync public bool CreateM3u; public uint SubfolderDepth; public string TargetFolder; + public bool CreateSymLinks; public List<Playlist> SelectedPlaylists; } @@ -52,7 +53,8 @@ namespace Banshee.FolderSync OverwriteExisting = overwrite_existing.Active, CreateM3u = create_m3u.Active, SubfolderDepth = 0, - TargetFolder = target_chooser.Uri + TargetFolder = target_chooser.Uri, + CreateSymLinks = create_symlinks.Active }; // if activated, we create subfolder until given depth if (create_subfolders.Active) @@ -93,6 +95,8 @@ namespace Banshee.FolderSync new Gtk.CheckButton (AddinManager.CurrentLocalizer.GetString ("Create M3U Playlist")); Gtk.CheckButton overwrite_existing = new Gtk.CheckButton (AddinManager.CurrentLocalizer.GetString ("Overwrite existing files")); + Gtk.CheckButton create_symlinks = + new Gtk.CheckButton (AddinManager.CurrentLocalizer.GetString ("Create as symbolic link")); Gtk.CheckButton create_subfolders = new Gtk.CheckButton (AddinManager.CurrentLocalizer.GetString ("Create subfolders")); Gtk.SpinButton subfolder_depth = new Gtk.SpinButton (0f, 10f, 1f) { @@ -147,6 +151,7 @@ namespace Banshee.FolderSync frame_alignment.Add (vbox_checkbox); vbox_checkbox.PackStart (create_m3u, true, true, 1); vbox_checkbox.PackStart (overwrite_existing, true, true, 1); + vbox_checkbox.PackStart (create_symlinks, true, true, 1); vbox_checkbox.PackStart (hbox_subfolder, true, true, 1); hbox_subfolder.PackStart (create_subfolders, true, true, 1); hbox_subfolder.PackStart ( |