From b6c0013052f837ba4bd4d1ed42bb3a55b72e78e0 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Wed, 6 Jan 2016 01:48:30 +0300 Subject: [PATCH] Fix subdir/subsubdir/newfile bug New files put in sub-subdirs of drive root were also trashed locally instead of begin uploaded to the server --- libgrive/src/base/Resource.cc | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/libgrive/src/base/Resource.cc b/libgrive/src/base/Resource.cc index 92708d0..1b888ae 100644 --- a/libgrive/src/base/Resource.cc +++ b/libgrive/src/base/Resource.cc @@ -272,14 +272,20 @@ void Resource::FromLocal( Val& state ) if ( state.Has( "srv_time" ) ) m_mtime.Assign( state[ "srv_time" ].U64(), 0 ) ; - // follow parent recursively - if ( m_parent->m_state == local_new || m_parent->m_state == remote_deleted ) - m_state = m_parent->m_state ; - else + // Upload file if it is changed and remove if not. + // State will be updated to sync/remote_changed in FromRemote() + m_state = is_changed ? local_new : remote_deleted; + if ( m_state == local_new ) { - // Upload file if it is changed and remove if not. - // State will be updated to sync/remote_changed in FromRemote() - m_state = is_changed ? local_new : remote_deleted; + // local_new means this file is changed in local. + // this means we can't delete any of its parents. + // make sure their state is also set to local_new. + Resource *p = m_parent; + while ( p && p->m_state == remote_deleted ) + { + p->m_state = local_new; + p = p->m_parent; + } } }