diff --git a/README.md b/README.md index afde8e12..e5ec3e92 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,8 @@ Enjoy! ### Grive2 v0.5.1-dev - no-remote-new and upload-only modes +- ignore regexp does not persist anymore (note that Grive will still track it to not + accidentally delete remote files when changing ignore regexp) ### Grive2 v0.5 diff --git a/libgrive/src/base/Resource.cc b/libgrive/src/base/Resource.cc index 9cc441e2..003e8940 100644 --- a/libgrive/src/base/Resource.cc +++ b/libgrive/src/base/Resource.cc @@ -525,7 +525,7 @@ void Resource::SyncSelf( Syncer* syncer, ResourceTree *res_tree, const Val& opti case local_deleted : Log( "sync %1% deleted in local. deleting remote", path, log::info ) ; - if ( syncer ) + if ( syncer && !options["no-delete-remote"].Bool() ) { syncer->DeleteRemote( this ) ; DeleteIndex() ; diff --git a/libgrive/src/base/State.cc b/libgrive/src/base/State.cc index c2b3865f..44d8bf91 100644 --- a/libgrive/src/base/State.cc +++ b/libgrive/src/base/State.cc @@ -41,6 +41,8 @@ State::State( const fs::path& filename, const Val& options ) : // the "-f" option will make grive always think remote is newer m_force = options.Has( "force" ) ? options["force"].Bool() : false ; + std::string m_orig_ign = m_ign; + m_ign = ""; if ( options.Has( "ignore" ) && options["ignore"].Str() != m_ign ) m_ign = options["ignore"].Str(); else if ( options.Has( "dir" ) ) @@ -62,7 +64,8 @@ State::State( const fs::path& filename, const Val& options ) : m_ign = ign; } } - + + m_ign_changed = m_orig_ign != "" && m_orig_ign != m_ign; m_ign_re = boost::regex( m_ign.empty() ? "^\\.(grive|grive_state|trash)" : ( m_ign+"|^\\.(grive|grive_state|trash)" ) ); } @@ -120,18 +123,24 @@ void State::FromLocal( const fs::path& p, Resource* folder, Val& tree ) for( Val::Object::iterator i = leftover.begin(); i != leftover.end(); i++ ) { - // Restore state of locally deleted files - Resource *c = folder->FindChild( i->first ) ; - if ( !c ) + std::string path = folder->IsRoot() ? i->first : ( folder->RelPath() / i->first ).string(); + if ( IsIgnore( path ) ) + Log( "file %1% is ignored by grive", path, log::verbose ) ; + else { - c = new Resource( i->first, i->second.Has( "tree" ) ? "folder" : "file" ) ; - folder->AddChild( c ) ; - m_res.Insert( c ) ; + // Restore state of locally deleted files + Resource *c = folder->FindChild( i->first ) ; + if ( !c ) + { + c = new Resource( i->first, i->second.Has( "tree" ) ? "folder" : "file" ) ; + folder->AddChild( c ) ; + m_res.Insert( c ) ; + } + Val& rec = tree.Item( i->first ); + if ( m_force || m_ign_changed ) + rec.Del( "srv_time" ); + c->FromDeleted( rec ); } - Val& rec = tree.Item( i->first ); - if ( m_force ) - rec.Del( "srv_time" ); - c->FromDeleted( rec ); } } diff --git a/libgrive/src/base/State.hh b/libgrive/src/base/State.hh index 088be382..68b6df88 100644 --- a/libgrive/src/base/State.hh +++ b/libgrive/src/base/State.hh @@ -78,6 +78,7 @@ private : boost::regex m_ign_re ; Val m_st ; bool m_force ; + bool m_ign_changed ; std::list m_unresolved ; } ; diff --git a/libgrive/src/util/Config.cc b/libgrive/src/util/Config.cc index 4d03108e..ba0c91e3 100644 --- a/libgrive/src/util/Config.cc +++ b/libgrive/src/util/Config.cc @@ -50,6 +50,7 @@ Config::Config( const po::variables_map& vm ) m_cmd.Add( "ignore", Val( vm["ignore"].as() ) ); m_cmd.Add( "no-remote-new", Val( vm.count( "no-remote-new" ) > 0 || vm.count( "upload-only" ) > 0 ) ); m_cmd.Add( "upload-only", Val( vm.count( "upload-only" ) > 0 ) ); + m_cmd.Add( "no-delete-remote", Val( vm.count( "no-delete-remote" ) > 0 ) ); m_path = GetPath( fs::path(m_cmd["path"].Str()) ) ; m_file = Read( ) ;