Bug 257739 - All pending files deleted when while renaming/moving a conflicting filename error appears
Summary: All pending files deleted when while renaming/moving a conflicting filename e...
Status: RESOLVED FIXED
Alias: None
Product: amarok
Classification: Applications
Component: Collections/Local (show other bugs)
Version: 2.4-GIT
Platform: Ubuntu Linux
: NOR major
Target Milestone: 2.4.0
Assignee: Amarok Developers
URL:
Keywords:
: 266008 (view as bug list)
Depends on:
Blocks:
 
Reported: 2010-11-23 22:30 UTC by Iñaki
Modified: 2012-08-19 16:54 UTC (History)
3 users (show)

See Also:
Latest Commit:
Version Fixed In: 2.4


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Iñaki 2010-11-23 22:30:42 UTC
Version:           2.4-GIT (using KDE 4.5.3) 
OS:                Linux

While reorganizing the collection, after starting the process, amarok deletes all files and starts copying new ones with the new naming schemes. 

If during that process something goes wrong, like some files conflict in naming, all the pending files get lost forever!

Reproducible: Always

Steps to Reproduce:
Make two files have the same title, album, track number and artis.
Try to reorganize those files with another file batch, selecting a schemes that conflicts. 
In the middle of the process, and after already amarok started deleting files, an error will appear, notifying the files are in conflict. 



Actual Results:  
Done, the pending to rename files are gone.

Expected Results:  
All the files in the same state they were before starting the process, or at least, the pending files only.

OS: Linux (x86_64) release 2.6.35-22-generic
Compiler: cc
Comment 1 Sergey Ivanov 2011-01-05 20:10:20 UTC
commit bc9e86bc350137623667baada2c4bacf256400a1
branch master
Author: Sergey Ivanov <123kash@gmail.com>
Date:   Wed Jan 5 22:08:52 2011 +0300

    Leave all pending files untouched in case of error/conflict during tracks moving.
    BUG: 257739

diff --git a/ChangeLog b/ChangeLog
index e451b12..9f529c1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,7 @@ VERSION 2.4-Beta 2
     * Fixed some broken radio stream URLs.
 
   BUGFIXES:
+    * Leave all pending files in case of error/conflict during tracks moving. (BR 257739)
     * Fix crash when moving tracks between collections. (BR 253033)
     * Fixed issue with UMS Collection that made amarok to delete original track
       instead of newly copied one. (BR 238915)
diff --git a/src/core-impl/collections/db/sql/SqlCollectionLocation.cpp b/src/core-impl/collections/db/sql/SqlCollectionLocation.cpp
index f729c31..6322c44 100644
--- a/src/core-impl/collections/db/sql/SqlCollectionLocation.cpp
+++ b/src/core-impl/collections/db/sql/SqlCollectionLocation.cpp
@@ -364,13 +364,17 @@ void
 SqlCollectionLocation::slotJobFinished( KJob *job )
 {
     DEBUG_BLOCK
+
+    Meta::TrackPtr track = m_jobs.value( job );
     if( job->error() )
     {
         //TODO: proper error handling
         warning() << "An error occurred when copying a file: " << job->errorString();
-        source()->transferError(m_jobs.value( job ), KIO::buildErrorString( job->error(), job->errorString() ) );
-        m_destinations.remove( m_jobs.value( job ) );
+        source()->transferError( track, KIO::buildErrorString( job->error(), job->errorString() ) );
+        m_destinations.remove( track );
     }
+    else
+        source()->transferSuccessful( track );
 
     m_jobs.remove( job );
     job->deleteLater();
@@ -381,21 +385,20 @@ void
 SqlCollectionLocation::slotRemoveJobFinished( KJob *job )
 {
     DEBUG_BLOCK
-    int error = job->error();
-    if( error != 0 && error != KIO::ERR_DOES_NOT_EXIST )
+    Meta::TrackPtr track = m_removejobs.value( job );
+    if( job->error() )
     {
         //TODO: proper error handling
-        debug() << "KIO::ERR_DOES_NOT_EXIST" << KIO::ERR_DOES_NOT_EXIST;
         warning() << "An error occurred when removing a file: " << job->errorString();
-        transferError(m_removejobs.value( job ), KIO::buildErrorString( job->error(), job->errorString() ) );
+        transferError( track, KIO::buildErrorString( job->error(), job->errorString() ) );
     }
     else
     {
         // Remove the track from the database
-        remove( m_removejobs.value( job ) );
+        remove( track );
 
         //we  assume that KIO works correctly...
-        transferSuccessful( m_removejobs.value( job ) );
+        transferSuccessful( track );
     }
 
     m_removejobs.remove( job );
@@ -420,13 +423,9 @@ void SqlCollectionLocation::slotTransferJobFinished( KJob* job )
     // that were successfully copied
     foreach( const Meta::TrackPtr &track, m_destinations.keys() )
     {
-        if( !QFileInfo( m_destinations[ track ] ).exists() )
-            m_destinations.remove( track );
+        if( QFile::exists( m_destinations[ track ] ) )
+            insert( track, m_destinations[ track ] );
         m_originalUrls[track] = track->playableUrl();
-        debug() << "inserting original url" << m_originalUrls[track];
-        // report successful transfer with the original url
-        source()->transferSuccessful( track );
-        insert( track, m_destinations[ track ] );
     }
     debug () << "m_originalUrls" << m_originalUrls;
     m_collection->scanManager()->unblockScan();
@@ -443,9 +442,7 @@ void SqlCollectionLocation::slotTransferJobAborted()
     // that were successfully copied
     foreach( const Meta::TrackPtr &track, m_destinations.keys() )
     {
-        if( !QFileInfo( m_destinations[ track ] ).exists() )
-            m_destinations.remove( track );
-        else
+        if( QFile::exists( m_destinations[ track ] ) )
             insert( track, m_destinations[ track ] ); // was already copied, so have to insert it in the db
         m_originalUrls[track] = track->playableUrl();
     }
@@ -548,8 +545,7 @@ bool SqlCollectionLocation::startNextJob( const Transcoding::Configuration confi
 
         if( src.equals( dest ) )
         {
-            debug() << "move to itself found";
-            source()->transferSuccessful( track );
+            warning() << "move to itself found: " << info.absoluteFilePath();
             m_transferjob->slotJobFinished( 0 );
             if( m_sources.isEmpty() )
                 return false;
diff --git a/src/core-impl/collections/mediadevicecollection/handler/MediaDeviceHandler.cpp b/src/core-impl/collections/mediadevicecollection/handler/MediaDeviceHandler.cpp
index 0ae0b59..3fb5e61 100644
--- a/src/core-impl/collections/mediadevicecollection/handler/MediaDeviceHandler.cpp
+++ b/src/core-impl/collections/mediadevicecollection/handler/MediaDeviceHandler.cpp
@@ -475,8 +475,7 @@ MediaDeviceHandler::copyNextTrackToDevice()
     if ( !m_tracksToCopy.isEmpty() )
     {
         // Pop the track off the front of the list
-        track = m_tracksToCopy.first();
-        m_tracksToCopy.removeFirst();
+        track = m_tracksToCopy.takeFirst();
 
         // Copy the track and check result
         if ( !privateCopyTrackToDevice( track ) )
diff --git a/src/core-impl/collections/umscollection/handler/UmsHandler.cpp b/src/core-impl/collections/umscollection/handler/UmsHandler.cpp
index 4535ae1..41a2978 100644
--- a/src/core-impl/collections/umscollection/handler/UmsHandler.cpp
+++ b/src/core-impl/collections/umscollection/handler/UmsHandler.cpp
@@ -707,6 +707,8 @@ UmsHandler::slotCopyingDone( KIO::Job* job, KUrl from, KUrl to, time_t mtime, bo
         m_files.insert( to.path(), destTrack );
         slotFinalizeTrackCopy( track );
     }
+    else
+        slotCopyTrackFailed( track );
 }
 
 void
diff --git a/src/core/collections/CollectionLocation.cpp b/src/core/collections/CollectionLocation.cpp
index c5b07ac..63db209 100644
--- a/src/core/collections/CollectionLocation.cpp
+++ b/src/core/collections/CollectionLocation.cpp
@@ -341,7 +341,6 @@ CollectionLocation::slotCopyOperationFinished()
 void
 CollectionLocation::slotRemoveOperationFinished()
 {
-    DEBUG_BLOCK
     emit finishRemove();
 }
 
@@ -360,7 +359,6 @@ CollectionLocation::slotShowDestinationDialogDone()
 void
 CollectionLocation::slotShowRemoveDialogDone()
 {
-    DEBUG_BLOCK
     emit startRemove();
 }
Comment 2 Myriam Schweingruber 2011-02-19 13:06:12 UTC
*** Bug 266008 has been marked as a duplicate of this bug. ***