summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Leberbauer <slosd@freedig.org>2012-08-02 13:42:46 +0200
committerBertrand Lorentz <bertrand.lorentz@gmail.com>2012-08-04 18:37:08 +0200
commita0b12ea8d42e9ae496e3d9e88042790bb72c3fa6 (patch)
tree8efdddda35c67a79f30994da2f5e30afed9117f7
parent2572e19d2d5310263c450f4717ee58d2d746b4ea (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.cs29
-rw-r--r--src/FolderSync/Banshee.FolderSync/FolderSyncView.cs7
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 (